1b8851fccSafresh1use strict; 2b8851fccSafresh1use warnings; 3*b46d8ef2Safresh1BEGIN { 'warnings'->unimport('utf8') if $] < 5.014 }; # turn off 'UTF-16 surrogate 0xd800' warnings 4b8851fccSafresh1 5*b46d8ef2Safresh1use Test::More; 6*b46d8ef2Safresh1use Encode qw(encode decode FB_CROAK LEAVE_SRC); 7b8851fccSafresh1 8*b46d8ef2Safresh1my $script = quotemeta $0; 9b8851fccSafresh1 10*b46d8ef2Safresh1plan tests => 12; 11b8851fccSafresh1 12*b46d8ef2Safresh1my @invalid; 13b8851fccSafresh1 14*b46d8ef2Safresh1ok ! defined eval { encode('UTF-8', "\x{D800}", FB_CROAK | LEAVE_SRC) }, 'Surrogate codepoint \x{D800} is not encoded to strict UTF-8'; 15*b46d8ef2Safresh1like $@, qr/^"\\x\{d800\}" does not map to UTF-8 at $script line /, 'Error message contains strict UTF-8 name'; 16*b46d8ef2Safresh1@invalid = (); 17*b46d8ef2Safresh1encode('UTF-8', "\x{D800}", sub { @invalid = @_; return ""; }); 18*b46d8ef2Safresh1is_deeply \@invalid, [ 0xD800 ], 'Fallback coderef contains invalid codepoint 0xD800'; 19b8851fccSafresh1 20*b46d8ef2Safresh1ok ! defined eval { decode('UTF-8', "\xed\xa0\x80", FB_CROAK | LEAVE_SRC) }, 'Surrogate UTF-8 byte sequence \xED\xA0\x80 is decoded with strict UTF-8 decoder'; 21*b46d8ef2Safresh1like $@, qr/^UTF-8 "\\xED\\xA0\\x80" does not map to Unicode at $script line /, 'Error message contains strict UTF-8 name and original (not decoded) invalid sequence'; 22*b46d8ef2Safresh1@invalid = (); 23*b46d8ef2Safresh1decode('UTF-8', "\xed\xa0\x80", sub { @invalid = @_; return ""; }); 24*b46d8ef2Safresh1is_deeply \@invalid, [ 0xED, 0xA0, 0x80 ], 'Fallback coderef contains invalid byte sequence 0xED, 0xA0, 0x80'; 255759b3d2Safresh1 26*b46d8ef2Safresh1ok ! defined eval { decode('UTF-8', "\xed\xa0", FB_CROAK | LEAVE_SRC) }, 'Invalid byte sequence \xED\xA0 is not decoded with strict UTF-8 decoder'; 27*b46d8ef2Safresh1like $@, qr/^UTF-8 "\\xED\\xA0" does not map to Unicode at $script line /, 'Error message contains strict UTF-8 name and original (not decoded) invalid sequence'; 28*b46d8ef2Safresh1@invalid = (); 29*b46d8ef2Safresh1decode('UTF-8', "\xed\xa0", sub { @invalid = @_; return ""; }); 30*b46d8ef2Safresh1is_deeply \@invalid, [ 0xED, 0xA0 ], 'Fallback coderef contains invalid byte sequence 0xED, 0xA0'; 315759b3d2Safresh1 32*b46d8ef2Safresh1ok ! defined eval { decode('utf8', "\xed\xa0", FB_CROAK | LEAVE_SRC) }, 'Invalid byte sequence \xED\xA0 is not decoded with non-strict utf8 decoder'; 33*b46d8ef2Safresh1like $@, qr/^utf8 "\\xED\\xA0" does not map to Unicode at $script line /, 'Error message contains non-strict utf8 name and original (not decoded) invalid sequence'; 34*b46d8ef2Safresh1decode('utf8', "\xed\xa0", sub { @invalid = @_; return ""; }); 35*b46d8ef2Safresh1is_deeply \@invalid, [ 0xED, 0xA0 ], 'Fallback coderef contains invalid byte sequence 0xED, 0xA0'; 36