sugar_path 2.0.1

Sugar functions for manipulating paths
Documentation
use std::path::Path;

use sugar_path::SugarPath;
mod test_utils;

#[cfg(target_family = "unix")]
#[test]
fn unix() {
  let cases = [
    ("/var/lib", "/var", ".."),
    ("/var/lib", "/bin", "../../bin"),
    ("/var/lib", "/var/lib", ""),
    ("/var/lib", "/var/apache", "../apache"),
    ("/var/", "/var/lib", "lib"),
    ("/", "/var/lib", "var/lib"),
    ("/foo/test", "/foo/test/bar/package.json", "bar/package.json"),
    ("/Users/a/web/b/test/mails", "/Users/a/web/b", "../.."),
    ("/foo/bar/baz-quux", "/foo/bar/baz", "../baz"),
    ("/foo/bar/baz", "/foo/bar/baz-quux", "../baz-quux"),
    ("/baz-quux", "/baz", "../baz"),
    ("/baz", "/baz-quux", "../baz-quux"),
    ("/page1/page2/foo", "/", "../../.."),
  ];
  cases.into_iter().for_each(|(to, target, right)| {
    assert_eq_str!(
      Path::new(target).relative(to),
      right,
      "for input target: {} base: {}",
      target,
      to
    );
  });
}

#[cfg(target_family = "windows")]
#[test]
fn windows() {
  let cases = [
    ("c:/blah\\blah", "d:/games", "d:\\games"),
    ("c:/aaaa/bbbb", "c:/aaaa", ".."),
    ("c:/aaaa/bbbb", "c:/cccc", "..\\..\\cccc"),
    ("c:/aaaa/bbbb", "c:/aaaa/bbbb", ""),
    ("c:/aaaa/bbbb", "c:/aaaa/cccc", "..\\cccc"),
    ("c:/aaaa/", "c:/aaaa/cccc", "cccc"),
    ("c:/", "c:\\aaaa\\bbbb", "aaaa\\bbbb"),
    ("c:/aaaa/bbbb", "d:\\", "d:\\"),
    ("c:/AaAa/bbbb", "c:/aaaa/bbbb", ""),
    ("c:/aaaaa/", "c:/aaaa/cccc", "..\\aaaa\\cccc"),
    ("c:/aaaaa/", "d:/aaaa/cccc", "d:\\aaaa\\cccc"),
    ("C:\\foo\\bar\\baz\\quux", "C:\\", "..\\..\\..\\.."),
    ("C:\\foo\\test", "C:\\foo\\test\\bar\\package.json", "bar\\package.json"),
    ("C:\\foo\\bar\\baz-quux", "C:\\foo\\bar\\baz", "..\\baz"),
    ("C:\\foo\\bar\\baz", "C:\\foo\\bar\\baz-quux", "..\\baz-quux"),
    ("\\\\foo\\bar\\baz", "C:\\baz", "C:\\baz"),
    ("C:\\baz", "\\\\foo\\bar\\baz", "\\\\foo\\bar\\baz"),
    ("C:\\baz-quux", "C:\\baz", "..\\baz"),
    ("C:\\baz", "C:\\baz-quux", "..\\baz-quux"),
  ];
  cases.into_iter().for_each(|(base, target, right)| {
    assert_eq_str!(
      Path::new(target).relative(Path::new(base)),
      right,
      "for input target: {} base: {}",
      target,
      base
    );
  });
}

#[cfg(target_family = "windows")]
#[test]
fn windows_unc() {
  let cases = [
    ("\\\\foo\\bar", "\\\\foo\\bar\\baz", "baz"),
    ("\\\\foo\\bar\\baz-quux", "\\\\foo\\bar\\baz", "..\\baz"),
    ("\\\\foo\\baz-quux", "\\\\foo\\baz", "\\\\foo\\baz\\"),
    ("\\\\foo\\bar\\baz", "\\\\foo\\bar\\baz-quux", "..\\baz-quux"),
    ("\\\\foo\\bar\\baz", "\\\\foo\\bar", ".."),
  ];
  cases.into_iter().for_each(|(base, target, right)| {
    assert_eq_str!(
      Path::new(target).relative(Path::new(base)),
      right,
      "for input target: {} base: {}",
      target,
      base
    );
  });
}