use strict; use warnings; use blib; use Test::More tests => 44; BEGIN { use_ok('Mail::SRS'); } BEGIN { use_ok('Mail::SRS::Guarded'); } BEGIN { use_ok('Mail::SRS::Reversible'); } BEGIN { use_ok('Mail::SRS::Shortcut'); } foreach my $subclass (qw(Guarded Reversible Shortcut)) { my $class = "Mail::SRS::$subclass"; my $srs0 = $class->new( Secret => "foo", Separator => "+", ); my $srs1 = $class->new( Secret => "foo", Separator => "-", ); my $srs2 = $class->new( Secret => "foo", Separator => "=", ); my @tests = qw( user@domain-with-dash.com user-with-dash@domain.com user+with+plus@domain.com user=with=equals@domain.com user%with!everything&everything=@domain.somewhere ); my $alias0 = 'alias@host.com'; my $alias1 = 'name@forwarder.com'; my $alias2 = 'user@postal.com'; foreach (@tests) { my $srs0addr = $srs0->forward($_, $alias0); my $srs0rev = $srs0->reverse($srs0addr); is($srs0rev, $_, 'Idempotent on ' . $_); my $srs1addr = $srs1->forward($srs0addr, $alias1); my $srs1rev = $srs1->reverse($srs1addr); if ($subclass eq 'Shortcut') { is($srs1rev, $_, 'Shortcut S2 idempotent on ' . $_); } else { is($srs1rev, $srs0addr, 'S2 idempotent on ' . $srs0addr); } my $srs2addr = $srs2->forward($srs1addr, $alias2); my $srs2rev = $srs2->reverse($srs2addr); if ($subclass eq 'Guarded') { is($srs2rev, $srs0addr, 'Guarded S3 idempotent on ' . $srs1addr); } elsif ($subclass eq 'Reversible') { is($srs2rev, $srs1addr, 'Reversible S3 idempotent on ' . $srs1addr); } } }