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