% $Id: IterateTest.oz,v 1.3 2011/10/22 01:26:14 leavens Exp leavens $ \insert 'TestingNoStop.oz' \insert 'FloatTesting.oz' \insert 'Iterate.oz' declare % Helper to avoid repeated test code proc {TestIter Iterate} fun {SumFromTo I J} {Iterate fun {$ N#_} N > J end fun {$ _#Sum} Sum end fun {$ N#Sum} N+1#Sum+N end I#0} end fun {ProdFromTo I J} {Iterate fun {$ N#_} N > J end fun {$ _#Prod} Prod end fun {$ N#Prod} N+1#Prod*N end I#1} end Sqrt % the block below defines this... local fun {SqrtMaker Tolerance} fun {$ X} {Iterate fun {$ Root} {Abs Root*Root - X} < Tolerance end fun {$ Root} Root end fun {$ Root} (Root + (X/Root))/2.0 end % Newton's method 1.0} end end in Sqrt = {SqrtMaker 0.01*StandardTolerance} end in {StartTesting 'SumFromTo'} {Test {SumFromTo 1 10} '==' 55} {Test {SumFromTo 1 1} '==' 1} {Test {SumFromTo 3 1} '==' 0} {Test {SumFromTo 3 100} '==' 5047} {StartTesting 'ProdFromTo'} {Test {ProdFromTo 1 3} '==' 6} {Test {ProdFromTo 1 1} '==' 1} {Test {ProdFromTo 3 1} '==' 1} {Test {ProdFromTo 3 10} '==' 1814400} {Test {ProdFromTo 0 100} '==' 0} {StartTesting 'Sqrt'} {WithinTest {Sqrt 4.0} '~==~' 2.0} {WithinTest {Sqrt 9.0} '~==~' 3.0} {WithinTest {Sqrt 100.0} '~==~' 10.0} {WithinTest {Sqrt 0.25} '~==~' 0.5} {StartTesting 'done'} end {StartTesting 'Iterate'} {TestIter Iterate} {StartTesting 'Iterate2'} {TestIter Iterate2} {StartTesting 'Iterate2c'} {TestIter fun {$ IsDone Extract Transform S} {{Iterate2c IsDone Extract Transform} S} end} {DoneTesting}