This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix utf char > IV_MAX on 32-bit platforms
[perl5.git] / t / op / lex_assign.t
index bd0c279..e1abde3 100644 (file)
@@ -5,8 +5,8 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    @INC = '../lib';
     require './test.pl';
+    set_up_inc('../lib');
 }
 
 $| = 1;
@@ -93,7 +93,7 @@ EOE
   if ($@) {
     $warning = $@;
     chomp $warning;
-    if ($@ !~ /is unimplemented/) {
+    if ($@ !~ /(?:is un|not )implemented/) {
       fail($_ . ' ' . $warning);
     }
   }
@@ -102,12 +102,13 @@ EOE
 {                              # Check calling STORE
   note('Tied variables, calling STORE');
   my $sc = 0;
-  sub B::TIESCALAR {bless [11], 'B'}
-  sub B::FETCH { -(shift->[0]) }
-  sub B::STORE { $sc++; my $o = shift; $o->[0] = 17 + shift }
+  # do not use B:: namespace
+  sub BB::TIESCALAR {bless [11], 'BB'}
+  sub BB::FETCH { -(shift->[0]) }
+  sub BB::STORE { $sc++; my $o = shift; $o->[0] = 17 + shift }
 
   my $m;
-  tie $m, 'B';
+  tie $m, 'BB';
   $m = 100;
 
   is( $sc, 1, 'STORE called when assigning scalar to tied variable' );
@@ -132,7 +133,7 @@ EOE
     $sc = 0;
     local $SIG{__WARN__} = \&wrn;
     eval "\$m = $op";
-    like $sc, $@ ? qr/^[01]\z/ : qr/^1\z/, "STORE count for $comment";
+    is $sc, $@ ? 0 : 1, "STORE count for $comment";
   }
 }
 
@@ -152,7 +153,7 @@ EOE
   if ($@) {
     $warning = $@;
     chomp $warning;
-    if ($@ =~ /is unimplemented/) {
+    if ($@ =~ /(?:is un|not )implemented/) {
       SKIP: {
         skip $warning, 1;
         pass($comment);
@@ -169,6 +170,19 @@ EOE
   }
 }
 
+# [perl #123790] Assigning to a typeglob
+# These used to die or crash.
+# Once the bug is fixed for all ops, we can combine this with the tests
+# above that use <DATA>.
+for my $glob (*__) {
+  $glob = $y x $z;
+  { use integer; $glob = $y <=> $z; }
+  $glob = $y cmp $z;
+  $glob = vec 1, 2, 4;
+  $glob = ~${\""};
+  $glob = split;
+}
+
 # XXX This test does not really belong here, as it has nothing to do with
 #     OPpTARGET_MY optimisation.  But where should it go?
 eval {
@@ -184,6 +198,36 @@ eval {
 };
 is($@, '', 'ex-PVBM assert'.$@);
 
+# RT perl #127855
+# Check that stringification and assignment to itself doesn't break
+# anything. This is unlikely to actually fail the tests; its more something
+# for valgrind to spot. It will also only fail if SvGROW or its caller
+# decides to over-allocate (otherwise copying the string will skip the
+# sv_grow(), as the new size is the same as the current size).
+
+{
+    my $s;
+    for my $len (1..40) {
+        $s = 'x' x $len;
+        my $t = $s;
+        $t = "$t";
+        ok($s eq $t, "RT 127855: len=$len");
+    }
+}
+
+# time() can't be tested using the standard framework since two successive
+# calls may return differing values.
+
+{
+    my $a;
+    $a = time;
+    $b = time;
+    my $diff = $b - $a;
+    cmp_ok($diff, '>=', 0,  "time is monotically increasing");
+    cmp_ok($diff, '<',  2,  "time delta is small");
+}
+
+
 done_testing();
 
 __END__
@@ -191,14 +235,14 @@ ref $xref                 # ref
 ref $cstr                      # ref nonref
 `$runme -e "print qq[1\\n]"`                           # backtick skip(MSWin32)
 `$undefed`                     # backtick undef skip(MSWin32)
-<*>                            # glob
+'???'                          # glob  (not currently OA_TARGLEX)
 <OP>                           # readline
 'faked'                                # rcatline
 (@z = (1 .. 3))                        # aassign
-chop $chopit                   # chop
-(chop (@x=@chopar))            # schop
-chomp $chopit                  # chomp
-(chop (@x=@chopar))            # schomp
+(chop (@x=@chopar))            # chop
+chop $chopit                   # schop
+(chomp (@x=@chopar))           # chomp
+chomp $chopit                  # schomp
 pos $posstr                    # pos
 pos $chopit                    # pos returns undef
 $nn++==2                       # postinc
@@ -324,7 +368,7 @@ getpgrp                             # getpgrp
 setpgrp                                # setpgrp
 getpriority $$, $$             # getpriority
 '???'                          # setpriority
-time                           # time
+'???'                          # time
 localtime $^T                  # localtime
 gmtime $^T                     # gmtime
 '???'                          # sleep: can randomly fail