summaryrefslogtreecommitdiff
path: root/t/subsumes.t
diff options
context:
space:
mode:
Diffstat (limited to 't/subsumes.t')
-rw-r--r--t/subsumes.t105
1 files changed, 105 insertions, 0 deletions
diff --git a/t/subsumes.t b/t/subsumes.t
new file mode 100644
index 0000000..87e5690
--- /dev/null
+++ b/t/subsumes.t
@@ -0,0 +1,105 @@
+use 5.008001;
+use strict;
+use warnings;
+use Test::More 0.96;
+
+use lib 't/lib';
+use TestUtils qw/exception/;
+
+use Path::Tiny;
+use Cwd;
+
+my $IS_WIN32 = $^O eq 'MSWin32';
+
+my @cases = (
+ # path1 => path2 => path1->subsumes(path2)
+
+ "identity always subsumes" => [
+ [ '.' => '.' => 1 ],
+ [ '/' => '/' => 1 ],
+ [ '..' => '..' => 1 ],
+ [ '../..' => '../..' => 1 ],
+ [ '/foo/' => '/foo' => 1 ],
+ [ 'foo/' => 'foo' => 1 ],
+ [ './foo' => 'foo' => 1 ],
+ [ 'foo/.' => 'foo' => 1 ],
+ ],
+
+ "absolute v. absolute" => [
+ [ '/foo' => '/foo/bar' => 1 ],
+ [ '/foo' => '/foo/bar/baz' => 1 ],
+ [ '/foo' => '/foo/bar/baz/' => 1 ],
+ [ '/' => '/foo' => 1 ],
+ [ '/foo' => '/bar' => 0 ],
+ [ '/foo/bar' => '/foo/baz' => 0 ],
+ ],
+
+ "relative v. relative" => [
+ [ '.' => 'foo' => 1 ],
+ [ 'foo' => 'foo/baz' => 1 ],
+ [ './foo/bar' => 'foo/bar/baz' => 1 ],
+ [ './foo/bar' => './foo/bar' => 1 ],
+ [ './foo/bar' => 'foo/bar' => 1 ],
+ [ 'foo/bar' => './foo/bar' => 1 ],
+ [ 'foo/bar' => 'foo/baz' => 0 ],
+ ],
+
+ "relative v. absolute" => [
+ [ path(".")->absolute => 't' => 1 ],
+ [ "." => path('t')->absolute => 1 ],
+ [ "foo" => path('t')->absolute => 0 ],
+ [ path("..")->realpath => 't' => 1 ],
+ [ path("lib")->absolute => 't' => 0 ],
+ ],
+
+ "updirs in paths" => [
+ [ '/foo' => '/foo/bar/baz/..' => 1 ],
+ [ '/foo/bar' => '/foo/bar/../baz' => $IS_WIN32 ? 0 : 1 ],
+ [ '/foo/../bar' => '/bar' => $IS_WIN32 ? 1 : 0 ],
+ [ '..' => '../bar' => 1 ],
+ ],
+
+);
+
+if ($IS_WIN32) {
+ my $vol = path( Win32::GetCwd() )->volume . "/";
+ my $other = $vol ne 'Z:/' ? 'Z:/' : 'Y:/';
+ push @cases, 'Win32 cases',
+ [
+ [ "C:/foo" => "C:/foo" => 1 ],
+ [ "C:/foo" => "C:/bar" => 0 ],
+ [ "C:/" => "C:/foo" => 1 ],
+ [ "C:/" => "D:/" => 0 ],
+ [ "${vol}foo" => "/foo" => 1 ],
+ [ $vol => "/foo" => 1 ],
+ [ $vol => $other => 0 ],
+ [ "/" => $vol => 1 ],
+ [ "/" => $other => 0 ],
+ [ "/foo" => "${vol}foo" => 1 ],
+ ];
+}
+
+while (@cases) {
+ my ( $subtest, $tests ) = splice( @cases, 0, 2 );
+ subtest $subtest => sub {
+ for my $t (@$tests) {
+ my ( $path1, $path2, $subsumes ) = @$t;
+ my $label =
+ join( " ", $path1, ( $subsumes ? "subsumes" : "does not subsume" ), $path2 );
+ ok( !!path($path1)->subsumes($path2) eq !!$subsumes, $label )
+ or diag "PATH 1:\n", explain( path($path1) ), "\nPATH2:\n",
+ explain( path($path2) );
+ }
+ };
+}
+
+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
+#