filespec.t revision 1.1
1#!./perl 2 3use VMS::Filespec; 4use File::Spec; 5 6foreach (<DATA>) { 7 chomp; 8 s/\s*#.*//; 9 next if /^\s*$/; 10 push(@tests,$_); 11} 12 13require 'test.pl'; 14plan(tests => scalar(2*@tests)+6); 15 16my $vms_unix_rpt; 17my $vms_efs; 18 19if ($^O eq 'VMS') { 20 if (eval 'require VMS::Feature') { 21 $vms_unix_rpt = VMS::Feature::current("filename_unix_report"); 22 $vms_efs = VMS::Feature::current("efs_charset"); 23 } else { 24 my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || ''; 25 my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || ''; 26 $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i; 27 $vms_efs = $efs_charset =~ /^[ET1]/i; 28 } 29} 30 31 32 33foreach $test (@tests) { 34 ($arg,$func,$expect2,$expect5) = split(/(?<!\\)\s+/,$test); 35 36 $arg =~ s/\\//g; # to get whitespace into the argument escape with \ 37 $expect2 = undef if $expect2 eq 'undef'; 38 $expect2 = undef if $expect2 eq '^'; 39 $expect5 = undef if $expect5 eq 'undef'; 40 $expect5 = $expect2 if $expect5 eq '^'; 41 42 if ($vms_efs) { 43 $expect = $expect5; 44 } 45 else { 46 $expect = $expect2; 47 } 48 49 $rslt = eval "$func('$arg')"; 50 is($@, '', "eval ${func}('$arg')"); 51 if ($expect ne '^*') { 52 is(lc($rslt), lc($expect), "${func}('$arg'): '$rslt'"); 53 } 54 else { 55 is(lc($rslt), lc($expect), "${func}('$arg'): '$rslt' # TODO fix ODS-5 test"); 56 } 57} 58 59$defwarn = <<'EOW'; 60# Note: This failure may have occurred because your default device 61# was set using a non-concealed logical name. If this is the case, 62# you will need to determine by inspection that the two resultant 63# file specifications shown above are in fact equivalent. 64EOW 65 66is(uc(rmsexpand('[]')), "\U$ENV{DEFAULT}", 'rmsexpand()') || print $defwarn; 67is(lc(rmsexpand('from.here')),"\L$ENV{DEFAULT}from.here") || print $defwarn; 68is(lc(rmsexpand('from')), "\L$ENV{DEFAULT}from") || print $defwarn; 69 70is(lc(rmsexpand('from.here','cant:[get.there];2')), 71 'cant:[get.there]from.here;2') || print $defwarn; 72 73 74# Make sure we're using redirected mkdir, which strips trailing '/', since 75# the CRTL's mkdir can't handle this. 76ok(mkdir('testdir/',0777), 'using redirected mkdir()'); 77ok(rmdir('testdir/'), ' rmdir()'); 78 79__DATA__ 80 81# Column definitions: 82# 83# Column 1: Argument (path spec to be transformed) 84# Column 2: Function that is to do the transformation 85# Column 3: Expected result when DECC$EFS_CHARSET is not in effect 86# Column 4: Expected result when DECC$EFS_CHARSET is in effect 87# ^ means expect same result for EFS as for non-EFS 88# ^* means TODO when EFS is in effect 89 90# lots of underscores used to minimize collision with existing logical names 91 92# Basic VMS to Unix filespecs 93__some_:[__where_.__over_]__the_.__rainbow_ unixify /__some_/__where_/__over_/__the_.__rainbow_ ^ 94__some_:<__where_.__over_>__the_.__rainbow_ unixify /__some_/__where_/__over_/__the_.__rainbow_ ^ 95[.__some_.__where_.__over_]__the_.__rainbow_ unixify __some_/__where_/__over_/__the_.__rainbow_ ^ 96[-.__some_.__where_.__over_]__the_.__rainbow_ unixify ../__some_/__where_/__over_/__the_.__rainbow_ ^ 97[.__some_.--.__where_.__over_]__the_.__rainbow_ unixify __some_/../../__where_/__over_/__the_.__rainbow_ ^ 98[.__some_...__where_.__over_]__the_.__rainbow_ unixify __some_/.../__where_/__over_/__the_.__rainbow_ ^ 99[...__some_.__where_.__over_]__the_.__rainbow_ unixify .../__some_/__where_/__over_/__the_.__rainbow_ ^ 100[.__some_.__where_.__over_...]__the_.__rainbow_ unixify __some_/__where_/__over_/.../__the_.__rainbow_ ^ 101[.__some_.__where_.__over_...] unixify __some_/__where_/__over_/.../ ^ 102[.__some_.__where_.__over_.-] unixify __some_/__where_/__over_/../ ^ 103[] unixify ./ ^ 104[-] unixify ../ ^ 105[--] unixify ../../ ^ 106[...] unixify .../ ^ 107__lyrics_:[__are_.__very_^.__sappy_]__but_^.__rhymes_^.__are_.__true_ unixify /__lyrics_/__are_/__very_.__sappy_/__but_.__rhymes_.__are_.__true_ ^ 108[.$(macro)] unixify $(macro)/ ^ 109 110# and back again 111/__some_/__where_/__over_/__the_.__rainbow_ vmsify __some_:[__where_.__over_]__the_.__rainbow_ ^ 112__some_/__where_/__over_/__the_.__rainbow_ vmsify [.__some_.__where_.__over_]__the_.__rainbow_ ^ 113../__some_/__where_/__over_/__the_.__rainbow_ vmsify [-.__some_.__where_.__over_]__the_.__rainbow_ ^ 114__some_/../../__where_/__over_/__the_.__rainbow_ vmsify [.__some_.--.__where_.__over_]__the_.__rainbow_ ^ 115.../__some_/__where_/__over_/__the_.__rainbow_ vmsify [...__some_.__where_.__over_]__the_.__rainbow_ ^ 116__some_/.../__where_/__over_/__the_.__rainbow_ vmsify [.__some_...__where_.__over_]__the_.__rainbow_ ^ 117/__some_/.../__where_/__over_/__the_.__rainbow_ vmsify __some_:[...__where_.__over_]__the_.__rainbow_ ^ 118__some_/__where_.DIR;1 vmsify [.__some_]__where_.DIR;1 ^ 119__some_/_;_where_.DIR;1 vmsify [.__some_]_^;_where_.DIR;1 ^ 120__some_/__where_/... vmsify [.__some_.__where_...] ^ 121/__where_/... vmsify __where_:[...] ^ 122. vmsify [] ^ 123.. vmsify [-] ^ 124../.. vmsify [--] ^ 125.../ vmsify [...] ^ 126/ vmsify sys$disk:[000000] ^ 127./$(macro)/ vmsify [.$(macro)] ^ 128./$(macro) vmsify []$(macro) ^ 129./$(m+ vmsify []$^(m^+ ^ 130foo-bar-0^.01/ vmsify [.foo-bar-0_01] [.foo-bar-0^.01] 131\ foo.tmp vmsify ^_foo.tmp ^ 132# Fileifying directory specs 133__down_:[__the_.__garden_.__path_] fileify __down_:[__the_.__garden_]__path_.dir;1 ^ 134[.__down_.__the_.__garden_.__path_] fileify [.__down_.__the_.__garden_]__path_.dir;1 ^ 135/__down_/__the_/__garden_/__path_ fileify /__down_/__the_/__garden_/__path_.dir;1 ^ 136/__down_/__the_/__garden_/__path_/ fileify /__down_/__the_/__garden_/__path_.dir;1 ^ 137__down_/__the_/__garden_/__path_ fileify __down_/__the_/__garden_/__path_.dir;1 ^ 138__down_:[__the_.__garden_]__path_ fileify __down_:[__the_.__garden_]__path_.dir;1 ^ 139__down_:[__the_.__garden_]__path_. fileify ^ __down_:[__the_.__garden_]__path_^..dir;1 # N.B. trailing . ==> null type 140__down_:[__the_]__garden_.__path_ fileify ^ __down_:[__the_]__garden_^.__path_.dir;1 #undef 141/__down_/__the_/__garden_/__path_. fileify ^ /__down_/__the_/__garden_/__path_..dir;1 # N.B. trailing . ==> null type 142/__down_/__the_/__garden_.__path_ fileify ^ /__down_/__the_/__garden_.__path_.dir;1 143__down_::__the_:[__garden_.__path_] fileify __down_::__the_:[__garden_]__path_.dir;1 ^ 144__down_::__the_:[__garden_] fileify __down_::__the_:[000000]__garden_.dir;1 ^ 145 146# and pathifying them 147__down_:[__the_.__garden_]__path_.dir;1 pathify __down_:[__the_.__garden_.__path_] ^ 148[.__down_.__the_.__garden_]__path_.dir pathify [.__down_.__the_.__garden_.__path_] ^ 149/__down_/__the_/__garden_/__path_.dir pathify /__down_/__the_/__garden_/__path_/ ^ 150__down_/__the_/__garden_/__path_.dir pathify __down_/__the_/__garden_/__path_/ ^ 151__down_:[__the_.__garden_]__path_ pathify __down_:[__the_.__garden_.__path_] ^ 152__down_:[__the_.__garden_]__path_. pathify ^ __down_:[__the_.__garden_.__path_^.] # N.B. trailing . ==> null type 153__down_:[__the_]__garden_.__path_ pathify ^ __down_:[__the_.__garden_^.__path_] # undef 154/__down_/__the_/__garden_/__path_. pathify /__down_/__the_/__garden_/__path__/ /__down_/__the_/__garden_/__path_./ # N.B. trailing . ==> null type 155/__down_/__the_/__garden_.__path_ pathify /__down_/__the_/__garden____path_/ /__down_/__the_/__garden_.__path_/ 156__down_:[__the_.__garden_]__path_.dir;2 pathify ^ #N.B. ;2 157__path_ pathify __path_/ ^ 158/__down_/__the_/__garden_/. pathify /__down_/__the_/__garden_/./ ^ 159/__down_/__the_/__garden_/.. pathify /__down_/__the_/__garden_/../ ^ 160/__down_/__the_/__garden_/... pathify /__down_/__the_/__garden_/.../ ^ 161__path_.notdir pathify __path__notdir/ __path_.notdir/ 162 163# Both VMS/Unix and file/path conversions 164__down_:[__the_.__garden_]__path_.dir;1 unixpath /__down_/__the_/__garden_/__path_/ ^ 165/__down_/__the_/__garden_/__path_ vmspath __down_:[__the_.__garden_.__path_] ^ 166__down_:[__the_.__garden_.__path_] unixpath /__down_/__the_/__garden_/__path_/ ^ 167__down_:[__the_.__garden_.__path_...] unixpath /__down_/__the_/__garden_/__path_/.../ ^ 168/__down_/__the_/__garden_/__path_.dir vmspath __down_:[__the_.__garden_.__path_] ^ 169[.__down_.__the_.__garden_]__path_.dir unixpath __down_/__the_/__garden_/__path_/ ^ 170__down_/__the_/__garden_/__path_ vmspath [.__down_.__the_.__garden_.__path_] ^ 171__path_ vmspath [.__path_] ^ 172/ vmspath sys$disk:[000000] ^ 173/sys$scratch vmspath sys$scratch: ^ 174 175# Redundant characters in Unix paths 176//__some_/__where_//__over_/../__the_.__rainbow_ vmsify __some_:[__where_.__over_.-]__the_.__rainbow_ ^ 177/__some_/__where_//__over_/./__the_.__rainbow_ vmsify __some_:[__where_.__over_]__the_.__rainbow_ ^ 178..//../ vmspath [--] ^ 179./././ vmspath [] ^ 180./../. vmsify [-] ^ 181 182# Our override of File::Spec->canonpath can do some strange things 183__dev:[__dir.000000]__foo File::Spec->canonpath __dev:[__dir.000000]__foo ^ 184__dev:[__dir.][000000]__foo File::Spec->canonpath __dev:[__dir]__foo ^ 185