% $Id: IterateTest.oz,v 1.2 2009/10/12 14:54:10 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 + (Root*Root- X))/(2.0*Root) end % Newton's method 1.0} end end in Sqrt = {SqrtMaker StandardTolerance/2.0} 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} {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}