1#!./perl 2 3BEGIN { 4 chdir 't' if -d 't'; 5 if ($^O eq 'MacOS') { 6 @INC = qw(: ::lib ::macos:lib); 7 } else { 8 @INC = '.'; 9 push @INC, '../lib'; 10 } 11 require Config; import Config; 12 if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) { 13 print "1..0\n"; 14 exit 0; 15 } 16 print "1..12\n"; 17} 18END { 19 print "not ok 1\n" unless $loaded; 20} 21use File::Glob ':glob'; 22use Cwd (); 23$loaded = 1; 24print "ok 1\n"; 25 26sub array { 27 return '(', join(", ", map {defined $_ ? "\"$_\"" : "undef"} @a), ")\n"; 28} 29 30# look for the contents of the current directory 31$ENV{PATH} = "/bin"; 32delete @ENV{BASH_ENV, CDPATH, ENV, IFS}; 33@correct = (); 34if (opendir(D, $^O eq "MacOS" ? ":" : ".")) { 35 @correct = grep { !/^\./ } sort readdir(D); 36 closedir D; 37} 38@a = File::Glob::glob("*", 0); 39@a = sort @a; 40if ("@a" ne "@correct" || GLOB_ERROR) { 41 print "# |@a| ne |@correct|\nnot "; 42} 43print "ok 2\n"; 44 45# look up the user's home directory 46# should return a list with one item, and not set ERROR 47if ($^O ne 'MSWin32' && $^O ne 'NetWare' && $^O ne 'VMS' && $^O ne 'os2') { 48 eval { 49 ($name, $home) = (getpwuid($>))[0,7]; 50 1; 51 } and do { 52 if (defined $home && defined $name && -d $home) { 53 @a = bsd_glob("~$name", GLOB_TILDE); 54 if ((scalar(@a) != 1 || $a[0] ne $home || GLOB_ERROR)) { 55 print "not "; 56 } 57 } 58 }; 59} 60print "ok 3\n"; 61 62# check backslashing 63# should return a list with one item, and not set ERROR 64@a = bsd_glob('TEST', GLOB_QUOTE); 65if (scalar @a != 1 || $a[0] ne 'TEST' || GLOB_ERROR) { 66 local $/ = "]["; 67 print "# [@a]\n"; 68 print "not "; 69} 70print "ok 4\n"; 71 72# check nonexistent checks 73# should return an empty list 74# XXX since errfunc is NULL on win32, this test is not valid there 75@a = bsd_glob("asdfasdf", 0); 76if (($^O ne 'MSWin32' && $^O ne 'NetWare') and scalar @a != 0) { 77 print "# |@a|\nnot "; 78} 79print "ok 5\n"; 80 81# check bad protections 82# should return an empty list, and set ERROR 83if ($^O eq 'mpeix' or $^O eq 'MSWin32' or $^O eq 'NetWare' or $^O eq 'os2' or $^O eq 'VMS' 84 or $^O eq 'cygwin' or Cwd::cwd() =~ m#^$Config{'afsroot'}#s or not $>) 85{ 86 print "ok 6 # skipped\n"; 87} 88else { 89 $dir = "pteerslo"; 90 mkdir $dir, 0; 91 @a = bsd_glob("$dir/*", GLOB_ERR); 92 #print "\@a = ", array(@a); 93 rmdir $dir; 94 if (scalar(@a) != 0 || GLOB_ERROR == 0) { 95 if ($^O eq 'vos') { 96 print "not ok 6 # TODO hit VOS bug posix-956\n"; 97 } else { 98 print "not ok 6\n"; 99 } 100 } 101 else { 102 print "ok 6\n"; 103 } 104} 105 106# check for csh style globbing 107@a = bsd_glob('{a,b}', GLOB_BRACE | GLOB_NOMAGIC); 108unless (@a == 2 and $a[0] eq 'a' and $a[1] eq 'b') { 109 print "not "; 110} 111print "ok 7\n"; 112 113@a = bsd_glob( 114 '{TES*,doesntexist*,a,b}', 115 GLOB_BRACE | GLOB_NOMAGIC | ($^O eq 'VMS' ? GLOB_NOCASE : 0) 116); 117 118# Working on t/TEST often causes this test to fail because it sees Emacs temp 119# and RCS files. Filter them out, and .pm files too, and patch temp files. 120@a = grep !/(,v$|~$|\.(pm|ori?g|rej)$)/, @a; 121@a = (grep !/test.pl/, @a) if $^O eq 'VMS'; 122 123print "# @a\n"; 124 125unless (@a == 3 126 and $a[0] eq ($^O eq 'VMS'? 'test.' : 'TEST') 127 and $a[1] eq 'a' 128 and $a[2] eq 'b') 129{ 130 print "not ok 8 # @a\n"; 131} else { 132 print "ok 8\n"; 133} 134 135# "~" should expand to $ENV{HOME} 136$ENV{HOME} = "sweet home"; 137@a = bsd_glob('~', GLOB_TILDE | GLOB_NOMAGIC); 138unless ($^O eq "MacOS" || (@a == 1 and $a[0] eq $ENV{HOME})) { 139 print "not "; 140} 141print "ok 9\n"; 142 143# GLOB_ALPHASORT (default) should sort alphabetically regardless of case 144mkdir "pteerslo", 0777; 145chdir "pteerslo"; 146 147@f_names = qw(Ax.pl Bx.pl Cx.pl aY.pl bY.pl cY.pl); 148@f_alpha = qw(Ax.pl aY.pl Bx.pl bY.pl Cx.pl cY.pl); 149if ('a' lt 'A') { # EBCDIC char sets sort lower case before UPPER 150 @f_names = sort(@f_names); 151} 152if ($^O eq 'VMS') { # VMS is happily caseignorant 153 @f_alpha = qw(ax.pl ay.pl bx.pl by.pl cx.pl cy.pl); 154 @f_names = @f_alpha; 155} 156 157for (@f_names) { 158 open T, "> $_"; 159 close T; 160} 161 162$pat = "*.pl"; 163 164$ok = 1; 165@g_names = bsd_glob($pat, 0); 166print "# f_names = @f_names\n"; 167print "# g_names = @g_names\n"; 168for (@f_names) { 169 $ok = 0 unless $_ eq shift @g_names; 170} 171print $ok ? "ok 10\n" : "not ok 10\n"; 172 173$ok = 1; 174@g_alpha = bsd_glob($pat); 175print "# f_alpha = @f_alpha\n"; 176print "# g_alpha = @g_alpha\n"; 177for (@f_alpha) { 178 $ok = 0 unless $_ eq shift @g_alpha; 179} 180print $ok ? "ok 11\n" : "not ok 11\n"; 181 182unlink @f_names; 183chdir ".."; 184rmdir "pteerslo"; 185 186# this can panic if PL_glob_index gets passed as flags to bsd_glob 187<*>; <*>; 188print "ok 12\n"; 189