tests/isValidIpv6.test.js
import test from 'tape';
import isValidIpv6 from '../src/isValidIpv6';
test('isValidIpv6 tests', (assert) => {
const testcases = [
// ipv6
[true, '2001:db8:3333:4444:5555:6666:1.2.3.4'],
[true, '::11.22.33.44'],
[true, '2001:db8::123.123.123.123'],
[true, '::1234:5678:91.123.4.56'],
[true, '::1234:5678:1.2.3.4'],
[true, '2001:db8::1234:5678:5.6.7.8'],
[false, ''],
[true, '2001:0000:1234:0000:0000:C1C0:ABCD:0876'],
[true, '2001:0:1234::C1C0:ABCD:876'],
[true, '3ffe:0b00:0000:0000:0001:0000:0000:000a'],
[true, '3ffe:b00::1:0:0:a'],
[true, 'FF02:0000:0000:0000:0000:0000:0000:0001'],
[true, 'FF02::1'],
[true, '0000:0000:0000:0000:0000:0000:0000:0001'],
[true, '0000:0000:0000:0000:0000:0000:0000:0000'],
[true, '::'],
[true, '::ffff:192.168.1.26'],
[false, '02001:0000:1234:0000:0000:C1C0:ABCD:0876'],
[false, '2001:0000:1234:0000:00001:C1C0:ABCD:0876'],
[false, ' 2001:0000:1234:0000:0000:C1C0:ABCD:0876'],
[false, ' 2001:0:1234::C1C0:ABCD:876'],
[false, ' 2001:0000:1234:0000:0000:C1C0:ABCD:0876 '],
[false, ' 2001:0:1234::C1C0:ABCD:876 '],
[false, ' 2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'],
[false, '2001:0000:1234: 0000:0000:C1C0:ABCD:0876'],
[false, '2001:1:1:1:1:1:255Z255X255Y255'],
[false, '3ffe:0b00:0000:0001:0000:0000:000a'],
[false, 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'],
[false, '3ffe:b00::1::a'],
[false, '::1111:2222:3333:4444:5555:6666::'],
[true, '2::10'],
[true, 'ff02::1'],
[true, 'fe80::'],
[true, '2002::'],
[true, '2001:db8::'],
[true, '2001:0db8:1234::'],
[true, '::ffff:0:0'],
[true, '::ffff:192.168.1.1'],
[true, '1:2:3:4:5:6:7:8'],
[true, '1:2:3:4:5:6::8'],
[true, '1:2:3:4:5::8'],
[true, '1:2:3:4::8'],
[true, '1:2:3::8'],
[true, '1:2::8'],
[true, '1::8'],
[true, '1::2:3:4:5:6:7'],
[true, '1::2:3:4:5:6'],
[true, '1::2:3:4:5'],
[true, '1::2:3:4'],
[true, '1::2:3'],
[true, '::2:3:4:5:6:7:8'],
[true, '::2:3:4:5:6:7'],
[true, '::2:3:4:5:6'],
[true, '::2:3:4:5'],
[true, '::2:3:4'],
[true, '::2:3'],
[true, '::8'],
[true, '1:2:3:4:5:6::'],
[true, '1:2:3:4:5::'],
[true, '1:2:3:4::'],
[true, '1:2:3::'],
[true, '1:2::'],
[true, '1::'],
[true, '1:2:3:4:5::7:8'],
[false, '1:2:3::4:5::7:8'],
[false, '12345::6:7:8'],
[true, '1:2:3:4::7:8'],
[true, '1:2:3::7:8'],
[true, '1:2::7:8'],
[true, '1::7:8'],
[true, '1:2:3:4:5:6:1.2.3.4'],
[true, '1:2:3:4:5::1.2.3.4'],
[true, '1:2:3:4::1.2.3.4'],
[true, '1:2:3::1.2.3.4'],
[true, '1:2::1.2.3.4'],
[true, '1::1.2.3.4'],
[true, '1:2:3:4::5:1.2.3.4'],
[true, '1:2:3::5:1.2.3.4'],
[true, '1:2::5:1.2.3.4'],
[true, '1::5:1.2.3.4'],
[true, '1::5:11.22.33.44'],
[false, '1::5:400.2.3.4'],
[false, '1::5:260.2.3.4'],
[false, '1::5:256.2.3.4'],
[false, '1::5:1.256.3.4'],
[false, '1::5:1.2.256.4'],
[false, '1::5:1.2.3.256'],
[false, '1::5:300.2.3.4'],
[false, '1::5:1.300.3.4'],
[false, '1::5:1.2.300.4'],
[false, '1::5:1.2.3.300'],
[false, '1::5:900.2.3.4'],
[false, '1::5:1.900.3.4'],
[false, '1::5:1.2.900.4'],
[false, '1::5:1.2.3.900'],
[false, '1::5:300.300.300.300'],
[false, '1::5:3000.30.30.30'],
[false, '1::400.2.3.4'],
[false, '1::260.2.3.4'],
[false, '1::256.2.3.4'],
[false, '1::1.256.3.4'],
[false, '1::1.2.256.4'],
[false, '1::1.2.3.256'],
[false, '1::300.2.3.4'],
[false, '1::1.300.3.4'],
[false, '1::1.2.300.4'],
[false, '1::1.2.3.300'],
[false, '1::900.2.3.4'],
[false, '1::1.900.3.4'],
[false, '1::1.2.900.4'],
[false, '1::1.2.3.900'],
[false, '1::300.300.300.300'],
[false, '1::3000.30.30.30'],
[false, '::400.2.3.4'],
[false, '::260.2.3.4'],
[false, '::256.2.3.4'],
[false, '::1.256.3.4'],
[false, '::1.2.256.4'],
[false, '::1.2.3.256'],
[false, '::300.2.3.4'],
[false, '::1.300.3.4'],
[false, '::1.2.300.4'],
[false, '::1.2.3.300'],
[false, '::900.2.3.4'],
[false, '::1.900.3.4'],
[false, '::1.2.900.4'],
[false, '::1.2.3.900'],
[false, '::300.300.300.300'],
[false, '::3000.30.30.30'],
[true, 'fe80::217:f2ff:254.7.237.98'],
[true, 'fe80::217:f2ff:fe07:ed62'],
[true, '2001:DB8:0:0:8:800:200C:417A'],
[true, 'FF01:0:0:0:0:0:0:101'],
[true, 'FF01::101'],
[true, '0:0:0:0:0:0:0:1'],
[true, '0:0:0:0:0:0:0:0'],
[true, '2001:2:3:4:5:6:7:134'],
[true, 'fe80::4413:c8ae:2821:5852%10'],
[true, '1111:2222:3333:4444:5555:6666:7777:8888'],
[true, '1111:2222:3333:4444:5555:6666:7777::'],
[true, '1111:2222:3333:4444:5555:6666::'],
[true, '1111:2222:3333:4444:5555::'],
[true, '1111:2222:3333:4444::'],
[true, '1111:2222:3333::'],
[true, '1111:2222::'],
[true, '1111::'],
[true, '1111:2222:3333:4444:5555:6666::8888'],
[true, '1111:2222:3333:4444:5555::8888'],
[true, '1111:2222:3333:4444::8888'],
[true, '1111:2222:3333::8888'],
[true, '1111:2222::8888'],
[true, '1111::8888'],
[true, '::8888'],
[true, '1111:2222:3333:4444:5555::7777:8888'],
[true, '1111:2222:3333:4444::7777:8888'],
[true, '1111:2222:3333::7777:8888'],
[true, '1111:2222::7777:8888'],
[true, '1111::7777:8888'],
[true, '::7777:8888'],
[true, '1111:2222:3333:4444::6666:7777:8888'],
[true, '1111:2222:3333::6666:7777:8888'],
[true, '1111:2222::6666:7777:8888'],
[true, '1111::6666:7777:8888'],
[true, '::6666:7777:8888'],
[true, '1111:2222:3333::5555:6666:7777:8888'],
[true, '1111:2222::5555:6666:7777:8888'],
[true, '1111::5555:6666:7777:8888'],
[true, '::5555:6666:7777:8888'],
[true, '1111:2222::4444:5555:6666:7777:8888'],
[true, '1111::4444:5555:6666:7777:8888'],
[true, '::4444:5555:6666:7777:8888'],
[true, '1111::3333:4444:5555:6666:7777:8888'],
[true, '::3333:4444:5555:6666:7777:8888'],
[true, '::2222:3333:4444:5555:6666:7777:8888'],
[true, '1111:2222:3333:4444:5555:6666:123.123.123.123'],
[true, '1111:2222:3333:4444:5555::123.123.123.123'],
[true, '1111:2222:3333:4444::123.123.123.123'],
[true, '1111:2222:3333::123.123.123.123'],
[true, '1111:2222::123.123.123.123'],
[true, '1111::123.123.123.123'],
[true, '::123.123.123.123'],
[true, '1111:2222:3333:4444::6666:123.123.123.123'],
[true, '1111:2222:3333::6666:123.123.123.123'],
[true, '1111:2222::6666:123.123.123.123'],
[true, '1111::6666:123.123.123.123'],
[true, '::6666:123.123.123.123'],
[true, '1111:2222:3333::5555:6666:123.123.123.123'],
[true, '1111:2222::5555:6666:123.123.123.123'],
[true, '1111::5555:6666:123.123.123.123'],
[true, '::5555:6666:123.123.123.123'],
[true, '1111:2222::4444:5555:6666:123.123.123.123'],
[true, '1111::4444:5555:6666:123.123.123.123'],
[true, '::4444:5555:6666:123.123.123.123'],
[true, '1111::3333:4444:5555:6666:123.123.123.123'],
[true, '::3333:4444:5555:6666:123.123.123.123'],
[true, '::2222:3333:4444:5555:6666:123.123.123.123'],
// Invalid data
[false, 'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX'],
// To much components
[false, '1111:2222:3333:4444:5555:6666:7777:8888:9999'],
[false, '1111:2222:3333:4444:5555:6666:7777:8888::'],
[false, '::2222:3333:4444:5555:6666:7777:8888:9999'],
// To less components
[false, '1111:2222:3333:4444:5555:6666:7777'],
[false, '1111:2222:3333:4444:5555:6666'],
[false, '1111:2222:3333:4444:5555'],
[false, '1111:2222:3333:4444'],
[false, '1111:2222:3333'],
[false, '1111:2222'],
[false, '1111'],
// Missing :
[false, '11112222:3333:4444:5555:6666:7777:8888'],
[false, '1111:22223333:4444:5555:6666:7777:8888'],
[false, '1111:2222:33334444:5555:6666:7777:8888'],
[false, '1111:2222:3333:44445555:6666:7777:8888'],
[false, '1111:2222:3333:4444:55556666:7777:8888'],
[false, '1111:2222:3333:4444:5555:66667777:8888'],
[false, '1111:2222:3333:4444:5555:6666:77778888'],
// Missing : intended for ::
[false, '1111:2222:3333:4444:5555:6666:7777:8888:'],
[false, '1111:2222:3333:4444:5555:6666:7777:'],
[false, '1111:2222:3333:4444:5555:6666:'],
[false, '1111:2222:3333:4444:5555:'],
[false, '1111:2222:3333:4444:'],
[false, '1111:2222:3333:'],
[false, '1111:2222:'],
[false, '1111:'],
[false, ':'],
[false, ':8888'],
[false, ':7777:8888'],
[false, ':6666:7777:8888'],
[false, ':5555:6666:7777:8888'],
[false, ':4444:5555:6666:7777:8888'],
[false, ':3333:4444:5555:6666:7777:8888'],
[false, ':2222:3333:4444:5555:6666:7777:8888'],
[false, ':1111:2222:3333:4444:5555:6666:7777:8888'],
// :::
[false, ':::2222:3333:4444:5555:6666:7777:8888'],
[false, '1111:::3333:4444:5555:6666:7777:8888'],
[false, '1111:2222:::4444:5555:6666:7777:8888'],
[false, '1111:2222:3333:::5555:6666:7777:8888'],
[false, '1111:2222:3333:4444:::6666:7777:8888'],
[false, '1111:2222:3333:4444:5555:::7777:8888'],
[false, '1111:2222:3333:4444:5555:6666:::8888'],
[false, '1111:2222:3333:4444:5555:6666:7777:::'],
// Double ::
[false, '::2222::4444:5555:6666:7777:8888'],
[false, '::2222:3333::5555:6666:7777:8888'],
[false, '::2222:3333:4444::6666:7777:8888'],
[false, '::2222:3333:4444:5555::7777:8888'],
[false, '::2222:3333:4444:5555:7777::8888'],
[false, '::2222:3333:4444:5555:7777:8888::'],
[false, '1111::3333::5555:6666:7777:8888'],
[false, '1111::3333:4444::6666:7777:8888'],
[false, '1111::3333:4444:5555::7777:8888'],
[false, '1111::3333:4444:5555:6666::8888'],
[false, '1111::3333:4444:5555:6666:7777::'],
[false, '1111:2222::4444::6666:7777:8888'],
[false, '1111:2222::4444:5555::7777:8888'],
[false, '1111:2222::4444:5555:6666::8888'],
[false, '1111:2222::4444:5555:6666:7777::'],
[false, '1111:2222:3333::5555::7777:8888'],
[false, '1111:2222:3333::5555:6666::8888'],
[false, '1111:2222:3333::5555:6666:7777::'],
[false, '1111:2222:3333:4444::6666::8888'],
[false, '1111:2222:3333:4444::6666:7777::'],
[false, '1111:2222:3333:4444:5555::7777::'],
[false, 'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:1.2.3.4'],
[false, '1111:2222:3333:4444:5555:6666:256.256.256.256'],
[false, '1111:2222:3333:4444:5555:6666:000.000.000.000'],
[false, '1111:2222:3333:4444:5555:6666:00.00.00.00'],
[false, '1111:2222:3333:4444:5555:6666:7777:8888:1.2.3.4'],
[false, '1111:2222:3333:4444:5555:6666:7777:1.2.3.4'],
[false, '1111:2222:3333:4444:5555:6666::1.2.3.4'],
[false, '::2222:3333:4444:5555:6666:7777:1.2.3.4'],
[false, '1111:2222:3333:4444:5555:6666:1.2.3.4.5'],
[false, '1111:2222:3333:4444:5555:1.2.3.4'],
[false, '1111:2222:3333:4444:1.2.3.4'],
[false, '1111:2222:3333:1.2.3.4'],
[false, '1111:2222:1.2.3.4'],
[false, '1111:1.2.3.4'],
[false, '11112222:3333:4444:5555:6666:1.2.3.4'],
[false, '1111:22223333:4444:5555:6666:1.2.3.4'],
[false, '1111:2222:33334444:5555:6666:1.2.3.4'],
[false, '1111:2222:3333:44445555:6666:1.2.3.4'],
[false, '1111:2222:3333:4444:55556666:1.2.3.4'],
[false, '1111:2222:3333:4444:5555:66661.2.3.4'],
// Missing .
[false, '1111:2222:3333:4444:5555:6666:255255.255.255'],
[false, '1111:2222:3333:4444:5555:6666:255.255255.255'],
[false, '1111:2222:3333:4444:5555:6666:255.255.255255'],
[false, ':1.2.3.4'],
[false, ':6666:1.2.3.4'],
[false, ':5555:6666:1.2.3.4'],
[false, ':4444:5555:6666:1.2.3.4'],
[false, ':3333:4444:5555:6666:1.2.3.4'],
[false, ':2222:3333:4444:5555:6666:1.2.3.4'],
[false, ':1111:2222:3333:4444:5555:6666:1.2.3.4'],
[false, ':::2222:3333:4444:5555:6666:1.2.3.4'],
[false, '1111:::3333:4444:5555:6666:1.2.3.4'],
[false, '1111:2222:::4444:5555:6666:1.2.3.4'],
[false, '1111:2222:3333:::5555:6666:1.2.3.4'],
[false, '1111:2222:3333:4444:::6666:1.2.3.4'],
[false, '1111:2222:3333:4444:5555:::1.2.3.4'],
[false, '::2222::4444:5555:6666:1.2.3.4'],
[false, '::2222:3333::5555:6666:1.2.3.4'],
[false, '::2222:3333:4444::6666:1.2.3.4'],
[false, '::2222:3333:4444:5555::1.2.3.4'],
[false, '1111::3333::5555:6666:1.2.3.4'],
[false, '1111::3333:4444::6666:1.2.3.4'],
[false, '1111::3333:4444:5555::1.2.3.4'],
[false, '1111:2222::4444::6666:1.2.3.4'],
[false, '1111:2222::4444:5555::1.2.3.4'],
[false, '1111:2222:3333::5555::1.2.3.4'],
// Missing parts [false, '::.'],
[false, '::..'],
[false, '::...'],
[false, '::1...'],
[false, '::1.2..'],
[false, '::1.2.3.'],
[false, '::.2..'],
[false, '::.2.3.'],
[false, '::.2.3.4'],
[false, '::..3.'],
[false, '::..3.4'],
[false, '::...4'],
// Extra : in front
[false, ':1111:2222:3333:4444:5555:6666:7777::'],
[false, ':1111:2222:3333:4444:5555:6666::'],
[false, ':1111:2222:3333:4444:5555::'],
[false, ':1111:2222:3333:4444::'],
[false, ':1111:2222:3333::'],
[false, ':1111:2222::'],
[false, ':1111::'],
[false, ':::'],
[false, ':1111:2222:3333:4444:5555:6666::8888'],
[false, ':1111:2222:3333:4444:5555::8888'],
[false, ':1111:2222:3333:4444::8888'],
[false, ':1111:2222:3333::8888'],
[false, ':1111:2222::8888'],
[false, ':1111::8888'],
[false, ':::8888'],
[false, ':1111:2222:3333:4444:5555::7777:8888'],
[false, ':1111:2222:3333:4444::7777:8888'],
[false, ':1111:2222:3333::7777:8888'],
[false, ':1111:2222::7777:8888'],
[false, ':1111::7777:8888'],
[false, ':::7777:8888'],
[false, ':1111:2222:3333:4444::6666:7777:8888'],
[false, ':1111:2222:3333::6666:7777:8888'],
[false, ':1111:2222::6666:7777:8888'],
[false, ':1111::6666:7777:8888'],
[false, ':::6666:7777:8888'],
[false, ':1111:2222:3333::5555:6666:7777:8888'],
[false, ':1111:2222::5555:6666:7777:8888'],
[false, ':1111::5555:6666:7777:8888'],
[false, ':::5555:6666:7777:8888'],
[false, ':1111:2222::4444:5555:6666:7777:8888'],
[false, ':1111::4444:5555:6666:7777:8888'],
[false, ':::4444:5555:6666:7777:8888'],
[false, ':1111::3333:4444:5555:6666:7777:8888'],
[false, ':::3333:4444:5555:6666:7777:8888'],
[false, ':1111:2222:3333:4444:5555::1.2.3.4'],
[false, ':1111:2222:3333:4444::1.2.3.4'],
[false, ':1111:2222:3333::1.2.3.4'],
[false, ':1111:2222::1.2.3.4'],
[false, ':1111::1.2.3.4'],
[false, ':::1.2.3.4'],
[false, ':1111:2222:3333:4444::6666:1.2.3.4'],
[false, ':1111:2222:3333::6666:1.2.3.4'],
[false, ':1111:2222::6666:1.2.3.4'],
[false, ':1111::6666:1.2.3.4'],
[false, ':::6666:1.2.3.4'],
[false, ':1111:2222:3333::5555:6666:1.2.3.4'],
[false, ':1111:2222::5555:6666:1.2.3.4'],
[false, ':1111::5555:6666:1.2.3.4'],
[false, ':::5555:6666:1.2.3.4'],
[false, ':1111:2222::4444:5555:6666:1.2.3.4'],
[false, ':1111::4444:5555:6666:1.2.3.4'],
[false, ':::4444:5555:6666:1.2.3.4'],
[false, ':1111::3333:4444:5555:6666:1.2.3.4'],
[false, ':::3333:4444:5555:6666:1.2.3.4'],
// Extra : at end,
[false, '1111:2222:3333:4444:5555:6666:::'],
[false, '1111:2222:3333:4444:5555:::'],
[false, '1111:2222:3333:4444:::'],
[false, '1111:2222:3333:::'],
[false, '1111:2222:::'],
[false, '1111:::'],
[false, '1111:2222:3333:4444:5555:6666::8888:'],
[false, '1111:2222:3333:4444:5555::8888:'],
[false, '1111:2222:3333:4444::8888:'],
[false, '1111:2222:3333::8888:'],
[false, '1111:2222::8888:'],
[false, '1111::8888:'],
[false, '::8888:'],
[false, '1111:2222:3333:4444:5555::7777:8888:'],
[false, '1111:2222:3333:4444::7777:8888:'],
[false, '1111:2222:3333::7777:8888:'],
[false, '1111:2222::7777:8888:'],
[false, '1111::7777:8888:'],
[false, '::7777:8888:'],
[false, '1111:2222:3333:4444::6666:7777:8888:'],
[false, '1111:2222:3333::6666:7777:8888:'],
[false, '1111:2222::6666:7777:8888:'],
[false, '1111::6666:7777:8888:'],
[false, '::6666:7777:8888:'],
[false, '1111:2222:3333::5555:6666:7777:8888:'],
[false, '1111:2222::5555:6666:7777:8888:'],
[false, '1111::5555:6666:7777:8888:'],
[false, '::5555:6666:7777:8888:'],
[false, '1111:2222::4444:5555:6666:7777:8888:'],
[false, '1111::4444:5555:6666:7777:8888:'],
[false, '::4444:5555:6666:7777:8888:'],
[false, '1111::3333:4444:5555:6666:7777:8888:'],
[false, '::3333:4444:5555:6666:7777:8888:'],
[false, '::2222:3333:4444:5555:6666:7777:8888:'],
[false, ''], // empty string
[true, '::1'], // loopback, compressed, non-routable
[true, '::'], // unspecified, compressed, non-routable
[true, '0:0:0:0:0:0:0:1'], // loopback, full
[true, '0:0:0:0:0:0:0:0'], // unspecified, full
[true, '2001:DB8:0:0:8:800:200C:417A'], // unicast, full
[true, 'FF01:0:0:0:0:0:0:101'], // multicast, full
[true, '2001:DB8::8:800:200C:417A'], // unicast, compressed
[true, 'FF01::101'], // multicast, compressed
[false, '2001:DB8:0:0:8:800:200C:417A:221'], // unicast, full
[false, 'FF01::101::2'], // multicast, compressed
[false, '02001:0000:1234:0000:0000:C1C0:ABCD:0876'],
[false, '2001:0000:1234:0000:00001:C1C0:ABCD:0876'],
// extra 0 not allowed!
[false, ' 2001:0000:1234:0000:0000:C1C0:ABCD:0876'],
// leading space
[false, ' 2001:0000:1234:0000:0000:C1C0:ABCD:0876'],
// trailing space
[false, '2001:0000:1234:0000:0000:C1C0:ABCD:0876 '],
// leading and trailing space
[false, '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'],
// junk after valid address
[false, '2001:0000:1234: 0000:0000:C1C0:ABCD:0876'],
// internal space
[false, '3ffe:0b00:0000:0001:0000:0000:000a'],
// seven segments
[false, 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'],
// nine segments
[false, '3ffe:b00::1::a'],
// double '::'
[false, '::1111:2222:3333:4444:5555:6666::'],
[true, '::1'],
[false, '1:2:3::4:5::7:8'],
// Double '::'
// IPv4 addresses as dotted-quads
[false, '2001:1:1:1:1:1:255Z255X255Y255'], // garbage instead of '.' in IPv4
[false, '::ffff:192x168.1.26'],
// ditto [true, '::ffff:192.168.1.1'],
[true, '0:0:0:0:0:0:13.1.68.3'], // IPv4-compatible IPv6 address, full, deprecated
[true, '0:0:0:0:0:FFFF:129.144.52.38'], // IPv4-mapped IPv6 address, full
[true, '::13.1.68.3'], // IPv4-compatible IPv6 address, compressed, deprecated
[true, '::FFFF:129.144.52.38'], // IPv4-mapped IPv6 address, compressed
[true, 'fe80:0:0:0:204:61ff:254.157.241.86'],
[true, 'fe80::204:61ff:254.157.241.86'],
[true, '::ffff:12.34.56.78'],
[false, '::ffff:2.3.4'],
[false, '::ffff:257.1.2.3'],
[false, '1.2.3.4:1111:2222:3333:4444::5555'], // Aeron
[false, '1.2.3.4:1111:2222:3333::5555'],
[false, '1.2.3.4:1111:2222::5555'],
[false, '1.2.3.4:1111::5555'],
[false, '1.2.3.4::5555'],
[false, '1.2.3.4::'],
// Testing IPv4 addresses represented as dotted-quads
// Leading zero's in IPv4 addresses not allowed: some systems treat the
// leading '0' in '.086' as the start of an octal number
// Update: The BNF in RFC-3986 explicitly defines the dec-octet
// (for IPv4 addresses) not to have a leading zero
// [false, 'fe80:0000:0000:0000:0204:61ff:254.157.241.086'],
[true, '::ffff:192.0.2.128'], // but this is OK, since there's a single digit
// Not testing address with subnet mask
// [true,'2001:0DB8:0000:CD30:0000:0000:0000:0000/60'],
// full, with prefix
// [true,'2001:0DB8::CD30:0:0:0:0/60'],
// compressed, with prefix
// [true,'2001:0DB8:0:CD30::/60'],
// compressed, with prefix
// 2
// [true,'::/128'],
// compressed, unspecified address type, non-routable
// [true,'::1/128'],
// compressed, loopback address type, non-routable
// [true,'FF00::/8'],
// compressed, multicast address type
// [true,'FE80::/10'],
// compressed, link-local unicast, non-routable
// [true,'FEC0::/10'],
// compressed, site-local unicast, deprecated
// [false,'124.15.6.89/60'],
// standard IPv4, prefix not allowed
[true, 'fe80:0000:0000:0000:0204:61ff:fe9d:f156'],
[true, 'fe80:0:0:0:204:61ff:fe9d:f156'],
[true, 'fe80::204:61ff:fe9d:f156'],
[true, 'fe80::1'],
[true, '::ffff:c000:280'],
// Aeron supplied these test cases
[false, '1111:2222:3333:4444::5555:'],
[false, '1111:2222:3333::5555:'],
[false, '1111:2222::5555:'],
[false, '1111::5555:'],
[false, '::5555:'],
[false, ':1111:2222:3333:4444::5555'],
[false, ':1111:2222:3333::5555'],
[false, ':1111:2222::5555'],
[false, ':1111::5555'],
[false, ':::5555'],
// Additional test cases
// from http://rt.cpan.org/Public/Bug/Display.html?id=50693
[true, '2001:0db8:85a3:0000:0000:8a2e:0370:7334'],
[true, '2001:db8:85a3:0:0:8a2e:370:7334'],
[true, '2001:db8:85a3::8a2e:370:7334'],
[true, '2001:0db8:0000:0000:0000:0000:1428:57ab'],
[true, '2001:0db8:0000:0000:0000::1428:57ab'],
[true, '2001:0db8:0:0:0:0:1428:57ab'],
[true, '2001:0db8:0:0::1428:57ab'],
[true, '2001:0db8::1428:57ab'],
[true, '2001:db8::1428:57ab'],
[true, '::ffff:0c22:384e'],
[true, '2001:0db8:1234:0000:0000:0000:0000:0000'],
[true, '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff'],
[true, '2001:db8:a::123'],
[false, '123'],
[false, 'ldkfj'], // valid domain name
[false, '2001::FFD3::57ab'],
[false, '2001:db8:85a3::8a2e:37023:7334'],
[false, '2001:db8:85a3::8a2e:370k:7334'],
[false, '1:2:3:4:5:6:7:8:9'],
[false, '1::2::3'],
[false, '1:::3:4:5'],
[false, '1:2:3::4:5:6:7:8:9'],
// New from Aeron
// Playing with combinations of '0' and '::'
// NB: these are all sytactically correct, but are bad form
// because '0' adjacent to '::' should be combined into '::'
[true, '::0:0:0:0:0:0:0'],
[true, '::0:0:0:0:0:0'],
[true, '::0:0:0:0:0'],
[true, '::0:0:0:0'],
[true, '::0:0:0'],
[true, '::0:0'],
[true, '::0'],
[true, '0:0:0:0:0:0:0::'],
[true, '0:0:0:0:0:0::'],
[true, '0:0:0:0:0::'],
[true, '0:0:0:0::'],
[true, '0:0:0::'],
[true, '0:0::'],
[true, '0::'],
// Double ::'
// Too many components'
[false, '::.'],
// Extra : at end
// Additional cases: http://crisp.tweakblogs.net/blog/2031/ipv6-validation-%28and-caveats%29.html
[true, '0:a:b:c:d:e:f::'],
[true, '::0:a:b:c:d:e:f'],
// syntactically correct, but bad form (::0:... could be combined)
[true, 'a:b:c:d:e:f:0::'],
[false, ':10.0.0.1'],
];
testcases.forEach((testcase) => {
const actual = isValidIpv6(testcase[1]);
const expected = testcase[0];
assert.same(actual, expected, `${testcase[1]} should return ${expected}`);
});
assert.end();
});