The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package SharedTests;

use strict;

use Test::More;

my $tests = 14;
sub run_tests
{
    my %p = @_;

    if ( $p{require} )
    {
        eval "require $p{require}";
        if ( $@ =~ /locate/ )
        {
            plan skip_all => "These tests require $p{require}";
            exit;
        }
    }

    $tests += $p{extra_tests} || 0;

    plan tests => $tests;

    use_ok( $p{class} );

    my $p = $p{p} || {};

    {
        my $th = $p{class}->new(%$p);

        $th->add( [ qw( a b c d E f ) ],
                  [ qw( 1 2 3 HELLO hello ) ] );

        my @words = sort $th->find('a');
        is( scalar @words, 6,
            "six matches should be returned" );

        my $x = 0;
        foreach ( qw( E a b c d f ) )
        {
            is( $words[$x++], $_,
                "\$words[$x] should be $_" );
        }

        my @find_A = $th->find('A');
        is( scalar @find_A, 0,
            "the object should be case sensitive for searches" );

        $th->delete('E');

        is( scalar $th->find('a'), 0,
            "delete should remove all items in a list" );
    }

    {
        my $th = $p{class}->new( %$p, ignore_case => 1 );

        $th->add( [ qw{ a b c d E f } ],
                  [ qw{ 1 2 3 HELLO hello } ] );

        is( scalar $th->find('e'), 6,
            "object should be case insensitive" );

        is( scalar $th->find('E'), 6,
            "object should be case insensitive (second test)" );

        $th->add( ['e', 'q'], [7, 8] );

        is( scalar $th->find('q'), 8,
            "adding multiple lists at once" );

        is( scalar $th->find('7'), 2,
            "adding multiple lists at once (second test)" );
    }
}

1;