#!/usr/bin/perl
use strict;
use lib qw {blib/lib};
use Regexp::Common;
sub create_parts;
my $normal = $RE {zip} {Denmark};
my $iso = $RE {zip} {Denmark} {-country => "iso"};
my $cept = $RE {zip} {Denmark} {-country => "cept"};
my $country = $RE {zip} {Denmark} {-country => "DEN"};
my ($prefix, $no_prefix, $iso_prefix, $cept_prefix);
unless ($] < 5.00503) {
$prefix = $RE {zip} {Denmark} {-prefix => 'yes'};
$no_prefix = $RE {zip} {Denmark} {-prefix => 'no'};
$iso_prefix = $iso -> {-prefix => 'yes'};
$cept_prefix = $cept -> {-prefix => 'yes'};
}
my @tests = (
[ normal => $normal => {no_prefix => NORMAL_PASS | FAIL,
iso_prefix => NORMAL_PASS | FAIL,
cept_prefix => NORMAL_PASS | FAIL,
prefix_dk => NORMAL_FAIL,
prefix_DEN => NORMAL_FAIL}],
[ iso => $iso => {no_prefix => NORMAL_PASS,
iso_prefix => NORMAL_PASS,
cept_prefix => NORMAL_PASS}],
[ cept => $cept => {no_prefix => NORMAL_PASS,
iso_prefix => NORMAL_PASS,
cept_prefix => NORMAL_PASS}],
[ country => $country => {no_prefix => NORMAL_PASS,
iso_prefix => NORMAL_FAIL,
cept_prefix => NORMAL_FAIL,
prefix_DEN => NORMAL_PASS}],
);
push @tests => (
[ prefix => $prefix => {no_prefix => NORMAL_FAIL,
iso_prefix => NORMAL_PASS,
cept_prefix => NORMAL_PASS}],
['no prefix' => $no_prefix => {no_prefix => NORMAL_PASS,
iso_prefix => NORMAL_FAIL,
cept_prefix => NORMAL_FAIL}],
['iso prefix' => $iso_prefix => {no_prefix => NORMAL_FAIL,
iso_prefix => NORMAL_PASS,
cept_prefix => NORMAL_PASS}],
['cept prefix' => $cept_prefix => {no_prefix => NORMAL_FAIL,
iso_prefix => NORMAL_PASS,
cept_prefix => NORMAL_PASS}],
) unless $] < 5.00503;
my ($good, $bad) = create_parts;
run_tests version => "Regexp::Common::zip",
tests => \@tests,
good => $good,
bad => $bad,
query => \&zip,
wanted => \&wanted;
sub zip {
my ($tag, $parts) = @_;
my $zip = $$parts [0] . $$parts [1] . $$parts [2];
return $zip if $tag eq "no_prefix";
return "DK-$zip" if $tag eq "iso_prefix";
return "DK-$zip" if $tag eq "cept_prefix";
return "$1-$zip" if $tag =~ /^prefix_(.*)/;
die "Unknown tag '$tag' in &zip\n";
}
sub wanted {
my ($tag, $parts) = @_;
my @wanted;
$wanted [0] = $_;
$wanted [1] = undef;
$wanted [1] = "DK" if $tag eq "iso_prefix";
$wanted [1] = "DK" if $tag eq "cept_prefix";
$wanted [1] = $1 if $tag =~ /^prefix_(.*)/;
$wanted [2] = $$parts [0] . $$parts [1] . $$parts [2];
push @wanted => @$parts [0, 1, 2];
return \@wanted;
}
sub _ {
my ($min, $max, $cache, $exclude) = @_;
$exclude ||= {};
my $x;
{
$x = "";
$x .= int rand 10 for 1 .. $_ [0] + int rand (1 + $max - $min);
redo if $exclude -> {$x} || $cache -> {$x} ++;
}
$x;
}
sub create_parts {
my (@good, @bad);
# Distribution regions.
my $a = {};
$good [0] = [map {_ 1, 1, $a, {0 => 1}} 1 .. 4];
$bad [0] = [0];
# Distribution district.
my $b = {0 => 1};
$good [1] = [0, map {_ 1, 1, $b} 1 .. 4];
$bad [1] = ['a'];
# Other numbers.
my $c = {'00' => 1};
$good [2] = ['00', map {_ 2, 2, $c} 2 .. 10];
$bad [2] = ["", "fnord", (map {_ 1, 1, $c} 1 .. 2),
(map {_ 3, 6, $c} 1 .. 2)];
(\@good, \@bad)
}
__END__