summaryrefslogtreecommitdiff
path: root/t/parent.t
blob: 340fc6e29227bb322997c8f7bd3edb7f936719a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use 5.008001;
use strict;
use warnings;
use Test::More 0.96;

use lib 't/lib';
use TestUtils qw/exception/;

my $DEBUG;
BEGIN { $DEBUG = 0 }

BEGIN {
    if ($DEBUG) { require Path::Class; Path::Class->import }
}

my $IS_WIN32 = $^O eq 'MSWin32';

use Path::Tiny;
use File::Spec::Functions qw/canonpath/;

sub canonical {
    my $d = canonpath(shift);
    $d =~ s{\\}{/}g;
    $d .= "/" if $d =~ m{//[^/]+/[^/]+$};
    return $d;
}

my @cases = (
    #<<< No perltidy
    "absolute"
        => [ "/foo/bar" => "/foo" => "/" => "/" ],

    "relative"
        => [ "foo/bar/baz" => "foo/bar" => "foo" => "." => ".." => "../.." => "../../.." ],

    "absolute with .."
        => [ "/foo/bar/../baz" => "/foo/bar/.." => "/foo/bar/../.." => "/foo/bar/../../.." ],

    "relative with .."
        => [ "foo/bar/../baz" => "foo/bar/.." => "foo/bar/../.." => "foo/bar/../../.." ],

    "relative with leading .."
        => [ "../foo/bar" => "../foo" => ".." => "../.." ],

    "absolute with internal dots"
        => [ "/foo..bar/baz..bam" => "/foo..bar" => "/" ],

    "relative with internal dots"
        => [ "foo/bar..baz/wib..wob" => "foo/bar..baz" => "foo" => "." => ".." ],

    "absolute with leading dots"
        => [ "/..foo/..bar" => "/..foo" => "/" ],

    "relative with leading dots"
        => [ "..foo/..bar/..wob" => "..foo/..bar" => "..foo" => "." => ".." ],

    "absolute with trailing dots"
        => [ "/foo../bar.." => "/foo.." => "/" ],

    "relative with trailing dots"
        => [ "foo../bar../wob.." => "foo../bar.." => "foo.." => "." => ".." ],
    #>>>
);

my @win32_cases = (
    #<<< No perltidy
    "absolute with drive"
        => [ "C:/foo/bar" => "C:/foo" => "C:/" => "C:/" ],

    "absolute with drive and .."
        => [ "C:/foo/bar/../baz" => "C:/foo" => "C:/" ],

    "absolute with UNC"
        => [ "//server/share/foo/bar" => "//server/share/foo" => "//server/share/" => "//server/share/" ],

    "absolute with drive, UNC and .."
        => [ "//server/share/foo/bar/../baz" => "//server/share/foo" => "//server/share/" ],
    #>>>
);

push @cases, @win32_cases if $IS_WIN32;

while (@cases) {
    my ( $label, $list ) = splice( @cases, 0, 2 );
    subtest $label => sub {
        my $path = path( shift @$list );
        while (@$list) {
            for my $i ( undef, 0, 1 .. @$list ) {
                my $n      = ( defined $i && $i > 0 ) ? $i : 1;
                my $expect = $list->[ $n - 1 ];
                my $got    = $path->parent($i);
                my $s      = defined($i) ? $i : "undef";
                is( $got, canonical($expect), "parent($s): $path -> $got" );
                is( dir("$path")->parent, canonical($expect), "Path::Class agrees" ) if $DEBUG;
            }
            $path = $path->parent;
            shift @$list;
        }
        if ( $path !~ m{\Q..\E} ) {
            ok( $path->is_rootdir, "final path is root directory" );
        }
    };
}

done_testing;
#
# This file is part of Path-Tiny
#
# This software is Copyright (c) 2014 by David Golden.
#
# This is free software, licensed under:
#
#   The Apache License, Version 2.0, January 2004
#