xref: /openbsd-src/gnu/usr.bin/perl/t/re/rxcode.t (revision 9f11ffb7133c203312a01e4b986886bc88c7d74b)
1b39c5158Smillert#!./perl
2b39c5158Smillert
3b39c5158SmillertBEGIN {
4b39c5158Smillert    chdir 't' if -d 't';
5b39c5158Smillert    require './test.pl';
6b8851fccSafresh1    set_up_inc('../lib');
7b39c5158Smillert}
8b39c5158Smillert
952736614Safresh1plan tests => 42;
10b39c5158Smillert
11b39c5158Smillert$^R = undef;
12b39c5158Smillertlike( 'a',  qr/^a(?{1})(?:b(?{2}))?/, 'a =~ ab?' );
13b39c5158Smillertcmp_ok( $^R, '==', 1, '..$^R after a =~ ab?' );
14b39c5158Smillert
15b39c5158Smillert$^R = undef;
16b39c5158Smillertunlike( 'abc', qr/^a(?{3})(?:b(?{4}))$/, 'abc !~ a(?:b)$' );
17b39c5158Smillertok( !defined $^R, '..$^R after abc !~ a(?:b)$' );
18b39c5158Smillert
19b39c5158Smillert$^R = undef;
20b39c5158Smillertlike( 'ab', qr/^a(?{5})b(?{6})/, 'ab =~ ab' );
21b39c5158Smillertcmp_ok( $^R, '==', 6, '..$^R after ab =~ ab' );
22b39c5158Smillert
23b39c5158Smillert$^R = undef;
24b39c5158Smillertlike( 'ab', qr/^a(?{7})(?:b(?{8}))?/, 'ab =~ ab?' );
25b39c5158Smillert
26b39c5158Smillertcmp_ok( $^R, '==', 8, '..$^R after ab =~ ab?' );
27b39c5158Smillert
28b39c5158Smillert$^R = undef;
29b39c5158Smillertlike( 'ab', qr/^a(?{9})b?(?{10})/, 'ab =~ ab? (2)' );
30b39c5158Smillertcmp_ok( $^R, '==', 10, '..$^R after ab =~ ab? (2)' );
31b39c5158Smillert
32b39c5158Smillert$^R = undef;
33b39c5158Smillertlike( 'ab', qr/^(a(?{11})(?:b(?{12})))?/, 'ab =~ (ab)? (3)' );
34b39c5158Smillertcmp_ok( $^R, '==', 12, '..$^R after ab =~ ab? (3)' );
35b39c5158Smillert
36b39c5158Smillert$^R = undef;
37b39c5158Smillertunlike( 'ac', qr/^a(?{13})b(?{14})/, 'ac !~ ab' );
38b39c5158Smillertok( !defined $^R, '..$^R after ac !~ ab' );
39b39c5158Smillert
40b39c5158Smillert$^R = undef;
41b39c5158Smillertlike( 'ac', qr/^a(?{15})(?:b(?{16}))?/, 'ac =~ ab?' );
42b39c5158Smillertcmp_ok( $^R, '==', 15, '..$^R after ac =~ ab?' );
43b39c5158Smillert
44b39c5158Smillertmy @ar;
45b39c5158Smillertlike( 'ab', qr/^a(?{push @ar,101})(?:b(?{push @ar,102}))?/, 'ab =~ ab? with code push' );
46b39c5158Smillertcmp_ok( scalar(@ar), '==', 2, '..@ar pushed' );
47b39c5158Smillertcmp_ok( $ar[0], '==', 101, '..first element pushed' );
48b39c5158Smillertcmp_ok( $ar[1], '==', 102, '..second element pushed' );
49b39c5158Smillert
50b39c5158Smillert$^R = undef;
51b39c5158Smillertunlike( 'a', qr/^a(?{103})b(?{104})/, 'a !~ ab with code push' );
52b39c5158Smillertok( !defined $^R, '..$^R after a !~ ab with code push' );
53b39c5158Smillert
54b39c5158Smillert@ar = ();
55b39c5158Smillertunlike( 'a', qr/^a(?{push @ar,105})b(?{push @ar,106})/, 'a !~ ab (push)' );
56b39c5158Smillertcmp_ok( scalar(@ar), '==', 0, '..nothing pushed' );
57b39c5158Smillert
58b39c5158Smillert@ar = ();
59b39c5158Smillertunlike( 'abc', qr/^a(?{push @ar,107})b(?{push @ar,108})$/, 'abc !~ ab$ (push)' );
60b39c5158Smillertcmp_ok( scalar(@ar), '==', 0, '..still nothing pushed' );
61b39c5158Smillert
62*9f11ffb7Safresh1our @var;
63b39c5158Smillert
64b39c5158Smillertlike( 'ab', qr/^a(?{push @var,109})(?:b(?{push @var,110}))?/, 'ab =~ ab? push to package var' );
65b39c5158Smillertcmp_ok( scalar(@var), '==', 2, '..@var pushed' );
66b39c5158Smillertcmp_ok( $var[0], '==', 109, '..first element pushed (package)' );
67b39c5158Smillertcmp_ok( $var[1], '==', 110, '..second element pushed (package)' );
68b39c5158Smillert
69b39c5158Smillert@var = ();
70b39c5158Smillertunlike( 'a', qr/^a(?{push @var,111})b(?{push @var,112})/, 'a !~ ab (push package var)' );
71b39c5158Smillertcmp_ok( scalar(@var), '==', 0, '..nothing pushed (package)' );
72b39c5158Smillert
73b39c5158Smillert@var = ();
74b39c5158Smillertunlike( 'abc', qr/^a(?{push @var,113})b(?{push @var,114})$/, 'abc !~ ab$ (push package var)' );
75b39c5158Smillertcmp_ok( scalar(@var), '==', 0, '..still nothing pushed (package)' );
76b39c5158Smillert
77b39c5158Smillert{
78b39c5158Smillert    local $^R = undef;
79b39c5158Smillert    ok( 'ac' =~ /^a(?{30})(?:b(?{31})|c(?{32}))?/, 'ac =~ a(?:b|c)?' );
80b39c5158Smillert    ok( $^R == 32, '$^R == 32' );
81b39c5158Smillert}
82b39c5158Smillert{
83b39c5158Smillert    local $^R = undef;
84b39c5158Smillert    ok( 'abbb' =~ /^a(?{36})(?:b(?{37})|c(?{38}))+/, 'abbbb =~ a(?:b|c)+' );
85b39c5158Smillert    ok( $^R == 37, '$^R == 37' ) or print "# \$^R=$^R\n";
86b39c5158Smillert}
8791f110e0Safresh1
8891f110e0Safresh1# Broken temporarily by the jumbo re-eval rewrite in 5.17.1; fixed in .6
8991f110e0Safresh1{
9091f110e0Safresh1    use re 'eval';
9191f110e0Safresh1    $x = "(?{})";
9291f110e0Safresh1    is eval { "a" =~ /a++(?{})+$x/x } || $@, '1', '/a++(?{})+$code_block/'
9391f110e0Safresh1}
946fb12b70Safresh1
956fb12b70Safresh1# [perl #78194] $_ in code block aliasing op return values
966fb12b70Safresh1"$_" =~ /(?{ is \$_, \$_,
976fb12b70Safresh1               '[perl #78194] \$_ == \$_ when $_ aliases "$x"' })/;
9852736614Safresh1
9952736614Safresh1@a = 1..3;
10052736614Safresh1like eval { qr/@a(?{})/ }, qr/1 2 3\(\?\{\}\)/, 'qr/@a(?{})/';
10152736614Safresh1
10252736614Safresh1# Not a code block, but looks a bit like one.  (Failed an assertion from
10352736614Safresh1# 5.17.1 to 5.21.6.)
10452736614Safresh1ok "(?{" =~ qr/\Q(?{/, 'qr/\Q(?{/';
105