#!/usr/bin/ruby

# Tests for numeric palindromic-related methods.

func my_next_palindrome(n,b) {
    n + n.is_palindrome(b) .. Inf -> first { .is_palindrome(b) }
}

for k in (1..100) {
    var b = irand(2, 100)
    assert_eq(next_palindrome(k, b), my_next_palindrome(k, b), "next_palindrome(#{k}, #{b})")
}

for b in (2..10) {
    with (0) { |k|
        var arr = gather {
            100.times {
                take(k)
                k = next_palindrome(k, b)
            }
        }
        assert_eq(arr, 100.by { .is_palindrome(b) })
    }
}

assert_eq(next_palindrome(10),    11);
assert_eq(next_palindrome(11),    22);
assert_eq(next_palindrome(12),    22);
assert_eq(next_palindrome(110),   111);
assert_eq(next_palindrome(111),   121);
assert_eq(next_palindrome(112),   121);
assert_eq(next_palindrome(120),   121);
assert_eq(next_palindrome(121),   131);
assert_eq(next_palindrome(1234),  1331);
assert_eq(next_palindrome(12345), 12421);

assert_eq(next_palindrome(8887),  8888);
assert_eq(next_palindrome(8888),  8998);
assert_eq(next_palindrome(8889),  8998);
assert_eq(next_palindrome(88887), 88888);
assert_eq(next_palindrome(88888), 88988);
assert_eq(next_palindrome(88889), 88988);
assert_eq(next_palindrome(9998),  9999);
assert_eq(next_palindrome(99998), 99999);
assert_eq(next_palindrome(9999),  10001);
assert_eq(next_palindrome(99999), 100001);

assert_eq(next_palindrome(12311), 12321);
assert_eq(next_palindrome(1321),  1331);
assert_eq(next_palindrome(1331),  1441);
assert_eq(next_palindrome(13530), 13531);
assert_eq(next_palindrome(13520), 13531);
assert_eq(next_palindrome(13521), 13531);
assert_eq(next_palindrome(13530), 13531);
assert_eq(next_palindrome(13531), 13631);
assert_eq(next_palindrome(13540), 13631);
assert_eq(next_palindrome(13532), 13631);

assert_eq(next_palindrome(1234, 2), 1241);
assert_eq(next_palindrome(1234, 3), 1249);
assert_eq(next_palindrome(1234, 4), 1265);
assert_eq(next_palindrome(1234, 5), 1246);
assert_eq(next_palindrome(1234, 6), 1253);

assert_eq(next_palindrome(12345, 2), 12483);
assert_eq(next_palindrome(12345, 3), 12382);
assert_eq(next_palindrome(12345, 4), 12355);
assert_eq(next_palindrome(12345, 5), 12348);
assert_eq(next_palindrome(12345, 6), 12439);

assert_eq(next_palindrome(2**65), 36893488155188439863)
assert_eq(next_palindrome(2**67), 147573952595259375741)
assert_eq(next_palindrome(2**65, 100), 36893488151588348936)
assert_eq(next_palindrome(2**67, 100), 147573952595239574701)

say "** Test passed!"