(.require [library [lux (.except) [abstract [monad (.only do)]] [math ["[0]" random (.only Random)] [number ["n" nat]]] [test ["_" property (.only Test)]]]] [\\library ["[0]" /]]) (def (within_boundaries? [min max] it) (-> [Nat Nat] Nat Bit) (and (n.<= max it) (n.>= min it))) (def .public test Test (<| (_.covering /._) (do [! random.monad] [left random.nat right random.nat .let [max (n.max left right) min (n.min left right)] parameter (random.only (n.> 0) random.nat) subject random.nat]) (all _.and (_.coverage [/.arithmetic] (let [boundaries_are_respected! (let [(open "/#[0]") (/.arithmetic n.order [min max] n.arithmetic)] (and (within_boundaries? [min max] (/#+ parameter subject)) (within_boundaries? [min max] (/#- parameter subject)) (within_boundaries? [min max] (/#* parameter subject)) (within_boundaries? [min max] (/#/ parameter subject)))) the_order_of_the_boundaries_does_not_matter! (let [(open "/#[0]") (/.arithmetic n.order [max min] n.arithmetic)] (and (within_boundaries? [min max] (/#+ parameter subject)) (within_boundaries? [min max] (/#- parameter subject)) (within_boundaries? [min max] (/#* parameter subject)) (within_boundaries? [min max] (/#/ parameter subject))))] (and boundaries_are_respected! the_order_of_the_boundaries_does_not_matter!))) )))