The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

# Adapted from http://gist.github.com/212780

use strict;
use warnings;

use Test::More tests => 7;
use Digest::Whirlpool;
#use Digest::MD5;

my @digesters;

for ( 1..5 ){
  push @digesters, {
      whirlpool => Digest::Whirlpool->new(),
      #md5 => Digest::MD5->new()
  };
}

# seeing that its constant accross instances.

for ( @digesters ) {
  my $hex = $_->{whirlpool}->hexdigest();
  my $hexd = $_->{whirlpool}->hexdigest();

  is($hex, $hexd, "Whirlpool: Two digest with no input added are the same");

  #$hex = $_->{md5}->hexdigest();
  #$hexd = $_->{md5}->hexdigest();

  #is($hex, $hexd, "MD5: Two digest with no input added are the same");
}

sub some_key
{
    my $hash = shift;
    if (my @keys = keys %$hash) {
        return $keys[0];
    }
    return;
}

my $tests = 1000;


# seeing that within a single digester, the same empty value results in a pseudorandom sequence generation.
{
    my (%whirl, %md5);

    $digesters[0]->{whirlpool}->reset();
    #$digesters[0]->{md5}->reset();

    for ( 1..$tests ) {
        my $digest = $digesters[0]->{whirlpool}->hexdigest;
        $whirl{$digest} = 1;
    }

    is_deeply({ some_key(\%whirl) => 1 }, \%whirl, "Whirlpool: Should only have one digest");

    #for ( 1..$tests ){
    #    my $digest = $digesters[0]->{md5}->hexdigest;
    #    $md5{ $digest } = 1;
    #}

    #is_deeply({ some_key(\%md5) => 1 }, \%md5, "MD5: Should only have one digest");
}


# seeing that the digester doesn't conform to the specification that the rest conform to
# with regard to hexdigest resetting the state.
{
    my (%whirl, %md5);

    $digesters[0]->{whirlpool}->reset();
    #$digesters[0]->{md5}->reset();

    for ( 1..$tests ) {
        $digesters[0]->{whirlpool}->add('hello');
        my $digest = $digesters[0]->{whirlpool}->hexdigest;
        $whirl{$digest} = 1;
    }

    is_deeply({ some_key(\%whirl) => 1 }, \%whirl, "Whirlpool: Should only have one digest");

    #for ( 1..$tests ){
    #    $digesters[0]->{md5}->add('hello');
    #    my $digest = $digesters[0]->{md5}->hexdigest;
    #    $md5{ $digest } = 1;
    #}

    #is_deeply({ some_key(\%md5) => 1 }, \%md5, "MD5: Should only have one digest");
}