teo_language_parser/fsutil/
default.rs

1use 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
40/// Provide a default implementation for file system utility.
41impl 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}