use Test::More; use NetAddr::IP qw(Exclude Subtract); my @r = ( ['10.0.0.0/8','10.0.0.0/9'], ['10.0.0.0/8','10.0.0.0/8'], ['10.0.0.0/8','10.128.0.0/9'], ['10.0.0.0/8','10.128.0.0/10'], ['10.0.0.0/8','10.0.0.0/32'], ['192.168.0.0/24','192.168.0.255/32'], ['192.168.0.0/23','192.168.0.127/32'], ['1.2.3.4/32','1.2.3.4/32'], ['0.0.0.0/0','0.0.0.0/32'], ); plan tests => 1 + 19 * scalar @r; SKIP: { my $res = Subtract([],[]); is("@$res", "", "Subtract([],[]) returns an empty list"); foreach my $case (@r) { my $whole = [NetAddr::IP->new($case->[0])]; my $part1 = [NetAddr::IP->new($case->[1])]; my ($low,$up) = Exclude($whole->[0],$part1->[0]); my $part2 = [@{$low},@{$up}]; my $res = []; $res = Subtract($whole,$part1); is("@$res", "@$part2", "Subtract(@$whole,@$part1) returns @$part2"); $res = $whole->[0]->Subtract($part1); is("@$res", "@$part2", "($whole->[0])->Subtract(@$part1) returns @$part2"); $res = Subtract($whole,$part2); is("@$res", "@$part1", "Subtract(@$whole,@$part2) returns @$part1"); $res = $whole->[0]->Subtract($part2); is("@$res", "@$part1", "($whole->[0])->Subtract(@$part2) returns @$part1"); $res = Subtract($part1,$part2); is("@$res", "@$part1", "Subtract(@$part1,@$part2) returns @$part1"); $res = $part1->[0]->Subtract($part2); is("@$res", "@$part1", "($part1->[0])->Subtract(@$part2) returns @$part1"); $res = Subtract($part2,$part1); is("@$res", "@$part2", "Subtract(@$part2,@$part1) returns @$part2"); $res = Subtract(Subtract($whole,$part1),$part2); is("@$res", "", "Subtract(Subtract(@$whole,@$part1),$part2) returns an empty list"); $res = Subtract($whole->[0]->Subtract($part1),$part2); is("@$res", "", "Subtract(($whole->[0])->Subtract(@$part1),$part2) returns an empty list"); $res = Subtract(Subtract($whole,$part2),$part1); is("@$res", "", "Subtract(Subtract(@$whole,@$part2),$part1) returns an empty list"); $res = Subtract($whole->[0]->Subtract($part2),$part1); is("@$res", "", "Subtract(($whole->[0])->Subtract(@$part2),$part1) returns an empty list"); $res = Subtract($whole,$whole); is("@$res", "", "Subtract(@$whole,@$whole) returns an empty list"); $res = $whole->[0]->Subtract($whole); is("@$res", "", "($whole->[0])->Subtract(@$whole) returns an empty list"); $res = Subtract($part1,$part1); is("@$res", "", "Subtract(@$part1,@$part1) returns an empty list"); $res = $part1->[0]->Subtract($part1); is("@$res", "", "($part1->[0])->Subract(@$part1) returns an empty list"); $res = Subtract($part2,$part2); is("@$res", "", "Subtract(@$part2,@$part2) returns an empty list"); $res = Subtract($part1,$whole); is("@$res", "", "Subtract(@$part1,@$whole) returns an empty list"); $res = $part1->[0]->Subtract($whole); is("@$res", "", "($part1->[0])->Subtract(@$whole) returns an empty list"); $res = Subtract($part2,$whole); is("@$res", "", "Subtract(@$part2,@$whole) returns an empty list"); } }