]>
Commit | Line | Data |
---|---|---|
49aad941 FG |
1 | use std::path::{Path, PathBuf}; |
2 | ||
3 | use gix_fs::Stack; | |
4 | ||
5 | #[derive(Debug, Default, Eq, PartialEq)] | |
6 | struct Record { | |
7 | push_dir: usize, | |
8 | dirs: Vec<PathBuf>, | |
9 | push: usize, | |
10 | } | |
11 | ||
12 | impl gix_fs::stack::Delegate for Record { | |
13 | fn push_directory(&mut self, stack: &Stack) -> std::io::Result<()> { | |
14 | self.push_dir += 1; | |
15 | self.dirs.push(stack.current().into()); | |
16 | Ok(()) | |
17 | } | |
18 | ||
19 | fn push(&mut self, _is_last_component: bool, _stack: &Stack) -> std::io::Result<()> { | |
20 | self.push += 1; | |
21 | Ok(()) | |
22 | } | |
23 | ||
24 | fn pop_directory(&mut self) { | |
25 | self.dirs.pop(); | |
26 | } | |
27 | } | |
28 | ||
29 | #[test] | |
30 | fn delegate_calls_are_consistent() -> crate::Result { | |
31 | let root = PathBuf::from("."); | |
781aab86 | 32 | let mut s = Stack::new(root.clone()); |
49aad941 FG |
33 | |
34 | assert_eq!(s.current(), root); | |
35 | assert_eq!(s.current_relative(), Path::new("")); | |
36 | ||
37 | let mut r = Record::default(); | |
781aab86 | 38 | s.make_relative_path_current("a/b".as_ref(), &mut r)?; |
49aad941 FG |
39 | let mut dirs = vec![root.clone(), root.join("a")]; |
40 | assert_eq!( | |
41 | r, | |
42 | Record { | |
43 | push_dir: 2, | |
44 | dirs: dirs.clone(), | |
45 | push: 2, | |
46 | } | |
47 | ); | |
48 | ||
781aab86 | 49 | s.make_relative_path_current("a/b2".as_ref(), &mut r)?; |
49aad941 FG |
50 | assert_eq!( |
51 | r, | |
52 | Record { | |
53 | push_dir: 2, | |
54 | dirs: dirs.clone(), | |
55 | push: 3, | |
56 | } | |
57 | ); | |
58 | ||
781aab86 | 59 | s.make_relative_path_current("c/d/e".as_ref(), &mut r)?; |
49aad941 FG |
60 | dirs.pop(); |
61 | dirs.extend([root.join("c"), root.join("c").join("d")]); | |
62 | assert_eq!( | |
63 | r, | |
64 | Record { | |
65 | push_dir: 4, | |
66 | dirs: dirs.clone(), | |
67 | push: 6, | |
68 | } | |
69 | ); | |
70 | ||
71 | dirs.push(root.join("c").join("d").join("x")); | |
781aab86 | 72 | s.make_relative_path_current("c/d/x/z".as_ref(), &mut r)?; |
49aad941 FG |
73 | assert_eq!( |
74 | r, | |
75 | Record { | |
76 | push_dir: 5, | |
77 | dirs: dirs.clone(), | |
78 | push: 8, | |
79 | } | |
80 | ); | |
81 | ||
82 | dirs.drain(dirs.len() - 3..).count(); | |
781aab86 | 83 | s.make_relative_path_current("f".as_ref(), &mut r)?; |
49aad941 FG |
84 | assert_eq!(s.current_relative(), Path::new("f")); |
85 | assert_eq!( | |
86 | r, | |
87 | Record { | |
88 | push_dir: 5, | |
89 | dirs: dirs.clone(), | |
90 | push: 9, | |
91 | } | |
92 | ); | |
93 | ||
94 | dirs.push(root.join("x")); | |
781aab86 | 95 | s.make_relative_path_current("x/z".as_ref(), &mut r)?; |
49aad941 FG |
96 | assert_eq!( |
97 | r, | |
98 | Record { | |
99 | push_dir: 6, | |
100 | dirs: dirs.clone(), | |
101 | push: 11, | |
102 | } | |
103 | ); | |
104 | ||
105 | dirs.push(root.join("x").join("z")); | |
781aab86 | 106 | s.make_relative_path_current("x/z/a".as_ref(), &mut r)?; |
49aad941 FG |
107 | assert_eq!( |
108 | r, | |
109 | Record { | |
110 | push_dir: 7, | |
111 | dirs: dirs.clone(), | |
112 | push: 12, | |
113 | } | |
114 | ); | |
115 | ||
116 | dirs.push(root.join("x").join("z").join("a")); | |
117 | dirs.push(root.join("x").join("z").join("a").join("b")); | |
781aab86 | 118 | s.make_relative_path_current("x/z/a/b/c".as_ref(), &mut r)?; |
49aad941 FG |
119 | assert_eq!( |
120 | r, | |
121 | Record { | |
122 | push_dir: 9, | |
123 | dirs: dirs.clone(), | |
124 | push: 14, | |
125 | } | |
126 | ); | |
127 | ||
128 | dirs.drain(dirs.len() - 2..).count(); | |
781aab86 | 129 | s.make_relative_path_current("x/z".as_ref(), &mut r)?; |
49aad941 FG |
130 | assert_eq!( |
131 | r, | |
132 | Record { | |
133 | push_dir: 9, | |
134 | dirs: dirs.clone(), | |
135 | push: 14, | |
136 | } | |
137 | ); | |
138 | assert_eq!( | |
139 | dirs.last(), | |
140 | Some(&PathBuf::from("./x/z")), | |
141 | "the stack is state so keeps thinking it's a directory which is consistent. Git does it differently though." | |
142 | ); | |
143 | ||
144 | Ok(()) | |
145 | } |