aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/data/number/rev.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/test/lux/data/number/rev.lux157
1 files changed, 127 insertions, 30 deletions
diff --git a/stdlib/source/test/lux/data/number/rev.lux b/stdlib/source/test/lux/data/number/rev.lux
index 90a29c6d3..c28f89451 100644
--- a/stdlib/source/test/lux/data/number/rev.lux
+++ b/stdlib/source/test/lux/data/number/rev.lux
@@ -1,6 +1,5 @@
(.module:
[lux #*
- ["%" data/text/format (#+ format)]
["_" test (#+ Test)]
[abstract
[monad (#+ do)]
@@ -13,41 +12,49 @@
["$." monoid]
["$." codec]]}]
[data
- [number
- ["." i64]]]
+ ["." bit ("#\." equivalence)]
+ [number (#+ hex)
+ ["n" nat]
+ ["f" frac]
+ ["." i64 ("#\." hash)]]]
[math
- ["r" random]]]
+ ["." random]]]
{1
- ["." /
- //]})
+ ["." /]})
-(def: #export test
+(def: signature
Test
- (<| (_.context (%.name (name-of /._)))
- (`` ($_ _.and
- ($equivalence.spec /.equivalence r.rev)
- ($order.spec /.order r.rev)
- ($enum.spec /.enum r.rev)
- ($interval.spec /.interval r.rev)
- (~~ (template [<monoid>]
- [(<| (_.context (%.name (name-of <monoid>)))
- ($monoid.spec /.equivalence <monoid> r.rev))]
+ (`` ($_ _.and
+ (_.for [/.equivalence /.=]
+ ($equivalence.spec /.equivalence random.rev))
+ (_.for [/.order /.<]
+ ($order.spec /.order random.rev))
+ (_.for [/.enum]
+ ($enum.spec /.enum random.rev))
+ (_.for [/.interval]
+ ($interval.spec /.interval random.rev))
+ (~~ (template [<compose> <monoid>]
+ [(_.for [<monoid> <compose>]
+ ($monoid.spec /.equivalence <monoid> random.rev))]
- [/.addition] [/.minimum] [/.maximum]
- ))
- (~~ (template [<codec>]
- [(<| (_.context (%.name (name-of /.binary)))
- ($codec.spec /.equivalence <codec> r.rev))]
+ [/.+ /.addition]
- [/.binary] [/.octal] [/.decimal] [/.hex]
- ))
- (_.test "Alternate notations."
- (and (/.= (bin ".11001001")
- (bin ".11,00,10,01"))
- (/.= (oct ".615243")
- (oct ".615,243"))
- (/.= (hex ".deadBEEF")
- (hex ".dead,BEEF"))))
+ [/.min /.minimum]
+ [/.max /.maximum]
+ ))
+ (~~ (template [<codec>]
+ [(_.for [<codec>]
+ ($codec.spec /.equivalence <codec> random.rev))]
+
+ [/.binary] [/.octal] [/.decimal] [/.hex]
+ ))
+ )))
+
+(def: #export test
+ Test
+ (<| (_.covering /._)
+ (_.for [.Rev])
+ (`` ($_ _.and
(~~ (template [<half> <whole>]
[(_.cover [<half>]
(/.= <whole>
@@ -66,4 +73,94 @@
[/./2048 /./1024]
[/./4096 /./2048]
))
+ (do random.monad
+ [sample random.rev]
+ (_.cover [/.-]
+ (and (/.= .0 (/.- sample sample))
+ (/.= sample (/.- .0 sample)))))
+ (do {! random.monad}
+ [left random.rev
+ right random.rev]
+ (_.cover [/.*]
+ (and (/.< left (/.* left right))
+ (/.< right (/.* left right)))))
+ (do {! random.monad}
+ [#let [dividend (\ ! map (i64.and (hex "FF"))
+ random.rev)
+ divisor (\ ! map (|>> (i64.and (hex "F"))
+ (i64.or (hex "1"))
+ (i64.rotate-right 8)
+ .rev)
+ random.nat)]
+ dividend dividend
+ divisor/0 divisor
+ divisor/1 (random.filter (|>> (/.= divisor/0) not)
+ divisor)
+ scale (\ ! map (|>> (n.% 10) inc)
+ random.nat)]
+ ($_ _.and
+ (_.cover [/./]
+ (bit\= (/.< divisor/0 divisor/1)
+ (/.> (/./ divisor/0 dividend) (/./ divisor/1 dividend))))
+ (_.cover [/.%]
+ (\ i64.equivalence =
+ (.i64 (n.% (.nat divisor/0) (.nat dividend)))
+ (.i64 (/.% divisor/0 dividend))))
+ (_.cover [/.up /.down]
+ (let [symmetry!
+ (|> dividend
+ (/.up scale)
+ (/.down scale)
+ (/.= dividend))
+
+ discrete-division!
+ (/.= (/.% (.rev scale) dividend)
+ (/.- (|> dividend
+ (/.down scale)
+ (/.up scale))
+ dividend))]
+ (and symmetry!
+ discrete-division!)))
+ (_.cover [/.ratio]
+ (|> dividend
+ (/.up scale)
+ (/.ratio dividend)
+ (n.= scale)))
+ ))
+ (do {! random.monad}
+ [dividend random.rev
+ divisor (random.filter (|>> (/.= .0) not)
+ random.rev)]
+ (_.cover [/./%]
+ (let [[quotient remainder] (/./% divisor dividend)]
+ (and (/.= (/./ divisor dividend) quotient)
+ (/.= (/.% divisor dividend) remainder)))))
+ (do random.monad
+ [left random.rev
+ right random.rev]
+ ($_ _.and
+ (_.cover [/.>]
+ (bit\= (/.> left right)
+ (/.< right left)))
+ (_.cover [/.<= /.>=]
+ (bit\= (/.<= left right)
+ (/.>= right left)))
+ ))
+ (do random.monad
+ [sample random.nat]
+ (_.cover [/.reciprocal]
+ (/.= (/.reciprocal sample)
+ (|> sample /.reciprocal .nat /.reciprocal .nat /.reciprocal))))
+ (do {! random.monad}
+ [expected (\ ! map (|>> f.abs (f.% +1.0))
+ random.safe-frac)]
+ (_.cover [/.frac]
+ (|> expected f.rev /.frac (f.= expected))))
+ (do random.monad
+ [sample random.rev]
+ (_.cover [/.hash]
+ (i64\= (i64\hash sample)
+ (\ /.hash hash sample))))
+
+ ..signature
))))