This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #78072] use re '/xism';
[perl5.git] / ext / re / t / reflags.t
1 #!./perl
2
3 BEGIN {
4         require Config;
5         if (($Config::Config{'extensions'} !~ /\bre\b/) ){
6                 print "1..0 # Skip -- Perl configured without re module\n";
7                 exit 0;
8         }
9 }
10
11 use strict;
12
13 use Test::More tests => 32;
14
15 use re '/i';
16 ok "Foo" =~ /foo/, 'use re "/i"';
17 no re '/i';
18 ok "Foo" !~ /foo/, 'no re "/i"';
19 use re '/x';
20 ok "foo" =~ / foo /, 'use re "/x"';
21 no re '/x';
22 ok "foo" !~ / foo /, 'no re "/x"';
23 use re '/s';
24 ok "\n" =~ /./, 'use re "/s"';
25 no re '/s';
26 ok "\n" !~ /./, 'no re "/s"';
27 use re '/m';
28 ok "\nfoo" =~ /^foo/, 'use re "/m"';
29 no re '/m';
30 ok "\nfoo" !~ /^foo/, 'no re "/m"';
31
32 use re '/xism';
33 ok qr// =~ /(?=.*x)(?=.*i)(?=.*s)(?=.*m)/, 'use re "/multiple"';
34 no re '/ix';
35 ok qr// =~ /(?!.*x)(?!.*i)(?=.*s)(?=.*m)/, 'no re "/i" only turns off /ix';
36 no re '/sm';
37
38 {
39   use re '/x';
40   ok 'frelp' =~ /f r e l p/, "use re '/x' in a lexical scope"
41 }
42 ok 'f r e l p' =~ /f r e l p/,
43  "use re '/x' turns off when it drops out of scope";
44
45 SKIP: {
46   if (
47       !$Config::Config{d_setlocale}
48    || $Config::Config{ccflags} =~ /\bD?NO_LOCALE\b/
49   ) {
50     skip "no locale support", 7
51   }
52   use locale;
53   use re '/u';
54   is qr//, '(?^u:)', 'use re "/u" with active locale';
55   no re '/u';
56   is qr//, '(?^l:)', 'no re "/u" reverts to /l with locale in scope';
57   no re '/l';
58   is qr//, '(?^l:)', 'no re "/l" is a no-op with locale in scope';
59   use re '/d';
60   is qr//, '(?^:)', 'use re "/d" with locale in scope';
61   no re '/l';
62   no re '/u';
63   is qr//, '(?^:)',
64     'no re "/l" and "/u" are no-ops when not on (locale scope)';
65   no re "/d";
66   is qr//, '(?^l:)', 'no re "/d" reverts to /l with locale in scope';
67   use re "/u";
68   no re "/d";
69   is qr//, '(?^u:)', 'no re "/d" is a no-op when not on (locale scope)';
70 }
71
72 {
73   use feature "unicode_strings";
74   use re '/d';
75   is qr//, '(?^:)', 'use re "/d" in Unicode scope';
76   no re '/d';
77   is qr//, '(?^u:)', 'no re "/d" reverts to /u in Unicode scope';
78   no re '/u';
79   is qr//, '(?^u:)', 'no re "/u" is a no-op in Unicode scope';
80   no re '/d';
81   is qr//, '(?^u:)', 'no re "/d" is a no-op when not on';
82   use re '/u';
83   no feature 'unicode_strings';
84   is qr//, '(?^u:)', 'use re "/u" is not tied to unicode_strings feature';
85 }
86
87 use re '/u';
88 is qr//, '(?^u:)', 'use re "/u"';
89 no re '/u';
90 is qr//, '(?^:)', 'no re "/u" reverts to /d';
91 no re '/u';
92 is qr//, '(?^:)', 'no re "/u" is a no-op when not on';
93 no re '/d';
94 is qr//, '(?^:)', 'no re "/d" is a no-op when not on';
95
96 {
97   local $SIG{__WARN__} = sub {
98    ok $_[0] =~ /Unknown regular expression flag "\x{100}"/,
99        "warning with unknown regexp flags in use re '/flags'"
100   };
101   import re "/\x{100}"
102 }
103
104 # use re '/flags' in combination with explicit flags
105 use re '/xi';
106 ok "A\n\n" =~ / a.$/sm, 'use re "/xi" in combination with explicit /sm';
107 {
108   local $::TODO = "test requires perl 5.16 syntax";
109   # (remove the evals, the quotes, and the ‘no warnings’ when removing the
110   # to-do notice)
111   no warnings;
112   use re '/u';
113   is eval 'qr//d', '(?^:)', 'explicit /d in re "/u" scope';
114   use re '/d';
115   is eval 'qr//u', '(?^u:)', 'explicit /u in re "/d" scope';
116 }