summaryrefslogtreecommitdiff
path: root/t
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2014-12-10 13:34:52 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2014-12-10 13:34:52 +0000
commit8fddd4400d09891094843fe9e77fec74e4510c67 (patch)
tree23dbb27d11e56cf6586d93b091c708fa111a7a2d /t
downloadData-Compare-tarball-8fddd4400d09891094843fe9e77fec74e4510c67.tar.gz
Diffstat (limited to 't')
-rw-r--r--t/FIXME-large-structures.t421
-rw-r--r--t/compare.t164
-rwxr-xr-xt/coverage.sh5
-rw-r--r--t/deep-objects.t28
-rw-r--r--t/deep-recursion.t34
-rw-r--r--t/duplicates.t16
-rw-r--r--t/lib/SpecialClass.pm12
-rw-r--r--t/noimport-register_plugins.t13
-rw-r--r--t/noimport.t11
-rw-r--r--t/oo.t27
-rw-r--r--t/opts-ignore-hash-keys.t38
-rw-r--r--t/overload.t15
-rw-r--r--t/plugins.t23
-rw-r--r--t/pod.t9
-rw-r--r--t/realtainttest11
-rw-r--r--t/saritha-nalagandla-bug.t34
-rw-r--r--t/saritha-nalagandla-bug/test082_updateevent_multipleinvitees.exp51
-rw-r--r--t/saritha-nalagandla-bug/test082_updateevent_multipleinvitees.out51
-rw-r--r--t/scalar-properties.t100
-rw-r--r--t/taint.t30
20 files changed, 1093 insertions, 0 deletions
diff --git a/t/FIXME-large-structures.t b/t/FIXME-large-structures.t
new file mode 100644
index 0000000..077df4d
--- /dev/null
+++ b/t/FIXME-large-structures.t
@@ -0,0 +1,421 @@
+use strict;
+use warnings;
+use Test::More tests => 1;
+
+use Data::Compare;
+$SIG{ALRM} = sub { fail("timeout"); exit };
+alarm(5);
+
+TODO: {
+ local $TODO = "broken";
+ ok(0);
+ # ok(Data::Compare::Compare(_get_data()), "yay, didn't timeout");
+}
+
+sub _get_data {
+my $VAR1 = {
+'bodies' => bless( {
+'774e1dee53a6c80d99cca81f188abf91' => bless( {
+'body' => 'Get Lost!
+For the 2th time',
+'headers' => bless( {
+'340954c191bbbadfbd7ab37e62ac91c0' => bless( {
+'body' => {},
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Billy 2',
+'messages' => bless( {
+'340954c191bbbadfbd7ab37e62ac91c0' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => bless( {
+'From' => 'Jonny 1',
+'messages' => bless( {
+'0a763e41c9c22e1a97fcef68e37d2564' => bless( {
+'body' => bless( {
+'body' => 'Let me count the ways.... 3',
+'headers' => bless( {
+'0a763e41c9c22e1a97fcef68e37d2564' => {}
+}, 'Quarantine::BHeaders' )
+}, 'Quarantine::Body' ),
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Sally 3',
+'messages' => bless( {
+'0a763e41c9c22e1a97fcef68e37d2564' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => {},
+'uniq' => '0a763e41c9c22e1a97fcef68e37d2564'
+}, 'Quarantine::Header' ),
+'340954c191bbbadfbd7ab37e62ac91c0' => {},
+'655c7a5d8f36c58632a92e9c318fa9b4' => bless( {
+'body' => {},
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Fred 2',
+'messages' => bless( {
+'655c7a5d8f36c58632a92e9c318fa9b4' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => {},
+'uniq' => '655c7a5d8f36c58632a92e9c318fa9b4'
+}, 'Quarantine::Header' ),
+'7020baa09e5801d94724257ee8fba3bc' => bless( {
+'body' => bless( {
+'body' => 'Get Lost!
+For the 3th time',
+'headers' => bless( {
+'7020baa09e5801d94724257ee8fba3bc' => {},
+'ddd55caf8ac04ed3e75224cd12847bac' => bless( {
+'body' => {},
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Billy 3',
+'messages' => bless( {
+'ddd55caf8ac04ed3e75224cd12847bac' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => {},
+'uniq' => 'ddd55caf8ac04ed3e75224cd12847bac'
+}, 'Quarantine::Header' )
+}, 'Quarantine::BHeaders' )
+}, 'Quarantine::Body' ),
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Fred 3',
+'messages' => bless( {
+'7020baa09e5801d94724257ee8fba3bc' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => {},
+'uniq' => '7020baa09e5801d94724257ee8fba3bc'
+}, 'Quarantine::Header' ),
+'bbed5198630e5d982f474ddb946b5cb6' => bless( {
+'body' => bless( {
+'body' => 'Let me count the ways.... 2',
+'headers' => bless( {
+'bbed5198630e5d982f474ddb946b5cb6' => {}
+}, 'Quarantine::BHeaders' )
+}, 'Quarantine::Body' ),
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Sally 2',
+'messages' => bless( {
+'bbed5198630e5d982f474ddb946b5cb6' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => {},
+'uniq' => 'bbed5198630e5d982f474ddb946b5cb6'
+}, 'Quarantine::Header' ),
+'ddd55caf8ac04ed3e75224cd12847bac' => {}
+}, 'Quarantine::SMessages' )
+}, 'Quarantine::Sender' ),
+'uniq' => '340954c191bbbadfbd7ab37e62ac91c0'
+}, 'Quarantine::Header' ),
+'655c7a5d8f36c58632a92e9c318fa9b4' => {}
+}, 'Quarantine::BHeaders' )
+}, 'Quarantine::Body' ),
+'81a987f71ec224975ad33bcd09e9ebe4' => {},
+'e3973a2585798a8e85f3a9a6a6ece156' => {},
+'f5794e56fc5ecd3a92a3586da3b6392a' => {}
+}, 'Quarantine::Bodies' ),
+'buckets' => bless( {
+0 => bless( {
+'a' => bless( {
+'0a763e41c9c22e1a97fcef68e37d2564' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' ),
+3 => bless( {
+4 => bless( {
+'340954c191bbbadfbd7ab37e62ac91c0' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' ),
+6 => bless( {
+5 => bless( {
+'655c7a5d8f36c58632a92e9c318fa9b4' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' ),
+7 => bless( {
+0 => bless( {
+'7020baa09e5801d94724257ee8fba3bc' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' ),
+'b' => bless( {
+'b' => bless( {
+'bbed5198630e5d982f474ddb946b5cb6' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' ),
+'d' => bless( {
+'d' => bless( {
+'ddd55caf8ac04ed3e75224cd12847bac' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' )
+}, 'Quarantine::Buckets' ),
+'headers' => bless( {}, 'Quarantine::Headers' ),
+'recipients' => bless( {
+'Billy 2' => {},
+'Billy 3' => {},
+'Fred 2' => {},
+'Fred 3' => {},
+'Sally 2' => {},
+'Sally 3' => {}
+}, 'Quarantine::Recipients' ),
+'senders' => bless( {
+'Jonny 1' => {}
+}, 'Quarantine::Senders' )
+};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'body'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'recipients'}[0]{'messages'}{'340954c191bbbadfbd7ab37e62ac91c0'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'}{'body'}{'headers'}{'0a763e41c9c22e1a97fcef68e37d2564'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'}{'recipients'}[0]{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'}{'sender'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'340954c191bbbadfbd7ab37e62ac91c0'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'}{'body'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'}{'recipients'}[0]{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'}{'sender'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'7020baa09e5801d94724257ee8fba3bc'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'}{'body'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'}{'recipients'}[0]{'messages'}{'ddd55caf8ac04ed3e75224cd12847bac'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'}{'sender'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'recipients'}[0]{'messages'}{'7020baa09e5801d94724257ee8fba3bc'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'sender'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'}{'body'}{'headers'}{'bbed5198630e5d982f474ddb946b5cb6'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'}{'recipients'}[0]{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'}{'sender'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'ddd55caf8ac04ed3e75224cd12847bac'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'};
+$VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'655c7a5d8f36c58632a92e9c318fa9b4'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'};
+$VAR1->{'bodies'}{'81a987f71ec224975ad33bcd09e9ebe4'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'};
+$VAR1->{'bodies'}{'e3973a2585798a8e85f3a9a6a6ece156'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'}{'body'};
+$VAR1->{'bodies'}{'f5794e56fc5ecd3a92a3586da3b6392a'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'}{'body'};
+$VAR1->{'buckets'}{0}{'a'}{'0a763e41c9c22e1a97fcef68e37d2564'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'};
+$VAR1->{'buckets'}{3}{4}{'340954c191bbbadfbd7ab37e62ac91c0'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'};
+$VAR1->{'buckets'}{6}{5}{'655c7a5d8f36c58632a92e9c318fa9b4'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'};
+$VAR1->{'buckets'}{7}{0}{'7020baa09e5801d94724257ee8fba3bc'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'};
+$VAR1->{'buckets'}{'b'}{'b'}{'bbed5198630e5d982f474ddb946b5cb6'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'};
+$VAR1->{'buckets'}{'d'}{'d'}{'ddd55caf8ac04ed3e75224cd12847bac'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'};
+$VAR1->{'recipients'}{'Billy 2'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'recipients'}[0];
+$VAR1->{'recipients'}{'Billy 3'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'}{'recipients'}[0];
+$VAR1->{'recipients'}{'Fred 2'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'}{'recipients'}[0];
+$VAR1->{'recipients'}{'Fred 3'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'recipients'}[0];
+$VAR1->{'recipients'}{'Sally 2'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'}{'recipients'}[0];
+$VAR1->{'recipients'}{'Sally 3'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'}{'recipients'}[0];
+$VAR1->{'senders'}{'Jonny 1'} = $VAR1->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+
+
+my $VAR2 = {
+'bodies' => bless( {
+'774e1dee53a6c80d99cca81f188abf91' => bless( {
+'body' => 'Get Lost!
+For the 2th time',
+'headers' => bless( {
+'340954c191bbbadfbd7ab37e62ac91c0' => bless( {
+'body' => {},
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Billy 2',
+'messages' => bless( {
+'340954c191bbbadfbd7ab37e62ac91c0' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => bless( {
+'From' => 'Jonny 1',
+'messages' => bless( {
+'0a763e41c9c22e1a97fcef68e37d2564' => bless( {
+'body' => bless( {
+'body' => 'Let me count the ways.... 3',
+'headers' => bless( {
+'0a763e41c9c22e1a97fcef68e37d2564' => {}
+}, 'Quarantine::BHeaders' )
+}, 'Quarantine::Body' ),
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Sally 3',
+'messages' => bless( {
+'0a763e41c9c22e1a97fcef68e37d2564' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => {},
+'uniq' => '0a763e41c9c22e1a97fcef68e37d2564'
+}, 'Quarantine::Header' ),
+'340954c191bbbadfbd7ab37e62ac91c0' => {},
+'655c7a5d8f36c58632a92e9c318fa9b4' => bless( {
+'body' => {},
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Fred 2',
+'messages' => bless( {
+'655c7a5d8f36c58632a92e9c318fa9b4' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => {},
+'uniq' => '655c7a5d8f36c58632a92e9c318fa9b4'
+}, 'Quarantine::Header' ),
+'7020baa09e5801d94724257ee8fba3bc' => bless( {
+'body' => bless( {
+'body' => 'Get Lost!
+For the 3th time',
+'headers' => bless( {
+'7020baa09e5801d94724257ee8fba3bc' => {},
+'ddd55caf8ac04ed3e75224cd12847bac' => bless( {
+'body' => {},
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Billy 3',
+'messages' => bless( {
+'ddd55caf8ac04ed3e75224cd12847bac' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => {},
+'uniq' => 'ddd55caf8ac04ed3e75224cd12847bac'
+}, 'Quarantine::Header' )
+}, 'Quarantine::BHeaders' )
+}, 'Quarantine::Body' ),
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Fred 3',
+'messages' => bless( {
+'7020baa09e5801d94724257ee8fba3bc' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => {},
+'uniq' => '7020baa09e5801d94724257ee8fba3bc'
+}, 'Quarantine::Header' ),
+'bbed5198630e5d982f474ddb946b5cb6' => bless( {
+'body' => bless( {
+'body' => 'Let me count the ways.... 2',
+'headers' => bless( {
+'bbed5198630e5d982f474ddb946b5cb6' => {}
+}, 'Quarantine::BHeaders' )
+}, 'Quarantine::Body' ),
+'header' => 'Re: Stuff',
+'recipients' => bless( [
+bless( {
+'To' => 'Sally 2',
+'messages' => bless( {
+'bbed5198630e5d982f474ddb946b5cb6' => {}
+}, 'Quarantine::RMessages' )
+}, 'Quarantine::Recipient' )
+], 'Quarantine::RList' ),
+'sender' => {},
+'uniq' => 'bbed5198630e5d982f474ddb946b5cb6'
+}, 'Quarantine::Header' ),
+'ddd55caf8ac04ed3e75224cd12847bac' => {}
+}, 'Quarantine::SMessages' )
+}, 'Quarantine::Sender' ),
+'uniq' => '340954c191bbbadfbd7ab37e62ac91c0'
+}, 'Quarantine::Header' ),
+'655c7a5d8f36c58632a92e9c318fa9b4' => {}
+}, 'Quarantine::BHeaders' )
+}, 'Quarantine::Body' ),
+'81a987f71ec224975ad33bcd09e9ebe4' => {},
+'e3973a2585798a8e85f3a9a6a6ece156' => {},
+'f5794e56fc5ecd3a92a3586da3b6392a' => {}
+}, 'Quarantine::Bodies' ),
+'buckets' => bless( {
+0 => bless( {
+'a' => bless( {
+'0a763e41c9c22e1a97fcef68e37d2564' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' ),
+3 => bless( {
+4 => bless( {
+'340954c191bbbadfbd7ab37e62ac91c0' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' ),
+6 => bless( {
+5 => bless( {
+'655c7a5d8f36c58632a92e9c318fa9b4' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' ),
+7 => bless( {
+0 => bless( {
+'7020baa09e5801d94724257ee8fba3bc' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' ),
+'b' => bless( {
+'b' => bless( {
+'bbed5198630e5d982f474ddb946b5cb6' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' ),
+'d' => bless( {
+'d' => bless( {
+'ddd55caf8ac04ed3e75224cd12847bac' => {}
+}, 'Quarantine::Bucket2' )
+}, 'Quarantine::Bucket1' )
+}, 'Quarantine::Buckets' ),
+'headers' => bless( {}, 'Quarantine::Headers' ),
+'recipients' => bless( {
+'Billy 2' => {},
+'Billy 3' => {},
+'Fred 2' => {},
+'Fred 3' => {},
+'Sally 2' => {},
+'Sally 3' => {}
+}, 'Quarantine::Recipients' ),
+'senders' => bless( {
+'Jonny 1' => {}
+}, 'Quarantine::Senders' )
+};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'body'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'recipients'}[0]{'messages'}{'340954c191bbbadfbd7ab37e62ac91c0'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'}{'body'}{'headers'}{'0a763e41c9c22e1a97fcef68e37d2564'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'}{'recipients'}[0]{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'}{'sender'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'340954c191bbbadfbd7ab37e62ac91c0'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'}{'body'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'}{'recipients'}[0]{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'}{'sender'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'7020baa09e5801d94724257ee8fba3bc'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'}{'body'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'}{'recipients'}[0]{'messages'}{'ddd55caf8ac04ed3e75224cd12847bac'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'}{'sender'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'recipients'}[0]{'messages'}{'7020baa09e5801d94724257ee8fba3bc'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'sender'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'}{'body'}{'headers'}{'bbed5198630e5d982f474ddb946b5cb6'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'}{'recipients'}[0]{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'}{'sender'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'ddd55caf8ac04ed3e75224cd12847bac'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'};
+$VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'655c7a5d8f36c58632a92e9c318fa9b4'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'};
+$VAR2->{'bodies'}{'81a987f71ec224975ad33bcd09e9ebe4'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'};
+$VAR2->{'bodies'}{'e3973a2585798a8e85f3a9a6a6ece156'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'}{'body'};
+$VAR2->{'bodies'}{'f5794e56fc5ecd3a92a3586da3b6392a'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'}{'body'};
+$VAR2->{'buckets'}{0}{'a'}{'0a763e41c9c22e1a97fcef68e37d2564'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'};
+$VAR2->{'buckets'}{3}{4}{'340954c191bbbadfbd7ab37e62ac91c0'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'};
+$VAR2->{'buckets'}{6}{5}{'655c7a5d8f36c58632a92e9c318fa9b4'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'};
+$VAR2->{'buckets'}{7}{0}{'7020baa09e5801d94724257ee8fba3bc'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'};
+$VAR2->{'buckets'}{'b'}{'b'}{'bbed5198630e5d982f474ddb946b5cb6'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'};
+$VAR2->{'buckets'}{'d'}{'d'}{'ddd55caf8ac04ed3e75224cd12847bac'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'};
+$VAR2->{'recipients'}{'Billy 2'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'recipients'}[0];
+$VAR2->{'recipients'}{'Billy 3'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'body'}{'headers'}{'ddd55caf8ac04ed3e75224cd12847bac'}{'recipients'}[0];
+$VAR2->{'recipients'}{'Fred 2'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'655c7a5d8f36c58632a92e9c318fa9b4'}{'recipients'}[0];
+$VAR2->{'recipients'}{'Fred 3'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'7020baa09e5801d94724257ee8fba3bc'}{'recipients'}[0];
+$VAR2->{'recipients'}{'Sally 2'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'bbed5198630e5d982f474ddb946b5cb6'}{'recipients'}[0];
+$VAR2->{'recipients'}{'Sally 3'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'}{'messages'}{'0a763e41c9c22e1a97fcef68e37d2564'}{'recipients'}[0];
+$VAR2->{'senders'}{'Jonny 1'} = $VAR2->{'bodies'}{'774e1dee53a6c80d99cca81f188abf91'}{'headers'}{'340954c191bbbadfbd7ab37e62ac91c0'}{'sender'};
+
+return ($VAR1, $VAR2);
+}
+
diff --git a/t/compare.t b/t/compare.t
new file mode 100644
index 0000000..94a6732
--- /dev/null
+++ b/t/compare.t
@@ -0,0 +1,164 @@
+# -*- Mode: Perl -*-
+
+BEGIN { unshift @INC, "lib", "../lib" }
+use strict;
+use warnings;
+# use diagnostics;
+
+use Data::Compare;
+
+local $^W = 1;
+print "1..45\n";
+
+my $t = 1;
+
+my $s0 = undef;
+my $s1 = 0;
+my $s2 = 10;
+
+# 1 .. 4
+&comp($s0, $s0, 1);
+&comp($s1, $s1, 1);
+&comp($s2, $s2, 1);
+&comp($s0, $s1, 0);
+
+my $s3 = \$s2;
+my $s4 = \$s1;
+my $s5 = "$s4";
+my $s6 = 0;
+my $s7 = \$s6;
+
+# 5 .. 8
+&comp($s3, $s3, 1);
+&comp($s3, $s4, 0);
+&comp($s4, $s5, 0);
+&comp($s4, $s7, 1);
+
+my $a1 = [];
+my $a2 = [ 0 ];
+my $a3 = [ '' ];
+my $a4 = [ 1, 2, 3 ];
+my $a5 = [ 1, 2, 4 ];
+my $a6 = [ 1, 2, 3, 5 ];
+
+# 9 .. 13
+&comp($a1, $a1, 1);
+&comp($a1, $a2, 0);
+&comp($a2, $a3, 0);
+&comp($a4, $a5, 0);
+&comp($a4, $a6, 0);
+
+my $h1 = {};
+my $h2 = { 'foo' => 'bar' };
+my $h3 = { 'foo' => 'bar' };
+my $h4 = { 'foo' => 'bar', 'bar' => 'foo' };
+
+# 14 .. 19
+&comp($h1, $s0, 0);
+&comp($h1, $h1, 1);
+&comp($h2, $h2, 1);
+&comp($h2, $h3, 1);
+&comp($h1, $h2, 0);
+&comp($h3, $h4, 0);
+
+my $o1 = bless [ 'FOO', 'BAR' ], 'foo';
+my $o2 = bless [ 'FOO', 'BAR' ], 'foo';
+my $o3 = bless [ 'FOO', 'BAR' ], 'fool';
+my $o4 = bless [ 'FOO', 'BAR', 'BAZ' ], 'foo';
+
+# 20 .. 22
+&comp($o1, $o2, 1);
+&comp($o1, $o3, 0);
+&comp($o1, $o4, 0);
+
+my $o5 = bless { 'FOO' => 'BAR' }, 'foo';
+my $o6 = bless { 'FOO' => 'BAR' }, 'foo';
+my $o7 = bless { 'FOO' => 'BAR' }, 'fool';
+my $o8 = bless { 'FOO' => 'BAR', 'foo' => 'BAZ' }, 'foo';
+
+# 23 .. 25
+&comp($o5, $o6, 1);
+&comp($o5, $o7, 0);
+&comp($o5, $o8, 0);
+
+my $s8 = 0;
+my $o9 = bless \$s0, 'foo';
+my $o10 = bless \$s8, 'foo';
+my $o11 = bless \$s1, 'foo';
+
+# 26 .. 27
+&comp($o9, $o10, 0);
+&comp($o10, $o11, 1);
+
+my $g1 = \*STDIN;
+my $g2 = \*STDOUT;
+
+# 28 .. 29
+&comp($g1, $g1, 1);
+&comp($g1, $g2, 0);
+
+my $o12 = bless $g1, 'foo';
+my $o13 = bless $g2, 'foo';
+
+# 30 .. 31
+&comp($o12, $o12, 1);
+&comp($o12, $o13, 0);
+
+my $o16 = bless sub { print "foo\n" }, 'foo';
+my $o17 = bless sub { print "foo\n" }, 'foo';
+
+# 32
+&comp($o16, $o17, 0); # :(
+
+my $v1 = { 'foo' => [ 1, { 'bar' => 'baz' }, 3 ] };
+my $v2 = { 'bar' => 'baz' };
+my $v3 = [ 1, $v2, 3 ];
+my $v4 = { 'foo' => $v3 };
+
+# 33
+&comp($v1, $v4, 1);
+
+# 34 .. 37
+&comp(\\1, \\1, 1);
+&comp(\\1, \\2, 0);
+&comp(\\1, 1, 0);
+&comp(\\1, \1, 0);
+
+# 38 .. 40
+&comp(qr/abc/i, qr/abc/i, 1, "Identical regexen");
+&comp(qr/abc/i, qr/[aA][bB][cC]/, 0, "Non-identical regexen");
+&comp(qr/abc/i, '(?i-xsm:abc)', 0, "Regex and scalar which stringify the same");
+
+# 41 .. 43
+# scalar cross
+$a = [];
+my($x, $y);
+$x=\$y;
+$y=\$x;
+$a->[0]=\$a->[1];
+$a->[1]=\$a->[0];
+&comp([$x, $y], $a, 1, "two parallel circular structures compare the same");
+
+# these two are probably superfluous, as they test referential equality
+# rather than any of the stuff we added to do with circles and recursion
+&comp([$x, $y], [$y, $x], 1, "looking at a circle from two different starting points compares the same");
+&comp([$x, $y], [$x, $y], 1, "a circular structure compares to itself");
+
+$a = [];
+$b = [];
+$a->[0] = { foo => { bar => $a } };
+$b->[0] = { foo => { bar => $b } };
+$a->[1] = $b->[1] = 5;
+comp($a, $b, 1, "structure of a circle plus same data compares the same");
+
+$a->[1] = 6;
+comp($a, $b, 0, "structure of a circle plus different data compares different");
+sub comp {
+ my $a = shift;
+ my $b = shift;
+ my $expect = shift;
+ my $comment = shift;
+
+ print Compare ($a, $b) == $expect ? "" : "not ", "ok ", $t++,
+ ($comment) ? " $comment\n" : "\n";
+}
diff --git a/t/coverage.sh b/t/coverage.sh
new file mode 100755
index 0000000..7b334b1
--- /dev/null
+++ b/t/coverage.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+cover -delete
+HARNESS_PERL_SWITCHES=-MDevel::Cover=-coverage,statement,branch,condition,path,subroutine make test
+cover
diff --git a/t/deep-objects.t b/t/deep-objects.t
new file mode 100644
index 0000000..a2c9702
--- /dev/null
+++ b/t/deep-objects.t
@@ -0,0 +1,28 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+# use diagnostics;
+
+eval 'use Clone';
+($@) ?
+ do {
+ print "1..0 # Skipping no Clone found\n";
+ exit(0);
+ } :
+ eval 'use Test::More tests => 1;';
+
+use Data::Compare;
+
+my $c = bless { foo => 1 }, 'Foo';
+my $d = bless { c => $c }, "Foo::D";
+my $e = bless { d => $d }, "Foo::E";
+my $f = bless { e => $e }, "Foo::F";
+my $g = bless { f => $f }, "Foo::G";
+my $h = bless { g => $g }, "Foo::H";
+my $i = bless { h => $h }, "Foo::I";
+my $j = bless { i => $i }, "Foo::J";
+my $k = Clone::clone $j;
+
+Compare($j, $k);
+ok(Compare($j, $k), 'Can compare deeply-nested objecty jibber-jabber');
diff --git a/t/deep-recursion.t b/t/deep-recursion.t
new file mode 100644
index 0000000..9861c0a
--- /dev/null
+++ b/t/deep-recursion.t
@@ -0,0 +1,34 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+# use diagnostics;
+
+use Data::Compare;
+use Test::More tests => 3;
+
+my $warning= '';
+$SIG{__WARN__} = sub { $warning= shift; };
+
+my($data1, $data2) = ({}, {});
+foreach my $i (qw(a b c d e f g h i j)) {
+ foreach my $j (qw(k l m n o p q r s t)) {
+ $data1->{$i}->{$j} = 'i like pie';
+ $data2->{$i}->{$j} = 'i like pie';
+ }
+}
+
+# check that we DTRT on very deep recursion
+$a = [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]];
+$b = [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]];
+Compare($a, $b);
+ok($warning, "warn on deep recursion");
+$warning = '';
+
+Compare([5], [5]) foreach(1..1000);
+ok(!$warning, "recursion counter correctly reset");
+
+
+Compare($data1, $data2);
+
+ok(!$warning, "no warnings emitted on large flat structures");
diff --git a/t/duplicates.t b/t/duplicates.t
new file mode 100644
index 0000000..e2636fb
--- /dev/null
+++ b/t/duplicates.t
@@ -0,0 +1,16 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+# use diagnostics;
+
+use Test::More tests => 2;
+
+use Data::Compare;
+
+my $z = 0;
+ok(Compare([\$z, \$z], [\$z, \$z]), 'Can compare duplicated array data');
+ok(Compare(
+ { a => \$z, b => \$z },
+ { a => \$z, b => \$z }
+), 'Can compare duplicated hash data');
diff --git a/t/lib/SpecialClass.pm b/t/lib/SpecialClass.pm
new file mode 100644
index 0000000..9dbb3e9
--- /dev/null
+++ b/t/lib/SpecialClass.pm
@@ -0,0 +1,12 @@
+package SpecialClass;
+use strict;use warnings;
+use overload
+ '""' => \&to_string,
+ '0+' => \&to_number,
+ fallback=>1;
+
+sub new { my ($class,%data) = @_; bless {%data},$class }
+sub to_string { return $_[0]->{str} || 'foo' }
+sub to_number { return $_[0]->{num} || 12 }
+
+1;
diff --git a/t/noimport-register_plugins.t b/t/noimport-register_plugins.t
new file mode 100644
index 0000000..de2c669
--- /dev/null
+++ b/t/noimport-register_plugins.t
@@ -0,0 +1,13 @@
+#!perl -w
+
+use Data::Compare ();
+Data::Compare->register_plugins();
+
+print "1..1\n";
+
+my $test = 0;
+
+# and now there should be plugins
+
+print "not " if(Data::Compare::Compare({}, Data::Compare::plugins()));
+print 'ok '.(++$test)." plugins available in no-import mode if explicitly asked for\n";
diff --git a/t/noimport.t b/t/noimport.t
new file mode 100644
index 0000000..f752e11
--- /dev/null
+++ b/t/noimport.t
@@ -0,0 +1,11 @@
+#!perl -w
+
+use Data::Compare ();
+print "1..1\n";
+
+my $test = 0;
+
+# in no-import mode there should be no plugins
+
+print "not " unless(Data::Compare::Compare({}, Data::Compare::plugins()));
+print 'ok '.(++$test)." plugins disabled in no-import mode\n";
diff --git a/t/oo.t b/t/oo.t
new file mode 100644
index 0000000..f043d19
--- /dev/null
+++ b/t/oo.t
@@ -0,0 +1,27 @@
+# -*- Mode: Perl -*-
+
+BEGIN { unshift @INC, "lib", "../lib" }
+use strict;
+use Data::Compare;
+
+local $^W = 1;
+print "1..7\n";
+
+my $t = 1;
+
+my $a = { 'foo' => [ 'bar', 'baz' ] };
+my $b = { 'Foo' => [ 'bar', 'baz' ] };
+
+my $c = new Data::Compare ($a, $b);
+print !$c->Cmp ? "" : "not ", "ok ", $t++, "\n";
+print $c->Cmp($a, $a) ? "" : "not ", "ok ", $t++, "\n";
+print !$c->Cmp($a, $b) ? "" : "not ", "ok ", $t++, "\n";
+
+my $d = new Data::Compare;
+print $d->Cmp ? "" : "not ", "ok ", $t++, "\n";
+print $d->Cmp($a, $a) ? "" : "not ", "ok ", $t++, "\n";
+print !$d->Cmp($a, $b) ? "" : "not ", "ok ", $t++, "\n";
+
+my $e = new Data::Compare;
+
+print $d->Cmp ($d, $e) ? "" : "not ", "ok ", $t++, "\n";
diff --git a/t/opts-ignore-hash-keys.t b/t/opts-ignore-hash-keys.t
new file mode 100644
index 0000000..c5fdd27
--- /dev/null
+++ b/t/opts-ignore-hash-keys.t
@@ -0,0 +1,38 @@
+# -*- Mode: Perl -*-
+
+BEGIN { unshift @INC, "lib", "../lib" }
+use strict;
+use Data::Compare;
+
+local $^W = 1;
+print "1..4\n";
+
+my $test = 0;
+
+print 'not ' unless(Compare(
+ { foo => 'FOO', bar => 'BAR', baz => 'BAZ' },
+ { foo => 'FOO', bar => 'BAR' },
+ { ignore_hash_keys => [qw(baz)] }
+) == 1);
+print 'ok '.(++$test)." different hashes compare the same when ignoring extra key in first\n";
+
+print 'not ' unless(Compare(
+ { foo => 'FOO', bar => 'BAR' },
+ { foo => 'FOO', bar => 'BAR', baz => 'BAZ' },
+ { ignore_hash_keys => [qw(baz)] }
+) == 1);
+print 'ok '.(++$test)." different hashes compare the same when ignoring extra key in second\n";
+
+print 'not ' unless(Compare(
+ { foo => 'FOO', bar => 'BAR', baz => [] },
+ { foo => 'FOO', bar => 'BAR', baz => 'BAZ' },
+ { ignore_hash_keys => [qw(baz)] }
+) == 1);
+print 'ok '.(++$test)." ignoring a key that differs works\n";
+
+print 'not ' unless(Compare(
+ { foo => 'FOO', bar => 'BAR', baz => [] },
+ { foo => 'FOO', bar => 'BAR', baz => 'BAZ' },
+ { ignore_hash_keys => [qw(bar)] }
+) == 0);
+print 'ok '.(++$test)." ignoring equal data in differing hashes compares unequal\n";
diff --git a/t/overload.t b/t/overload.t
new file mode 100644
index 0000000..1fdbb97
--- /dev/null
+++ b/t/overload.t
@@ -0,0 +1,15 @@
+use strict;
+use warnings;
+use lib 't/lib';
+use SpecialClass;
+
+use Data::Compare;
+use Test::More tests=>2;
+
+ok(!Compare(SpecialClass->new(str=>'bar'),
+ SpecialClass->new(str=>'bar',num=>15)),
+ 'String overload does not fool it');
+
+ok(!Compare(SpecialClass->new(str=>'bar',num=>15),
+ SpecialClass->new(str=>'boo',num=>15)),
+ 'Numeric overload does not fool it');
diff --git a/t/plugins.t b/t/plugins.t
new file mode 100644
index 0000000..828ad5c
--- /dev/null
+++ b/t/plugins.t
@@ -0,0 +1,23 @@
+#!perl -w
+
+use strict;
+
+use Data::Compare;
+
+print "1..1\n";
+
+my $test = 0;
+
+# Scalar::Properties is the only plugin we know will be present. The plugin
+# will even be present if S::P itself isn't installed.
+my $plugins = Data::Compare::plugins();
+my %pairs = ();
+foreach my $key (keys %{$plugins}) {
+ foreach(@{$plugins->{$key}}) {
+ $pairs{"$key <-> $_"} = 1;
+ $pairs{"$_ <-> $key"} = 1 if($key ne $_);
+ }
+}
+
+print 'not ' unless($pairs{'[scalar] <-> Scalar::Properties'} && $pairs{'Scalar::Properties <-> Scalar::Properties'} && $pairs{'Scalar::Properties <-> [scalar]'});
+print 'ok '.(++$test)." plugins() function\n";
diff --git a/t/pod.t b/t/pod.t
new file mode 100644
index 0000000..7f9b2c4
--- /dev/null
+++ b/t/pod.t
@@ -0,0 +1,9 @@
+# $Id: pod.t,v 1.1 2007/07/30 12:49:38 drhyde Exp $
+use strict;
+
+$^W=1;
+
+use Test::More;
+eval "use Test::Pod 1.00";
+plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
+all_pod_files_ok();
diff --git a/t/realtainttest b/t/realtainttest
new file mode 100644
index 0000000..a972bc7
--- /dev/null
+++ b/t/realtainttest
@@ -0,0 +1,11 @@
+use strict;
+
+use Data::Compare;
+print "1..1\n";
+
+my $test = 0;
+
+# in taint mode there should be no plugins
+
+print "not " unless(Compare({}, Data::Compare::plugins()));
+print 'ok '.(++$test)." plugins disabled in taint mode\n";
diff --git a/t/saritha-nalagandla-bug.t b/t/saritha-nalagandla-bug.t
new file mode 100644
index 0000000..5f70432
--- /dev/null
+++ b/t/saritha-nalagandla-bug.t
@@ -0,0 +1,34 @@
+#!perl -w
+# $Id: saritha-nalagandla-bug.t,v 1.2 2008/08/26 20:51:36 drhyde Exp $
+
+use strict;
+use Data::Compare;
+eval "use JSON";
+if($@) {
+ eval 'use Test::More skip_all => "no JSON support";exit 0';
+} elsif($JSON::VERSION < 2.9) {
+ eval 'use Test::More skip_all => "JSON module too old";exit 0';
+} else {
+ eval 'use Test::More tests => 2';
+}
+
+my $expfile = "t/saritha-nalagandla-bug/test082_updateevent_multipleinvitees.exp";
+my $outfile = "t/saritha-nalagandla-bug/test082_updateevent_multipleinvitees.out";
+my $ignoreKeysList = [qw(UID INVID LAST_MODIFIED DTSTAMP_UTC BUILD)];
+
+$/ = undef;
+
+($expfile, $outfile) = map {
+ open(FILE, $_) || die("Can't open $_\n");
+ my $f = <FILE>;
+ close(FILE);
+ from_json($f);
+} ($expfile, $outfile);
+
+# delete $expfile->{RESPONSE}{VALUE}{ATTENDEE}[0]{RSVP};
+# delete $outfile->{RESPONSE}{VALUE}{ATTENDEE}[0]{RSVP};
+# delete $expfile->{RESPONSE}{VALUE}{ATTENDEE}[1]{RSVP};
+# delete $outfile->{RESPONSE}{VALUE}{ATTENDEE}[1]{RSVP};
+
+ok(Compare($expfile, $outfile, {ignore_hash_keys=> $ignoreKeysList}), "match with ignore_hash_keys");
+ok(!Compare($expfile, $outfile), "doesn't match without ignore_hash_keys");
diff --git a/t/saritha-nalagandla-bug/test082_updateevent_multipleinvitees.exp b/t/saritha-nalagandla-bug/test082_updateevent_multipleinvitees.exp
new file mode 100644
index 0000000..48e591c
--- /dev/null
+++ b/t/saritha-nalagandla-bug/test082_updateevent_multipleinvitees.exp
@@ -0,0 +1,51 @@
+{
+ "REQUEST" : {
+ "BUILD" : "5.0 hitaine 20080801-1615",
+ "DTSTAMP_UTC" : "20080804T122520",
+ "INTL" : "us",
+ "OPERATION" : "UPDATE_EVENT",
+ "SERVICE" : "CAL",
+ "SERVICE_VERSION" : "1.2",
+ "USER" : "autocaljson3"
+ },
+ "RESPONSE" : {
+ "CODE" : 0,
+ "VALUE" : {
+ "ACCOUNT_ID" : "autocaljson3",
+ "ALL_DAY" : false,
+ "ATTENDEE" : [
+ {
+ "EMAIL" : "f323_bart1@yahoo.com",
+ "PARTSTAT" : "ACCEPTED",
+ "RSVP" : false
+ },
+ {
+ "EMAIL" : "f323_bart2@yahoo.com",
+ "PARTSTAT" : "DECLINED",
+ "RSVP" : false
+ }
+ ],
+ "CLASS" : "PUBLIC",
+ "COMMENT" : [
+ "test comment"
+ ],
+ "COMPONENT_TYPE" : "EVENT",
+ "DESCRIPTION" : "go party",
+ "DTEND" : "20080820T093000",
+ "DTEND_TZID" : "America/Los_Angeles",
+ "DTSTART" : "20080820T090000",
+ "DTSTART_TZID" : "America/Los_Angeles",
+ "DURATION" : "PT30M",
+ "FOLDER_ID" : 131,
+ "INVID" : "1092-1091",
+ "LAST_MODIFIED" : "20080804T122520",
+ "LOCATION" : "test loc",
+ "ORGANIZER" : "autocaljson3@yahoo.com",
+ "STATUS" : "CONFIRMED",
+ "SUMMARY" : "Party Update event 082",
+ "TRANSP" : "OPAQUE",
+ "TYPE" : 10,
+ "UID" : "c3e0efde-da42-45dc-8322-46ff686a5832"
+ }
+ }
+} \ No newline at end of file
diff --git a/t/saritha-nalagandla-bug/test082_updateevent_multipleinvitees.out b/t/saritha-nalagandla-bug/test082_updateevent_multipleinvitees.out
new file mode 100644
index 0000000..92d45b4
--- /dev/null
+++ b/t/saritha-nalagandla-bug/test082_updateevent_multipleinvitees.out
@@ -0,0 +1,51 @@
+{
+ "REQUEST" : {
+ "BUILD" : "5.0 akanjila 20080806-1047",
+ "DTSTAMP_UTC" : "20080807T001048",
+ "INTL" : "us",
+ "OPERATION" : "UPDATE_EVENT",
+ "SERVICE" : "CAL",
+ "SERVICE_VERSION" : "1.2",
+ "USER" : "autocaljson3"
+ },
+ "RESPONSE" : {
+ "CODE" : 0,
+ "VALUE" : {
+ "ACCOUNT_ID" : "autocaljson3",
+ "ALL_DAY" : false,
+ "ATTENDEE" : [
+ {
+ "EMAIL" : "f323_bart1@yahoo.com",
+ "PARTSTAT" : "ACCEPTED",
+ "RSVP" : false
+ },
+ {
+ "EMAIL" : "f323_bart2@yahoo.com",
+ "PARTSTAT" : "DECLINED",
+ "RSVP" : false
+ }
+ ],
+ "CLASS" : "PUBLIC",
+ "COMMENT" : [
+ "test comment"
+ ],
+ "COMPONENT_TYPE" : "EVENT",
+ "DESCRIPTION" : "go party",
+ "DTEND" : "20080820T093000",
+ "DTEND_TZID" : "America/Los_Angeles",
+ "DTSTART" : "20080820T090000",
+ "DTSTART_TZID" : "America/Los_Angeles",
+ "DURATION" : "PT30M",
+ "FOLDER_ID" : 131,
+ "INVID" : "331-330",
+ "LAST_MODIFIED" : "20080807T001048",
+ "LOCATION" : "test loc",
+ "ORGANIZER" : "autocaljson3@yahoo.com",
+ "STATUS" : "CONFIRMED",
+ "SUMMARY" : "Party Update event 082",
+ "TRANSP" : "OPAQUE",
+ "TYPE" : 10,
+ "UID" : "8f060ff2-28bc-4e32-8ba6-3d03dd40d900"
+ }
+ }
+} \ No newline at end of file
diff --git a/t/scalar-properties.t b/t/scalar-properties.t
new file mode 100644
index 0000000..3384166
--- /dev/null
+++ b/t/scalar-properties.t
@@ -0,0 +1,100 @@
+#!perl -w
+
+my $loaded;
+
+use strict;
+
+use constant num_one => 1;
+use constant num_two => 2;
+use constant txt_one => 'one';
+use constant txt_two => 'two';
+
+use Data::Compare;
+
+$| = 1;
+eval 'use Scalar::Properties';
+print (($@) ? "1..0 # Skipping no Scalar::Properties found\n" : "1..17\n");
+exit(0) if($@);
+
+my $test = 0;
+print "ok ".(++$test)." load module\n";
+
+eval q{
+
+use Scalar::Properties;
+
+# test SP vs SP
+
+my($sp1, $sp2) = (1, 1);
+print 'not ' unless(Compare($sp1, $sp2));
+print 'ok '.(++$test)." SPs with same value, no properties compare the same\n";
+
+($sp1, $sp2) = (1, 2);
+print 'not ' if(Compare($sp1, $sp2));
+print 'ok '.(++$test)." SPs with different values, no properties compare different\n";
+
+($sp1, $sp2) = (1->a('frob')->b(num_one), 1->a('frob')->b(num_one));
+print 'not ' unless(Compare($sp1, $sp2));
+print 'ok '.(++$test)." SPs with same value, same properties compare the same\n";
+
+($sp1, $sp2) = (1->a('foo')->b(num_one), 1->a('frob')->b(num_one));
+print 'not ' if(Compare($sp1, $sp2));
+print 'ok '.(++$test)." SPs same value, different properties compare different\n";
+
+($sp1, $sp2) = (1->a('frob')->b(num_one), 2->a('frob')->b(num_one));
+print 'not ' if(Compare($sp1, $sp2));
+print 'ok '.(++$test)." SPs different value, same properties compare different\n";
+
+($sp1, $sp2) = (1->a('foo')->b(num_one), 2->a('frob')->b(num_one));
+print 'not ' if(Compare($sp1, $sp2));
+print 'ok '.(++$test)." SPs different value, different properties compare different\n";
+
+($sp1, $sp2) = (1, 1->a('frob')->b(num_one));
+print 'not ' if(Compare($sp1, $sp2));
+print 'ok '.(++$test)." SPs with same value, one with extra properties compare different\n";
+
+($sp1, $sp2) = (1->a('frob')->b(num_one), 1);
+print 'not ' if(Compare($sp1, $sp2));
+print 'ok '.(++$test)." (rev) SPs with same value, one with extra properties compare different\n";
+
+# test scalar vs SP
+
+$sp1 = 1;
+my $scalar1 = num_one;
+print 'not ' unless(Compare($scalar1, $sp1));
+print 'ok '.(++$test)." scalar and S::P with same numeric value compare the same\n";
+
+$sp1 = 2;
+print 'not ' if(Compare($scalar1, $sp1));
+print 'ok '.(++$test)." scalar and S::P with different numeric value compare different\n";
+
+$sp1 = 'one';
+$scalar1 = txt_one;
+print 'not ' unless(Compare($scalar1, $sp1));
+print 'ok '.(++$test)." scalar and S::P with same string value compare the same\n";
+
+$sp1 = 'two';
+print 'not ' if(Compare($scalar1, $sp1));
+print 'ok '.(++$test)." scalar and S::P with different string value compare different\n";
+
+# test SP vs scalar
+
+$sp1 = 1;
+$scalar1 = num_one;
+print 'not ' unless(Compare($sp1, $scalar1));
+print 'ok '.(++$test)." (rev) scalar and S::P with same numeric value compare the same\n";
+
+$sp1 = 2;
+print 'not ' if(Compare($sp1, $scalar1));
+print 'ok '.(++$test)." (rev) scalar and S::P with different numeric value compare different\n";
+
+$sp1 = 'one';
+$scalar1 = txt_one;
+print 'not ' unless(Compare($sp1, $scalar1));
+print 'ok '.(++$test)." (rev) scalar and S::P with same string value compare the same\n";
+
+$sp1 = 'two';
+print 'not ' if(Compare($sp1, $scalar1));
+print 'ok '.(++$test)." (rev) scalar and S::P with different string value compare different\n";
+
+}
diff --git a/t/taint.t b/t/taint.t
new file mode 100644
index 0000000..5a7a990
--- /dev/null
+++ b/t/taint.t
@@ -0,0 +1,30 @@
+#!perl -w
+
+use Config;
+
+if($^O =~ /vms/i) {
+ # $^X isn't VMS-friendly. I'm disinclined to add a dependency on
+ # Probe::Perl just for testing this corner-case
+ print "1..0 # skip - can't reliably taint-test on VMS\n";
+# } elsif($ENV{PERL5LIB}) {
+# print "1..0 # skip - can't reliably taint-test with PERL5LIB set\n";
+# } else {
+# exec("$^X -Tw -Iblib/lib t/realtainttest");
+# }
+} else {
+ my $perl5lib = $ENV{PERL5LIB} || '';
+ $ENV{PERL5LIB} = '';
+ exec(
+ join(' ',
+ $Config{perlpath},
+ '-Tw',
+ (
+ # map { "-I$_" }
+ map { qq{-I"$_"} }
+ grep { -d $_ } # bleh, code-refs getting stringified
+ split(/$Config{path_sep}/, $perl5lib)
+ ),
+ 't/realtainttest'
+ )
+ );
+}