#!perl -T use 5.010; use strict; use warnings; #use Data::Dump::OneLine qw(dump1); use Test::More 0.96; use Text::sprintfn; # [fmt, args, res], ... my @tests = ( # no named, must be same as sprintf ['<%%>', [4, 5], "<%>"], # %% ['<%d>', [4, 5], "<4>"], # simple ['<% 4d>', [4, 5], "< 4>"], # flag (1) ['<% +4d>', [4, 5], "< +4>"], # flag (2) ['<%vd>', ["ABC"], "<65.66.67>"], # vector flag (1) ['<%*vd>', [":", "ABC"], "<65:66:67>"], # vector flag (2) ['<%04d>', [4, 5], "<0004>"], # width ['<%-5d>', [-4, 5], "<-4 >"], # width (2, negative) ['<%*d>', [4, 5], "< 5>"], # width * ['<%*d> <%d>', [4, 5, 6], "< 5> <6>"], # width * (2) ['<%5.2f>', [4, 5], "< 4.00>"], # width + precision ['<%*.2f>', [4, 5], "<5.00>"], # width + precision (2) ['<%*.*f>', [4, 5, 6], "<6.00000>"], # width + precision (3) ['<%*1$.*f>', [4, 5, 10], "<4.0000>"], # width + precision (4) ['<%2$d>', [-4, 5], "<5>"], # param index ['<%2$-3d> <%.*f> <%d>', [4, 5, 6, 7], "<5 > <5.0000> <6>"], # combo (1) # with named but no hash provided, must be same as sprinf ['<%(v1)d> N', [4, 5], "<%(v1)d> N"], # simple (1) # with named ['<%(v1)$d>', [{v1=>10}, 4, 5], "<10>"], # simple (1) ['<%(v1)d>', [{v1=>10}, 4, 5], "<10>"], # simple (1b, $ optional) ['<%(v1)d> <%d>', [{v1=>10}, 4, 5], "<10> <4>"], # simple (2) ['<%(v1)d> <%(v1)d> <%d> <%(v2)d> <%d>', [{v1=>10, v2=>2}, 4, 5], "<10> <10> <4> <2> <5>"], # simple (3) ['<%(v1)04d>', [{v1=>10}, 4, 5], "<0010>"], # flag + width ['<%(v1)vd>', [{v1=>"DE"}, "ABC"], "<68.69>"], # vector flag (1) ['<%(v1)*vd>', [{v1=>"DE"}, ":", "ABC"], "<68:69>"], # vector flag (2) ['<%(v1)(v2)d>', [{v1=>10, v2=>3}, 4, 5], "< 10>"], # named width ['<%5.(v2)f>', [{v1=>10, v2=>2}, 4, 5], "< 4.00>"], # named precision ['<%(v1)5.2f>', [{v1=>10, v2=>2}, 4, 5], "<10.00>"], # named param + precision ['<%1$(v1).(v2)f>', [{v1=>10, v2=>2}, 4, 5], "< 4.00>"], # named width + precision ['<%(v1)(v1).(v2)f>', [{v1=>10, v2=>2}, 4, 5], "< 10.00>"], # named param + width + precision ['<%(v1)(v1).(v2)f> <%vd>', [{v1=>-6, v2=>2}, "AB"], "<-6.00 > <65.66>"], # combo 1 ['<%(v1)(v1).(v2)f> <%*vd>', [{v1=>-6, v2=>2}, ":", "AB"], "<-6.00 > <65:66>"], # combo 1 # XXX more combos ); for my $t (@tests) { my ($fmt, $args, $res) = @$t; is(sprintfn($fmt, @$args), $res, "$fmt = $res"); } DONE_TESTING: done_testing(); __END__ > <%04x> <%1$6.2f>', [10, 17], '<10> <0011> < 10.00>'], '<%(v1)03d> <%(v3)(v1)s> <%(v2)(v1).(v0)f>' => [[{v1=>5, v2=>4, v3=>"foo", v0=>1}, 1, 2, 3], '<005> < foo> < 4.0>'],