aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/math.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/test/lux/math.lux')
-rw-r--r--stdlib/source/test/lux/math.lux252
1 files changed, 111 insertions, 141 deletions
diff --git a/stdlib/source/test/lux/math.lux b/stdlib/source/test/lux/math.lux
index aeadbf093..6b5c9749e 100644
--- a/stdlib/source/test/lux/math.lux
+++ b/stdlib/source/test/lux/math.lux
@@ -4,6 +4,8 @@
["_" test {"+" Test}]
[abstract
[monad {"+" do}]]
+ [data
+ ["[0]" bit ("[1]#[0]" equivalence)]]
[macro
["[0]" template]]
[math
@@ -11,7 +13,10 @@
[number
["n" nat]
["i" int]
- ["f" frac]]]]]
+ ["r" rev]
+ ["f" frac]
+ ["[0]" ratio {"+" Ratio}]
+ ["[0]" complex {"+" Complex}]]]]]
[\\library
["[0]" /]]
["[0]" / "_"
@@ -23,152 +28,117 @@
["[1]/[0]" continuous]
["[1]/[0]" fuzzy]]])
-(def: margin_of_error
- +0.0000001)
+(def: ratio/0
+ Ratio
+ [ratio.#numerator 0 ratio.#denominator 1])
-(def: (trigonometric_symmetry forward backward angle)
- (-> (-> Frac Frac) (-> Frac Frac) Frac Bit)
- (let [normal (|> angle forward backward)]
- (|> normal forward backward (f.approximately? ..margin_of_error normal))))
+(def: complex/0
+ Complex
+ [complex.#real +0.0 complex.#imaginary +0.0])
(def: .public test
Test
(<| (_.covering /._)
- ($_ _.and
- (do [! random.monad]
- [.let [~= (f.approximately? ..margin_of_error)]
- angle (|> random.safe_frac (# ! each (f.* /.tau)))]
- ($_ _.and
- (_.cover [/.sin /.asin]
- (trigonometric_symmetry /.sin /.asin angle))
- (_.cover [/.cos /.acos]
- (trigonometric_symmetry /.cos /.acos angle))
- (_.cover [/.tan /.atan]
- (trigonometric_symmetry /.tan /.atan angle))
- (_.cover [/.tau]
- (and (and (~= +0.0 (/.sin /.tau))
- (~= +1.0 (/.cos /.tau)))
- (and (~= +0.0 (/.sin (f./ +2.0 /.tau)))
- (~= -1.0 (/.cos (f./ +2.0 /.tau))))
- (and (~= +1.0 (/.sin (f./ +4.0 /.tau)))
- (~= +0.0 (/.cos (f./ +4.0 /.tau))))
- (and (~= -1.0 (/.sin (f.* +3.0 (f./ +4.0 /.tau))))
- (~= +0.0 (/.cos (f.* +3.0 (f./ +4.0 /.tau)))))
- (let [x2+y2 (f.+ (/.pow +2.0 (/.sin angle))
- (/.pow +2.0 (/.cos angle)))]
- (~= +1.0 x2+y2))))
- (_.cover [/.pi]
- (~= (f./ +2.0 /.tau) /.pi))
- ))
- (do [! random.monad]
- [sample (|> random.safe_frac (# ! each (f.* +1000.0)))]
- ($_ _.and
- (_.cover [/.ceil]
- (let [ceil'd (/.ceil sample)]
- (and (|> ceil'd f.int i.frac (f.= ceil'd))
- (f.>= sample ceil'd)
- (f.<= +1.0 (f.- sample ceil'd)))))
- (_.cover [/.floor]
- (let [floor'd (/.floor sample)]
- (and (|> floor'd f.int i.frac (f.= floor'd))
- (f.<= sample floor'd)
- (f.<= +1.0 (f.- floor'd sample)))))
- (_.cover [/.round]
- (let [round'd (/.round sample)]
- (and (|> round'd f.int i.frac (f.= round'd))
- (f.<= +1.0 (f.abs (f.- sample round'd))))))
- (_.cover [/.root/2]
- (let [sample (f.abs sample)]
- (|> sample
- /.root/2
- (/.pow +2.0)
- (f.approximately? ..margin_of_error sample))))
- (_.cover [/.root/3]
- (|> sample
- /.root/3
- (/.pow +3.0)
- (f.approximately? ..margin_of_error sample)))
- ))
- (do [! random.monad]
- [.let [~= (f.approximately? ..margin_of_error)]
- sample (# ! each (f.* +10.0) random.safe_frac)
- power (# ! each (|>> (n.% 10) ++ n.frac) random.nat)]
- ($_ _.and
- (_.cover [/.exp /.log]
- (|> sample /.exp /.log (f.approximately? +0.000000000000001 sample)))
- (_.cover [/.e]
- (~= +1.0 (/.log /.e)))
- (_.cover [/.pow /.log_by]
- (let [sample (f.abs sample)]
- (|> sample
- (/.pow power)
- (/.log_by sample)
- (~= power))))
- ))
- (do [! random.monad]
- [.let [~= (f.approximately? ..margin_of_error)]
- angle (# ! each (f.* /.tau) random.safe_frac)
- sample (# ! each f.abs random.safe_frac)
- big (# ! each (f.* +1,000,000,000.00) random.safe_frac)]
- (template.let [(odd! <function>)
- [(_.cover [<function>]
- (~= (f.opposite (<function> angle))
- (<function> (f.opposite angle))))]
+ (do random.monad
+ [parameterN (random.only (|>> (n.= 0) not) random.nat)
+ subjectN random.nat
- (even! <function>)
- [(_.cover [<function>]
- (~= (<function> angle)
- (<function> (f.opposite angle))))]
+ parameterI (random.only (|>> (i.= +0) not) random.int)
+ subjectI random.int
- (inverse! <left> <right> <input>)
- [(_.cover [<left> <right>]
- (~= (<right> <input>)
- (<left> (f./ <input> +1.0))))]]
- ($_ _.and
- (odd! /.sinh)
- (even! /.cosh)
- (odd! /.tanh)
- (odd! /.coth)
- (even! /.sech)
- (odd! /.csch)
+ parameterR (random.only (|>> (r.= .0) not) random.rev)
+ subjectR random.rev
- (inverse! /.acosh /.asech sample)
- (inverse! /.asinh /.acsch sample)
- (inverse! /.atanh /.acoth big)
- )))
- (do [! random.monad]
- [x (# ! each (|>> (f.* +10.0) f.abs) random.safe_frac)
- y (# ! each (|>> (f.* +10.0) f.abs) random.safe_frac)]
- (_.cover [/.hypotenuse]
- (let [h (/.hypotenuse x y)]
- (and (f.>= x h)
- (f.>= y h)))))
- (do [! random.monad]
- [.let [~= (f.approximately? ..margin_of_error)
- tau/4 (f./ +4.0 /.tau)]
- x (# ! each (f.* tau/4) random.safe_frac)
- y (# ! each (f.* tau/4) random.safe_frac)]
- (_.cover [/.atan/2]
- (let [expected (/.atan/2 x y)
- actual (if (f.> +0.0 x)
- (/.atan (f./ x y))
- (if (f.< +0.0 y)
- (f.- /.pi (/.atan (f./ x y)))
- (f.+ /.pi (/.atan (f./ x y)))))]
- (and (~= expected actual)
- (~= tau/4 (/.atan/2 +0.0 (f.abs y)))
- (~= (f.opposite tau/4) (/.atan/2 +0.0 (f.opposite (f.abs y))))
- (f.not_a_number? (/.atan/2 +0.0 +0.0))))))
- (do [! random.monad]
- [of (# ! each (|>> (n.% 10) ++) random.nat)]
- (_.cover [/.factorial]
- (and (n.= 1 (/.factorial 0))
- (|> (/.factorial of) (n.% of) (n.= 0)))))
+ parameterF (random.only (|>> (f.= +0.0) not) random.safe_frac)
+ subjectF random.safe_frac
- /infix.test
- /modulus.test
- /modular.test
- /number.test
- /logic/continuous.test
- /logic/fuzzy.test
- )))
+ parameter/ (random.only (|>> (ratio.= ratio/0) not) random.ratio)
+ subject/ random.ratio
+
+ parameterC (random.only (|>> (complex.= complex/0) not) random.complex)
+ subjectC random.complex])
+ (`` ($_ _.and
+ (~~ (template [</> <scenarios>']
+ [(_.cover [</>]
+ (with_expansions [<scenarios> (template.spliced <scenarios>')]
+ (`` (and (~~ (template [<=> <//> <parameter> <subject>]
+ [(<=> (<//> <parameter> <subject>)
+ (</> <parameter> <subject>))]
+
+ <scenarios>))))))]
+
+ [/.+ [[n.= n.+ parameterN subjectN]
+ [i.= i.+ parameterI subjectI]
+ [r.= r.+ parameterR subjectR]
+ [f.= f.+ parameterF subjectF]
+ [ratio.= ratio.+ parameter/ subject/]
+ [complex.= complex.+ parameterC subjectC]]]
+ [/.- [[n.= n.- parameterN subjectN]
+ [i.= i.- parameterI subjectI]
+ [r.= r.- parameterR subjectR]
+ [f.= f.- parameterF subjectF]
+ [ratio.= ratio.- parameter/ subject/]
+ [complex.= complex.- parameterC subjectC]]]
+ [/.* [[n.= n.* parameterN subjectN]
+ [i.= i.* parameterI subjectI]
+ [r.= r.* parameterR subjectR]
+ [f.= f.* parameterF subjectF]
+ [ratio.= ratio.* parameter/ subject/]
+ [complex.= complex.* parameterC subjectC]]]
+ [/./ [[n.= n./ parameterN subjectN]
+ [i.= i./ parameterI subjectI]
+ [r.= r./ parameterR subjectR]
+ [f.= f./ parameterF subjectF]
+ [ratio.= ratio./ parameter/ subject/]
+ [complex.= complex./ parameterC subjectC]]]
+ [/.% [[n.= n.% parameterN subjectN]
+ [i.= i.% parameterI subjectI]
+ [r.= r.% parameterR subjectR]
+ [f.= f.% parameterF subjectF]
+ [ratio.= ratio.% parameter/ subject/]
+ [complex.= complex.% parameterC subjectC]]]
+ ))
+ (~~ (template [</> <scenarios>']
+ [(_.cover [</>]
+ (with_expansions [<scenarios> (template.spliced <scenarios>')]
+ (`` (and (~~ (template [<//> <parameter> <subject>]
+ [(bit#= (<//> <parameter> <subject>)
+ (</> <parameter> <subject>))]
+
+ <scenarios>))))))]
+
+ [/.= [[n.= parameterN subjectN]
+ [i.= parameterI subjectI]
+ [r.= parameterR subjectR]
+ [f.= parameterF subjectF]
+ [ratio.= parameter/ subject/]
+ [complex.= parameterC subjectC]]]
+ [/.< [[n.< parameterN subjectN]
+ [i.< parameterI subjectI]
+ [r.< parameterR subjectR]
+ [f.< parameterF subjectF]
+ [ratio.< parameter/ subject/]]]
+ [/.<= [[n.<= parameterN subjectN]
+ [i.<= parameterI subjectI]
+ [r.<= parameterR subjectR]
+ [f.<= parameterF subjectF]
+ [ratio.<= parameter/ subject/]]]
+ [/.> [[n.> parameterN subjectN]
+ [i.> parameterI subjectI]
+ [r.> parameterR subjectR]
+ [f.> parameterF subjectF]
+ [ratio.> parameter/ subject/]]]
+ [/.>= [[n.>= parameterN subjectN]
+ [i.>= parameterI subjectI]
+ [r.>= parameterR subjectR]
+ [f.>= parameterF subjectF]
+ [ratio.>= parameter/ subject/]]]
+ ))
+
+ /infix.test
+ /modulus.test
+ /modular.test
+ /number.test
+ /logic/continuous.test
+ /logic/fuzzy.test
+ ))))