49 lines
1.8 KiB
Perl
49 lines
1.8 KiB
Perl
use v5.36;
|
|
use Test::More;
|
|
no warnings 'experimental::builtin';
|
|
use builtin qw/true false is_bool created_as_number/;
|
|
|
|
plan skip_all => $@ if !eval { require FU::PG; } && $@ =~ /Unable to load libpq/;
|
|
die $@ if $@;
|
|
plan skip_all => 'Please set FU_TEST_DB to a PostgreSQL connection string to run these tests' if !$ENV{FU_TEST_DB};
|
|
|
|
my $conn = FU::PG->connect($ENV{FU_TEST_DB});
|
|
$conn->_debug_trace(0);
|
|
|
|
# TODO: Test behavior of magic bind params
|
|
|
|
sub v($type, $p_in, @args) {
|
|
my $p_out = @args > 0 && ref $args[0] ne 'SCALAR' ? $args[0] : $p_in;
|
|
my $s_in = @args > 1 && ref $args[1] ne 'SCALAR' ? $args[1] : $p_in;
|
|
my $s_out = @args > 2 && ref $args[2] ne 'SCALAR' ? $args[2] : $s_in;
|
|
|
|
{
|
|
my $res = $conn->q("SELECT \$1::$type", $s_in)->text_params->val;
|
|
ok is_bool($res), "$type $s_in is bool" if $type eq 'bool';
|
|
ok created_as_number($res), "$type $s_in is number" if $type =~ /^int/;
|
|
is_deeply $res, $p_out, "$type $s_in text->bin";
|
|
}
|
|
{
|
|
my $res = $conn->q("SELECT \$1::$type", $p_in)->text_results->val;
|
|
is $res, $s_out, "$type $s_out bin->text";
|
|
}
|
|
{
|
|
my $res = $conn->q("SELECT \$1::$type", $p_in)->val;
|
|
is_deeply $res, $p_out, "$type $s_in bin->bin";
|
|
}
|
|
}
|
|
sub f($type, $p_in) {
|
|
ok !eval { $conn->q("SELECT \$1::$type", $p_in)->val; 1 }, "$type $p_in fail";
|
|
}
|
|
|
|
v bool => true, 1, 'true', 't';
|
|
v bool => false, '', 'false', 'f';
|
|
|
|
v int2 => $_ for (1, -1, -32768, 32767, '12345', -12345, 123.0);
|
|
f int2 => $_ for (-32769, 32768, [], '', 'a', 1.5);
|
|
v int4 => $_ for (1, -1, -2147483648, 2147483647, 1234567890, -1234567890);
|
|
f int4 => $_ for (-2147483649, 2147483648, []);
|
|
v int8 => $_ for (1, -1, -9223372036854775808, 9223372036854775807, 1234567890123456789, -1234567890123456789, 1e10);
|
|
f int8 => $_ for ('aaa', '-9223372036854775809', '9223372036854775808', 1e20);
|
|
|
|
done_testing;
|