use strict;
use warnings;
use Test::More;
use Encode qw( is_utf8 encode_utf8 );
use Inline C => <<'__EOC__';
void candidate(SV* sv) {
dXSARGS;
STRLEN len;
char* buf = SvPV(sv, len);
SP[0] = sv_2mortal(newSVpvn(buf, len));
XSRETURN(1);
}
__EOC__
sub baseline { is_utf8($_[0]) ? encode_utf8($_[0]) : $_[0] }
sub _u { my ($s) = @_; utf8::upgrade($s); $s }
sub _d { my ($s) = @_; utf8::downgrade($s); $s }
sub printable { sprintf("%v04X", $_[0]) }
my @tests = (
[ '00-7F', "a" ],
[ '80-FF,UTF8=0', _d(chr(0xE9)) ],
[ '80-FF,UTF8=1', _u(chr(0xE9)) ],
[ '>FF', chr(0x2660) ],
);
plan tests => 0+@tests;
for (@tests) {
my ($test_name, $input) = @$_;
my $got = candidate($input);
my $expected = baseline($input);
#is($got, $expected, $test_name);
is(printable($got), printable($expected), $test_name);
}
####
1..4
ok 1 - 00-7F
ok 2 - 80-FF,UTF8=0
ok 3 - 80-FF,UTF8=1
ok 4 - >FF
####
my @tests = (
[ '00-7F', "a" ],
[ '80-FF,UTF8=0', _d(chr(0xE9)) ],
[ '80-FF,UTF8=1', _u(chr(0xE9)) ],
[ '>FF', chr(0x2660) ],
);
plan tests => 0+@tests;
my $dbh = ... connect and setup as you wish ...
my $sth = $dbh->prepare('SELECT ?');
for (@tests) {
my ($test_name, $input) = @$_;
$sth->execute($input) or die;
my $row = $sth->fetch() or die;
$sth->finish() or die if $row;
my $got = $row->[0];
is(printable($got), printable($input), $test_name);
}