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