%PDF- %PDF-
Direktori : /home/opti/optisoftcom/.cpanm/work/1544535406.20768/Sub-Quote-2.005001/t/ |
Current File : /home/opti/optisoftcom/.cpanm/work/1544535406.20768/Sub-Quote-2.005001/t/quotify.t |
use strict; use warnings; no warnings 'once'; use Test::More; use Test::Fatal; use Data::Dumper; use B; use constant HAVE_UTF8 => defined &utf8::upgrade && defined &utf8::is_utf8;; use Sub::Quote qw( quotify ); sub _dump { my $value = shift; local $Data::Dumper::Terse = 1; local $Data::Dumper::Useqq = 1; my $d = Data::Dumper::Dumper($value); $d =~ s/\s+$//; $d; } sub is_numeric { my $val = shift; my $sv = B::svref_2object(\$val); !!($sv->FLAGS & ( B::SVp_IOK | B::SVp_NOK ) ) } my %flags; { no strict 'refs'; for my $flag (qw( SVs_TEMP SVs_OBJECT SVs_GMG SVs_SMG SVs_RMG SVf_IOK SVf_NOK SVf_POK SVf_OOK SVf_FAKE SVf_READONLY SVf_PROTECT SVf_BREAK SVp_IOK SVp_NOK SVp_POK )) { if (defined &{'B::'.$flag}) { $flags{$flag} = &{'B::'.$flag}; } } } sub flags { my $val = shift; my $flags = B::svref_2object(\$val)->FLAGS; join ' ', sort grep $flags & $flags{$_}, keys %flags; } BEGIN { if (HAVE_UTF8) { eval ' sub eval_utf8 { my $value = shift; my $output; eval "use utf8; \$output = $value; 1;" or die $@; $output; } 1; ' or die $@; } } my @numbers = ( -20 .. 20, (map 1 / $_, -10 .. -2, 2 .. 10), ); my @strings = ( "\x00", "a", "\xC3\x84", "\xE8", "\xFC", "\xFF", "\x{1F4A9}", ); if (HAVE_UTF8) { utf8::downgrade($_, 1) for @strings; } my @utf8_strings; if (HAVE_UTF8) { @utf8_strings = @strings; utf8::upgrade($_) for @utf8_strings; } my @quotify = ( undef, (map { my $used_as_string = $_; my $string = "$used_as_string"; ($_, $used_as_string, $string); } @numbers), @strings, @utf8_strings, ); my $eval_utf8; for my $value (@quotify) { my $value_name = _dump($value) . (HAVE_UTF8 && utf8::is_utf8($value) ? ' utf8' : '') . (is_numeric($value) ? ' num' : ''); my $quoted = quotify(my $copy = $value); utf8::downgrade($quoted, 1) if HAVE_UTF8; is flags($copy), flags($value), "$value_name: quotify doesn't modify input"; my $evaled; eval "\$evaled = $quoted; 1" or die $@; is is_numeric($evaled), is_numeric($value), "$value_name: numeric status maintained"; is $value, $evaled, "$value_name: value maintained"; if (HAVE_UTF8) { my $utf8_evaled = eval_utf8($quoted); is is_numeric($value), is_numeric($utf8_evaled), "$value_name: numeric status maintained under utf8"; is $value, $utf8_evaled, "$value_name: value maintained under utf8"; } } done_testing;