normalizefs 0.0.11

Normalization of file system paths
Documentation
#![allow(non_snake_case)]

use std::path::Path;
use super::normalize_windows;


//   windows style normalizer tests

fn normalize(path: impl AsRef<Path>) -> String {
   normalize_windows(path).to_str().unwrap().to_owned()
}

/*
Windows normalizer calls these functions sequentialy:
   1. replace_slashes
   2. UNC aware remove extra backslashes
   3. normalize UNC
   4. normalize drive letter
   5. remove_start_dot_slash
   6. remove_slash_dot_slash
   7. remove_end_dot
   8. resolve_end_updir
   9. resolve_updirs
*/

/* test case for 1 */
#[test]
fn replace_forward_slashes_test() {
   let p = "//here/we/go";
   assert_eq!(normalize(p), r"\\here\we\go");
}

/* test case for 1 */
#[test]
fn replace_forward_slashes_mixed_test() {
   let p = r"//here/we\go";
   assert_eq!(normalize(p), r"\\here\we\go");
}

/* test case for 2 */
#[test]
fn double_separators_keep_unc_test() {
   let p = r"\\here\we\go";
   assert_eq!(normalize(p), r"\\here\we\go");
}

/* test case for 2 */
#[test]
fn double_separators_normalize_unc_test() {
   let p = r"\\here\\we\go";
   assert_eq!(normalize(p), r"\\here\we\go");
}

/* test case for 2 */
#[test]
fn colapse_all_multiple_separators_test() {
   let p = r"\here\\we\\go\\\";
   assert_eq!(normalize(p), r"\here\we\go\");
}

/* test case for 2 */
#[test]
fn colapse_UNC_mixed_separators_test() {
   let p = r"/\here//\\we//\\go////\\\";
   assert_eq!(normalize(p), r"\\here\we\go\");
}

/* test case for 3 */
#[test]
fn normalize_UNC_case_test() {
   let p = r"\\HeRE\\iS\\UNC";
   assert_eq!(normalize(p), r"\\here\is\UNC");
}

/* test case for 4 */
#[test]
fn drive_letter_to_uppercase() {
   let p = r"c:\\\HeRE\\\iS\\\DriVe";
   assert_eq!(normalize(p), r"C:\HeRE\iS\DriVe");
}

/** test case for 4 and 9 */
#[test]
fn drive_root_travel_normalize() {
   let p = r"c:/here/../../../man";
   assert_eq!(normalize(p), r"C:\man");
}

/* test case for 5 */
#[test]
fn start_dot_slash_test() {
   let p = "./here/we/go";
   assert_eq!(normalize(p), r"here\we\go");
}

/* test case for 6 */
#[test]
fn remove_slash_dot_slash_test() {
   let p = r"here\./we\./go";
   assert_eq!(normalize(p), r"here\we\go");
}

/* test case for 7 */
#[test]
fn remove_end_dot_test() {
   let p = r"here/we/go\.";
   assert_eq!(normalize(p), r"here\we\go\");
}

/* test case for 8 */
#[test]
fn resolve_end_updir_test() {
   let p1 = r"here\we\go/..";
   assert_eq!(normalize(p1), r"here\we\");
   let p2 = "here/we/go/../";
   assert_eq!(normalize(p2), r"here\we\");
   let p3 = "here/we/go/../.";
   assert_eq!(normalize(p3), r"here\we\");
}

/** test case for 2 and 9 */
#[test]
fn do_not_travel_outside_root_double_separators_test() {
   let p = "/here//..//..//..//man";
   assert_eq!(normalize(p), r"\man");
}

/** test case for 9 */
#[test]
fn travel_outside_root_relative_test() {
   let p = "here/../../man";
   assert_eq!(normalize(p), r"..\man");
}

/** test case for 9 */
#[test]
fn travel_one_dir_up_test() {
   let p = "here/../man";
   assert_eq!(normalize(p), "man");
}

/** test case for 9 */
#[test]
fn do_not_travel_outside_root_test() {
   let p = "/here/../../../man";
   assert_eq!(normalize(p), r"\man");
}

/** test case for 9 */
#[test]
fn updirs_up_to_UNC() {
   let p = r"//here/../../../man";
   assert_eq!(normalize(p), r"\\man");
}

/** Google AI testcase */
#[test]
fn google_code_assist_1() {
   let input_path = "\\\\.\\C:\\temp\\test.txt";
   assert_eq!(normalize(input_path), r"\\C:\temp\test.txt");
}