nu_path/
assert_path_eq.rs

1//! Path equality in Rust is defined by comparing their `components()`. However,
2//! `Path::components()` will perform its own normalization, which makes
3//! `assert_eq!` not suitable testing.
4//!
5//! This module provides two macros, `assert_path_eq!` and `assert_path_ne!`,
6//! which converts path to string before comparison. They accept PathBuf, Path,
7//! String, and &str as parameters.
8
9#[macro_export]
10macro_rules! assert_path_eq {
11    ($left:expr, $right:expr $(,)?) => {
12        assert_eq!(
13            AsRef::<Path>::as_ref(&$left).to_str().unwrap(),
14            AsRef::<Path>::as_ref(&$right).to_str().unwrap()
15        )
16    };
17}
18
19#[macro_export]
20macro_rules! assert_path_ne {
21    ($left:expr, $right:expr $(,)?) => {
22        assert_ne!(
23            AsRef::<Path>::as_ref(&$left).to_str().unwrap(),
24            AsRef::<Path>::as_ref(&$right).to_str().unwrap()
25        )
26    };
27}
28
29#[cfg(test)]
30mod test {
31    use std::path::{Path, PathBuf};
32
33    #[test]
34    fn assert_path_eq_works() {
35        assert_path_eq!(PathBuf::from("/foo/bar"), Path::new("/foo/bar"));
36        assert_path_eq!(PathBuf::from("/foo/bar"), String::from("/foo/bar"));
37        assert_path_eq!(PathBuf::from("/foo/bar"), "/foo/bar");
38        assert_path_eq!(Path::new("/foo/bar"), String::from("/foo/bar"));
39        assert_path_eq!(Path::new("/foo/bar"), "/foo/bar");
40        assert_path_eq!(Path::new(r"\foo\bar"), r"\foo\bar");
41
42        assert_path_ne!(PathBuf::from("/foo/bar/."), Path::new("/foo/bar"));
43        assert_path_ne!(PathBuf::from("/foo/bar/."), String::from("/foo/bar"));
44        assert_path_ne!(PathBuf::from("/foo/bar/."), "/foo/bar");
45        assert_path_ne!(Path::new("/foo/./bar"), String::from("/foo/bar"));
46        assert_path_ne!(Path::new("/foo/./bar"), "/foo/bar");
47        assert_path_ne!(Path::new(r"\foo\bar"), r"/foo/bar");
48        assert_path_ne!(Path::new(r"/foo/bar"), r"\foo\bar");
49    }
50}