aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/compiler/default/phase/synthesis/primitive.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/test/lux/compiler/default/phase/synthesis/primitive.lux')
-rw-r--r--stdlib/source/test/lux/compiler/default/phase/synthesis/primitive.lux97
1 files changed, 97 insertions, 0 deletions
diff --git a/stdlib/source/test/lux/compiler/default/phase/synthesis/primitive.lux b/stdlib/source/test/lux/compiler/default/phase/synthesis/primitive.lux
new file mode 100644
index 000000000..87dccc9f5
--- /dev/null
+++ b/stdlib/source/test/lux/compiler/default/phase/synthesis/primitive.lux
@@ -0,0 +1,97 @@
+(.module:
+ [lux (#- primitive)
+ [control
+ [monad (#+ do)]
+ pipe]
+ [data
+ ["." error]
+ [text
+ format]]
+ [compiler
+ [default
+ ["." phase
+ ["." analysis (#+ Analysis)]
+ ["//" synthesis (#+ Synthesis)
+ ["." expression]]
+ [extension
+ ["." bundle]]]]]
+ [math
+ ["r" random]]
+ test])
+
+(def: #export primitive
+ (r.Random Analysis)
+ (do r.monad
+ [primitive (: (r.Random analysis.Primitive)
+ ($_ r.or
+ (wrap [])
+ r.bit
+ r.nat
+ r.int
+ r.rev
+ r.frac
+ (r.unicode 5)))]
+ (wrap (#analysis.Primitive primitive))))
+
+(def: #export (corresponds? analysis synthesis)
+ (-> Analysis Synthesis Bit)
+ (case [synthesis analysis]
+ [(#//.Primitive (#//.Text valueS))
+ (#analysis.Primitive (#analysis.Unit valueA))]
+ (is? valueS (:coerce Text valueA))
+
+ [(#//.Primitive (#//.Bit valueS))
+ (#analysis.Primitive (#analysis.Bit valueA))]
+ (is? valueS valueA)
+
+ [(#//.Primitive (#//.I64 valueS))
+ (#analysis.Primitive (#analysis.Nat valueA))]
+ (is? (.i64 valueS) (.i64 valueA))
+
+ [(#//.Primitive (#//.I64 valueS))
+ (#analysis.Primitive (#analysis.Int valueA))]
+ (is? (.i64 valueS) (.i64 valueA))
+
+ [(#//.Primitive (#//.I64 valueS))
+ (#analysis.Primitive (#analysis.Rev valueA))]
+ (is? (.i64 valueS) (.i64 valueA))
+
+ [(#//.Primitive (#//.F64 valueS))
+ (#analysis.Primitive (#analysis.Frac valueA))]
+ (is? valueS valueA)
+
+ [(#//.Primitive (#//.Text valueS))
+ (#analysis.Primitive (#analysis.Text valueA))]
+ (is? valueS valueA)
+
+ _
+ #0))
+
+(context: "Primitives."
+ (<| (times 100)
+ (do @
+ [|bit| r.bit
+ |nat| r.nat
+ |int| r.int
+ |rev| r.rev
+ |frac| r.frac
+ |text| (r.unicode 5)]
+ (`` ($_ seq
+ (~~ (do-template [<desc> <analysis> <synthesis> <sample>]
+ [(test (format "Can synthesize " <desc> ".")
+ (|> (#analysis.Primitive (<analysis> <sample>))
+ expression.phase
+ (phase.run [bundle.empty //.init])
+ (case> (#error.Success (#//.Primitive (<synthesis> value)))
+ (is? <sample> value)
+
+ _
+ #0)))]
+
+ ["unit" #analysis.Unit #//.Text //.unit]
+ ["bit" #analysis.Bit #//.Bit |bit|]
+ ["nat" #analysis.Nat #//.I64 (.i64 |nat|)]
+ ["int" #analysis.Int #//.I64 (.i64 |int|)]
+ ["rev" #analysis.Rev #//.I64 (.i64 |rev|)]
+ ["frac" #analysis.Frac #//.F64 |frac|]
+ ["text" #analysis.Text #//.Text |text|])))))))