]> git.proxmox.com Git - rustc.git/blame - vendor/gix-fs/tests/stack/mod.rs
New upstream version 1.74.1+dfsg1
[rustc.git] / vendor / gix-fs / tests / stack / mod.rs
CommitLineData
49aad941
FG
1use std::path::{Path, PathBuf};
2
3use gix_fs::Stack;
4
5#[derive(Debug, Default, Eq, PartialEq)]
6struct Record {
7 push_dir: usize,
8 dirs: Vec<PathBuf>,
9 push: usize,
10}
11
12impl 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]
30fn 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}