teo_language_parser/fsutil/
default.rs1use super::FSUtil;
2use path_clean::PathClean;
3use std::fs;
4use std::path::{Path, PathBuf};
5
6fn read_file(file_path: &str) -> Option<String> {
7 match fs::read_to_string(Path::new(file_path)) {
8 Ok(s) => Some(s),
9 Err(_) => None,
10 }
11}
12
13fn file_exists(file_path: &str) -> bool {
14 Path::new(file_path).exists()
15}
16
17fn parent_directory(path: &str) -> String {
18 let mut path = PathBuf::from(path);
19 path.pop();
20 path.to_str().unwrap().to_string()
21}
22
23fn path_is_absolute(path: &str) -> bool {
24 Path::new(path).is_absolute()
25}
26
27fn path_join(base: &str, path: &str) -> String {
28 Path::new(base)
29 .join(Path::new(path))
30 .clean()
31 .to_str()
32 .unwrap()
33 .to_string()
34}
35
36fn file_is_directory(file_path: &str) -> bool {
37 Path::new(file_path).is_dir()
38}
39
40impl Default for FSUtil {
42 fn default() -> Self {
43 Self::new(
44 read_file,
45 file_exists,
46 file_is_directory,
47 path_join,
48 parent_directory,
49 path_is_absolute,
50 )
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 #[test]
59 fn test_read_file_returns_string_if_file_exists_and_readable() {
60 let file_path = "src/fsutil/default.rs";
61 let content = read_file(file_path).unwrap();
62 let fs_content = fs::read_to_string(Path::new(file_path)).unwrap();
63 assert_eq!(content, fs_content);
64 }
65
66 #[test]
67 fn test_read_file_returns_none_if_file_does_not_exist() {
68 let file_path = "src/fsutil/nonexistent.rs";
69 let content = read_file(file_path);
70 assert_eq!(content, None);
71 }
72
73 #[test]
74 fn test_file_exists_returns_true_if_file_exists() {
75 let file_path = "src/fsutil/default.rs";
76 let exists = file_exists(file_path);
77 assert_eq!(exists, true);
78 }
79
80 #[test]
81 fn test_file_exists_returns_false_if_file_does_not_exist() {
82 let file_path = "src/fsutil/nonexistent.rs";
83 let exists = file_exists(file_path);
84 assert_eq!(exists, false);
85 }
86
87 #[test]
88 fn test_file_is_directory_returns_true_if_file_is_directory() {
89 let file_path = "src/fsutil";
90 let is_directory = file_is_directory(file_path);
91 assert_eq!(is_directory, true);
92 }
93
94 #[test]
95 fn test_file_is_directory_returns_false_if_file_is_not_directory() {
96 let file_path = "src/fsutil/default.rs";
97 let is_directory = file_is_directory(file_path);
98 assert_eq!(is_directory, false);
99 }
100
101 #[test]
102 fn test_parent_directory_returns_parent_directory_of_path() {
103 let path = "src/fsutil/default.rs";
104 let parent = parent_directory(path);
105 assert_eq!(parent, "src/fsutil");
106 }
107
108 #[test]
109 fn test_path_is_absolute_returns_true_if_path_is_absolute() {
110 if cfg!(windows) {
111 let path = "C:\\Users\\user";
112 let is_absolute = path_is_absolute(path);
113 assert_eq!(is_absolute, true);
114 return;
115 } else {
116 let path = "/home/user";
117 let is_absolute = path_is_absolute(path);
118 assert_eq!(is_absolute, true);
119 }
120 }
121
122 #[test]
123 fn test_path_is_absolute_returns_false_if_path_is_not_absolute() {
124 let path = "home/user";
125 let is_absolute = path_is_absolute(path);
126 assert_eq!(is_absolute, false);
127 }
128
129 #[test]
130 fn test_path_join_returns_joined_path() {
131 if cfg!(windows) {
132 let base = "src";
133 let path = "fsutil\\default.rs";
134 let joined = path_join(base, path);
135 assert_eq!(joined, "src\\fsutil\\default.rs");
136 return;
137 } else {
138 let base = "src";
139 let path = "fsutil/default.rs";
140 let joined = path_join(base, path);
141 assert_eq!(joined, "src/fsutil/default.rs");
142 }
143 }
144
145 #[test]
146 fn test_path_join_removes_redundant_path_components() {
147 if cfg!(windows) {
148 let base = "src";
149 let path = "fsutil\\..\\fsutil\\default.rs";
150 let joined = path_join(base, path);
151 assert_eq!(joined, "src\\fsutil\\default.rs");
152 return;
153 } else {
154 let base = "src";
155 let path = "fsutil/../fsutil/default.rs";
156 let joined = path_join(base, path);
157 assert_eq!(joined, "src/fsutil/default.rs");
158 }
159 }
160
161 #[test]
162 fn test_path_join_returns_base_if_path_is_empty() {
163 let base = "src";
164 let path = "";
165 let joined = path_join(base, path);
166 assert_eq!(joined, "src");
167 }
168
169 #[test]
170 fn test_path_join_returns_path_if_base_is_empty() {
171 if cfg!(windows) {
172 let base = "";
173 let path = "fsutil\\default.rs";
174 let joined = path_join(base, path);
175 assert_eq!(joined, "fsutil\\default.rs");
176 return;
177 } else {
178 let base = "";
179 let path = "fsutil/default.rs";
180 let joined = path_join(base, path);
181 assert_eq!(joined, "fsutil/default.rs");
182 }
183 }
184
185 #[test]
186 fn test_parent_directory_returns_root_if_path_is_root() {
187 let path = "/";
188 let parent = parent_directory(path);
189 assert_eq!(parent, "/");
190 }
191
192 #[test]
193 fn test_parent_directory_returns_empty_string_if_path_is_empty() {
194 let path = "";
195 let parent = parent_directory(path);
196 assert_eq!(parent, "");
197 }
198
199 #[test]
200 fn test_parent_directory_returns_empty_string_if_path_is_single_component() {
201 let path = "src";
202 let parent = parent_directory(path);
203 assert_eq!(parent, "");
204 }
205
206 #[test]
207 fn test_parent_directory_returns_empty_string_if_path_is_single_component_with_trailing_slash()
208 {
209 let path = "src/";
210 let parent = parent_directory(path);
211 assert_eq!(parent, "");
212 }
213
214 #[test]
215 fn test_parent_directory_returns_parent_directory_of_path_with_trailing_slash() {
216 let path = "src/fsutil/";
217 let parent = parent_directory(path);
218 assert_eq!(parent, "src");
219 }
220
221 #[test]
222 fn test_parent_directory_returns_parent_directory_of_path_with_multiple_components() {
223 let path = "src/fsutil/default.rs";
224 let parent = parent_directory(path);
225 assert_eq!(parent, "src/fsutil");
226 }
227
228 #[test]
229 fn test_parent_directory_returns_parent_directory_of_path_with_multiple_components_and_trailing_slash(
230 ) {
231 let path = "src/fsutil/default.rs/";
232 let parent = parent_directory(path);
233 assert_eq!(parent, "src/fsutil");
234 }
235
236 #[test]
237 fn test_parent_directory_returns_parent_directory_of_path_with_multiple_components_and_multiple_trailing_slashes(
238 ) {
239 let path = "src/fsutil/default.rs///";
240 let parent = parent_directory(path);
241 assert_eq!(parent, "src/fsutil");
242 }
243
244 #[test]
245 fn test_parent_directory_returns_parent_directory_of_path_with_multiple_components_and_multiple_trailing_slashes_and_root(
246 ) {
247 let path = "/src/fsutil/default.rs///";
248 let parent = parent_directory(path);
249 assert_eq!(parent, "/src/fsutil");
250 }
251
252 #[test]
253 fn test_parent_directory_returns_parent_directory_of_path_with_multiple_components_and_multiple_trailing_slashes_and_root_and_trailing_slash(
254 ) {
255 let path = "/src/fsutil/default.rs///";
256 let parent = parent_directory(path);
257 assert_eq!(parent, "/src/fsutil");
258 }
259
260 #[test]
261 fn test_parent_directory_returns_parent_directory_of_path_with_multiple_components_and_multiple_trailing_slashes_and_root_and_trailing_slash_and_root(
262 ) {
263 let path = "/src/fsutil/default.rs///";
264 let parent = parent_directory(path);
265 assert_eq!(parent, "/src/fsutil");
266 }
267}