aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/abstract/equivalence.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/test/lux/abstract/equivalence.lux34
1 files changed, 33 insertions, 1 deletions
diff --git a/stdlib/source/test/lux/abstract/equivalence.lux b/stdlib/source/test/lux/abstract/equivalence.lux
index ac0084e82..7ae9b37af 100644
--- a/stdlib/source/test/lux/abstract/equivalence.lux
+++ b/stdlib/source/test/lux/abstract/equivalence.lux
@@ -3,13 +3,45 @@
["_" test (#+ Test)]
[abstract/monad (#+ do)]
[data
+ ["." bit ("#@." equivalence)]
[text
- ["%" format (#+ format)]]]
+ ["%" format (#+ format)]]
+ [number
+ ["n" nat]
+ ["i" int]]]
[math
["r" random (#+ Random)]]]
{1
["." / (#+ Equivalence)]})
+(def: #export test
+ Test
+ (do r.monad
+ [leftN r.nat
+ rightN r.nat
+ leftI r.int
+ rightI r.int]
+ (<| (_.context (%.name (name-of /._)))
+ ($_ _.and
+ (_.test (%.name (name-of /.sum))
+ (let [equivalence (/.sum n.equivalence i.equivalence)]
+ (and (bit@= (:: n.equivalence = leftN leftN)
+ (:: equivalence = (#.Left leftN) (#.Left leftN)))
+ (bit@= (:: n.equivalence = leftN rightN)
+ (:: equivalence = (#.Left leftN) (#.Left rightN)))
+ (bit@= (:: i.equivalence = leftI leftI)
+ (:: equivalence = (#.Right leftI) (#.Right leftI)))
+ (bit@= (:: i.equivalence = leftI rightI)
+ (:: equivalence = (#.Right leftI) (#.Right rightI))))))
+ (_.test (%.name (name-of /.product))
+ (let [equivalence (/.product n.equivalence i.equivalence)]
+ (and (bit@= (and (:: n.equivalence = leftN leftN)
+ (:: i.equivalence = leftI leftI))
+ (:: equivalence = [leftN leftI] [leftN leftI]))
+ (bit@= (and (:: n.equivalence = leftN rightN)
+ (:: i.equivalence = leftI rightI))
+ (:: equivalence = [leftN leftI] [rightN rightI])))))))))
+
(def: #export (spec (^open "_@.") generator)
(All [a] (-> (Equivalence a) (Random a) Test))
(do r.monad