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 => 100;

=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::Unix;

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

ok(!File::Spec::Unix->case_tolerant(), '... unix is not case tolerant');

{
    my @paths = (
        "path///to//a///////dir/", 
        "path/./to/././a/./././dir/",
        "./path/to/a/dir/",
        "././path/to/a/dir/"              
        );
    
    for my $path (@paths) {
        is(File::Spec::Unix->canonpath($path), 'path/to/a/dir', '... cannonpath works for ' . $path);
    }
    
    my @paths2 = (       
        "/../path/to/a/dir/",
        "/../../path/to/a/dir/"               
        );
    
    for my $path (@paths2) {
        is(File::Spec::Unix->canonpath($path), '/path/to/a/dir', '... cannonpath works for ' . $path);
    }    
}

{
    my $path = '/path/to/a/dir';

    my @path = File::Spec::Unix->splitdir($path);
    is(scalar @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::Unix->catdir(@path), $path, '... got the right catdir string');                 
}

{
    my $path = '/path/to/a/file.txt';

    my @path = File::Spec::Unix->splitdir($path);
    is(scalar @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::Unix->catfile(@path), $path, '... got the right catfile string');                 
}

is(File::Spec::Unix->catpath('vol', 'dir', 'file'), 'dir/file', 
   '... got the right catpath string (volume is ignored)'); 

is(File::Spec::Unix->catpath('', 'dir', 'file'), 'dir/file', 
   '... got the right catpath string (volume is ignored)'); 

is(File::Spec::Unix->catpath('', 'dir/', 'file'), 'dir/file', 
   '... got the right catpath string (volume is ignored)'); 

is(File::Spec::Unix->catpath('', '', 'file'), 'file', 
   '... got the right catpath string (volume is ignored)'); 

is(File::Spec::Unix->catpath('', '', ''), '', 
   '... got the right catpath string (volume is ignored)'); 
   
{
    my @upwards = ('path/to/file', '..', '.', ".\n/path");
    my @no_upwards = File::Spec::Unix->no_upwards(@upwards);
    is(scalar @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');        
}   

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

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

#     my $orig_path = %*ENV{'PATH'};
#     
#     %*ENV{'PATH'} = 'path/to/bin:path/to/some/other/bin:other/path:';
#     
#     my @path = path();
#     is(+@path, 4, '... we have 4 elements in the path'); 
#     is(@path[0], 'path/to/bin', '... correct first element in the path'); 
#     is(@path[1], 'path/to/some/other/bin', '... correct second element in the path'); 
#     is(@path[2], 'other/path', '... correct third element in the path'); 
#     is(@path[3], '.', '... correct fourth element in the path');             
#     
#     %*ENV{'PATH'} = $orig_path;
}

{
    my ($vol, $dir, $file) = File::Spec::Unix->splitpath('/path/to/file');
    is($vol, '', '... 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::Unix->splitpath('/path/to/file', 1);
    is($vol, '', '... got the right volume');    
    is($dir, '/path/to/file', '... got the right directory');
    is($file, '', '... got the right file');       
}

{
    is(File::Spec::Unix->abs2rel('/t1/t2/t3','/t1/t2/t3'), '', 'checking abs2real');
    is(File::Spec::Unix->abs2rel('/t1/t2/t4','/t1/t2/t3'), '../t4', 'checking abs2real'); 
    is(File::Spec::Unix->abs2rel('/t1/t2','/t1/t2/t3'), '..', 'checking abs2real'); 
    is(File::Spec::Unix->abs2rel('/t1/t2/t3/t4','/t1/t2/t3'), 't4', 'checking abs2real'); 
    is(File::Spec::Unix->abs2rel('/t4/t5/t6','/t1/t2/t3'), '../../../t4/t5/t6', 'checking abs2real'); 
    is(File::Spec::Unix->abs2rel('/','/t1/t2/t3'), '../../..', 'checking abs2real'); 
    is(File::Spec::Unix->abs2rel('///','/t1/t2/t3'), '../../..', 'checking abs2real'); 
    is(File::Spec::Unix->abs2rel('/.','/t1/t2/t3'), '../../..', 'checking abs2real'); 
    is(File::Spec::Unix->abs2rel('/./','/t1/t2/t3'), '../../..', 'checking abs2real');  
}

{
    is(File::Spec::Unix->rel2abs('t4', '/t1/t2/t3'),    '/t1/t2/t3/t4',    'checking rel2abs');
    is(File::Spec::Unix->rel2abs('t4/t5', '/t1/t2/t3'), '/t1/t2/t3/t4/t5', 'checking rel2abs');
    is(File::Spec::Unix->rel2abs('.', '/t1/t2/t3'),     '/t1/t2/t3',       'checking rel2abs');
    is(File::Spec::Unix->rel2abs('..', '/t1/t2/t3'),    '/t1/t2/t3/..',    'checking rel2abs');
    is(File::Spec::Unix->rel2abs('../t4', '/t1/t2/t3'), '/t1/t2/t3/../t4', 'checking rel2abs');
    is(File::Spec::Unix->rel2abs('/t1', '/t1/t2/t3'),   '/t1',             'checking rel2abs');
    
    # concatenating
    
    is(File::Spec::Unix->catfile('a','b','c'),   'a/b/c', 'checking catfile');
    is(File::Spec::Unix->catfile('a','b','./c'), 'a/b/c', 'checking catfile');
    is(File::Spec::Unix->catfile('./a','b','c'), 'a/b/c', 'checking catfile');
    is(File::Spec::Unix->catfile('c'),           'c',     'checking catfile');
    is(File::Spec::Unix->catfile('./c'),         'c',     'checking catfile');
    
    is(File::Spec::Unix->catpath('','','file'),            'file',            'checking catpath');
    is(File::Spec::Unix->catpath('','/d1/d2/d3/',''),      '/d1/d2/d3/',      'checking catpath');
    is(File::Spec::Unix->catpath('','d1/d2/d3/',''),       'd1/d2/d3/',       'checking catpath');
    is(File::Spec::Unix->catpath('','/d1/d2/d3/.',''),     '/d1/d2/d3/.',     'checking catpath');
    is(File::Spec::Unix->catpath('','/d1/d2/d3/..',''),    '/d1/d2/d3/..',    'checking catpath');
    is(File::Spec::Unix->catpath('','/d1/d2/d3/','.file'), '/d1/d2/d3/.file', 'checking catpath');
    is(File::Spec::Unix->catpath('','d1/d2/d3/','file'),   'd1/d2/d3/file',   'checking catpath');
    is(File::Spec::Unix->catpath('','/../../d1/',''),      '/../../d1/',      'checking catpath');
    is(File::Spec::Unix->catpath('','/././d1/',''),        '/././d1/',        'checking catpath');
    is(File::Spec::Unix->catpath('d1','d2/d3/',''),        'd2/d3/',          'checking catpath');
    is(File::Spec::Unix->catpath('d1','d2','d3/'),         'd2/d3/',          'checking catpath');
    
    is(File::Spec::Unix->catdir(),                     '',          'checking catdir');
    is(File::Spec::Unix->catdir('/'),                  '/',         'checking catdir');
    is(File::Spec::Unix->catdir('','d1','d2','d3',''), '/d1/d2/d3', 'checking catdir');
    is(File::Spec::Unix->catdir('d1','d2','d3',''),    'd1/d2/d3',  'checking catdir');
    is(File::Spec::Unix->catdir('','d1','d2','d3'),    '/d1/d2/d3', 'checking catdir');
    is(File::Spec::Unix->catdir('d1','d2','d3'),       'd1/d2/d3',  'checking catdir');
    
    # splitting
    
    is(join(',', File::Spec::Unix->splitpath('file')),            ',,file',            'checking splitpath');
    is(join(',', File::Spec::Unix->splitpath('/d1/d2/d3/')),      ',/d1/d2/d3/,',      'checking splitpath');
    is(join(',', File::Spec::Unix->splitpath('d1/d2/d3/')),       ',d1/d2/d3/,',       'checking splitpath');
    is(join(',', File::Spec::Unix->splitpath('/d1/d2/d3/.')),     ',/d1/d2/d3/.,',     'checking splitpath');
    is(join(',', File::Spec::Unix->splitpath('/d1/d2/d3/..')),    ',/d1/d2/d3/..,',    'checking splitpath');
    is(join(',', File::Spec::Unix->splitpath('/d1/d2/d3/.file')), ',/d1/d2/d3/,.file', 'checking splitpath');
    is(join(',', File::Spec::Unix->splitpath('d1/d2/d3/file')),   ',d1/d2/d3/,file',   'checking splitpath');
    is(join(',', File::Spec::Unix->splitpath('/../../d1/')),      ',/../../d1/,',      'checking splitpath');
    is(join(',', File::Spec::Unix->splitpath('/././d1/')),        ',/././d1/,',        'checking splitpath');
    
    is(join(',', File::Spec::Unix->splitdir('')),           '',           'checking splitdir');
    is(join(',', File::Spec::Unix->splitdir('/d1/d2/d3/')), ',d1,d2,d3,', 'checking splitdir');
    is(join(',', File::Spec::Unix->splitdir('d1/d2/d3/')),  'd1,d2,d3,',  'checking splitdir');
    is(join(',', File::Spec::Unix->splitdir('/d1/d2/d3')),  ',d1,d2,d3',  'checking splitdir');
    is(join(',', File::Spec::Unix->splitdir('d1/d2/d3')),   'd1,d2,d3',   'checking splitdir');
    
    # cannonpath
    
    is(File::Spec::Unix->canonpath(''),                                      '',          'checking canonpath');
    is(File::Spec::Unix->canonpath('///../../..//./././a//b/.././c/././'),   '/a/b/../c', 'checking canonpath');
    is(File::Spec::Unix->canonpath('/.'),                                    '/',         'checking canonpath');
    is(File::Spec::Unix->canonpath('/./'),                                   '/',         'checking canonpath');
    is(File::Spec::Unix->canonpath('/a/./'),                                 '/a',        'checking canonpath');
    is(File::Spec::Unix->canonpath('/a/.'),                                  '/a',        'checking canonpath');

}