(.module: [lux #* ["_" test (#+ Test)] [abstract [monad (#+ do)]] [control [pipe (#+ case>)]] [data ["." error]] [tool [compiler ["." reference] ["." synthesis]]] [math ["r" random (#+ Random)]]] ["." ///]) (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> (#error.Success actual) (f/= expected (:coerce Frac actual)) (#error.Failure error) false))))) (def: (variable run) (-> ///.Runner Test) (do r.monad [register (|> r.nat (:: @ map (n/% 100))) expected r.safe-frac] (_.test "Local variables." (|> (synthesis.branch/let [(synthesis.f64 expected) register (synthesis.variable/local register)]) (run "variable") (case> (#error.Success actual) (f/= expected (:coerce Frac actual)) (#error.Failure error) false))))) (def: #export (spec runner definer) (-> ///.Runner ///.Definer Test) ($_ _.and (..definition definer) (..variable runner)))