use strict;
use Test;
BEGIN { plan tests => 5 }
use lib qw(..);
use Data::Random qw( rand_chars );
use vars qw( %charsets );
%charsets = (
all => [
0 .. 9,
'a' .. 'z',
'A' .. 'Z',
'#',
',',
qw( ~ ! @ $ % ^ & * ( ) _ + = - { } | : " < > ? / . ' ; [ ] \ ` )
],
alpha => [ 'a' .. 'z', 'A' .. 'Z' ],
upperalpha => [ 'A' .. 'Z' ],
loweralpha => [ 'a' .. 'z' ],
numeric => [ 0 .. 9 ],
alphanumeric => [ 0 .. 9, 'a' .. 'z', 'A' .. 'Z' ],
misc => [
'#',
',',
qw( ~ ! @ $ % ^ & * ( ) _ + = - { } | : " < > ? / . ' ; [ ] \ ` )
],
);
my %valid_chars;
foreach my $charset ( keys %charsets ) {
@{ $valid_chars{$charset} }{ @{ $charsets{$charset} } } = ();
}
# Test default w/ no params -- should return one entry
{
my $pass = 1;
foreach my $charset ( keys %charsets ) {
my $num_chars = @{ $charsets{$charset} };
my $i = 0;
while ( $pass && $i < $num_chars ) {
my @chars = rand_chars( set => $charsets{$charset} );
$pass = 0
unless ( @chars == 1
&& exists( $valid_chars{$charset}->{ $chars[0] } ) );
$i++;
}
}
ok($pass);
}
# Test size option
{
my $pass = 1;
foreach my $charset ( keys %charsets ) {
my $num_chars = @{ $charsets{$charset} };
my $i = 0;
while ( $pass && $i < $num_chars ) {
my @chars = rand_chars( set => $charset, size => $i + 1 );
$pass = 0 unless @chars == ( $i + 1 );
foreach (@chars) {
$pass = 0 unless exists( $valid_chars{$charset}->{$_} );
}
$i++;
}
}
ok($pass);
}
# Test max/min option
{
my $pass = 1;
foreach my $charset ( keys %charsets ) {
my $num_chars = @{ $charsets{$charset} };
my $i = 0;
while ( $pass && $i < $num_chars ) {
my @chars = rand_chars(
set => $charsets{$charset},
min => $i,
max => $num_chars
);
$pass = 0 unless ( @chars >= $i && @chars <= $num_chars );
foreach (@chars) {
$pass = 0 unless exists( $valid_chars{$charset}->{$_} );
}
$i++;
}
}
ok($pass);
}
# Test size w/ min/max set
{
my $pass = 1;
foreach my $charset ( keys %charsets ) {
my $num_chars = @{ $charsets{$charset} };
my $i = 0;
while ( $pass && $i < $num_chars ) {
my @chars = rand_chars(
set => $charsets{$charset},
size => $i + 1,
min => $i,
max => $num_chars
);
$pass = 0 unless @chars == ( $i + 1 );
foreach (@chars) {
$pass = 0 unless exists( $valid_chars{$charset}->{$_} );
}
$i++;
}
}
ok($pass);
}
# Test w/ shuffle set to 0
{
my $pass = 1;
sub _get_index {
my ( $charset, $char ) = @_;
my $i = 0;
while ( $charsets{$charset}->[$i] ne $char
&& $i < @{ $charsets{$charset} } )
{
$i++;
}
$i;
}
foreach my $charset ( keys %charsets ) {
my $num_chars = @{ $charsets{$charset} };
my $i = 0;
while ( $pass && $i < $num_chars ) {
my @chars =
rand_chars( set => $charsets{$charset}, size => 2, shuffle => 0 );
$pass = 0
unless ( @chars == 2
&& _get_index( $charset, $chars[0] ) <
_get_index( $charset, $chars[1] ) );
foreach (@chars) {
$pass = 0 unless exists( $valid_chars{$charset}->{$_} );
}
$i++;
}
}
ok($pass);
}