1#!./perl
2
3BEGIN { unshift(@INC,'../lib') if -d '../lib'; }
4
5use VMS::Filespec;
6use File::Spec;
7
8foreach (<DATA>) {
9  chomp;
10  s/\s*#.*//;
11  next if /^\s*$/;
12  push(@tests,$_);
13}
14
15require './test.pl';
16plan(tests => scalar(2*@tests)+6);
17
18foreach $test (@tests) {
19  ($arg,$func,$expect) = split(/\s+/,$test);
20
21  $expect = undef if $expect eq 'undef';
22  $rslt = eval "$func('$arg')";
23  is($@, '', "eval ${func}('$arg')");
24  is($rslt, $expect, "${func}('$arg'): '$rslt'");
25}
26
27$defwarn = <<'EOW';
28# Note: This failure may have occurred because your default device
29# was set using a non-concealed logical name.  If this is the case,
30# you will need to determine by inspection that the two resultant
31# file specifications shown above are in fact equivalent.
32EOW
33
34is(uc(rmsexpand('[]')),   "\U$ENV{DEFAULT}", 'rmsexpand()') || print $defwarn;
35is(rmsexpand('from.here'),"\L$ENV{DEFAULT}from.here") || print $defwarn;
36is(rmsexpand('from'),     "\L$ENV{DEFAULT}from")      || print $defwarn;
37
38is(rmsexpand('from.here','cant:[get.there];2'),
39   'cant:[get.there]from.here;2')                     || print $defwarn;
40
41
42# Make sure we're using redirected mkdir, which strips trailing '/', since
43# the CRTL's mkdir can't handle this.
44ok(mkdir('testdir/',0777),      'using redirected mkdir()');
45ok(rmdir('testdir/'),           '    rmdir()');
46
47__DATA__
48
49# lots of underscores used to minimize collision with existing logical names
50
51# Basic VMS to Unix filespecs
52__some_:[__where_.__over_]__the_.__rainbow_    unixify /__some_/__where_/__over_/__the_.__rainbow_
53[.__some_.__where_.__over_]__the_.__rainbow_   unixify __some_/__where_/__over_/__the_.__rainbow_
54[-.__some_.__where_.__over_]__the_.__rainbow_  unixify ../__some_/__where_/__over_/__the_.__rainbow_
55[.__some_.--.__where_.__over_]__the_.__rainbow_        unixify __some_/../../__where_/__over_/__the_.__rainbow_
56[.__some_...__where_.__over_]__the_.__rainbow_ unixify __some_/.../__where_/__over_/__the_.__rainbow_
57[...__some_.__where_.__over_]__the_.__rainbow_ unixify .../__some_/__where_/__over_/__the_.__rainbow_
58[.__some_.__where_.__over_...]__the_.__rainbow_        unixify __some_/__where_/__over_/.../__the_.__rainbow_
59[.__some_.__where_.__over_...] unixify __some_/__where_/__over_/.../
60[.__some_.__where_.__over_.-]  unixify __some_/__where_/__over_/../
61[]	unixify		./
62[-]	unixify		../
63[--]	unixify		../../
64[...]	unixify		.../
65
66# and back again
67/__some_/__where_/__over_/__the_.__rainbow_    vmsify  __some_:[__where_.__over_]__the_.__rainbow_
68__some_/__where_/__over_/__the_.__rainbow_     vmsify  [.__some_.__where_.__over_]__the_.__rainbow_
69../__some_/__where_/__over_/__the_.__rainbow_  vmsify  [-.__some_.__where_.__over_]__the_.__rainbow_
70__some_/../../__where_/__over_/__the_.__rainbow_       vmsify  [-.__where_.__over_]__the_.__rainbow_
71.../__some_/__where_/__over_/__the_.__rainbow_ vmsify  [...__some_.__where_.__over_]__the_.__rainbow_
72__some_/.../__where_/__over_/__the_.__rainbow_ vmsify  [.__some_...__where_.__over_]__the_.__rainbow_
73/__some_/.../__where_/__over_/__the_.__rainbow_        vmsify  __some_:[...__where_.__over_]__the_.__rainbow_
74__some_/__where_/...   vmsify  [.__some_.__where_...]
75/__where_/...  vmsify  __where_:[...]
76.	vmsify	[]
77..	vmsify	[-]
78../..	vmsify	[--]
79.../	vmsify	[...]
80/	vmsify	sys$disk:[000000]
81
82# Fileifying directory specs
83__down_:[__the_.__garden_.__path_]     fileify __down_:[__the_.__garden_]__path_.dir;1
84[.__down_.__the_.__garden_.__path_]    fileify [.__down_.__the_.__garden_]__path_.dir;1
85/__down_/__the_/__garden_/__path_      fileify /__down_/__the_/__garden_/__path_.dir;1
86/__down_/__the_/__garden_/__path_/     fileify /__down_/__the_/__garden_/__path_.dir;1
87__down_/__the_/__garden_/__path_       fileify __down_/__the_/__garden_/__path_.dir;1
88__down_:[__the_.__garden_]__path_      fileify __down_:[__the_.__garden_]__path_.dir;1
89__down_:[__the_.__garden_]__path_.     fileify # N.B. trailing . ==> null type
90__down_:[__the_]__garden_.__path_      fileify undef
91/__down_/__the_/__garden_/__path_.     fileify # N.B. trailing . ==> null type
92/__down_/__the_/__garden_.__path_      fileify undef
93
94# and pathifying them
95__down_:[__the_.__garden_]__path_.dir;1        pathify __down_:[__the_.__garden_.__path_]
96[.__down_.__the_.__garden_]__path_.dir pathify [.__down_.__the_.__garden_.__path_]
97/__down_/__the_/__garden_/__path_.dir  pathify /__down_/__the_/__garden_/__path_/
98__down_/__the_/__garden_/__path_.dir   pathify __down_/__the_/__garden_/__path_/
99__down_:[__the_.__garden_]__path_      pathify __down_:[__the_.__garden_.__path_]
100__down_:[__the_.__garden_]__path_.     pathify # N.B. trailing . ==> null type
101__down_:[__the_]__garden_.__path_      pathify undef
102/__down_/__the_/__garden_/__path_.     pathify # N.B. trailing . ==> null type
103/__down_/__the_/__garden_.__path_      pathify undef
104__down_:[__the_.__garden_]__path_.dir;2        pathify #N.B. ;2
105__path_        pathify __path_/
106/__down_/__the_/__garden_/.    pathify /__down_/__the_/__garden_/./
107/__down_/__the_/__garden_/..   pathify /__down_/__the_/__garden_/../
108/__down_/__the_/__garden_/...  pathify /__down_/__the_/__garden_/.../
109__path_.notdir pathify undef
110
111# Both VMS/Unix and file/path conversions
112__down_:[__the_.__garden_]__path_.dir;1        unixpath        /__down_/__the_/__garden_/__path_/
113/__down_/__the_/__garden_/__path_      vmspath __down_:[__the_.__garden_.__path_]
114__down_:[__the_.__garden_.__path_]     unixpath        /__down_/__the_/__garden_/__path_/
115__down_:[__the_.__garden_.__path_...]  unixpath        /__down_/__the_/__garden_/__path_/.../
116/__down_/__the_/__garden_/__path_.dir  vmspath __down_:[__the_.__garden_.__path_]
117[.__down_.__the_.__garden_]__path_.dir unixpath        __down_/__the_/__garden_/__path_/
118__down_/__the_/__garden_/__path_       vmspath [.__down_.__the_.__garden_.__path_]
119__path_        vmspath [.__path_]
120/	vmspath	sys$disk:[000000]
121
122# Redundant characters in Unix paths
123//__some_/__where_//__over_/../__the_.__rainbow_       vmsify  __some_:[__where_]__the_.__rainbow_
124/__some_/__where_//__over_/./__the_.__rainbow_ vmsify  __some_:[__where_.__over_]__the_.__rainbow_
125..//../	vmspath	[--]
126./././	vmspath	[]
127./../.	vmsify	[-]
128
129# Our override of File::Spec->canonpath can do some strange things
130__dev:[__dir.000000]__foo     File::Spec->canonpath   __dev:[__dir.000000]__foo
131__dev:[__dir.][000000]__foo   File::Spec->canonpath   __dev:[__dir]__foo
132