1#!perl -w 2 3use strict; 4use Test::More; 5use Encode; 6 7use XS::APItest qw(utf16_to_utf8 utf16_to_utf8_reversed); 8 9for my $ord (0, 10, 13, 78, 255, 256, 0xD7FF, 0xE000, 0xFFFD, 10 0x10000, 0x10FC00, 0x103FF, 0x10FFFD) { 11 my $chr = chr $ord; 12 for my $prefix ('', "\0", 'Perl rules') { 13 for my $suffix ('', "\0", "Moo!") { 14 my $string = $prefix . $chr . $suffix; 15 my $name = sprintf "for chr $ord prefix %d, suffix %d", 16 length $prefix, length $suffix; 17 my $as_utf8 = $string; 18 utf8::encode($as_utf8); 19 is(utf16_to_utf8(encode('UTF-16BE', $string)), $as_utf8, 20 "utf16_to_utf8 $name"); 21 is(utf16_to_utf8_reversed(encode('UTF-16LE', $string)), $as_utf8, 22 "utf16_to_utf8_reversed $name"); 23 } 24 } 25} 26 27foreach ("\0", 'N', 'Perl rules!') { 28 my $length = length $_; 29 my $got = eval {utf16_to_utf8($_)}; 30 like($@, qr/^panic: utf16_to_utf8: odd bytelen $length at/, 31 "Odd byte length panics for '$_'"); 32 is($got, undef, 'hence eval returns undef'); 33} 34 35for (["\xD8\0\0\0", 'NULs'], 36 ["\xD8\0\xD8\0", '2 Lows'], 37 ["\xDC\0\0\0", 'High NUL'], 38 ["\xDC\0\xD8\0", 'High Low'], 39 ["\xDC\0\xDC\0", 'High High'], 40 ) { 41 my ($malformed, $name) = @$_; 42 my $got = eval {utf16_to_utf8($malformed)}; 43 like($@, qr/^Malformed UTF-16 surrogate at/, 44 "Malformed surrogate $name croaks for utf16_to_utf8"); 45 is($got, undef, 'hence eval returns undef'); 46 47 $malformed =~ s/(.)(.)/$2$1/gs; 48 $got = eval {utf16_to_utf8_reversed($malformed)}; 49 like($@, qr/^Malformed UTF-16 surrogate at/, 50 "Malformed surrogate $name croaks for utf16_to_utf8_reversed"); 51 is($got, undef, 'hence eval returns undef'); 52} 53 54my $in = "NA"; 55my $got = eval {utf16_to_utf8_reversed($in, 1)}; 56like($@, qr/^panic: utf16_to_utf8_reversed: odd bytelen 1 at/, 57 'Odd byte length panics'); 58is($got, undef, 'hence eval returns undef'); 59is($in, "NA", 'and input unchanged'); 60 61$in = "\xD8\0\xDC\0"; 62$got = eval {utf16_to_utf8($in, 2)}; 63like($@, qr/^Malformed UTF-16 surrogate at/, 'Lone surrogate croaks'); 64(ok(!defined $got, 'hence eval returns undef')) or 65 diag(join ', ', map {ord $_} split //, $got); 66 67done_testing; 68