The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 41;
BEGIN { use_ok('String::MkPasswd') };

String::MkPasswd->import("mkpasswd");

my $passwd = mkpasswd();

ok(length $passwd == 9, "length = 9");
ok(&count_digits($passwd) == 2, "digits = 2");
ok(&count_lower($passwd) == 4, "lower = 4");
ok(&count_upper($passwd) == 2, "upper = 2");
ok(&count_special($passwd) == 1, "special = 1");

$passwd = mkpasswd(
	-length		=> 20,
	-minnum		=> 4,
	-minlower	=> 7,
	-minupper	=> 6,
	-minspecial	=> 3,
);

ok(length $passwd == 20, "length = 20");
ok(&count_digits($passwd) == 4, "digits = 4");
ok(&count_lower($passwd) == 7, "lower = 7");
ok(&count_upper($passwd) == 6, "upper = 6");
ok(&count_special($passwd) == 3, "special = 3");

$passwd = mkpasswd(
	-minnum	=> 0,
);

ok(length $passwd == 9, "length = 9");
ok(&count_digits($passwd) == 0, "digits = 0");
ok(&count_lower($passwd) == 6, "lower = 6");
ok(&count_upper($passwd) == 2, "upper = 2");
ok(&count_special($passwd) == 1, "special = 1");

$passwd = mkpasswd(
	-minlower	=> 0,
);

ok(length $passwd == 9, "length = 9");
ok(&count_digits($passwd) == 2, "digits = 2");
ok(&count_lower($passwd) == 4, "lower = 4");
ok(&count_upper($passwd) == 2, "upper = 2");
ok(&count_special($passwd) == 1, "special = 1");

$passwd = mkpasswd(
	-minupper	=> 0,
);

ok(length $passwd == 9, "length = 9");
ok(&count_digits($passwd) == 2, "digits = 2");
ok(&count_lower($passwd) == 6, "lower = 6");
ok(&count_upper($passwd) == 0, "upper = 0");
ok(&count_special($passwd) == 1, "special = 1");

$passwd = mkpasswd(
	-minspecial	=> 0,
);

ok(length $passwd == 9, "length = 9");
ok(&count_digits($passwd) == 2, "digits = 2");
ok(&count_lower($passwd) == 5, "lower = 5");
ok(&count_upper($passwd) == 2, "upper = 2");
ok(&count_special($passwd) == 0, "special = 0");

$passwd = mkpasswd(
	-minnum		=> 0,
	-minlower	=> 0,
	-minupper	=> 0,
	-minspecial	=> 0,
);

ok(length $passwd == 9, "length = 9");
ok(&count_digits($passwd) == 0, "digits = 0");
ok(&count_lower($passwd) == 9, "lower = 9");
ok(&count_upper($passwd) == 0, "upper = 0");
ok(&count_special($passwd) == 0, "special = 0");

$passwd = mkpasswd(
	-length		=> 3,
	-minnum		=> 3,
	-minlower	=> 0,
	-minupper	=> 0,
	-minspecial	=> 0,
);

ok(length $passwd == 3, "length = 3");
ok(&count_digits($passwd) == 3, "digits = 3");
ok(&count_lower($passwd) == 0, "lower = 0");
ok(&count_upper($passwd) == 0, "upper = 0");
ok(&count_special($passwd) == 0, "special = 0");

sub count_digits {
	my $re = qr/([0-9])/;
	my $count = 0;
	$count++ while $_[0] =~ /$re/g;
	return $count;
}

sub count_lower {
	my $re = qr/([a-z])/;
	my $count = 0;
	$count++ while $_[0] =~ /$re/g;
	return $count;
}

sub count_special {
	my $re = qr/([!@#\$%~^&*()=_+\[\]{}\\|;:'"<>,.?\/-])/;
	my $count = 0;
	$count++ while $_[0] =~ /$re/g;
	return $count;
}

sub count_upper {
	my $re = qr/([A-Z])/;
	my $count = 0;
	$count++ while $_[0] =~ /$re/g;
	return $count;
}