| // Copyright (c) The camino Contributors |
| // SPDX-License-Identifier: MIT OR Apache-2.0 |
| |
| use camino::{Utf8Path, Utf8PathBuf}; |
| use std::{ |
| collections::hash_map::DefaultHasher, |
| hash::{Hash, Hasher}, |
| path::Path, |
| }; |
| |
| static PATH_CORPUS: &[&str] = &[ |
| "", |
| "foo", |
| "foo/bar", |
| "foo//bar", |
| "foo/bar/baz", |
| "foo/bar/./baz", |
| "foo/bar/../baz", |
| "../foo/bar/./../baz", |
| "/foo", |
| "/foo/bar", |
| "/", |
| "///", |
| // --- |
| // Windows-only paths |
| // --- |
| #[cfg(windows)] |
| "foo\\bar", |
| #[cfg(windows)] |
| "\\foo\\bar", |
| #[cfg(windows)] |
| "C:\\foo", |
| #[cfg(windows)] |
| "C:foo\\bar", |
| #[cfg(windows)] |
| "C:\\foo\\..\\.\\bar", |
| #[cfg(windows)] |
| "\\\\server\\foo\\bar", |
| #[cfg(windows)] |
| "\\\\.\\C:\\foo\\bar.txt", |
| ]; |
| |
| #[test] |
| fn test_borrow_eq_ord() { |
| // Utf8PathBuf implements Borrow<Utf8Path> so equality and ordering comparisons should |
| // match. |
| for (idx, &path1) in PATH_CORPUS.iter().enumerate() { |
| for &path2 in &PATH_CORPUS[idx..] { |
| let borrowed1 = Utf8Path::new(path1); |
| let borrowed2 = Utf8Path::new(path2); |
| let owned1 = Utf8PathBuf::from(path1); |
| let owned2 = Utf8PathBuf::from(path2); |
| |
| assert_eq!( |
| borrowed1 == borrowed2, |
| owned1 == owned2, |
| "Eq impls match: {} == {}", |
| borrowed1, |
| borrowed2 |
| ); |
| assert_eq!( |
| borrowed1.cmp(borrowed2), |
| owned1.cmp(&owned2), |
| "Ord impls match: {} and {}", |
| borrowed1, |
| borrowed2 |
| ); |
| |
| // Also check against std paths. |
| let std1 = Path::new(path1); |
| let std2 = Path::new(path2); |
| assert_eq!( |
| borrowed1, std1, |
| "Eq between Path and Utf8Path: {}", |
| borrowed1 |
| ); |
| assert_eq!( |
| borrowed1 == borrowed2, |
| std1 == std2, |
| "Eq impl matches Path: {} == {}", |
| borrowed1, |
| borrowed2 |
| ); |
| assert_eq!( |
| borrowed1.cmp(borrowed2), |
| std1.cmp(std2), |
| "Ord impl matches Path: {} and {}", |
| borrowed1, |
| borrowed2 |
| ); |
| } |
| } |
| } |
| |
| #[test] |
| fn test_borrow_hash() { |
| // Utf8PathBuf implements Borrow<Utf8Path> so hash comparisons should match. |
| fn hash_output(x: impl Hash) -> u64 { |
| let mut hasher = DefaultHasher::new(); |
| x.hash(&mut hasher); |
| hasher.finish() |
| } |
| |
| for &path in PATH_CORPUS { |
| let borrowed = Utf8Path::new(path); |
| let owned = Utf8PathBuf::from(path); |
| |
| assert_eq!( |
| hash_output(owned), |
| hash_output(borrowed), |
| "consistent Hash: {}", |
| borrowed |
| ); |
| } |
| } |