PATH=/usr/bin:/bin:/Users/fly2400/cpanfly-5.24/var/megalib/bin Start 2018-12-17T02:03:09 ActivePerl-2400 CPAN-2.10 Reading '/Users/fly2400/cpanfly-5.24/var/cpan/Metadata' Database was generated on Sun, 16 Dec 2018 05:17:02 GMT Checksum for /Users/fly2400/cpanfly-5.24/var/cpan/sources/authors/id/P/PR/PRBRENAN/Data-Table-Text-20181215.tar.gz ok Data-Table-Text-20181215 Data-Table-Text-20181215/Build.PL Data-Table-Text-20181215/MANIFEST Data-Table-Text-20181215/META.json Data-Table-Text-20181215/META.yml Data-Table-Text-20181215/test.pl Data-Table-Text-20181215/lib Data-Table-Text-20181215/lib/Data Data-Table-Text-20181215/lib/Data/Table Data-Table-Text-20181215/lib/Data/Table/Text.pm Configuring P/PR/PRBRENAN/Data-Table-Text-20181215.tar.gz with Build.PL >>> /Users/fly2400/ap2400-300558/bin/perl-dynamic Build.PL Created MYMETA.yml and MYMETA.json Creating new 'Build' script for 'Data-Table-Text' version '20181215' PRBRENAN/Data-Table-Text-20181215.tar.gz /Users/fly2400/ap2400-300558/bin/perl-dynamic Build.PL -- OK Running Build for P/PR/PRBRENAN/Data-Table-Text-20181215.tar.gz >>> ./Build Building Data-Table-Text PRBRENAN/Data-Table-Text-20181215.tar.gz ./Build -- OK Running Build test >>> ./Build test verbose=1 # Failed test at (eval 22) line 732. # Structures begin differing at: # $got->[1] = '/tmp/uEUEejUkNJ//ddd/' # $expected->[1] = '/tmp/uEUEejUkNJ/ddd/' Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Can't call method "print" on an undefined value at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2053. Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 Unable to retrieve results at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2369. Data::Table::Text::Starter::waitOne(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 2385 Data::Table::Text::Starter::finish(Data::Table::Text::Starter=HASH(0x7fb3254af8a8)) called at (eval 22) line 1531 eval 'Test::More->builder->output("/dev/null") # Reduce number of confirmation messages during testing if ((caller(1))[0]//\'Data::Table::Text\') eq "Data::Table::Text"; use Test::More tests => 458; my $haiku = $^O =~ m(haiku)i; my $windows = $^O =~ m(MSWin32)i; my $mac = $^O =~ m(darwin)i; my $freeBsd = $^O =~ m(freebsd)i; my $dragonFly = $^O =~ m(dragonfly)i; my $linux = $^O =~ m(linux)i; if (1) # Unicode to local file {use utf8; my $z = "𝝰 𝝱 𝝲"; my $t = temporaryFolder; my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); unlink $f; ok !-e $f; rmdir $t; ok !-d $t; } if (1) { # Key counts my $a = [[1..3], {map{$_=>1} 1..3}]; #TkeyCount my $h = {a=>[1..3], b=>{map{$_=>1} 1..3}}; #TkeyCount ok keyCount(2, $a) == 6; #TkeyCount ok keyCount(2, $h) == 6; #TkeyCount } if (1) { #TfilePath #TfilePathDir #TfilePathExt #Tfpd #Tfpe #Tfpf ok filePath (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok filePathDir(qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok filePathDir(\'\', qw(aaa)) eq "aaa/"; ok filePathDir(\'\') eq ""; ok filePathExt(qw(aaa xxx)) eq "aaa.xxx"; ok filePathExt(qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; ok fpd (qw(/aaa bbb ccc ddd)) eq "/aaa/bbb/ccc/ddd/"; ok fpf (qw(/aaa bbb ccc ddd.eee)) eq "/aaa/bbb/ccc/ddd.eee"; ok fpe (qw(aaa bbb xxx)) eq "aaa/bbb.xxx"; } if (1) #TparseFileName {is_deeply [parseFileName "/home/phil/test.data"], ["/home/phil/", "test", "data"]; is_deeply [parseFileName "/home/phil/test"], ["/home/phil/", "test"]; is_deeply [parseFileName "phil/test.data"], ["phil/", "test", "data"]; is_deeply [parseFileName "phil/test"], ["phil/", "test"]; is_deeply [parseFileName "test.data"], [undef, "test", "data"]; is_deeply [parseFileName "phil/"], [qw(phil/)]; is_deeply [parseFileName "/phil"], [qw(/ phil)]; is_deeply [parseFileName "/"], [qw(/)]; is_deeply [parseFileName "/var/www/html/translations/"], [qw(/var/www/html/translations/)]; is_deeply [parseFileName "a.b/c.d.e"], [qw(a.b/ c.d e)]; is_deeply [parseFileName "./a.b"], [qw(./ a b)]; is_deeply [parseFileName "./../../a.b"], [qw(./../../ a b)]; } if (1) # Unicode {use utf8; my $z = "𝝰 𝝱 𝝲"; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeFile($f, $z); ok -e $f; my $s = readFile($f); ok $s eq $z; ok length($s) == length($z); if ($windows or $mac) {ok 1} else {my @f = findFiles($T); ok $f[0] eq $f; } unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (1) # Binary {my $z = "𝝰 𝝱 𝝲"; my $Z = join \'\', map {chr($_)} 0..11; my $T = temporaryFolder; my $t = filePath($T, $z); my $f = filePathExt($t, $z, qq(data)); unlink $f if -e $f; ok !-e $f; writeBinaryFile($f, $Z); ok -e $f; my $s = readBinaryFile($f); ok $s eq $Z; ok length($s) == 12; unlink $f; ok !-e $f; rmdir $t; ok !-d $t; rmdir $T; ok !-d $T; } if (!$windows) { # Check files my $d = filePath (my @d = qw(a b c d)); #TcheckFile #TmatchPath my $f = filePathExt(qw(a b c d e x)); #TcheckFile my $F = filePathExt(qw(a b c e d)); #TcheckFile createEmptyFile($f); #TcheckFile ok matchPath($d) eq $d; #TmatchPath ok checkFile($d); #TcheckFile ok checkFile($f); #TcheckFile eval q{checkFile($F)}; my @m = split m/\\n/, $@; ok $m[1] eq "a/b/c/"; unlink $f; ok !-e $f; while(@d) # Remove path {my $d = filePathDir(@d); rmdir $d; ok !-d $d; pop @d; } } else {ok 1 for 1..9; } if (1) # Clear folder {my $d = \'a\'; my @d = qw(a b c d); my @D = @d; while(@D) {my $f = filePathExt(@D, qw(test data)); overWriteFile($f, \'1\'); pop @D; } if ($windows) {ok 1 for 1..3} else {ok findFiles($d) == 4; eval q{clearFolder($d, 3)}; ok $@ =~ m(\\ALimit is 3, but 4 files under folder:)s; clearFolder($d, 4); ok !-d $d; } } ok formatTable #TformatTable ([[qw(A B C D )], #TformatTable [qw(AA BB CC DD )], #TformatTable [qw(AAA BBB CCC DDD )], #TformatTable [qw(AAAA BBBB CCCC DDDD)], #TformatTable [qw(1 22 333 4444)]], [qw(aa bb cc)]) eq <\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable {aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable {aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable {aa=>\'1\', bb=>\'22\', cc=>\'333\'} #TformatTable ]) eq <[qw(aa bb cc)], #TformatTable 1=>[qw(A B C)], #TformatTable 22=>[qw(AA BB CC)], #TformatTable 333=>[qw(AAA BBB CCC)], #TformatTable 4444=>[qw(1 22 333)]}) eq <{aa=>\'A\', bb=>\'B\', cc=>\'C\'}, #TformatTable 22=>{aa=>\'AA\', bb=>\'BB\', cc=>\'CC\'}, #TformatTable 333=>{aa=>\'AAA\', bb=>\'BBB\', cc=>\'CCC\'}, #TformatTable 4444=>{aa=>\'1\', bb=>\'22\', cc=>\'333\'}}) eq <\'A\', bb=>\'B\', cc=>\'C\'}, [qw(aaaa bbbb)]) eq < q(10 11 12), b =>q(20 21 22)}; #TloadHashFromLines ok formatTable($s) eq <[qw(A B C)], b => [qw(AA BB CC)] }; #TloadHashArrayFromLines ok formatTable($s) eq <1, B=>2}, {AA=>11, BB=>22}]; #TloadArrayHashFromLines ok formatTable($s) eq <{A=>1, B=>2}, b=>{AA=>11, BB=>22}}; #TloadHashHashFromLines ok formatTable($s) eq <aa = \'aa\'; ok $a->aa eq \'aa\'; ok !$a->bb; ok $a->bbX eq q(); $a->aa = undef; ok !$a->aa; } if (1) { # Conditionally using a named package my $class = "Data::Table::Text::Test"; #TaddLValueScalarMethods my $a = bless{}, $class; #TaddLValueScalarMethods addLValueScalarMethods(qq(${class}::$_)) for qw(aa bb aa bb); #TaddLValueScalarMethods $a->aa = \'aa\'; #TaddLValueScalarMethods ok $a->aa eq \'aa\'; #TaddLValueScalarMethods ok !$a->bb; #TaddLValueScalarMethods ok $a->bbX eq q(); #TaddLValueScalarMethods $a->aa = undef; #TaddLValueScalarMethods ok !$a->aa; #TaddLValueScalarMethods } if (1) { # Using the caller\'s package package Scalars; #TgenLValueScalarMethods my $a = bless{}; #TgenLValueScalarMethods Data::Table::Text::genLValueScalarMethods(qw(aa bb cc)); #TgenLValueScalarMethods $a->aa = \'aa\'; #TgenLValueScalarMethods Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethods Test::More::ok !$a->bb; #TgenLValueScalarMethods Test::More::ok $a->bbX eq q(); #TgenLValueScalarMethods $a->aa = undef; #TgenLValueScalarMethods Test::More::ok !$a->aa; #TgenLValueScalarMethods } if (1) { # SDM package ScalarsWithDefaults; #TgenLValueScalarMethodsWithDefaultValues my $a = bless{}; #TgenLValueScalarMethodsWithDefaultValues Data::Table::Text::genLValueScalarMethodsWithDefaultValues(qw(aa bb cc)); #TgenLValueScalarMethodsWithDefaultValues Test::More::ok $a->aa eq \'aa\'; #TgenLValueScalarMethodsWithDefaultValues } if (1) { # AM package Arrays; #TgenLValueArrayMethods my $a = bless{}; #TgenLValueArrayMethods Data::Table::Text::genLValueArrayMethods(qw(aa bb cc)); #TgenLValueArrayMethods $a->aa->[1] = \'aa\'; #TgenLValueArrayMethods Test::More::ok $a->aa->[1] eq \'aa\'; #TgenLValueArrayMethods } # # if (1) { ## AM package Hashes; #TgenLValueHashMethods my $a = bless{}; #TgenLValueHashMethods Data::Table::Text::genLValueHashMethods(qw(aa bb cc)); #TgenLValueHashMethods $a->aa->{a} = \'aa\'; #TgenLValueHashMethods Test::More::ok $a->aa->{a} eq \'aa\'; #TgenLValueHashMethods } if (1) { my $t = [qw(aa bb cc)]; #TindentString my $d = [[qw(A B C)], [qw(AA BB CC)], [qw(AAA BBB CCC)], [qw(1 22 333)]]; #TindentString my $s = indentString(formatTable($d), \' \')."\\n"; ok $s eq <1,b=>2, c=>[1..2]}); #TencodeJson #TdecodeJson my $b = decodeJson($A); #TencodeJson #TdecodeJson is_deeply $a, $b; #TencodeJson #TdecodeJson } if (1) { my $A = encodeBase64(my $a = "Hello World" x 10); #TencodeBase64 #TdecodeBase64 my $b = decodeBase64($A); #TencodeBase64 #TdecodeBase64 ok $a eq $b; #TencodeBase64 #TdecodeBase64 } ok !max; #Tmax ok max(1) == 1; #Tmax ok max(1,4,2,3) == 4; #Tmax ok min(1) == 1; #Tmin ok min(5,4,2,3) == 2; #Tmin is_deeply [1], [contains(1,0..1)]; #Tcontains is_deeply [1,3], [contains(1, qw(0 1 0 1 0 0))]; #Tcontains is_deeply [0, 5], [contains(\'a\', qw(a b c d e a b c d e))]; #Tcontains is_deeply [0, 1, 5], [contains(qr(a+), qw(a baa c d e aa b c d e))]; #Tcontains is_deeply [qw(a b)], [&removeFilePrefix(qw(a/ a/a a/b))]; #TremoveFilePrefix is_deeply [qw(b)], [&removeFilePrefix("a/", "a/b")]; #TremoveFilePrefix if (0) { #TfileOutOfDate my @Files = qw(a b c); my @files = (@Files, qw(d)); writeFile($_, $_), sleep 1 for @Files; my $a = \'\'; my @a = fileOutOfDate {$a .= $_} q(a), @files; ok $a eq \'da\'; is_deeply [@a], [qw(d a)]; my $b = \'\'; my @b = fileOutOfDate {$b .= $_} q(b), @files; ok $b eq \'db\'; is_deeply [@b], [qw(d b)]; my $c = \'\'; my @c = fileOutOfDate {$c .= $_} q(c), @files; ok $c eq \'dc\'; is_deeply [@c], [qw(d c)]; my $d = \'\'; my @d = fileOutOfDate {$d .= $_} q(d), @files; ok $d eq \'d\'; is_deeply [@d], [qw(d)]; my @A = fileOutOfDate {} q(a), @Files; my @B = fileOutOfDate {} q(b), @Files; my @C = fileOutOfDate {} q(c), @Files; is_deeply [@A], [qw(a)]; is_deeply [@B], [qw(b)]; is_deeply [@C], []; unlink for @Files; } else { SKIP: {skip "Takes too much time", 11; } } ok convertUnicodeToXml(\'setenta e trΓͺs\') eq q(setenta e três); #TconvertUnicodeToXml ok zzz(<undef, dd=>undef, eee=>"EEEE", f=>"F", gg=>"g g", hh=>"h h"}, #TparseCommandLineArguments ]; #TparseCommandLineArguments } if (1) {my $r = parseCommandLineArguments {ok 1; $_[1] } [qw(--aAa=AAA --bbB=BBB)], [qw(aaa bbb ccc)]; is_deeply $r, {aaa=>\'AAA\', bbb=>\'BBB\'}; } if (1) {eval q{parseCommandLineArguments {$_[1]} [qw(aaa bbb ddd --aAa=AAA --dDd=DDD)], [qw(aaa bbb ccc)]; }; my $r = $@; ok $r =~ m(\\AInvalid parameter: --dDd=DDD); } if (1) { #TsetIntersectionOfSetsOfWords is_deeply [qw(a b c)], [setIntersectionOfSetsOfWords([qw(e f g a b c )], [qw(a A b B c C)])]; } is_deeply [qw(a b c)], [setUnionOfWords(qw(a b c a a b b b))]; #TsetUnionOfWords ok printQw(qw(a b c)) eq "qw(a b c)"; if (1) { my $f = writeFile("zzz.data", "aaa"); #TfileSize ok -e $f; ok fileSize($f) == 3; #TfileSize unlink $f; ok !-e $f; } if (1) { my $f = createEmptyFile(fpe(my $d = temporaryFolder, qw(a jpg))); #TfindFileWithExtension my $F = findFileWithExtension(fpf($d, q(a)), qw(txt data jpg)); #TfindFileWithExtension ok -e $f; ok $F eq "jpg"; #TfindFileWithExtension unlink $f; ok !-e $f; rmdir $d; ok !-d $d; } if (1) { my $d = temporaryFolder; #TfirstFileThatExists ok $d eq firstFileThatExists("$d/$d", $d); #TfirstFileThatExists } if (1) { #TassertRef eval q{assertRef(bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to Data::Table::Text, but got aaa); } if (1) { #TassertPackageRefs eval q{assertPackageRefs(q(bbb), bless {}, q(aaa))}; ok $@ =~ m(\\AWanted reference to bbb, but got aaa); } # Relative and absolute files ok "../../../" eq relFromAbsAgainstAbs("/", "/home/la/perl/bbb.pl"); ok "../../../home" eq relFromAbsAgainstAbs("/home", "/home/la/perl/bbb.pl"); ok "../../" eq relFromAbsAgainstAbs("/home/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb.pl"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb.pl"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb.pl"); ok "aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/la/perl/bbb"); ok "aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/la/perl/bbb"); ok "./" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/la/perl/bbb"); ok "../java/aaa.jv" eq relFromAbsAgainstAbs("/home/la/java/aaa.jv", "/home/la/perl/bbb.pl"); ok "../java/aaa" eq relFromAbsAgainstAbs("/home/la/java/aaa", "/home/la/perl/bbb.pl"); ok "../java/" eq relFromAbsAgainstAbs("/home/la/java/", "/home/la/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb.pl"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb.pl"); ok "../../la/perl/aaa.pl" eq relFromAbsAgainstAbs("/home/la/perl/aaa.pl", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/bbb"); ok "../../la/perl/aaa" eq relFromAbsAgainstAbs("/home/la/perl/aaa", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "../../la/perl/" eq relFromAbsAgainstAbs("/home/la/perl/", "/home/il/perl/"); ok "home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/"); ok "../home/la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home"); ok "la/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa.pl"); #TrelFromAbsAgainstAbs ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/aaa"); ok "bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/perl/"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa.pl"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/aaa"); ok "bbb" eq relFromAbsAgainstAbs("/home/la/perl/bbb", "/home/la/perl/"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa.jv"); #TrelFromAbsAgainstAbs ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/aaa"); ok "../perl/bbb.pl" eq relFromAbsAgainstAbs("/home/la/perl/bbb.pl", "/home/la/java/"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/aaa"); ok "../../il/perl/bbb.pl" eq relFromAbsAgainstAbs("/home/il/perl/bbb.pl", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa.pl"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/aaa"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/bbb" eq relFromAbsAgainstAbs("/home/il/perl/bbb", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/aaa"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "../../il/perl/" eq relFromAbsAgainstAbs("/home/il/perl/", "/home/la/perl/"); ok "/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../.."); ok "/home" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../../../home"); ok "/home/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../.."); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", ""); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb", "aaa"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/la/perl/bbb", ""); ok "/home/la/java/aaa.jv" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa.jv"); ok "/home/la/java/aaa" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/aaa"); ok "/home/la/java" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java"); ok "/home/la/java/" eq absFromAbsPlusRel("/home/la/perl/bbb.pl", "../java/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa.pl"); #TabsFromAbsPlusRel ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb.pl", "../../la/perl/"); ok "/home/la/perl/aaa.pl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa.pl"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/bbb", "../../la/perl/"); ok "/home/la/perl/aaa" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/aaa"); ok "/home/la/perl" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl"); ok "/home/la/perl/" eq absFromAbsPlusRel("/home/il/perl/", "../../la/perl/"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/", "home/la/perl/bbb.pl"); #ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home", "../home/la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/", "la/perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "bbb.pl"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "bbb"); ok "/home/la/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "bbb"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa.jv", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/aaa", "../perl/bbb.pl"); ok "/home/la/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/java/", "../perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb.pl" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb.pl"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa.pl", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl/bbb" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/bbb"); ok "/home/il/perl" eq absFromAbsPlusRel("/home/la/perl/aaa", "../../il/perl"); ok "/home/il/perl/" eq absFromAbsPlusRel("/home/la/perl/", "../../il/perl/"); ok "aaa/bbb/ccc/ddd.txt" eq sumAbsAndRel(qw(aaa/AAA/ ../bbb/bbb/BBB/ ../../ccc/ddd.txt)); #TsumAbsAndRel ok fp (q(a/b/c.d.e)) eq q(a/b/); #Tfp ok fpn(q(a/b/c.d.e)) eq q(a/b/c.d); #Tfpn ok fn (q(a/b/c.d.e)) eq q(c.d); #Tfn ok fne(q(a/b/c.d.e)) eq q(c.d.e); #Tfne ok fe (q(a/b/c.d.e)) eq q(e); #Tfe ok fp (q(/a/b/c.d.e)) eq q(/a/b/); ok fpn(q(/a/b/c.d.e)) eq q(/a/b/c.d); ok fn (q(/a/b/c.d.e)) eq q(c.d); ok fne(q(/a/b/c.d.e)) eq q(c.d.e); ok fe (q(/a/b/c.d.e)) eq q(e); if (!$windows) { Λ’{our $a = q(1); #Tcall our @a = qw(1); our %a = (a=>1); our $b = q(1); for(2..4) { call {$a = $_ x 1e3; $a[0] = $_ x 1e2; $a{a} = $_ x 1e1; $b = 2;} qw($a @a %a); ok $a == $_ x 1e3; ok $a[0] == $_ x 1e2; ok $a{a} == $_ x 1e1; ok $b == 1; } }; } else {ok 1 for 1..12; } Λ’{ok q(../a/) eq fp q(../a/b.c); ok q(b) eq fn q(../a/b.c); ok q(c) eq fe q(../a/b.c); }; if (1) { #TwwwEncode #TwwwDecode ok wwwEncode(q(a {b} )) eq q(a%20%20%7bb%7d%20%3cc%3e); ok wwwEncode(q(../)) eq q(%2e%2e/); ok wwwDecode(wwwEncode $_) eq $_ for q(a {b} ), q(a b|c), q(%), q(%%), q(%%.%%); } ok quoteFile(fpe(qw(a "b" c))) eq q("a/\\"b\\".c"); #TquoteFile ok printQw(qw(a b c)) eq q(qw(a b c)); #TprintQw if (!$windows) { my $D = temporaryFolder; #TtemporaryFolder #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my $d = fpd($D, q(ddd)); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs my @f = map {createEmptyFile(fpe($d, $_, qw(txt)))} qw(a b c); #TcreateEmptyFile #TclearFolder #TfileList #TfindFiles #TsearchDirectoryTreesForMatchingFiles #TfindDirs is_deeply [sort map {fne $_} findFiles($d, qr(txt\\Z))], [qw(a.txt b.txt c.txt)]; #TcreateEmptyFile #TfindFiles is_deeply [findDirs($D)], [$D, $d]; #TfindDirs is_deeply [sort map {fne $_} searchDirectoryTreesForMatchingFiles($d)], #TsearchDirectoryTreesForMatchingFiles ["a.txt", "b.txt", "c.txt"]; #TsearchDirectoryTreesForMatchingFiles is_deeply [sort map {fne $_} fileList("$d/*.txt")], #TfileList ["a.txt", "b.txt", "c.txt"]; #TfileList ok -e $_ for @f; clearFolder($D, 5); #TclearFolder ok !-e $_ for @f; #TclearFolder ok !-d $D; #TclearFolder } else # searchDirectoryTreesForMatchingFiles uses find which does not work identically to Linux on Windows {ok 1 for 1..11; } if (1) { my $f = writeFile(undef, "aaa"); #TwriteFile #TreadFile #TappendFile my $s = readFile($f); #TwriteFile #TreadFile #TappendFile ok $s eq "aaa"; #TwriteFile #TreadFile #TappendFile appendFile($f, "bbb"); #TwriteFile #TreadFile #TappendFile my $S = readFile($f); #TwriteFile #TreadFile #TappendFile ok $S eq "aaabbb"; #TwriteFile #TreadFile #TappendFile unlink $f; } if (1) { no utf8; my $f = writeBinaryFile(undef, 0xff x 8); #TwriteBinaryFile #TreadBinaryFile my $s = readBinaryFile($f); #TwriteBinaryFile #TreadBinaryFile ok $s eq 0xff x 8; #TwriteBinaryFile #TreadBinaryFile unlink $f; } if (!$windows) { my $d = fpd(my $D = temporaryDirectory, qw(a)); #TmakePath #TtemporaryDirectory my $f = fpe($d, qw(bbb txt)); #TmakePath ok !-d $d; #TmakePath eval q{checkFile($f)}; my $r = $@; my $q = quotemeta($D); ok nws($r) =~ m(Can only find.+?: $q)s; makePath($f); #TmakePath ok -d $d; #TmakePath ok -d $D; rmdir $_ for $d, $D; } else {ok 1 for 1..4} ok nws(qq(a b c)) eq q(a b c); #Tnws ok Λ’{1} == 1; #TΛ’ if (0) { # Despite eval the confess seems to be killing the process - perhaps the confess is just too big? eval q{checkKeys({a=>1, b=>2, d=>3}, {a=>1, b=>2, c=>3})}; #TcheckKeys ok nws($@) =~ m(\\AInvalid options chosen: d Permitted.+?: a 1 b 2 c 3); #TcheckKeys } if (1) { my $d = [[qw(a 1)], [qw(bb 22)], [qw(ccc 333)], [qw(dddd 4444)]]; #TformatTableBasic ok formatTableBasic($d) eq <= keys %pids} for 1..8; waitForAllStartedProcessesToFinish(%pids); ok !keys(%pids) } if (!$windows) { ok dateTimeStamp =~ m(\\A\\d{4}-\\d\\d-\\d\\d at \\d\\d:\\d\\d:\\d\\d\\Z); #TdateTimeStamp ok dateTimeStampName =~ m(\\A_on_\\d{4}_\\d\\d_\\d\\d_at_\\d\\d_\\d\\d_\\d\\d\\Z); #TdateTimeStampName ok dateStamp =~ m(\\A\\d{4}-\\w{3}-\\d\\d\\Z); #TdateStamp ok versionCode =~ m(\\A\\d{8}-\\d{6}\\Z); #TversionCode ok versionCodeDashed =~ m(\\A\\d{4}-\\d\\d-\\d\\d-\\d\\d:\\d\\d:\\d\\d\\Z); #TversionCodeDashed ok timeStamp =~ m(\\A\\d\\d:\\d\\d:\\d\\d\\Z); #TtimeStamp ok microSecondsSinceEpoch > 47*365*24*60*60*1e6; #TmicroSecondsSinceEpoch } else {ok 1 for 1..7; } if (0) { saveCodeToS3(1200, q(.), q(projectName), q(bucket/folder), q(--quiet)); #TsaveCodeToS3 my ($width, $height) = imageSize(fpe(qw(a image jpg))); #TimageSize addCertificate(fpf(qw(.ssh cert))); #TaddCertificate binModeAllUtf8; #TbinModeAllUtf8 convertImageToJpx(fpe(qw(a image jpg)), fpe(qw(a image jpg)), 256); #TconvertImageToJpx currentDirectory; #TcurrentDirectory currentDirectoryAbove; #TcurrentDirectoryAbove fullFileName(fpe(qw(a txt))); #TfullFileName convertDocxToFodt(fpe(qw(a docx)), fpe(qw(a fodt))); #TconvertDocxToFodt cutOutImagesInFodtFile(fpe(qw(source fodt)), fpd(qw(images)), q(image)); #TcutOutImagesInFodtFile userId; #TuserId hostName; #ThostName makeDieConfess #TmakeDieConfess ipAddressViaArp(q(secarias)); #TipAddressViaArp fileMd5Sum(q(/etc/hosts)); #TfileMd5Sum countFileExtensions(q(/home/phil/perl/)); #TcountFileExtensions countFileTypes(4, q(/home/phil/perl/)); #TcountFileTypes } ok nws(htmlToc("XXXX", <Chapter 1

Section 1

Chapter 2

XXXX END eq nws(<Chapter 1

Section 1

Chapter 2

 
1    Chapter 1
2        Section 1
 
3    Chapter 2
END ok fileModTime($0) =~ m(\\A\\d+\\Z)s; #TfileModTime if (1) {my $s = updateDocumentation(<<\'END\' =~ s(!) (#)gsr =~ s(~) ()gsr); #TupdateDocumentation package Sample::Module; !D1 Samples ! Sample methods. sub sample($@) !R Documentation for the: sample() method. See also L. !Tsample {my ($node, @context) = @_; ! Node, optional context 1 } ~BEGIN{*smpl=*sample} sub Data::Table::Text::sample2(\\&@) !PS Documentation for the sample2() method. {my ($sub, @context) = @_; ! Sub to call, context. 1 } ok sample(undef, qw(a b c)) == 1; !Tsample if (1) !Tsample {ok sample(q(a), qw(a b c)) == 2; ok sample(undef, qw(a b c)) == 1; } ok sample(<{a=>4, b=>5}]; my $file = dumpGZipFile(q(zzz.zip), $d); ok -e $file; my $D = evalGZipFile($file); is_deeply $d, $D; unlink $file; } } else {ok 1 for 1..2 } if (1) {my $t = formatTableBasic([["a",undef], [undef, "b\\nc"]]); ok $t eq <$file, # Output file head=><< "A", bb => "B", cc => "C" }, {aa=> "AA", bb => "BB", cc => "CC" }, {aa=> "AAA", bb => "BBB", cc => "CCC" }, {aa=> 1, bb => 22, cc => 333 }]); ok $ah eq < ["aa", "bb", "cc"], "1" => ["A", "B", "C"], "22" => ["AA", "BB", "CC"], "333" => ["AAA", "BBB", "CCC"], "4444" => [1, 22, 333]}, [qw(Key A B C)] ); ok $ha eq < {aa=>"A", bb=>"B", cc=>"C" }, aa => {aa=>"AA", bb=>"BB", cc=>"CC" }, aaa => {aa=>"AAA", bb=>"BBB", cc=>"CCC" }, aaaa => {aa=>1, bb=>22, cc=>333 }}); ok $hh eq <"AAAA", bb=>"BBBB", cc=>"333"}, [qw(Key Title)]); ok $h eq <q(aa), # Definition of attribute aa. b=>q(bb), # Definition of attribute bb. ); ok $o->a eq q(aa); is_deeply $o, {a=>"aa", b=>"bb"}; my $p = genHash(q(TestHash), c=>q(cc), # Definition of attribute cc. ); ok $p->c eq q(cc); ok $p->a = q(aa); ok $p->a eq q(aa); is_deeply $p, {a=>"aa", c=>"cc"}; loadHash($p, a=>11, b=>22); # Load the hash is_deeply $p, {a=>11, b=>22, c=>"cc"}; my $r = eval {loadHash($p, d=>44)}; # Try to load the hash ok $@ =~ m(Cannot load attribute: d); } if (1) #TnewServiceIncarnation #TData::Exchange::Service::check {my $s = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $s->check, $s; my $t = newServiceIncarnation("aaa", q(bbb.txt)); is_deeply $t->check, $t; ok $t->start >= $s->start+1; ok !$s->check(1); unlink q(bbb.txt); } if (!$windows) { if (1) #TnewProcessStarter #TData::Table::Text::Starter::start #TData::Table::Text::Starter::finish {my $N = 100; my $l = q(logFile.txt); unlink $l; my $s = newProcessStarter(4, q(processes)); $s->processingTitle = q(Test processes); $s->totalToBeStarted = $N; $s->processingLogFile = $l; for my $i(1..$N) {Data::Table::Text::Starter::start($s, sub{$i*$i}); } is_deeply [sort {$a <=> $b} Data::Table::Text::Starter::finish($s)], [map {$_**2} 1..$N]; ok readFile($l) =~ m(Finished $N processes for: Test processes)s; clearFolder($s->transferArea, 1e3); unlink $l; } } else {ok 1 for 1..2 } is_deeply arrayToHash(qw(a b c)), {a=>1, b=>1, c=>1}; #TarrayToHash if (1) #TreloadHashes {my $a = bless [bless {aaa=>42}, "AAAA"], "BBBB"; eval {$a->[0]->aaa}; ok $@ =~ m(\\ACan.t locate object method .aaa. via package .AAAA.); reloadHashes($a); ok $a->[0]->aaa == 42; } if (1) #TreloadHashes {my $a = bless [bless {ccc=>42}, "CCCC"], "DDDD"; eval {$a->[0]->ccc}; ok $@ =~ m(\\ACan.t locate object method .ccc. via package .CCCC.); reloadHashes($a); ok $a->[0]->ccc == 42; } if (1) { #TreadFile #TwriteFile #ToverWriteFile my $f = writeFile(undef, q(aaaa)); ok readFile($f) eq q(aaaa); eval{writeFile($f, q(bbbb))}; ok $@ =~ m(\\AFile already exists)s; ok readFile($f) eq q(aaaa); overWriteFile($f, q(bbbb)); ok readFile($f) eq q(bbbb); unlink $f; } if ($freeBsd or $windows or $dragonFly or $linux or $haiku) {ok 1 for 1..3} else { if (1) { #TwriteFiles #TreadFiles #TcopyFile #TcopyFolder my $h = {"aaa/1.txt"=>"1111", "aaa/2.txt"=>"2222", }; clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); writeFiles($h); my $a = readFiles(q(aaa)); is_deeply $h, $a; copyFolder(q(aaa), q(bbb)); my $b = readFiles(q(bbb)); is_deeply [sort values %$a],[sort values %$b]; copyFile(q(aaa/1.txt), q(aaa/2.txt)); my $A = readFiles(q(aaa)); is_deeply(values %$A); clearFolder(q(aaa), 3); clearFolder(q(bbb), 3); } } if (1) #TsetPackageSearchOrder {if (1) {package AAAA; sub aaaa{q(AAAAaaaa)} sub bbbb{q(AAAAbbbb)} sub cccc{q(AAAAcccc)} } if (1) {package BBBB; sub aaaa{q(BBBBaaaa)} sub bbbb{q(BBBBbbbb)} sub dddd{q(BBBBdddd)} } if (1) {package CCCC; sub aaaa{q(CCCCaaaa)} sub dddd{q(CCCCdddd)} sub eeee{q(CCCCeeee)} } setPackageSearchOrder(__PACKAGE__, qw(CCCC BBBB AAAA)); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(CCCCaaaa); ok &bbbb eq q(BBBBbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(CCCCdddd); ok &eeee eq q(CCCCeeee); setPackageSearchOrder(__PACKAGE__, qw(AAAA BBBB CCCC)); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &aaaa eq q(AAAAaaaa); ok &bbbb eq q(AAAAbbbb); ok &cccc eq q(AAAAcccc); ok &dddd eq q(BBBBdddd); ok &eeee eq q(CCCCeeee); } if (1) {my $d = bless {a=>1, b=> [bless({A=>1, B=>2, C=>3}, q(BBBB)), bless({A=>5, B=>6, C=>7}, q(BBBB)), ], c=>bless({A=>1, B=>2, C=>3}, q(CCCC)), }, q(AAAA); is_deeply showHashes($d), {AAAA => { a => 1, b => 1, c => 1 }, BBBB => { A => 2, B => 2, C => 2 }, CCCC => { A => 1, B => 1, C => 1 }, }; reloadHashes($d); ok $d->c->C == 3; } ok swapFilePrefix(q(/aaa/bbb.txt), q(/aaa/), q(/AAA/)) eq q(/AAA/bbb.txt); #TswapFilePrefix if (1) #ToverrideMethods #TisSubInPackage {sub AAAA::Call {q(AAAA)} sub BBBB::Call {q(BBBB)} sub BBBB::call {q(bbbb)} if (1) {package BBBB; use Test::More; *ok = *Test::More::ok; *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok !isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(BBBB); ok call eq q(bbbb); &Data::Table::Text::overrideMethods(qw(AAAA BBBB Call call)); *isSubInPackage = *Data::Table::Text::isSubInPackage; ok isSubInPackage(q(AAAA), q(Call)); ok isSubInPackage(q(AAAA), q(call)); ok isSubInPackage(q(BBBB), q(Call)); ok isSubInPackage(q(BBBB), q(call)); ok Call eq q(AAAA); ok call eq q(bbbb); package AAAA; use Test::More; *ok = *Test::More::ok; ok Call eq q(AAAA); ok &call eq q(bbbb); } } #eval {readFile($f)}; # Fails to fail in the following section on a number of operating systems #ok $@, "readFile"; if (1) #ToverWriteBinaryFile #TwriteBinaryFile #TcopyBinaryFile {vec(my $a, 0, 8) = 254; vec(my $b, 0, 8) = 255; ok dump($a) eq dump("\\xFE"); ok dump($b) eq dump("\\xFF"); ok length($a) == 1; ok length($b) == 1; my $s = $a.$a.$b.$b; ok length($s) == 4; my $f = eval {writeFile(undef, $s)}; ok fileSize($f) == 8; eval {writeBinaryFile($f, $s)}; ok $@ =~ m(Binary file already exists:)s; eval {overWriteBinaryFile($f, $s)}; ok !$@; ok fileSize($f) == 4; ok $s eq eval {readBinaryFile($f)}; copyBinaryFile($f, my $F = temporaryFile); ok $s eq readBinaryFile($F); unlink $f, $F; } is_deeply [parseFileName(q(/home/phil/r/aci2/out/.ditamap))], ["/home/phil/r/aci2/out/", "", "ditamap"]; ok relFromAbsAgainstAbs ("/home/phil/r/aci2/out/audit_events.xml", "/home/phil/r/aci2/out/.ditamap") eq "audit_events.xml"; if (1) { #TmergeHashesBySummingValues is_deeply +{a=>1, b=>2, c=>3}, mergeHashesBySummingValues +{a=>1,b=>1, c=>1}, +{b=>1,c=>1}, +{c=>1}; } if (1) { #TsquareArray #TdeSquareArray is_deeply [squareArray @{[1..4]} ], [[1, 2], [3, 4]]; is_deeply [squareArray @{[1..22]}], [[1 .. 5], [6 .. 10], [11 .. 15], [16 .. 20], [21, 22]]; is_deeply [1..$_], [deSquareArray squareArray @{[1..$_]}] for 1..22; ok $_ == countSquareArray squareArray @{[1..$_]} for 222; } if (1) { #TsummarizeColumn is_deeply [summarizeColumn([map {[$_]} qw(A B D B C D C D A C D C B B D)], 0)], [[5, "D"], [4, "B"], [4, "C"], [2, "A"]]; ok nws(formatTable ([map {[split m//, $_]} qw(AA CB CD BC DC DD CD AD AA DC CD CC BB BB BD)], [qw(Col-1 Col-2)], summarize=>1)) eq nws(<<\'END\'); Col-1 Col-2 1 A A 2 C B 3 C D 4 B C 5 D C 6 D D 7 C D 8 A D 9 A A 10 D C 11 C D 12 C C 13 B B 14 B B 15 B D Summary of column: Col-1 Count Col-1 1 5 C 2 4 B 3 3 A 4 3 D Summary of column: Col-2 Count Col-2 1 6 D 2 4 C 3 3 B 4 2 A END } if (0) { #TisFileUtf8 my $f = writeFile(undef, "aaa"); ok isFileUtf8 $f; } if (1) { #TnewUdsrServer #TnewUdsrClient #TUdsr::read #TUdsr::write #TUdsr::kill my $N = 20; my $s = newUdsrServer(serverAction=>sub {my ($u) = @_; my $r = $u->read; $u->write(qq(Hello from server $r)); }); my $p = newProcessStarter(min(100, $N)); # Run some clients for my $i(1..$N) {$p->start(sub {my $count = 0; for my $j(1..$N) {my $c = newUdsrClient; my $m = qq(Hello from client $i x $j); $c->write($m); my $r = $c->read; ++$count if $r eq qq(Hello from server $m); } [$count] }); } my $count; for my $r($p->finish) # Consolidate results {my ($c) = @$r; $count += $c; } ok $count == $N*$N; # Check results and kill $s->kill; } if (1) { #TguidFromMd5 ok guidFromMd5(substr(join(\'\', 0..9) x 4, 0, 32)) eq q(GUID-01234567-8901-2345-6789-012345678901); } #tttt 1 ' called at /Users/fly2400/cpanfly-5.24/var/tmp/cpan_build/Data-Table-Text-20181215-T3rffG/blib/lib/Data/Table/Text.pm line 7980 Data::Table::Text::test("Data::Table::Text") called at test.pl line 11 # Failed test at (eval 22) line 1536. # Looks like you failed 2 tests of 458. test.pl .. 1..458 ok 1 ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 ok 8 ok 9 ok 10 ok 11 ok 12 ok 13 ok 14 ok 15 ok 16 ok 17 ok 18 ok 19 ok 20 ok 21 ok 22 ok 23 ok 24 ok 25 ok 26 ok 27 ok 28 ok 29 ok 30 ok 31 ok 32 ok 33 ok 34 ok 35 ok 36 ok 37 ok 38 ok 39 ok 40 ok 41 ok 42 ok 43 ok 44 ok 45 ok 46 ok 47 ok 48 ok 49 ok 50 ok 51 ok 52 ok 53 ok 54 ok 55 ok 56 ok 57 ok 58 ok 59 ok 60 ok 61 ok 62 ok 63 ok 64 ok 65 ok 66 ok 67 ok 68 ok 69 ok 70 ok 71 ok 72 ok 73 ok 74 ok 75 ok 76 ok 77 ok 78 ok 79 ok 80 ok 81 ok 82 ok 83 ok 84 ok 85 ok 86 ok 87 ok 88 ok 89 ok 90 ok 91 ok 92 ok 93 ok 94 ok 95 ok 96 ok 97 ok 98 ok 99 ok 100 ok 101 ok 102 ok 103 ok 104 ok 105 ok 106 ok 107 ok 108 ok 109 ok 110 ok 111 ok 112 ok 113 ok 114 ok 115 ok 116 ok 117 ok 118 ok 119 ok 120 ok 121 ok 122 ok 123 ok 124 ok 125 ok 126 ok 127 ok 128 ok 129 ok 130 # skip Takes too much time ok 131 # skip Takes too much time ok 132 # skip Takes too much time ok 133 # skip Takes too much time ok 134 # skip Takes too much time ok 135 # skip Takes too much time ok 136 # skip Takes too much time ok 137 # skip Takes too much time ok 138 # skip Takes too much time ok 139 # skip Takes too much time ok 140 # skip Takes too much time ok 141 ok 142 ok 143 ok 144 ok 145 ok 146 ok 147 ok 148 ok 149 ok 150 ok 151 ok 152 ok 153 ok 154 ok 155 ok 156 ok 157 ok 158 ok 159 ok 160 ok 161 ok 162 ok 163 ok 164 ok 165 ok 166 ok 167 ok 168 ok 169 ok 170 ok 171 ok 172 ok 173 ok 174 ok 175 ok 176 ok 177 ok 178 ok 179 ok 180 ok 181 ok 182 ok 183 ok 184 ok 185 ok 186 ok 187 ok 188 ok 189 ok 190 ok 191 ok 192 ok 193 ok 194 ok 195 ok 196 ok 197 ok 198 ok 199 ok 200 ok 201 ok 202 ok 203 ok 204 ok 205 ok 206 ok 207 ok 208 ok 209 ok 210 ok 211 ok 212 ok 213 ok 214 ok 215 ok 216 ok 217 ok 218 ok 219 ok 220 ok 221 ok 222 ok 223 ok 224 ok 225 ok 226 ok 227 ok 228 ok 229 ok 230 ok 231 ok 232 ok 233 ok 234 ok 235 ok 236 ok 237 ok 238 ok 239 ok 240 ok 241 ok 242 ok 243 ok 244 ok 245 ok 246 ok 247 ok 248 ok 249 ok 250 ok 251 ok 252 ok 253 ok 254 ok 255 ok 256 ok 257 ok 258 ok 259 ok 260 ok 261 ok 262 ok 263 ok 264 ok 265 ok 266 ok 267 ok 268 ok 269 ok 270 ok 271 ok 272 ok 273 ok 274 ok 275 ok 276 ok 277 ok 278 ok 279 ok 280 ok 281 ok 282 ok 283 ok 284 ok 285 not ok 286 ok 287 ok 288 ok 289 ok 290 ok 291 ok 292 ok 293 ok 294 ok 295 ok 296 ok 297 ok 298 ok 299 ok 300 ok 301 ok 302 ok 303 ok 304 ok 305 ok 306 ok 307 ok 308 ok 309 ok 310 ok 311 ok 312 ok 313 - ok 314 ok 315 ok 316 ok 317 ok 318 ok 319 ok 320 ok 321 ok 322 ok 323 ok 324 ok 325 ok 326 ok 327 ok 328 ok 329 ok 330 ok 331 ok 332 ok 333 ok 334 ok 335 ok 336 ok 337 ok 338 ok 339 ok 340 ok 341 ok 342 ok 343 ok 344 ok 345 ok 346 ok 347 ok 348 ok 349 ok 350 ok 351 ok 352 ok 353 ok 354 ok 355 ok 356 ok 357 ok 358 ok 359 ok 360 ok 361 ok 362 ok 363 ok 364 ok 365 ok 366 ok 367 ok 368 ok 369 ok 370 ok 371 ok 372 ok 373 ok 374 ok 375 ok 376 ok 377 ok 378 ok 379 ok 380 ok 381 ok 382 ok 383 ok 384 ok 385 ok 386 ok 387 ok 388 ok 389 ok 390 ok 391 ok 392 ok 393 ok 394 ok 395 ok 396 ok 397 ok 398 ok 399 ok 400 ok 401 ok 402 ok 403 ok 404 ok 405 ok 406 ok 407 ok 408 ok 409 ok 410 ok 411 ok 412 ok 413 ok 414 ok 415 ok 416 ok 417 ok 418 ok 419 ok 420 ok 421 ok 422 ok 423 ok 424 ok 425 ok 426 ok 427 ok 428 ok 429 ok 430 ok 431 ok 432 ok 433 ok 434 ok 435 ok 436 ok 437 ok 438 ok 439 ok 440 ok 441 ok 442 ok 443 ok 444 ok 445 ok 446 ok 447 ok 448 ok 449 ok 450 ok 451 ok 452 ok 453 ok 454 ok 455 ok 456 not ok 457 ok 458 Dubious, test returned 2 (wstat 512, 0x200) Failed 2/458 subtests (less 11 skipped subtests: 445 okay) Test Summary Report ------------------- test.pl (Wstat: 512 Tests: 458 Failed: 2) Failed tests: 286, 457 Non-zero exit status: 2 Files=1, Tests=458, 2 wallclock secs ( 0.04 usr 0.01 sys + 0.99 cusr 1.13 csys = 2.17 CPU) Result: FAIL Failed 1/1 test programs. 2/458 subtests failed. PRBRENAN/Data-Table-Text-20181215.tar.gz ./Build test verbose=1 -- NOT OK //hint// to see the cpan-testers results for installing this module, try: reports PRBRENAN/Data-Table-Text-20181215.tar.gz Finished 2018-12-17T02:03:13