(.module: [lux "*" ["_" test {"+" [Test]}] [abstract [monad {"+" [do]}]] [control [pipe {"+" [case>]}] ["[0]" try]] [data [number ["n" nat] ["f" frac]]] [tool [compiler ["[0]" reference] ["[0]" synthesis]]] [math ["r" random {"+" [Random]}]]] [/// [common {"+" [Runner Definer]}]]) (def: name (Random Name) (let [name_part (r.ascii/upper_alpha 5)] [(r.and name_part name_part)])) (def: (definition define) (-> Definer Test) (do r.monad [name ..name expected r.safe_frac] (_.test "Definitions." (|> (define name (synthesis.f64 expected)) (case> (#try.Success actual) (f.= expected (:as Frac actual)) (#try.Failure _) false))))) (def: (variable run) (-> Runner Test) (do [! r.monad] [register (|> r.nat (\ ! each (n.% 100))) expected r.safe_frac] (_.test "Local variables." (|> (synthesis.branch/let [(synthesis.f64 expected) register (synthesis.variable/local register)]) (run "variable") (case> (#try.Success actual) (f.= expected (:as Frac actual)) (#try.Failure _) false))))) (def: .public (spec runner definer) (-> Runner Definer Test) ($_ _.and (..definition definer) (..variable runner)))