use strict;
use warnings;

use Test::More;

require Tie::SubstrHash;

my %a;

tie %a, 'Tie::SubstrHash', 3, 3, 3;

$a{abc} = 123;
$a{bcd} = 234;

is( $a{abc}, 123 );

is( keys %a, 2 );

delete $a{abc};

is( $a{bcd}, 234 );

is( ( values %a )[0], 234 );

eval { $a{abcd} = 123 };
like( $@, qr/Key "abcd" is not 3 characters long/ );

eval { $a{abc} = 1234 };
like( $@, qr/Value "1234" is not 3 characters long/ );

eval { $a = $a{abcd}; $a++ };
like( $@, qr/Key "abcd" is not 3 characters long/ );

@a{qw(abc cde)} = qw(123 345);

is( $a{cde}, 345 );

eval { $a{def} = 456 };
like( $@, qr/Table is full \(3 elements\)/ );

%a = ();

is( keys %a, 0 );

# Tests contributed by Linc Madison.

my $hashsize = 119;    # arbitrary values from my data
my %test;
tie %test, "Tie::SubstrHash", 13, 86, $hashsize;

for ( my $i = 1 ; $i <= $hashsize ; $i++ ) {
    my $key1 = $i + 100_000;     # fix to uniform 6-digit numbers
    my $key2 = "abcdefg$key1";
    $test{$key2} = ( "abcdefgh" x 10 ) . "$key1";
}

for ( my $i = 1 ; $i <= $hashsize ; $i++ ) {
    my $key1 = $i + 100_000;
    my $key2 = "abcdefg$key1";
    ok( $test{$key2} );
}

is( Tie::SubstrHash::findgteprime(1), 2 );

is( Tie::SubstrHash::findgteprime(2), 2 );

is( Tie::SubstrHash::findgteprime(5.5), 7 );

is( Tie::SubstrHash::findgteprime(13), 13 );

is( Tie::SubstrHash::findgteprime(13.000001), 17 );

is( Tie::SubstrHash::findgteprime(114), 127 );

is( Tie::SubstrHash::findgteprime(1000), 1009 );

is( Tie::SubstrHash::findgteprime(1024), 1031 );

is( Tie::SubstrHash::findgteprime(10000), 10007 );

done_testing();