The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 164;

=pod

This is the perl5 version of the perl6 test. 
It is here to make sure we are in sync with 
the perl5 version.

=cut

use File::Spec::Win32;

is(File::Spec::Win32->curdir(),  '.',         '... got the right curdir');
is(File::Spec::Win32->updir(),   '..',        '... got the right updir');
is(File::Spec::Win32->rootdir(), '/',         '... got the right rootdir');
is(File::Spec::Win32->devnull(), 'nul', '... got the right devnull');

ok(File::Spec::Win32->case_tolerant(), '... Win32 is case tolerant');

{
    my $path = "\\path\\to\\a\\dir";

    my @path = File::Spec::Win32->splitdir($path);
    is(+@path, 5, '... we have 5 elements in the path');
    is($path[0], '', '... our first element is ""');    
    is($path[1], 'path', '... our second element is "path"');    
    is($path[2], 'to', '... our third element is "to"');    
    is($path[3], 'a', '... our fourth element is "a"');    
    is($path[4], 'dir', '... our fifth element is "dir"');      
    
    is(File::Spec::Win32->catdir(@path), $path, '... got the right catdir string');                 
}

{
    my $path = "path\\to\\a\\dir";

    my @path = File::Spec::Win32->splitdir($path);
    is(+@path, 4, '... we have 4 elements in the path');
    is($path[0], 'path', '... our third element is "path"');    
    is($path[1], 'to', '... our fourth element is "to"');    
    is($path[2], 'a', '... our fifth element is "a"');      
    is($path[3], 'dir', '... our second element is "dir"');    
    
    is(File::Spec::Win32->catdir(@path), $path, '... got the right catdir string');                 
}

{
    my $path = "\\path\\to\\a\\file.txt";

    my @path = File::Spec::Win32->splitdir($path);
    is(+@path, 5, '... we have 5 elements in the path');
    is($path[0], '', '... our first element is ""');    
    is($path[1], 'path', '... our second element is "path"');    
    is($path[2], 'to', '... our third element is "to"');    
    is($path[3], 'a', '... our fourth element is "a"');    
    is($path[4], 'file.txt', '... our fifth element is "file.txt"');      
    
    is(File::Spec::Win32->catfile(@path), $path, '... got the right catfile string');                 
}

ok(File::Spec::Win32->file_name_is_absolute("C:\\\\path\\from\\root"), '... checking if path is absolute (yes)');
ok(!File::Spec::Win32->file_name_is_absolute("path\\from\\root"), '... checking if path is absolute (no)');
ok(!File::Spec::Win32->file_name_is_absolute("\nC:\\\\path\\from\\root"), '... checking if path is absolute (no)');

is(File::Spec::Win32->catpath('C:\\\\', 'dir', 'file'), "C:\\\\dir\\file", 
   '... got the right catpath string (volume is ignored)'); 
   
{
    my @upwards = ('path/to/file', '..', '.', ".\n/path");
    my @no_upwards = File::Spec::Win32->no_upwards(@upwards);
    is(+@no_upwards, 2, '... got one element');
    is($no_upwards[0], 'path/to/file', '... got the right element');  
    is($no_upwards[1], ".\n/path", '... got the right element');        
}  

{
    my @path = File::Spec::Win32->path();
    ok(+@path, '... we have elements in the path'); 
} 

{
    my ($vol, $dir, $file) = File::Spec::Win32->splitpath("C:\\path\\to\\file");
    is($vol, "C:", '... got the right volume');    
    is($dir, "\\path\\to\\", '... got the right directory');
    is($file, 'file', '... got the right file');    
}

{
    my ($vol, $dir, $file) = File::Spec::Win32->splitpath("C:\\path\\to\\dir", 1);
    is($vol, "C:", '... got the right volume');    
    is($dir, "\\path\\to\\dir", '... got the right directory');
    is($file, '', '... got the right file');    
}

# perl5 File::Spec tests

is(File::Spec::Win32->canonpath(''),               '',             'checking canonpath');
is(File::Spec::Win32->canonpath('a:'),             'A:',           'checking canonpath');
is(File::Spec::Win32->canonpath('A:f'),            'A:f',          'checking canonpath');
is(File::Spec::Win32->canonpath('A:/'),            'A:\\',         'checking canonpath');
is(File::Spec::Win32->canonpath('//a\\b//c'),      '\\\\a\\b\\c',  'checking canonpath');
is(File::Spec::Win32->canonpath('/a/..../c'),      '\\a\\....\\c', 'checking canonpath');
is(File::Spec::Win32->canonpath('//a/b\\c'),       '\\\\a\\b\\c',  'checking canonpath');
is(File::Spec::Win32->canonpath('////'),           '\\\\\\',       'checking canonpath');
is(File::Spec::Win32->canonpath('//'),             '\\',           'checking canonpath');
is(File::Spec::Win32->canonpath('/.'),             '\\.',          'checking canonpath');
is(File::Spec::Win32->canonpath('//a/b/../../c'),  '\\\\a\\b\\c',  'checking canonpath');
is(File::Spec::Win32->canonpath('//a/b/c/../d'),   '\\\\a\\b\\d',  'checking canonpath');
is(File::Spec::Win32->canonpath('//a/b/c/../../d'),'\\\\a\\b\\d',  'checking canonpath');
is(File::Spec::Win32->canonpath('//a/b/c/.../d'),  '\\\\a\\b\\d',  'checking canonpath');
is(File::Spec::Win32->canonpath('/a/b/c/../../d'), '\\a\\d',       'checking canonpath');
is(File::Spec::Win32->canonpath('/a/b/c/.../d'),   '\\a\\d',       'checking canonpath');
is(File::Spec::Win32->canonpath('\\../temp\\'),    '\\temp',       'checking canonpath');
is(File::Spec::Win32->canonpath('\\../'),          '\\',           'checking canonpath');
is(File::Spec::Win32->canonpath('\\..\\'),         '\\',           'checking canonpath');
is(File::Spec::Win32->canonpath('/../'),           '\\',           'checking canonpath');
is(File::Spec::Win32->canonpath('/..\\'),          '\\',           'checking canonpath');

is(join(',', File::Spec::Win32->splitpath('file')),                            ",,file",                            'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\d1/d2\\d3/")),                    ",\\d1/d2\\d3/,",                    'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("d1/d2\\d3/")),                      ",d1/d2\\d3/,",                      'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\d1/d2\\d3/.")),                   ",\\d1/d2\\d3/.,",                   'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\d1/d2\\d3/..")),                  ",\\d1/d2\\d3/..,",                  'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\d1/d2\\d3/.file")),               ",\\d1/d2\\d3/,.file",               'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\d1/d2\\d3/file")),                ",\\d1/d2\\d3/,file",                'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("d1/d2\\d3/file")),                  ",d1/d2\\d3/,file",                  'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("C:\\d1/d2\\d3/")),                  "C:,\\d1/d2\\d3/,",                  'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("C:d1/d2\\d3/")),                    "C:,d1/d2\\d3/,",                    'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("C:\\d1/d2\\d3/file")),              "C:,\\d1/d2\\d3/,file",              'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("C:d1/d2\\d3/file")),                "C:,d1/d2\\d3/,file",                'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("C:\\../d2\\d3/file")),              "C:,\\../d2\\d3/,file",              'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("C:../d2\\d3/file")),                "C:,../d2\\d3/,file",                'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\../..\\d1/")),                    ",\\../..\\d1/,",                    'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\./.\\d1/")),                      ",\\./.\\d1/,",                      'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\\\node\\share\\d1/d2\\d3/")),     "\\\\node\\share,\\d1/d2\\d3/,",     'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\\\node\\share\\d1/d2\\d3/file")), "\\\\node\\share,\\d1/d2\\d3/,file", 'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\\\node\\share\\d1/d2\\file")),    "\\\\node\\share,\\d1/d2\\,file",    'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("file", 1)),                         ",file,",                            'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\d1/d2\\d3/", 1)),                 ",\\d1/d2\\d3/,",                    'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("d1/d2\\d3/", 1)),                   ",d1/d2\\d3/,",                      'checking splitpath');
is(join(',', File::Spec::Win32->splitpath("\\\\node\\share\\d1/d2\\d3/", 1)),  "\\\\node\\share,\\d1/d2\\d3/,",     'checking splitpath');

is(join(',', File::Spec::Win32->splitdir('')),             ''           ,'checking splitdir');
is(join(',', File::Spec::Win32->splitdir("\\d1/d2\\d3/")), ',d1,d2,d3,' ,'checking splitdir');
is(join(',', File::Spec::Win32->splitdir("d1/d2\\d3/")),   'd1,d2,d3,'  ,'checking splitdir');
is(join(',', File::Spec::Win32->splitdir("\\d1/d2\\d3")),  ',d1,d2,d3'  ,'checking splitdir');
is(join(',', File::Spec::Win32->splitdir("d1/d2\\d3")),    'd1,d2,d3'   ,'checking splitdir');

is(File::Spec::Win32->catpath('', '', 'file'),                            'file'                            ,'checking catpath');
is(File::Spec::Win32->catpath('', "\\d1/d2\\d3/", ''),                    "\\d1/d2\\d3/"                    ,'checking catpath');
is(File::Spec::Win32->catpath('', "d1/d2\\d3/", ''),                      "d1/d2\\d3/"                      ,'checking catpath');
is(File::Spec::Win32->catpath('', "\\d1/d2\\d3/.", ''),                   "\\d1/d2\\d3/."                   ,'checking catpath');
is(File::Spec::Win32->catpath('', "\\d1/d2\\d3/..",''),                   "\\d1/d2\\d3/.."                  ,'checking catpath');
is(File::Spec::Win32->catpath('', "\\d1/d2\\d3/", '.file'),               "\\d1/d2\\d3/.file"               ,'checking catpath');
is(File::Spec::Win32->catpath('', "\\d1/d2\\d3/", 'file'),                "\\d1/d2\\d3/file"                ,'checking catpath');
is(File::Spec::Win32->catpath('', "d1/d2\\d3/", 'file'),                  "d1/d2\\d3/file"                  ,'checking catpath');
is(File::Spec::Win32->catpath('C:', "\\d1/d2\\d3/", ''),                  "C:\\d1/d2\\d3/"                  ,'checking catpath');
is(File::Spec::Win32->catpath('C:', "d1/d2\\d3/", ''),                    "C:d1/d2\\d3/"                    ,'checking catpath');
is(File::Spec::Win32->catpath('C:', "\\d1/d2\\d3/", 'file'),              "C:\\d1/d2\\d3/file"              ,'checking catpath');
is(File::Spec::Win32->catpath('C:', "d1/d2\\d3/", 'file'),                "C:d1/d2\\d3/file"                ,'checking catpath');
is(File::Spec::Win32->catpath('C:', "\\../d2\\d3/", 'file'),              "C:\\../d2\\d3/file"              ,'checking catpath');
is(File::Spec::Win32->catpath('C:', "../d2\\d3/", 'file'),                "C:../d2\\d3/file"                ,'checking catpath');
is(File::Spec::Win32->catpath('', "\\../..\\d1/", ''),                    "\\../..\\d1/"                    ,'checking catpath');
is(File::Spec::Win32->catpath('', "\\./.\\d1/", ''),                      "\\./.\\d1/"                      ,'checking catpath');
is(File::Spec::Win32->catpath("\\\\node\\share", "\\d1/d2\\d3/", ''),     "\\\\node\\share\\d1/d2\\d3/"     ,'checking catpath');
is(File::Spec::Win32->catpath("\\\\node\\share", "\\d1/d2\\d3/", 'file'), "\\\\node\\share\\d1/d2\\d3/file" ,'checking catpath');
is(File::Spec::Win32->catpath("\\\\node\\share", "\\d1/d2\\", 'file'),    "\\\\node\\share\\d1/d2\\file"    ,'checking catpath');

is(File::Spec::Win32->catfile('a', 'b', 'c'),    "a\\b\\c", 'checking catfile');
is(File::Spec::Win32->catfile('a', 'b', ".\\c"), "a\\b\\c", 'checking catfile');
is(File::Spec::Win32->catfile(".\\a", 'b', 'c'), "a\\b\\c", 'checking catfile');
is(File::Spec::Win32->catfile('c'),              'c', 'checking catfile');
is(File::Spec::Win32->catfile(".\\c"),           'c', 'checking catfile');  

is(File::Spec::Win32->catdir(),                        ''                   ,'checking catdir');
is(File::Spec::Win32->catdir(''),                      "\\"                 ,'checking catdir');
is(File::Spec::Win32->catdir("/"),                     "\\"                 ,'checking catdir');
is(File::Spec::Win32->catdir("/", "../"),              "\\"                 ,'checking catdir');
is(File::Spec::Win32->catdir("/", "..\\"),             "\\"                 ,'checking catdir');
is(File::Spec::Win32->catdir("\\", "../"),             "\\"                 ,'checking catdir');
is(File::Spec::Win32->catdir("\\", "..\\"),            "\\"                 ,'checking catdir');
is(File::Spec::Win32->catdir("//d1",'d2'),             "\\\\d1\\d2"         ,'checking catdir');
is(File::Spec::Win32->catdir("\\d1\\",'d2'),           "\\d1\\d2"           ,'checking catdir');
is(File::Spec::Win32->catdir("\\d1",'d2'),             "\\d1\\d2"           ,'checking catdir');
is(File::Spec::Win32->catdir("\\d1","\\d2"),           "\\d1\\d2"           ,'checking catdir');
is(File::Spec::Win32->catdir("\\d1","\\d2\\"),         "\\d1\\d2"           ,'checking catdir');
is(File::Spec::Win32->catdir('',"/d1",'d2'),           "\\\\d1\\d2"         ,'checking catdir');
is(File::Spec::Win32->catdir('','',"/d1",'d2'),        "\\\\\\d1\\d2"       ,'checking catdir');
is(File::Spec::Win32->catdir('',"//d1",'d2'),          "\\\\\\d1\\d2"       ,'checking catdir');
is(File::Spec::Win32->catdir('','',"//d1",'d2'),       "\\\\\\\\d1\\d2"     ,'checking catdir');
is(File::Spec::Win32->catdir('','d1','','d2',''),      "\\d1\\d2"           ,'checking catdir');
is(File::Spec::Win32->catdir('','d1','d2','d3',''),    "\\d1\\d2\\d3"       ,'checking catdir');
is(File::Spec::Win32->catdir('d1','d2','d3',''),       "d1\\d2\\d3"         ,'checking catdir');
is(File::Spec::Win32->catdir('','d1','d2','d3'),       "\\d1\\d2\\d3"       ,'checking catdir');
is(File::Spec::Win32->catdir('d1','d2','d3'),          "d1\\d2\\d3"         ,'checking catdir');
is(File::Spec::Win32->catdir("A:/d1",'d2','d3'),       "A:\\d1\\d2\\d3"     ,'checking catdir');
is(File::Spec::Win32->catdir("A:/d1",'d2','d3',''),    "A:\\d1\\d2\\d3"     ,'checking catdir');
is(File::Spec::Win32->catdir("A:/d1","B:/d2",'d3',''), "A:\\d1\\B:\\d2\\d3" ,'checking catdir');
is(File::Spec::Win32->catdir("A:/"),                   "A:\\"               ,'checking catdir');
is(File::Spec::Win32->catdir("\\", 'foo'),             "\\foo"              ,'checking catdir'); 

is(File::Spec::Win32->rel2abs('temp', "C:/"),                       "C:\\temp"                     ,'checking real2abs');
is(File::Spec::Win32->rel2abs('temp', "C:/a"),                      "C:\\a\\temp"                  ,'checking real2abs');
is(File::Spec::Win32->rel2abs('temp', "C:/a/"),                     "C:\\a\\temp"                  ,'checking real2abs');
is(File::Spec::Win32->rel2abs("../",  "C:/"),                       "C:\\"                         ,'checking real2abs');
is(File::Spec::Win32->rel2abs("../", "C:/a"),                       "C:\\"                         ,'checking real2abs');
is(File::Spec::Win32->rel2abs('temp', "//prague_main/work/"),       "\\\\prague_main\\work\\temp" ,'checking real2abs');
is(File::Spec::Win32->rel2abs("../temp", "//prague_main/work/"),    "\\\\prague_main\\work\\temp" ,'checking real2abs');
is(File::Spec::Win32->rel2abs('temp', "//prague_main/work"),        "\\\\prague_main\\work\\temp" ,'checking real2abs');
is(File::Spec::Win32->rel2abs("../", "//prague_main/work"),         "\\\\prague_main\\work"       ,'checking real2abs');

is(File::Spec::Win32->abs2rel("/t1/t2/t3", "/t1/t2/t3"),         ''                       ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("/t1/t2/t4", "/t1/t2/t3"),         "..\\t4"                 ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("/t1/t2", "/t1/t2/t3"),            '..'                     ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("/t1/t2/t3/t4", "/t1/t2/t3"),      't4'                     ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("/t4/t5/t6", "/t1/t2/t3"),         "..\\..\\..\\t4\\t5\\t6" ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("/", "/t1/t2/t3"),                 "..\\..\\.."             ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("///", "/t1/t2/t3"),               "..\\..\\.."             ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("/.", "/t1/t2/t3"),                "..\\..\\.."             ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("/./", "/t1/t2/t3"),               "..\\..\\.."             ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("\\\\a/t1/t2/t4", "/t2/t3"),       "\\\\a\\t1\\t2\\t4"      ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("//a/t1/t2/t4", "/t2/t3"),         "\\\\a\\t1\\t2\\t4"      ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("A:/t1/t2/t3", "A:/t1/t2/t3"),     ''                       ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("A:/t1/t2/t3/t4", "A:/t1/t2/t3"),  't4'                     ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("A:/t1/t2/t3", "A:/t1/t2/t3/t4"),  '..'                     ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("A:/t1/t2/t3", "B:/t1/t2/t3"),     "A:\\t1\\t2\\t3"         ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("A:/t1/t2/t3/t4", "B:/t1/t2/t3"),  "A:\\t1\\t2\\t3\\t4"     ,'checking abs2rel');
is(File::Spec::Win32->abs2rel("E:/foo/bar/baz"),                 "E:\\foo\\bar\\baz"      ,'checking abs2rel');