#!/usr/bin/ruby

# Tests for Array/Range `each_slice`, `map_slice`, `each_cons` and `map_cons`.

var r = 1..10
var a = @r

assert_eq(a.slices(3), [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]])
assert_eq(a.cons(3), [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]])

assert_eq(a.slices(4), r.slices(4))
assert_eq(a.cons(4), r.cons(4))

do {
    var arr1 = []
    var arr2 = []
    r.each_slice(3, {|*a|
        next if (a == [4,5,6])
        arr1 << a
    })
    a.each_slice(3, {|*a|
        next if (a == [4,5,6])
        arr2 << a
    })
    assert_eq(arr1, arr2)
    assert_eq(arr1, [[1, 2, 3], [7, 8, 9], [10]])
}

do {
    var arr1 = []
    var arr2 = []
    r.each_slice(5, {|*a|
        arr1 << a
    })
    a.each_slice(5, {|*a|
        arr2 << a
    })
    assert_eq(arr1, arr2)
    assert_eq(arr1, [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
}

do {
    var arr1 = []
    var arr2 = []
    r.each_slice(3, {|*a|
        arr1 << a
        break if (a == [4,5,6])
    })
    a.each_slice(3, {|*a|
        arr2 << a
        break if (a == [4,5,6])
    })
    assert_eq(arr1, arr2)
    assert_eq(arr1, [[1, 2, 3], [4, 5, 6]])
}

do {
    var arr1 = []
    var arr2 = []
    r.each_cons(3, {|*a|
        next if (a == [4,5,6])
        arr1 << a
    })
    a.each_cons(3, {|*a|
        next if (a == [4,5,6])
        arr2 << a
    })
    assert_eq(arr1, arr2)
    assert_eq(arr1, [[1, 2, 3], [2, 3, 4], [3, 4, 5], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]])
}

do {
    var arr1 = []
    var arr2 = []
    r.each_cons(3, {|*a|
        arr1 << a
        break if (a == [4,5,6])
    })
    a.each_cons(3, {|*a|
        arr2 << a
        break if (a == [4,5,6])
    })
    assert_eq(arr1, arr2)
    assert_eq(arr1, [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]])
}

do {
    var arr1 = r.map_cons(3, {|*a|
        next if (a == [4,5,6])
        a
    })
    var arr2 = a.map_cons(3, {|*a|
        next if (a == [4,5,6])
        a
    })
    assert_eq(arr1, arr2)
    assert_eq(arr1, [[1, 2, 3], [2, 3, 4], [3, 4, 5], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]])
}

do {
    var arr1 = r.map_cons(3, {|*a|
        next if (a == [4,5,6])
        a.sum
    })
    var arr2 = a.map_cons(3, {|*a|
        next if (a == [4,5,6])
        a.sum
    })
    assert_eq(arr1, arr2)
    assert_eq(arr1, [6, 9, 12, 18, 21, 24, 27])
}

assert_eq(r, 1..10)
assert_eq(a, [1,2,3,4,5,6,7,8,9,10])

say "** Test passed!"