13 # Predeclare vars used in the tests:
14 my $deep1 = []; push @$deep1, \$deep1;
15 my $deep2 = []; push @$deep2, \$deep2;
18 tie my @tied_nums, 'Tie::StdArray';
21 my %hash = (foo => 17, bar => 23);
22 tie my %tied_hash, 'Tie::StdHash';
26 package Test::Object::NoOverload;
27 sub new { bless { key => 1 } }
31 package Test::Object::CopyOverload;
32 sub new { bless { key => 1 } }
33 use overload '~~' => sub { my %hash = %{ $_[0] }; %hash ~~ $_[1] };
36 our $ov_obj = Test::Object::CopyOverload->new;
37 our $obj = Test::Object::NoOverload->new;
39 my @keyandmore = qw(key and more);
40 my @fooormore = qw(foo or more);
41 my %keyandmore = map { $_ => 0 } @keyandmore;
42 my %fooormore = map { $_ => 0 } @fooormore;
44 # Load and run the tests
48 next if /^#/ || !/\S/;
50 my ($yn, $left, $right, $note) = split /\t+/;
52 local $::TODO = $note =~ /TODO/;
54 die "Bad test spec: ($yn, $left, $right)" if $yn =~ /[^!@=]/;
56 my $tstr = "$left ~~ $right";
64 ok( $@ ne '', "$tstr dies" )
65 and print "# \$\@ was: $@\n";
67 my $test_name = $tstr . ($yn =~ /!/ ? " does not match" : " matches");
70 print "# \$\@ was: $@\n";
72 ok( ($yn =~ /!/ xor $res), $test_name );
77 $tstr = "$right ~~ $left";
87 sub fatal {die "fatal sub\n"}
95 # ! - expected to not match
96 # @ - expected to be a compilation failure
97 # = - expected to match symmetrically (runs test twice)
98 # Data types to test :
107 # Tied arrays and hashes
108 # Arrays that reference themselves
109 # Regex (// and qr//)
113 # Other syntactic items of interest:
115 # Values returned by a sub call
140 # Any ~~ object overloaded
141 # object overloaded ~~ Any
147 = $ov_obj sub { shift ~~ "key" }
148 =! $ov_obj sub { shift ne "key" }
149 =! $ov_obj sub { shift ~~ "foo" }
150 = $ov_obj %keyandmore TODO
151 =! $ov_obj %fooormore
152 = $ov_obj {"key" => 1}
153 = $ov_obj {"key" => 1, bar => 2} TODO
154 =! $ov_obj {"foo" => 1}
155 = $ov_obj @keyandmore
156 =! $ov_obj @fooormore
157 = $ov_obj ["key" => 1]
158 =! $ov_obj ["foo" => 1]
185 sub{0} sub { ref $_[0] eq "CODE" }
186 %fooormore sub { $_[0] =~ /^(foo|or|more)$/ }
187 ! %fooormore sub { $_[0] =~ /^(foo|or|less)$/ }
188 \%fooormore sub { $_[0] =~ /^(foo|or|more)$/ }
189 ! \%fooormore sub { $_[0] =~ /^(foo|or|less)$/ }
190 +{%fooormore} sub { $_[0] =~ /^(foo|or|more)$/ }
191 ! +{%fooormore} sub { $_[0] =~ /^(foo|or|less)$/ }
192 @fooormore sub { $_[0] =~ /^(foo|or|more)$/ }
193 ! @fooormore sub { $_[0] =~ /^(foo|or|less)$/ }
194 \@fooormore sub { $_[0] =~ /^(foo|or|more)$/ }
195 ! \@fooormore sub { $_[0] =~ /^(foo|or|less)$/ }
196 [@fooormore] sub { $_[0] =~ /^(foo|or|more)$/ }
197 ! [@fooormore] sub { $_[0] =~ /^(foo|or|less)$/ }
198 %fooormore sub{@_==1}
199 @fooormore sub{@_==1}
200 "foo" sub { $_[0] =~ /^(foo|or|more)$/ }
201 ! "more" sub { $_[0] =~ /^(foo|or|less)$/ }
202 /fooormore/ sub{ref $_[0] eq 'Regexp'}
203 qr/fooormore/ sub{ref $_[0] eq 'Regexp'}
214 # empty stuff matches, because the sub is never called:
226 # sub is not called on empty hashes / arrays
230 # - null-prototyped subs
239 # - non-null-prototyped subs
250 \%main:: {map {$_ => 'x'} keys %main::}
254 \%tied_hash \%tied_hash
261 { foo => 1 } ["foo", "bar"]
262 \%hash ["foo", "bar"]
265 \%hash [qw(foo quux)]
268 {foo => 1} qr/^(fo[ox])$/
269 ! +{0..99} qr/[13579]$/
272 +{foo => 1, bar => 2} "foo"
273 ! +{foo => 1, bar => 2} "baz"
277 # - another array ref
280 [["foo"], ["bar"]] [qr/o/, qr/a/]
281 ["foo", "bar"] [qr/o/, qr/a/]
282 ! ["foo", "bar"] [qr/o/, "foo"]
289 [qw(foo bar baz quux)] qr/x/
290 ! [qw(foo bar baz quux)] qr/y/
299 ! [qw(1foo 2bar)] "2"
300 [qw(1foo 2bar)] "2bar"
302 # Number against number
308 # Number against string
315 # Regex against string
319 # Regex against number
323 # Test the implicit referencing
338 %tied_hash %tied_hash
339 %hash { foo => 5, bar => 10 }
340 ! %hash { foo => 5, bar => 10, quux => 15 }
342 @nums { 1, '', 2, '' }
343 @nums { 1, '', 12, '' }
344 ! @nums { 11, '', 12, '' }