The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::Simple tests => 8;

use Text::GenderFromName qw( :DEFAULT &gender_init );

my %genders = ('Josephine' => 'f',
               'Michael' => 'm',
               'Dondi' => 'm',
               'Jonny' => 'm',
               'Pascal' => 'm',
               'Velvet' => 'f',
               'Eamon' => 'm',
               'FLKMLKSJN' => '');


my @names = ('Josephine',
             'Michael',
             'Dondi', 
             'Jonny',
             'Pascal',
             'Velvet',
             'Eamon',
             'FLKMLKSJN');

push @Text::GenderFromName::MATCH_LIST, 'main::user_sub';

my @tests = @Text::GenderFromName::MATCH_LIST;

# Test for Text::DoubleMetaphone. Skip those tests if not installed.

eval "require Text::DoubleMetaphone";

my %skip;

if ($@) { 
    my @metaphones = ('one_only_metaphone', 'either_weight_metaphone');

    splice(@tests, 2, 0, @metaphones);

    for (@metaphones) {
        $skip{$_} = "Skipping $_: required module not installed.";
    }
}

# First of all, make sure we have the right number of match subs.

ok(@tests == 7, 'Found all 7 match subs');

for (my $i = 0; $i < @tests; $i++) {
    # Test just this one rule.
    @Text::GenderFromName::MATCH_LIST = ($tests[$i]);

    # Skip if in %skip.
    if ($skip{$tests[$i]}) { ok(1, $skip{$tests[$i]}); next; }

    my $pos = &gender($names[$i]);
    my $neg = &gender($names[$i+1]);

    ok($pos eq $genders{$names[$i]} && !$neg,
       "$tests[$i]: $names[$i] => [$pos], $names[$i+1] => [$neg]");
}

sub user_sub {
    my $name = shift;
    return 'm' if $name =~ /^eamon/;
}