Fixes for the test suite on OS/2
[p5sagit/p5-mst-13.2.git] / t / op / sub_lval.t
index 4654118..953a1e0 100755 (executable)
@@ -1,4 +1,4 @@
-print "1..64\n";
+print "1..72\n";
 
 BEGIN {
     chdir 't' if -d 't';
@@ -43,92 +43,92 @@ $blah = 3;
 
 get_st = 7;
 
-print "# `$blah' ne 7\nnot " unless $blah eq 7;
+print "# `$blah' ne 7\nnot " unless $blah == 7;
 print "ok 4\n";
 
 get_lex = 7;
 
-print "# `$in' ne 7\nnot " unless $in eq 7;
+print "# `$in' ne 7\nnot " unless $in == 7;
 print "ok 5\n";
 
 ++get_st;
 
-print "# `$blah' ne 8\nnot " unless $blah eq 8;
+print "# `$blah' ne 8\nnot " unless $blah == 8;
 print "ok 6\n";
 
 ++get_lex;
 
-print "# `$in' ne 8\nnot " unless $in eq 8;
+print "# `$in' ne 8\nnot " unless $in == 8;
 print "ok 7\n";
 
 id(get_st) = 10;
 
-print "# `$blah' ne 10\nnot " unless $blah eq 10;
+print "# `$blah' ne 10\nnot " unless $blah == 10;
 print "ok 8\n";
 
 id(get_lex) = 10;
 
-print "# `$in' ne 10\nnot " unless $in eq 10;
+print "# `$in' ne 10\nnot " unless $in == 10;
 print "ok 9\n";
 
 ++id(get_st);
 
-print "# `$blah' ne 11\nnot " unless $blah eq 11;
+print "# `$blah' ne 11\nnot " unless $blah == 11;
 print "ok 10\n";
 
 ++id(get_lex);
 
-print "# `$in' ne 11\nnot " unless $in eq 11;
+print "# `$in' ne 11\nnot " unless $in == 11;
 print "ok 11\n";
 
 id1(get_st) = 20;
 
-print "# `$blah' ne 20\nnot " unless $blah eq 20;
+print "# `$blah' ne 20\nnot " unless $blah == 20;
 print "ok 12\n";
 
 id1(get_lex) = 20;
 
-print "# `$in' ne 20\nnot " unless $in eq 20;
+print "# `$in' ne 20\nnot " unless $in == 20;
 print "ok 13\n";
 
 ++id1(get_st);
 
-print "# `$blah' ne 21\nnot " unless $blah eq 21;
+print "# `$blah' ne 21\nnot " unless $blah == 21;
 print "ok 14\n";
 
 ++id1(get_lex);
 
-print "# `$in' ne 21\nnot " unless $in eq 21;
+print "# `$in' ne 21\nnot " unless $in == 21;
 print "ok 15\n";
 
 inc(get_st);
 
-print "# `$blah' ne 22\nnot " unless $blah eq 22;
+print "# `$blah' ne 22\nnot " unless $blah == 22;
 print "ok 16\n";
 
 inc(get_lex);
 
-print "# `$in' ne 22\nnot " unless $in eq 22;
+print "# `$in' ne 22\nnot " unless $in == 22;
 print "ok 17\n";
 
 inc(id(get_st));
 
-print "# `$blah' ne 23\nnot " unless $blah eq 23;
+print "# `$blah' ne 23\nnot " unless $blah == 23;
 print "ok 18\n";
 
 inc(id(get_lex));
 
-print "# `$in' ne 23\nnot " unless $in eq 23;
+print "# `$in' ne 23\nnot " unless $in == 23;
 print "ok 19\n";
 
 ++inc(id1(id(get_st)));
 
-print "# `$blah' ne 25\nnot " unless $blah eq 25;
+print "# `$blah' ne 25\nnot " unless $blah == 25;
 print "ok 20\n";
 
 ++inc(id1(id(get_lex)));
 
-print "# `$in' ne 25\nnot " unless $in eq 25;
+print "# `$in' ne 25\nnot " unless $in == 25;
 print "ok 21\n";
 
 @a = (1) x 3;
@@ -166,7 +166,7 @@ sub a::var : lvalue { $var }
 
 "a"->var = 45;
 
-print "# `$var' ne 45\nnot " unless $var eq 45;
+print "# `$var' ne 45\nnot " unless $var == 45;
 print "ok 23\n";
 
 my $oo;
@@ -174,14 +174,14 @@ $o = bless \$oo, "a";
 
 $o->var = 47;
 
-print "# `$var' ne 47\nnot " unless $var eq 47;
+print "# `$var' ne 47\nnot " unless $var == 47;
 print "ok 24\n";
 
 sub o : lvalue { $o }
 
 o->var = 49;
 
-print "# `$var' ne 49\nnot " unless $var eq 49;
+print "# `$var' ne 49\nnot " unless $var == 49;
 print "ok 25\n";
 
 sub nolv () { $x0, $x1 } # Not lvalue
@@ -251,7 +251,7 @@ eval <<'EOE' or $_ = $@;
 EOE
 
 print "# '$_'.\nnot "
-  unless /Empty array returned from lvalue subroutine in scalar context/;
+  unless /Can't return undef from lvalue subroutine/;
 print "ok 31\n";
 
 sub lv10 : lvalue {}
@@ -274,7 +274,7 @@ eval <<'EOE' or $_ = $@;
 EOE
 
 print "# '$_'.\nnot "
-  unless /Can\'t return a readonly value from lvalue subroutine/;
+  unless /Can't return undef from lvalue subroutine/;
 print "ok 33\n";
 
 $_ = undef;
@@ -423,10 +423,7 @@ $a->() = 8;
 print "# '$nnewvar'.\nnot " unless $nnewvar eq '8';
 print "ok 46\n";
 
-# This must happen at run time
-eval {
-    sub AUTOLOAD : lvalue { $newvar };
-};
+eval 'sub AUTOLOAD : lvalue { $newvar }';
 foobar() = 12;
 print "# '$newvar'.\nnot " unless $newvar eq "12";
 print "ok 47\n";
@@ -532,3 +529,89 @@ sub lval2 : lvalue { $ary[1]; }
 (lval1(), lval2()) = split ' ', "1 2 3 4";
 print "not " unless join(':', @ary) eq "1:2:6";
 print "ok 64\n";
+
+# check that an element of a tied hash/array can be assigned to via lvalueness
+
+package Tie_Hash;
+
+our ($key, $val);
+sub TIEHASH { bless \my $v => __PACKAGE__ }
+sub STORE   { ($key, $val) = @_[1,2] }
+
+package main;
+sub lval_tie_hash : lvalue {
+    tie my %t => 'Tie_Hash';
+    $t{key};
+}
+
+eval { lval_tie_hash() = "value"; };
+
+print "# element of tied hash: $@\nnot " if $@;
+print "ok 65\n";
+
+print "not " if "$Tie_Hash::key-$Tie_Hash::val" ne "key-value";
+print "ok 66\n";
+
+
+package Tie_Array;
+
+our @val;
+sub TIEARRAY { bless \my $v => __PACKAGE__ }
+sub STORE   { $val[ $_[1] ] = $_[2] }
+
+package main;
+sub lval_tie_array : lvalue {
+    tie my @t => 'Tie_Array';
+    $t[0];
+}
+
+eval { lval_tie_array() = "value"; };
+
+print "# element of tied array: $@\nnot " if $@;
+print "ok 67\n";
+
+print "not " if $Tie_Array::val[0] ne "value";
+print "ok 68\n";
+
+require './test.pl';
+curr_test(69);
+
+TODO: {
+    local $TODO = 'test explicit return of lval expr';
+
+    # subs are corrupted copies from tests 1-~4
+    sub bad_get_lex : lvalue { return $in };
+    sub bad_get_st  : lvalue { return $blah }
+
+    sub bad_id  : lvalue { return ${\shift} }
+    sub bad_id1 : lvalue { return $_[0] }
+    sub bad_inc : lvalue { return ${\++$_[0]} }
+
+    $in = 5;
+    $blah = 3;
+
+    bad_get_st = 7;
+
+    is( $blah, 7 );
+
+    bad_get_lex = 7;
+
+    is($in, 7, "yada");
+
+    ++bad_get_st;
+
+    is($blah, 8, "yada");
+}
+
+TODO: {
+    local $TODO = "bug #23790";
+    my @arr  = qw /one two three/;
+    my $line = "zero";
+    sub lval_array () : lvalue {@arr}
+
+    for (lval_array) {
+        $line .= $_;
+    }
+
+    is($line, "zeroonetwothree");
+}