Skip to content

Instantly share code, notes, and snippets.

@danielpclark
Created March 7, 2018 00:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danielpclark/fb0e794b10e7f63f0010c82407b6653e to your computer and use it in GitHub Desktop.
Save danielpclark/fb0e794b10e7f63f0010c82407b6653e to your computer and use it in GitHub Desktop.
require 'test_helper'
class RelativePathFromTest < Minitest::Test
def test_relative_path_from
assert_equal FasterPath.relative_path_from("a", "b").to_s, "../a"
assert_equal FasterPath.relative_path_from("a", "b/").to_s, "../a"
assert_equal FasterPath.relative_path_from("a/", "b").to_s, "../a"
assert_equal FasterPath.relative_path_from("a/", "b/").to_s, "../a"
assert_equal FasterPath.relative_path_from("/a", "/b").to_s, "../a"
assert_equal FasterPath.relative_path_from("/a", "/b/").to_s, "../a"
assert_equal FasterPath.relative_path_from("/a/", "/b").to_s, "../a"
assert_equal FasterPath.relative_path_from("/a/", "/b/").to_s, "../a"
assert_equal FasterPath.relative_path_from("a/b", "a/c").to_s, "../b"
assert_equal FasterPath.relative_path_from("../a", "../b").to_s, "../a"
assert_equal FasterPath.relative_path_from("a", ".").to_s, "a"
assert_equal FasterPath.relative_path_from(".", "a").to_s, ".."
assert_equal FasterPath.relative_path_from(".", ".").to_s, "."
assert_equal FasterPath.relative_path_from("..", "..").to_s, "."
assert_equal FasterPath.relative_path_from("..", ".").to_s, ".."
assert_equal FasterPath.relative_path_from("/a/b/c/d", "/a/b").to_s, "c/d"
assert_equal FasterPath.relative_path_from("/a/b", "/a/b/c/d").to_s, "../.."
assert_equal FasterPath.relative_path_from("/e", "/a/b/c/d").to_s, "../../../../e"
assert_equal FasterPath.relative_path_from("a/b/c", "a/d").to_s, "../b/c"
assert_equal FasterPath.relative_path_from("/../a", "/b").to_s, "../a"
assert_equal FasterPath.relative_path_from("../a", "b").to_s, "../../a"
assert_equal FasterPath.relative_path_from("/a/../../b", "/b").to_s, "."
assert_equal FasterPath.relative_path_from("a/..", "a").to_s, ".."
assert_equal FasterPath.relative_path_from("a/../b", "b").to_s, "."
assert_equal FasterPath.relative_path_from("a", "b/..").to_s, "a"
assert_equal FasterPath.relative_path_from("b/c", "b/..").to_s, "b/c"
assert_raises(ArgumentError) { FasterPath.relative_path_from("/", ".") }
assert_raises(ArgumentError) { FasterPath.relative_path_from(".", "/") }
assert_raises(ArgumentError) { FasterPath.relative_path_from("a", "..") }
assert_raises(ArgumentError) { FasterPath.relative_path_from(".", "..") }
end
def relative_path_str(dest, base)
Pathname.new(dest).relative_path_from(Pathname.new(base)).to_s
end
def test_raises_an_error_when_the_two_paths_do_not_share_a_common_prefix
assert_raises(ArgumentError) { relative_path_str('/usr', 'foo') }
end
def test_raises_an_error_when_the_base_directory_has_dot_dot
assert_raises(ArgumentError) { relative_path_str('a', '..') }
end
def test_returns_a_path_relative_from_root
assert_equal relative_path_str('/usr', '/'), 'usr'
end
def test_returns_1_level_up_when_both_paths_are_relative
assert_equal relative_path_str('a', 'b'), '../a'
assert_equal relative_path_str('a', 'b/'), '../a'
end
def test_returns_a_relative_path_when_both_are_absolute
assert_equal relative_path_str('/a', '/b'), '../a'
end
def test_returns_a_path_relative_to_the_current_directory
assert_equal relative_path_str('/usr/bin/ls', '/usr'), 'bin/ls'
end
def test_returns_a_dot_when_base_and_dest_are_the_same
assert_equal relative_path_str('/usr', '/usr'), '.'
end
def test_returns_the_same_directory_with_a_non_clean_base_that_matches_the_current_dir
assert_equal relative_path_str('/usr', '/stuff/..'), 'usr'
end
def test_returns_a_relative_path_with_a_non_clean_base_that_matches_a_different_dir
assert_equal relative_path_str('/usr', '/stuff/../foo'), '../usr'
end
def test_returns_current_and_pattern_when_only_those_patterns_are_used
assert_equal relative_path_str('.', '.'), '.'
assert_equal relative_path_str('..', '..'), '.'
assert_equal relative_path_str('..', '.'), '..'
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment