1#!perl
2
3use strict;
4use warnings;
5use Test::More tests => 150;
6use Net::CIDR::Set;
7use Net::CIDR::Set::IPv4;
8use Net::CIDR::Set::IPv6;
9
10{
11  # _inc
12  for my $b ( 0 .. 31 ) {
13    my $n = 1 << $b;
14    my $p = $n - 1;
15    my $q = $n + 1;
16    is unpack( 'N', Net::CIDR::Set::_inc( pack 'N', $p ) ), $n,
17     "_inc($p) == $n";
18    is unpack( 'N', Net::CIDR::Set::_inc( pack 'N', $n ) ), $q,
19     "_inc($n) == $q";
20    is unpack( 'N', Net::CIDR::Set::_dec( pack 'N', $n ) ), $p,
21     "_dec($n) == $p";
22    is unpack( 'N', Net::CIDR::Set::_dec( pack 'N', $q ) ), $n,
23     "_dec($q) == $n";
24  }
25  my @big = (
26    {
27      name   => '0 to 1',
28      before => [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
29      after  => [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ]
30    },
31    {
32      name => 'wrap some',
33      before =>
34       [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255 ],
35      after => [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ]
36    },
37    {
38      name   => 'wrap all',
39      before => [
40        255, 255, 255, 255, 255, 255, 255, 255,
41        255, 255, 255, 255, 255, 255, 255, 255
42      ],
43      after => [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
44    },
45  );
46  for my $b ( @big ) {
47    my $name = $b->{name};
48    my @inc  = unpack 'C*',
49     Net::CIDR::Set::_inc( pack 'C*', @{ $b->{before} } );
50    is_deeply [@inc], $b->{after}, "$name: _inc";
51    my @dec = unpack 'C*', Net::CIDR::Set::_dec( pack 'C*', @inc );
52    is_deeply [@dec], $b->{before}, "$name: _dec";
53  }
54}
55
56{
57  my @case = (
58    {
59      ip     => '127.0.0.1',
60      expect => [ [ 0, 127, 0, 0, 1 ], [ 0, 127, 0, 0, 2 ] ]
61    },
62    {
63      ip     => '192.168.0.0/16',
64      expect => [ [ 0, 192, 168, 0, 0 ], [ 0, 192, 169, 0, 0 ] ]
65    },
66    {
67      ip     => '192.168.0.0/255.255.0.0',
68      expect => [ [ 0, 192, 168, 0, 0 ], [ 0, 192, 169, 0, 0 ] ]
69    },
70    {
71      ip    => '192.168.0.0/0.0.255.255',
72      error => qr{Can't decode}
73    },
74    {
75      ip     => '0.0.0.0/0',
76      expect => [ [ 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ]
77    },
78    {
79      ip     => '192.168.0.12-192.168.1.13',
80      expect => [ [ 0, 192, 168, 0, 12 ], [ 0, 192, 168, 1, 14 ] ]
81    },
82    {
83      ip     => '0.0.0.0-255.255.255.255',
84      expect => [ [ 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ]
85    },
86  );
87  for my $case ( @case ) {
88    my @enc = eval { Net::CIDR::Set::IPv4->encode( $case->{ip} ) };
89    if ( my $error = $case->{error} ) {
90      like $@, $error, 'error';
91    }
92    else {
93      my @got = map { [ unpack 'C*', $_ ] } @enc;
94      is_deeply [@got], $case->{expect}, "encode $case->{ip}";
95    }
96  }
97}
98
99{
100  my @case = (
101    {
102      range => [ [ 0, 127, 0, 0, 1 ], [ 0, 127, 0, 0, 2 ] ],
103      generic => 0,
104      expect  => '127.0.0.1',
105    },
106    {
107      range => [ [ 0, 127, 0, 0, 1 ], [ 0, 127, 0, 0, 2 ] ],
108      generic => 1,
109      expect  => '127.0.0.1/32',
110    },
111    {
112      range => [ [ 0, 127, 0, 0, 1 ], [ 0, 127, 0, 0, 2 ] ],
113      generic => 2,
114      expect  => '127.0.0.1-127.0.0.1',
115    },
116    {
117      range => [ [ 0, 192, 168, 0, 12 ], [ 0, 192, 168, 1, 14 ] ],
118      generic => 0,
119      expect  => '192.168.0.12-192.168.1.13',
120    },
121    {
122      range => [ [ 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ],
123      generic => 0,
124      expect  => '0.0.0.0/0',
125    },
126    {
127      range => [ [ 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ],
128      generic => 1,
129      expect  => '0.0.0.0/0',
130    },
131    {
132      range => [ [ 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ],
133      generic => 2,
134      expect  => '0.0.0.0-255.255.255.255',
135    },
136  );
137  for my $case ( @case ) {
138    my $got
139     = Net::CIDR::Set::IPv4->decode(
140      ( map { pack 'C*', @$_ } @{ $case->{range} } ),
141      $case->{generic} );
142    is $got, $case->{expect}, "$got";
143  }
144}
145
146{
147  is Net::CIDR::Set::_conjunction( or => 1, 2, 3 ), '1, 2 or 3',
148   '_conjunction';
149  is Net::CIDR::Set::_and( 1, 2, 3 ), '1, 2 and 3', '_and';
150}
151
152# vim:ts=2:sw=2:et:ft=perl
153
154