xref: /openbsd-src/gnu/usr.bin/perl/ext/POSIX/t/mb.t (revision 256a93a44f36679bee503f12e49566c2183f6181)
1f3efcd01Safresh1#!./perl
2f3efcd01Safresh1
3f3efcd01Safresh1# These tests are in a separate file, because they use fresh_perl_is()
4f3efcd01Safresh1# from test.pl.
5f3efcd01Safresh1
6f3efcd01Safresh1# The mb* functions use the "underlying locale" that is not affected by
7f3efcd01Safresh1# the Perl one.  So we run the tests in a separate "fresh_perl" process
8f3efcd01Safresh1# with the correct LC_CTYPE set in the environment.
9f3efcd01Safresh1
10f3efcd01Safresh1BEGIN {
11f3efcd01Safresh1    require Config; import Config;
12f3efcd01Safresh1    if ($^O ne 'VMS' and $Config{'extensions'} !~ /\bPOSIX\b/) {
13f3efcd01Safresh1	print "1..0\n";
14f3efcd01Safresh1	exit 0;
15f3efcd01Safresh1    }
16f3efcd01Safresh1    unshift @INC, "../../t";
17f3efcd01Safresh1    require 'loc_tools.pl';
18f3efcd01Safresh1    require 'charset_tools.pl';
19f3efcd01Safresh1    require 'test.pl';
20f3efcd01Safresh1}
21f3efcd01Safresh1
22de8cc8edSafresh1my $utf8_locale = find_utf8_ctype_locale();
23de8cc8edSafresh1
24de8cc8edSafresh1plan tests => 13;
25f3efcd01Safresh1
26f3efcd01Safresh1use POSIX qw();
27f3efcd01Safresh1
28f3efcd01Safresh1SKIP: {
29de8cc8edSafresh1    skip("mblen() not present", 7) unless $Config{d_mblen};
30f3efcd01Safresh1
31de8cc8edSafresh1    is(&POSIX::mblen("a", &POSIX::MB_CUR_MAX), 1, 'mblen() works on ASCII input');
32de8cc8edSafresh1    is(&POSIX::mblen("b"), 1, '... and the 2nd parameter is optional');
33f3efcd01Safresh1
34de8cc8edSafresh1    skip("LC_CTYPE locale support not available", 4)
35f3efcd01Safresh1      unless locales_enabled('LC_CTYPE');
36f3efcd01Safresh1
37de8cc8edSafresh1    skip("no utf8 locale available", 4) unless $utf8_locale;
38de8cc8edSafresh1    # Here we need to influence LC_CTYPE, but it's not enough to just
39de8cc8edSafresh1    # set this because LC_ALL could override it. It's also not enough
40de8cc8edSafresh1    # to delete LC_ALL because it could be used to override other
41de8cc8edSafresh1    # variables such as LANG in the underlying test environment.
42de8cc8edSafresh1    # Continue to set LC_CTYPE just in case...
43f3efcd01Safresh1    local $ENV{LC_CTYPE} = $utf8_locale;
44de8cc8edSafresh1    local $ENV{LC_ALL} = $utf8_locale;
45f3efcd01Safresh1
46f3efcd01Safresh1    fresh_perl_like(
47f3efcd01Safresh1        'use POSIX; print &POSIX::MB_CUR_MAX',
48f3efcd01Safresh1      qr/[4-6]/, {}, 'MB_CUR_MAX is at least 4 in a UTF-8 locale');
49f3efcd01Safresh1
50f3efcd01Safresh1  SKIP: {
51f3efcd01Safresh1    my ($major, $minor, $rest) = $Config{osvers} =~ / (\d+) \. (\d+) .* /x;
52de8cc8edSafresh1    skip("mblen() broken (at least for c.utf8) on early HP-UX", 3)
53f3efcd01Safresh1        if   $Config{osname} eq 'hpux'
54f3efcd01Safresh1          && $major < 11 || ($major == 11 && $minor < 31);
55de8cc8edSafresh1
56f3efcd01Safresh1    fresh_perl_is(
57de8cc8edSafresh1        'use POSIX; &POSIX::mblen(undef,0); print &POSIX::mblen("'
58f3efcd01Safresh1      . I8_to_native("\x{c3}\x{28}")
59f3efcd01Safresh1      . '", 2)',
60f3efcd01Safresh1      -1, {}, 'mblen() recognizes invalid multibyte characters');
61f3efcd01Safresh1
62f3efcd01Safresh1    fresh_perl_is(
63de8cc8edSafresh1     'use POSIX; &POSIX::mblen(undef,0);
64de8cc8edSafresh1      my $sigma = "\N{GREEK SMALL LETTER SIGMA}";
65de8cc8edSafresh1      utf8::encode($sigma);
66de8cc8edSafresh1      print &POSIX::mblen($sigma, 2)',
67f3efcd01Safresh1     2, {}, 'mblen() works on UTF-8 characters');
68de8cc8edSafresh1
69de8cc8edSafresh1    fresh_perl_is(
70de8cc8edSafresh1     'use POSIX; &POSIX::mblen(undef,0);
71de8cc8edSafresh1      my $wide; print &POSIX::mblen("\N{GREEK SMALL LETTER SIGMA}", 1);',
72de8cc8edSafresh1     -1, {}, 'mblen() returns -1 when input length is too short');
73de8cc8edSafresh1  }
74de8cc8edSafresh1}
75de8cc8edSafresh1
76de8cc8edSafresh1SKIP: {
77*256a93a4Safresh1    skip("mbtowc() not present", 5) unless $Config{d_mbtowc} || $Config{d_mbrtowc};
78de8cc8edSafresh1
79de8cc8edSafresh1    my $wide;
80de8cc8edSafresh1
81de8cc8edSafresh1    is(&POSIX::mbtowc($wide, "a"), 1, 'mbtowc() returns correct length on ASCII input');
82de8cc8edSafresh1    is($wide , ord "a", 'mbtowc() returns correct ordinal on ASCII input');
83de8cc8edSafresh1
84de8cc8edSafresh1    skip("LC_CTYPE locale support not available", 3)
85de8cc8edSafresh1      unless locales_enabled('LC_CTYPE');
86de8cc8edSafresh1
87de8cc8edSafresh1    skip("no utf8 locale available", 3) unless $utf8_locale;
88de8cc8edSafresh1
89de8cc8edSafresh1    local $ENV{LC_CTYPE} = $utf8_locale;
90de8cc8edSafresh1    local $ENV{LC_ALL} = $utf8_locale;
91de8cc8edSafresh1    local $ENV{PERL_UNICODE};
92de8cc8edSafresh1    delete $ENV{PERL_UNICODE};
93de8cc8edSafresh1
94de8cc8edSafresh1  SKIP: {
95de8cc8edSafresh1    my ($major, $minor, $rest) = $Config{osvers} =~ / (\d+) \. (\d+) .* /x;
96de8cc8edSafresh1    skip("mbtowc() broken (at least for c.utf8) on early HP-UX", 3)
97de8cc8edSafresh1        if   $Config{osname} eq 'hpux'
98de8cc8edSafresh1          && $major < 11 || ($major == 11 && $minor < 31);
99de8cc8edSafresh1
100de8cc8edSafresh1    fresh_perl_is(
101de8cc8edSafresh1        'use POSIX; &POSIX::mbtowc(undef, undef,0); my $wide; print &POSIX::mbtowc($wide, "'
102de8cc8edSafresh1      . I8_to_native("\x{c3}\x{28}")
103de8cc8edSafresh1      . '", 2)',
104de8cc8edSafresh1      -1, {}, 'mbtowc() recognizes invalid multibyte characters');
105de8cc8edSafresh1
106de8cc8edSafresh1    fresh_perl_is(
107de8cc8edSafresh1     'use POSIX; &POSIX::mbtowc(undef,undef,0);
108de8cc8edSafresh1      my $sigma = "\N{GREEK SMALL LETTER SIGMA}";
109de8cc8edSafresh1      utf8::encode($sigma);
110de8cc8edSafresh1      my $wide; my $len = &POSIX::mbtowc($wide, $sigma, 2);
111de8cc8edSafresh1      print "$len:$wide"',
112de8cc8edSafresh1     "2:963", {}, 'mbtowc() works on UTF-8 characters');
113de8cc8edSafresh1
114de8cc8edSafresh1    fresh_perl_is(
115de8cc8edSafresh1     'use POSIX; &POSIX::mbtowc(undef,undef,0);
116de8cc8edSafresh1      my $wide; print &POSIX::mbtowc($wide, "\N{GREEK SMALL LETTER SIGMA}", 1);',
117de8cc8edSafresh1     -1, {}, 'mbtowc() returns -1 when input length is too short');
118de8cc8edSafresh1  }
119de8cc8edSafresh1}
120de8cc8edSafresh1
121de8cc8edSafresh1SKIP: {
122*256a93a4Safresh1    skip("wctomb() not present", 2) unless $Config{d_wctomb} || $Config{d_wcrtomb};
123de8cc8edSafresh1
124de8cc8edSafresh1    fresh_perl_is('use POSIX; &POSIX::wctomb(undef,0); my $string; my $len = &POSIX::wctomb($string, ord "A"); print "$len:$string"',
125de8cc8edSafresh1      "1:A", {}, 'wctomb() works on ASCII input');
126de8cc8edSafresh1
127de8cc8edSafresh1    skip("LC_CTYPE locale support not available", 1)
128de8cc8edSafresh1      unless locales_enabled('LC_CTYPE');
129de8cc8edSafresh1
130de8cc8edSafresh1    skip("no utf8 locale available", 1) unless $utf8_locale;
131de8cc8edSafresh1
132de8cc8edSafresh1    local $ENV{LC_CTYPE} = $utf8_locale;
133de8cc8edSafresh1    local $ENV{LC_ALL} = $utf8_locale;
134de8cc8edSafresh1    local $ENV{PERL_UNICODE};
135de8cc8edSafresh1    delete $ENV{PERL_UNICODE};
136de8cc8edSafresh1
137de8cc8edSafresh1  SKIP: {
138de8cc8edSafresh1    my ($major, $minor, $rest) = $Config{osvers} =~ / (\d+) \. (\d+) .* /x;
139de8cc8edSafresh1    skip("wctomb() broken (at least for c.utf8) on early HP-UX", 1)
140de8cc8edSafresh1        if   $Config{osname} eq 'hpux'
141de8cc8edSafresh1          && $major < 11 || ($major == 11 && $minor < 31);
142de8cc8edSafresh1
143de8cc8edSafresh1    fresh_perl_is('use POSIX; &POSIX::wctomb(undef,0); my $string; my $len = &POSIX::wctomb($string, 0x100); print "$len:$string"',
144de8cc8edSafresh1      "2:" . I8_to_native("\x{c4}\x{80}"),
145de8cc8edSafresh1      {}, 'wctomb() works on UTF-8 characters');
146de8cc8edSafresh1
147f3efcd01Safresh1  }
148f3efcd01Safresh1}
149