1 USING: math.intervals kernel sequences words math math.order
2 arrays prettyprint tools.test random vocabs combinators
3 accessors math.constants fry ;
4 IN: math.intervals.tests
6 [ empty-interval ] [ 2 2 (a,b) ] unit-test
8 [ empty-interval ] [ 2 2.0 (a,b) ] unit-test
10 [ empty-interval ] [ 2 2 [a,b) ] unit-test
12 [ empty-interval ] [ 2 2 (a,b] ] unit-test
14 [ empty-interval ] [ 3 2 [a,b] ] unit-test
16 [ T{ interval f { 1 t } { 2 t } } ] [ 1 2 [a,b] ] unit-test
18 [ T{ interval f { 1 t } { 2 f } } ] [ 1 2 [a,b) ] unit-test
20 [ T{ interval f { 1 f } { 2 f } } ] [ 1 2 (a,b) ] unit-test
22 [ T{ interval f { 1 f } { 2 t } } ] [ 1 2 (a,b] ] unit-test
24 [ T{ interval f { 1 t } { 1 t } } ] [ 1 [a,a] ] unit-test
26 [ t ] [ { 3 t } { 3 f } endpoint< ] unit-test
27 [ t ] [ { 2 f } { 3 f } endpoint< ] unit-test
28 [ f ] [ { 3 f } { 3 t } endpoint< ] unit-test
29 [ t ] [ { 4 f } { 3 t } endpoint> ] unit-test
30 [ f ] [ { 3 f } { 3 t } endpoint> ] unit-test
32 [ empty-interval ] [ 1 2 [a,b] empty-interval interval+ ] unit-test
34 [ empty-interval ] [ empty-interval 1 2 [a,b] interval+ ] unit-test
37 1 2 [a,b] -3 3 [a,b] interval+ -2 5 [a,b] =
41 1 2 [a,b] -3 3 (a,b) interval+ -2 5 (a,b) =
44 [ empty-interval ] [ 1 2 [a,b] empty-interval interval- ] unit-test
46 [ empty-interval ] [ empty-interval 1 2 [a,b] interval- ] unit-test
49 1 2 [a,b] 0 1 [a,b] interval- 0 2 [a,b] =
52 [ empty-interval ] [ 1 2 [a,b] empty-interval interval* ] unit-test
54 [ empty-interval ] [ empty-interval 1 2 [a,b] interval* ] unit-test
57 1 2 [a,b] 0 4 [a,b] interval* 0 8 [a,b] =
61 1 2 [a,b] -4 4 [a,b] interval* -8 8 [a,b] =
65 1 2 [a,b] -0.5 0.5 [a,b] interval* -1.0 1.0 [a,b] =
69 1 2 [a,b] -0.5 0.5 (a,b] interval* -1.0 1.0 (a,b] =
73 -1 1 [a,b] -1 1 (a,b] interval* -1 1 [a,b] =
76 [ t ] [ 1 2 [a,b] dup empty-interval interval-union = ] unit-test
78 [ t ] [ empty-interval 1 2 [a,b] tuck interval-union = ] unit-test
81 0 1 (a,b) 0 1 [a,b] interval-union 0 1 [a,b] =
85 0 1 (a,b) 1 2 [a,b] interval-union 0 2 (a,b] =
89 0 1 (a,b) 0 1 [a,b] interval-intersect 0 1 (a,b) =
92 [ empty-interval ] [ 0 5 [a,b] -1 [a,a] interval-intersect ] unit-test
94 [ empty-interval ] [ 0 5 (a,b] 0 [a,a] interval-intersect ] unit-test
96 [ empty-interval ] [ empty-interval -1 [a,a] interval-intersect ] unit-test
98 [ empty-interval ] [ 0 5 (a,b] empty-interval interval-intersect ] unit-test
101 0 1 (a,b) full-interval interval-intersect 0 1 (a,b) =
105 empty-interval empty-interval interval-subset?
109 empty-interval 0 1 [a,b] interval-subset?
113 0 1 (a,b) 0 1 [a,b] interval-subset?
117 full-interval -1/0. 1/0. [a,b] interval-subset?
121 -1/0. 1/0. [a,b] full-interval interval-subset?
125 full-interval 0 1/0. [a,b] interval-subset?
129 0 1/0. [a,b] full-interval interval-subset?
133 0 0 1 (a,b) interval-contains?
137 0.5 0 1 (a,b) interval-contains?
141 1 0 1 (a,b) interval-contains?
144 [ empty-interval ] [ -1 1 (a,b) empty-interval interval/ ] unit-test
146 [ t ] [ 0 0 331 [a,b) -1775 -953 (a,b) interval/ interval-contains? ] unit-test
148 [ t ] [ -1 1 (a,b) -1 1 (a,b) interval/ [-inf,inf] = ] unit-test
150 [ t ] [ -1 1 (a,b) 0 1 (a,b) interval/ [-inf,inf] = ] unit-test
152 "math.ratios.private" vocab [
154 -1 1 (a,b) 0.5 1 (a,b) interval/ -2.0 2.0 (a,b) =
158 [ f ] [ empty-interval interval-singleton? ] unit-test
160 [ t ] [ 1 [a,a] interval-singleton? ] unit-test
162 [ f ] [ 1 1 [a,b) interval-singleton? ] unit-test
164 [ f ] [ 1 3 [a,b) interval-singleton? ] unit-test
166 [ f ] [ 1 1 (a,b) interval-singleton? ] unit-test
168 [ 2 ] [ 1 3 [a,b) interval-length ] unit-test
170 [ 0 ] [ empty-interval interval-length ] unit-test
172 [ t ] [ 0 5 [a,b] 5 [a,a] interval<= ] unit-test
174 [ incomparable ] [ empty-interval 5 [a,a] interval< ] unit-test
176 [ incomparable ] [ 5 [a,a] empty-interval interval< ] unit-test
178 [ incomparable ] [ 0 5 [a,b] 5 [a,a] interval< ] unit-test
180 [ t ] [ 0 5 [a,b) 5 [a,a] interval< ] unit-test
182 [ f ] [ 0 5 [a,b] -1 [a,a] interval< ] unit-test
184 [ incomparable ] [ 0 5 [a,b] 1 [a,a] interval< ] unit-test
186 [ t ] [ -1 1 (a,b) -1 [a,a] interval> ] unit-test
188 [ t ] [ -1 1 (a,b) -1 [a,a] interval>= ] unit-test
190 [ f ] [ -1 1 (a,b) -1 [a,a] interval< ] unit-test
192 [ f ] [ -1 1 (a,b) -1 [a,a] interval<= ] unit-test
194 [ t ] [ -1 1 (a,b] 1 [a,a] interval<= ] unit-test
196 [ t ] [ -1 1 (a,b] 1 2 [a,b] interval<= ] unit-test
198 [ incomparable ] [ -1 1 (a,b] empty-interval interval>= ] unit-test
200 [ incomparable ] [ empty-interval -1 1 (a,b] interval>= ] unit-test
202 [ incomparable ] [ -1 1 (a,b] 1 2 [a,b] interval>= ] unit-test
204 [ incomparable ] [ -1 1 (a,b] 1 2 [a,b] interval> ] unit-test
206 [ t ] [ -1 1 (a,b] 1 2 (a,b] interval<= ] unit-test
208 [ f ] [ 0 10 [a,b] 0 [a,a] interval< ] unit-test
210 [ f ] [ 0 10 [a,b] 0.0 [a,a] interval< ] unit-test
212 [ f ] [ 0.0 10 [a,b] 0 [a,a] interval< ] unit-test
214 [ f ] [ 0 10 [a,b] 10 [a,a] interval> ] unit-test
216 [ incomparable ] [ 0 [a,a] 0 10 [a,b] interval< ] unit-test
218 [ incomparable ] [ 10 [a,a] 0 10 [a,b] interval> ] unit-test
220 [ t ] [ 0 [a,a] 0 10 [a,b] interval<= ] unit-test
222 [ incomparable ] [ 0 [a,a] 0 10 [a,b] interval>= ] unit-test
224 [ t ] [ 0 10 [a,b] 0 [a,a] interval>= ] unit-test
234 [ t ] [ 1 100 [a,b] -1 1 [a,b] interval/i [-inf,inf] = ] unit-test
236 ! Accuracy of interval-mod
237 [ t ] [ full-interval 40 40 [a,b] interval-mod -40 40 (a,b) interval-subset?
240 ! Interval random tester
241 : random-element ( interval -- n )
242 dup full-interval eq? [
243 drop 32 random-bits 31 2^ -
245 dup to>> first over from>> first tuck - random +
246 2dup swap interval-contains? [
253 : random-interval ( -- interval )
254 10 random 0 = [ full-interval ] [
255 2000 random 1000 - dup 2 1000 random + +
256 1 random zero? [ [ neg ] bi@ swap ] when
265 : unary-ops ( -- alist )
267 { bitnot interval-bitnot }
272 "math.ratios.private" vocab [
273 { recip interval-recip } suffix
276 : unary-test ( op -- ? )
277 [ random-interval ] dip
278 0 pick interval-contains? over first \ recip eq? and [
281 [ [ random-element ] dip first execute( a -- b ) ] 2keep
282 second execute( a -- b ) interval-contains?
286 [ [ t ] ] dip '[ 8000 iota [ drop _ unary-test ] all? ] unit-test
289 : binary-ops ( -- alist )
297 { bitand interval-bitand }
298 { bitor interval-bitor }
299 { bitxor interval-bitxor }
303 "math.ratios.private" vocab [
304 { / interval/ } suffix
307 : binary-test ( op -- ? )
308 [ random-interval random-interval ] dip
309 0 pick interval-contains? over first { / /i mod rem } member? and [
312 [ [ [ random-element ] bi@ ] dip first execute( a b -- c ) ] 3keep
313 second execute( a b -- c ) interval-contains?
317 [ [ t ] ] dip '[ 8000 iota [ drop _ binary-test ] all? ] unit-test
320 : comparison-ops ( -- alist )
328 : comparison-test ( op -- ? )
329 [ random-interval random-interval ] dip
330 [ [ [ random-element ] bi@ ] dip first execute( a b -- ? ) ] 3keep
331 second execute( a b -- ? ) dup incomparable eq? [ 2drop t ] [ = ] if ;
334 [ [ t ] ] dip '[ 8000 iota [ drop _ comparison-test ] all? ] unit-test
337 [ t ] [ -10 10 [a,b] 0 100 [a,b] assume> 0 10 (a,b] = ] unit-test
339 [ t ] [ -10 10 [a,b] 0 100 [a,b] assume>= 0 10 [a,b] = ] unit-test
341 [ t ] [ -10 10 [a,b] 0 100 [a,b] assume< -10 10 [a,b] = ] unit-test
343 [ t ] [ -10 10 [a,b] -100 0 [a,b] assume< -10 0 [a,b) = ] unit-test
345 [ t ] [ -10 10 [a,b] -100 0 [a,b] assume<= -10 0 [a,b] = ] unit-test
347 [ t ] [ -10 10 [a,b] 0 100 [a,b] assume<= -10 10 [a,b] = ] unit-test
349 [ t ] [ -10 10 [a,b] interval-abs 0 10 [a,b] = ] unit-test
351 ! Test that commutative interval ops really are
352 : random-interval-or-empty ( -- obj )
353 10 random 0 = [ empty-interval ] [ random-interval ] if ;
355 : commutative-ops ( -- seq )
358 interval-bitor interval-bitand interval-bitxor
359 interval-max interval-min
366 random-interval-or-empty random-interval-or-empty _
367 [ execute ] [ swapd execute ] 3bi =