use "std" use "types" use "functional" def testRangeParams() { x = range(10) assertEquals(10, length(x)) assertEquals(0, x[0]) assertEquals(9, x[9]) } def testRangeParamsFromTo() { x = range(4, 10) assertEquals(6, length(x)) assertEquals(4, x[0]) assertEquals(9, x[5]) } def testRangeParamsWithStep() { x = range(4, 10, 2) assertEquals(3, length(x)) assertEquals(4, x[0]) assertEquals(8, x[2]) } def testRangeParamsReversed() { x = range(10, 4, -1) assertEquals(6, length(x)) assertEquals(10, x[0]) assertEquals(5, x[5]) } def testRangeLength() { assertEquals(10, length(range(0, 10, 1))) assertEquals(5, length(range(0, 10, 2))) assertEquals(4, length(range(0, 10, 3))) assertEquals(3, length(range(0, 10, 4))) assertEquals(2, length(range(0, 10, 5))) assertEquals(1, length(range(0, 10, 15))) } def testRangeReversedLength() { assertEquals(10, length(range(10, 0, -1))) assertEquals(5, length(range(10, 0, -2))) assertEquals(4, length(range(10, 0, -3))) assertEquals(3, length(range(10, 0, -4))) assertEquals(2, length(range(10, 0, -5))) assertEquals(1, length(range(10, 0, -15))) } def testRangeHuge() { x = range(-1002003004005006007, 1002003004005006007) assertEquals(-1002003004005006000, x[7]) x = range(-1002003004005006007, 1002003004005006007, 100000000000) assertEquals(20040061, length(x)) x = range(-10000000, 20000000) assertEquals(30000000, length(x)) assertEquals(0, x[10000000]) } def testRangeAsString() { x = range(1, 6) assertEquals("[1, 2, 3, 4, 5]", string(x)) x = range(1, 6, 2) assertEquals("[1, 3, 5]", string(x)) assertEquals(string([1,3,5]), string(x)) } def testRangeIterate() { sum = 0 for x : range(5) { sum += x } assertEquals(10, sum) } def testRangeFunctionalForeach() { i = 0 foreach(range(5), def(x) = assertEquals(i++, x)) } def testRangeFunctionalReduce() { sum = reduce(range(5), 0, def(x, y) = x + y) assertEquals(10, sum) } def testRangeInvalid() { assertEquals(0, length(range(-100))) assertEquals(0, length(range(0, -100, 1))) assertEquals(0, length(range(0, 100, 0))) }