1#!perl -w 2 3use Test qw(plan ok); 4plan tests => 12; 5 6{ 7 package LenDigest; 8 require Digest::base; 9 use vars qw(@ISA); 10 @ISA = qw(Digest::base); 11 12 sub new { 13 my $class = shift; 14 my $str = ""; 15 bless \$str, $class; 16 } 17 18 sub add { 19 my $self = shift; 20 $$self .= join("", @_); 21 return $self; 22 } 23 24 sub digest { 25 my $self = shift; 26 my $len = length($$self); 27 my $first = ($len > 0) ? substr($$self, 0, 1) : "X"; 28 $$self = ""; 29 return sprintf "$first%04d", $len; 30 } 31} 32 33my $ctx = LenDigest->new; 34ok($ctx->digest, "X0000"); 35ok($ctx->hexdigest, "5830303030"); 36ok($ctx->b64digest, "WDAwMDA"); 37 38$ctx->add("foo"); 39ok($ctx->digest, "f0003"); 40 41$ctx->add("foo"); 42ok($ctx->hexdigest, "6630303033"); 43 44$ctx->add("foo"); 45ok($ctx->b64digest, "ZjAwMDM"); 46 47open(F, ">xxtest$$") || die; 48binmode(F); 49print F "abc" x 100, "\n"; 50close(F) || die; 51 52open(F, "xxtest$$") || die; 53$ctx->addfile(*F); 54close(F); 55unlink("xxtest$$") || warn; 56 57ok($ctx->digest, "a0301"); 58 59eval { 60 $ctx->add_bits("1010"); 61}; 62ok($@ =~ /^Number of bits must be multiple of 8/); 63 64$ctx->add_bits("01010101"); 65ok($ctx->digest, "U0001"); 66 67eval { 68 $ctx->add_bits("abc", 12); 69}; 70ok($@ =~ /^Number of bits must be multiple of 8/); 71 72$ctx->add_bits("abc", 16); 73ok($ctx->digest, "a0002"); 74 75$ctx->add_bits("abc", 32); 76ok($ctx->digest, "a0003"); 77