1BEGIN {
2  $^O = 'Unix'; # Test in Unix mode
3}
4
5use Test;
6use strict;
7use Path::Class;
8use Cwd;
9
10plan tests => 66;
11ok(1);
12
13my $file1 = Path::Class::File->new('foo.txt');
14ok $file1, 'foo.txt';
15ok $file1->is_absolute, '';
16ok $file1->dir, '.';
17ok $file1->basename, 'foo.txt';
18
19my $file2 = file('dir', 'bar.txt');
20ok $file2, 'dir/bar.txt';
21ok $file2->is_absolute, '';
22ok $file2->dir, 'dir';
23ok $file2->basename, 'bar.txt';
24
25my $dir = dir('tmp');
26ok $dir, 'tmp';
27ok $dir->is_absolute, '';
28
29my $dir2 = dir('/tmp');
30ok $dir2, '/tmp';
31ok $dir2->is_absolute, 1;
32
33my $cat = file($dir, 'foo');
34ok $cat, 'tmp/foo';
35$cat = $dir->file('foo');
36ok $cat, 'tmp/foo';
37ok $cat->dir, 'tmp';
38ok $cat->basename, 'foo';
39
40$cat = file($dir2, 'foo');
41ok $cat, '/tmp/foo';
42$cat = $dir2->file('foo');
43ok $cat, '/tmp/foo';
44ok $cat->isa('Path::Class::File');
45ok $cat->dir, '/tmp';
46
47$cat = $dir2->subdir('foo');
48ok $cat, '/tmp/foo';
49ok $cat->isa('Path::Class::Dir');
50
51my $file = file('/foo//baz/./foo')->cleanup;
52ok $file, '/foo/baz/foo';
53ok $file->dir, '/foo/baz';
54ok $file->parent, '/foo/baz';
55
56{
57  my $dir = dir('/foo/bar/baz');
58  ok $dir->parent, '/foo/bar';
59  ok $dir->parent->parent, '/foo';
60  ok $dir->parent->parent->parent, '/';
61  ok $dir->parent->parent->parent->parent, '/';
62
63  $dir = dir('foo/bar/baz');
64  ok $dir->parent, 'foo/bar';
65  ok $dir->parent->parent, 'foo';
66  ok $dir->parent->parent->parent, '.';
67  ok $dir->parent->parent->parent->parent, '..';
68  ok $dir->parent->parent->parent->parent->parent, '../..';
69}
70
71{
72  my $dir = dir("foo/");
73  ok $dir, 'foo';
74  ok $dir->parent, '.';
75}
76
77{
78  # Special cases
79  ok dir(''), '/';
80  ok dir(), '.';
81  ok dir('', 'var', 'tmp'), '/var/tmp';
82  ok dir()->absolute, dir(Cwd::cwd())->cleanup;
83  ok dir(undef), undef;
84}
85
86{
87  my $file = file('/tmp/foo/bar.txt');
88  ok $file->relative('/tmp'), 'foo/bar.txt';
89  ok $file->relative('/tmp/foo'), 'bar.txt';
90  ok $file->relative('/tmp/'), 'foo/bar.txt';
91  ok $file->relative('/tmp/foo/'), 'bar.txt';
92
93  $file = file('one/two/three');
94  ok $file->relative('one'), 'two/three';
95}
96
97{
98  # Try out the dir_list() method
99  my $dir = dir('one/two/three/four/five');
100  my @d = $dir->dir_list();
101  ok "@d", "one two three four five";
102
103  @d = $dir->dir_list(2);
104  ok "@d", "three four five";
105
106  @d = $dir->dir_list(-2);
107  ok "@d", "four five";
108
109  @d = $dir->dir_list(2, 2);
110  ok "@d", "three four", "dir_list(2, 2)";
111
112  @d = $dir->dir_list(-3, 2);
113  ok "@d", "three four", "dir_list(-3, 2)";
114
115  @d = $dir->dir_list(-3, -2);
116  ok "@d", "three", "dir_list(-3, -2)";
117
118  @d = $dir->dir_list(-3, -1);
119  ok "@d", "three four", "dir_list(-3, -1)";
120
121  my $d = $dir->dir_list();
122  ok $d, 5, "scalar dir_list()";
123
124  $d = $dir->dir_list(2);
125  ok $d, "three", "scalar dir_list(2)";
126  
127  $d = $dir->dir_list(-2);
128  ok $d, "four", "scalar dir_list(-2)";
129  
130  $d = $dir->dir_list(2, 2);
131  ok $d, "four", "scalar dir_list(2, 2)";
132}
133
134{
135  # Test is_dir()
136  ok  dir('foo')->is_dir, 1;
137  ok file('foo')->is_dir, 0;
138}
139
140{
141  # subsumes()
142  ok dir('foo/bar')->subsumes('foo/bar/baz'), 1;
143  ok dir('/foo/bar')->subsumes('/foo/bar/baz'), 1;
144  ok dir('foo/bar')->subsumes('bar/baz'), 0;
145  ok dir('/foo/bar')->subsumes('foo/bar'), 0;
146  ok dir('/foo/bar')->subsumes('/foo/baz'), 0;
147  ok dir('/')->subsumes('/foo/bar'), 1;
148}
149