Make tests for gmagic on sub exit count fetches
authorFather Chrysostomos <sprout@cpan.org>
Fri, 22 Jul 2011 16:52:56 +0000 (09:52 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 22 Jul 2011 16:54:13 +0000 (09:54 -0700)
These tests, added in commit 767eda44 (when lvalue subs started auto-
vivifying, causing regular sub exit to have to call get-magic), were
not counting the number of fetches, but simply whether the fetches
were happening.  The number that was occurring was wrong until
7ffa7e75, which fixed symbolic refs to call magic the right number of
times.  But now that that’s fixed, we can count them.  So this commit
does just that.

t/op/gmagic.t

index 26ad08553b9ab4ee34302b0fc62e67c6ae9b2d7a..2ec1f1126c0c314bf38bac44fae9cbc924d3f8bf 100644 (file)
@@ -11,11 +11,11 @@ use strict;
 tie my $c => 'Tie::Monitor';
 
 sub expected_tie_calls {
-    my ($obj, $rexp, $wexp) = @_;
+    my ($obj, $rexp, $wexp, $tn) = @_;
     local $::Level = $::Level + 1;
     my ($rgot, $wgot) = $obj->init();
-    is ($rgot, $rexp);
-    is ($wgot, $wexp);
+    is ($rgot, $rexp, $tn ? "number of fetches when $tn" : ());
+    is ($wgot, $wexp, $tn ? "number of stores when $tn" : ());
 }
 
 # Use ok() instead of is(), cmp_ok() etc, to strictly control number of accesses
@@ -69,14 +69,19 @@ ok($wgot == 0, 'a plain *foo causes no set-magic');
 
 # get-magic when exiting a non-lvalue sub in potentially autovivify-
 # ing context
-my $tied_to = tie $_{elem}, "Tie::Monitor";
-eval { () = sub { delete $_{elem} }->()->[3] };
-ok +($tied_to->init)[0],
- 'get-magic is called on mortal magic var on sub exit in autoviv context';
-$tied_to = tie $_{elem}, "Tie::Monitor";
-eval { () = sub { return delete $_{elem} }->()->[3] };
-ok +($tied_to->init)[0],
- 'get-magic is called on mortal magic var on return in autoviv context';
+{
+  no strict;
+
+  my $tied_to = tie $_{elem}, "Tie::Monitor";
+  () = sub { delete $_{elem} }->()->[3];
+  expected_tie_calls $tied_to, 1, 0,
+     'mortal magic var is implicitly returned in autoviv context';
+
+  $tied_to = tie $_{elem}, "Tie::Monitor";
+  () = sub { return delete $_{elem} }->()->[3];
+  expected_tie_calls $tied_to, 1, 0,
+      'mortal magic var is explicitly returned in autoviv context';
+}
 
 done_testing();