Upgrade to File::Spec 0.85_03.
[p5sagit/p5-mst-13.2.git] / lib / File / Spec / t / crossplatform.t
1 #!/usr/bin/perl -w
2
3 use strict;
4 use Test::More;
5 use File::Spec;
6 local $|=1;
7
8 my @platforms = qw(Cygwin Epoc Mac OS2 Unix VMS Win32);
9 my $tests_per_platform = 7;
10
11 plan tests => 1 + @platforms * $tests_per_platform;
12
13 my %volumes = (
14                Mac => 'Macintosh HD',
15                OS2 => 'A:',
16                Win32 => 'A:',
17                VMS => 'v',
18               );
19 my %other_vols = (
20                   Mac => 'Mounted Volume',
21                   OS2 => 'B:',
22                   Win32 => 'B:',
23                   VMS => 'w',
24               );
25
26 ok 1, "Loaded";
27
28 foreach my $platform (@platforms) {
29   my $module = "File::Spec::$platform";
30   
31  SKIP:
32   {
33     eval "require $module; 1";
34
35     skip "Can't load $module", $tests_per_platform
36       if $@;
37     
38     my $v = $volumes{$platform} || '';
39     my $other_v = $other_vols{$platform} || '';
40     
41     # Fake out the rootdir on MacOS
42     no strict 'refs';
43     my $save_w = $^W;
44     $^W = 0;
45     local *{"File::Spec::Mac::rootdir"} = sub { "Macintosh HD:" };
46     $^W = $save_w;
47     use strict 'refs';
48     
49     my ($file, $base, $result);
50
51     $base = $module->catpath($v, $module->catdir('', 'foo'), '');
52     $base = $module->catdir($module->rootdir, 'foo');
53
54     is $module->file_name_is_absolute($base), 1, "$base is absolute on $platform";
55
56
57     # abs2rel('A:/foo/bar', 'A:/foo')    ->  'bar'
58     $file = $module->catpath($v, $module->catdir($module->rootdir, 'foo', 'bar'), 'file');
59     $base = $module->catpath($v, $module->catdir($module->rootdir, 'foo'), '');
60     $result = $module->catfile('bar', 'file');
61     is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
62     
63     # abs2rel('A:/foo/bar', 'B:/foo')    ->  'A:/foo/bar'
64     $base = $module->catpath($other_v, $module->catdir($module->rootdir, 'foo'), '');
65     $result = volumes_differ($module, $file, $base) ? $file : $module->catfile('bar', 'file');
66     is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
67
68     # abs2rel('A:/foo/bar', '/foo')      ->  'A:/foo/bar'
69     $base = $module->catpath('', $module->catdir($module->rootdir, 'foo'), '');
70     $result = volumes_differ($module, $file, $base) ? $file : $module->catfile('bar', 'file');
71     is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
72
73     # abs2rel('/foo/bar', 'A:/foo')    ->  '/foo/bar'
74     $file = $module->catpath('', $module->catdir($module->rootdir, 'foo', 'bar'), 'file');
75     $base = $module->catpath($v, $module->catdir($module->rootdir, 'foo'), '');
76     $result = volumes_differ($module, $file, $base) ? $file : $module->catfile('bar', 'file');
77     is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
78     
79     # abs2rel('/foo/bar', 'B:/foo')    ->  '/foo/bar'
80     $base = $module->catpath($other_v, $module->catdir($module->rootdir, 'foo'), '');
81     $result = volumes_differ($module, $file, $base) ? $file : $module->catfile('bar', 'file');
82     is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
83     
84     # abs2rel('/foo/bar', '/foo')      ->  'bar'
85     $base = $module->catpath('', $module->catdir($module->rootdir, 'foo'), '');
86     $result = $module->catfile('bar', 'file');
87     is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
88   }
89 }
90
91 sub volumes_differ {
92   my ($module, $one, $two) = @_;
93   my ($one_v) = $module->splitpath( $module->rel2abs($one) );
94   my ($two_v) = $module->splitpath( $module->rel2abs($two) );
95   return $one_v ne $two_v;
96 }