This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Maintainers.PL for divergence from cpan
[perl5.git] / t / op / bop.t
index b7f82ee..fa08e98 100644 (file)
@@ -15,7 +15,7 @@ BEGIN {
 # If you find tests are failing, please try adding names to tests to track
 # down where the failure is, and supply your new names as a patch.
 # (Just-in-time test naming)
-plan tests => 161 + (10*13*2) + 4;
+plan tests => 174 + (10*13*2) + 5;
 
 # numerics
 ok ((0xdead & 0xbeef) == 0x9ead);
@@ -63,6 +63,32 @@ is (($foo | $bar), ($Aoz x 75 . $zap));
 # ^ does not truncate
 is (($foo ^ $bar), ($Axz x 75 . $zap));
 
+# string constants
+sub _and($) { $_[0] & "+0" }
+sub _oar($) { $_[0] | "+0" }
+sub _xor($) { $_[0] ^ "+0" }
+is _and "waf", '# ',  'str var & const str'; # These three
+is _and  0,    '0',   'num var & const str';    # are from
+is _and "waf", '# ',  'str var & const str again'; # [perl #20661]
+is _oar "yit", '{yt', 'str var | const str';
+is _oar  0,    '0',   'num var | const str';
+is _oar "yit", '{yt', 'str var | const str again';
+is _xor "yit", 'RYt', 'str var ^ const str';
+is _xor  0,    '0',   'num var ^ const str';
+is _xor "yit", 'RYt', 'str var ^ const str again';
+
+# But don’t mistake a COW for a constant when assigning to it
+%h=(150=>1);
+$i=(keys %h)[0];
+$i |= 105;
+is $i, 255, '[perl #108480] $cow |= number';
+$i=(keys %h)[0];
+$i &= 105;
+is $i, 0, '[perl #108480] $cow &= number';
+$i=(keys %h)[0];
+$i ^= 105;
+is $i, 255, '[perl #108480] $cow ^= number';
+
 #
 is ("ok \xFF\xFF\n" & "ok 19\n", "ok 19\n");
 is ("ok 20\n" | "ok \0\0\n", "ok 20\n");
@@ -427,6 +453,16 @@ SKIP: {
   # it's really bogus that (~~malformed) is \0.
   my $ref = "\x{10000}\0";
   is(~~$str, $ref);
+
+  # same test, but this time with a longer replacement string that
+  # exercises a different branch in pp_subsr()
+
+  $str = "\x{10000}\x{800}";
+  { use bytes; $str =~ s/\C\C\z/\0\0\0/; }
+
+  # it's also bogus that (~~malformed) is \0\0\0\0.
+  my $ref = "\x{10000}\0\0\0\0";
+  is(~~$str, $ref, "use bytes with long replacement");
 }
 
 # ref tests
@@ -530,3 +566,7 @@ $strval = "x";
 eval { $obj |= "Q" };
 $strval = "z";
 is("$obj", "z", "|= doesn't break string overload");
+
+# [perl #29070]
+$^A .= new version ~$_ for "\xce", v205, "\xcc";
+is $^A, "123", '~v0 clears vstring magic on retval';