Merge pull request #298967 from vbgl/ocaml-5.2.0
[NixPkgs.git] / lib / path / tests / unit.nix
blob9b0a0b2714aabac2518b1da720d01c667912715d
1 # Unit tests for lib.path functions. Use `nix-build` in this directory to
2 # run these
3 { libpath }:
4 let
5   lib = import libpath;
6   inherit (lib.path) hasPrefix removePrefix append splitRoot hasStorePathPrefix subpath;
8   # This is not allowed generally, but we're in the tests here, so we'll allow ourselves.
9   storeDirPath = /. + builtins.storeDir;
11   cases = lib.runTests {
12     # Test examples from the lib.path.append documentation
13     testAppendExample1 = {
14       expr = append /foo "bar/baz";
15       expected = /foo/bar/baz;
16     };
17     testAppendExample2 = {
18       expr = append /foo "./bar//baz/./";
19       expected = /foo/bar/baz;
20     };
21     testAppendExample3 = {
22       expr = append /. "foo/bar";
23       expected = /foo/bar;
24     };
25     testAppendExample4 = {
26       expr = (builtins.tryEval (append "/foo" "bar")).success;
27       expected = false;
28     };
29     testAppendExample5 = {
30       expr = (builtins.tryEval (append /foo /bar)).success;
31       expected = false;
32     };
33     testAppendExample6 = {
34       expr = (builtins.tryEval (append /foo "")).success;
35       expected = false;
36     };
37     testAppendExample7 = {
38       expr = (builtins.tryEval (append /foo "/bar")).success;
39       expected = false;
40     };
41     testAppendExample8 = {
42       expr = (builtins.tryEval (append /foo "../bar")).success;
43       expected = false;
44     };
46     testHasPrefixExample1 = {
47       expr = hasPrefix /foo /foo/bar;
48       expected = true;
49     };
50     testHasPrefixExample2 = {
51       expr = hasPrefix /foo /foo;
52       expected = true;
53     };
54     testHasPrefixExample3 = {
55       expr = hasPrefix /foo/bar /foo;
56       expected = false;
57     };
58     testHasPrefixExample4 = {
59       expr = hasPrefix /. /foo;
60       expected = true;
61     };
63     testRemovePrefixExample1 = {
64       expr = removePrefix /foo /foo/bar/baz;
65       expected = "./bar/baz";
66     };
67     testRemovePrefixExample2 = {
68       expr = removePrefix /foo /foo;
69       expected = "./.";
70     };
71     testRemovePrefixExample3 = {
72       expr = (builtins.tryEval (removePrefix /foo/bar /foo)).success;
73       expected = false;
74     };
75     testRemovePrefixExample4 = {
76       expr = removePrefix /. /foo;
77       expected = "./foo";
78     };
80     testSplitRootExample1 = {
81       expr = splitRoot /foo/bar;
82       expected = { root = /.; subpath = "./foo/bar"; };
83     };
84     testSplitRootExample2 = {
85       expr = splitRoot /.;
86       expected = { root = /.; subpath = "./."; };
87     };
88     testSplitRootExample3 = {
89       expr = splitRoot /foo/../bar;
90       expected = { root = /.; subpath = "./bar"; };
91     };
92     testSplitRootExample4 = {
93       expr = (builtins.tryEval (splitRoot "/foo/bar")).success;
94       expected = false;
95     };
97     testHasStorePathPrefixExample1 = {
98       expr = hasStorePathPrefix (storeDirPath + "/nvl9ic0pj1fpyln3zaqrf4cclbqdfn1j-foo/bar/baz");
99       expected = true;
100     };
101     testHasStorePathPrefixExample2 = {
102       expr = hasStorePathPrefix storeDirPath;
103       expected = false;
104     };
105     testHasStorePathPrefixExample3 = {
106       expr = hasStorePathPrefix (storeDirPath + "/nvl9ic0pj1fpyln3zaqrf4cclbqdfn1j-foo");
107       expected = true;
108     };
109     testHasStorePathPrefixExample4 = {
110       expr = hasStorePathPrefix /home/user;
111       expected = false;
112     };
113     testHasStorePathPrefixExample5 = {
114       expr = hasStorePathPrefix (storeDirPath + "/.links/10gg8k3rmbw8p7gszarbk7qyd9jwxhcfq9i6s5i0qikx8alkk4hq");
115       expected = false;
116     };
117     testHasStorePathPrefixExample6 = {
118       expr = hasStorePathPrefix (storeDirPath + "/nvl9ic0pj1fpyln3zaqrf4cclbqdfn1j-foo.drv");
119       expected = true;
120     };
122     # Test examples from the lib.path.subpath.isValid documentation
123     testSubpathIsValidExample1 = {
124       expr = subpath.isValid null;
125       expected = false;
126     };
127     testSubpathIsValidExample2 = {
128       expr = subpath.isValid "";
129       expected = false;
130     };
131     testSubpathIsValidExample3 = {
132       expr = subpath.isValid "/foo";
133       expected = false;
134     };
135     testSubpathIsValidExample4 = {
136       expr = subpath.isValid "../foo";
137       expected = false;
138     };
139     testSubpathIsValidExample5 = {
140       expr = subpath.isValid "foo/bar";
141       expected = true;
142     };
143     testSubpathIsValidExample6 = {
144       expr = subpath.isValid "./foo//bar/";
145       expected = true;
146     };
147     # Some extra tests
148     testSubpathIsValidTwoDotsEnd = {
149       expr = subpath.isValid "foo/..";
150       expected = false;
151     };
152     testSubpathIsValidTwoDotsMiddle = {
153       expr = subpath.isValid "foo/../bar";
154       expected = false;
155     };
156     testSubpathIsValidTwoDotsPrefix = {
157       expr = subpath.isValid "..foo";
158       expected = true;
159     };
160     testSubpathIsValidTwoDotsSuffix = {
161       expr = subpath.isValid "foo..";
162       expected = true;
163     };
164     testSubpathIsValidTwoDotsPrefixComponent = {
165       expr = subpath.isValid "foo/..bar/baz";
166       expected = true;
167     };
168     testSubpathIsValidTwoDotsSuffixComponent = {
169       expr = subpath.isValid "foo/bar../baz";
170       expected = true;
171     };
172     testSubpathIsValidThreeDots = {
173       expr = subpath.isValid "...";
174       expected = true;
175     };
176     testSubpathIsValidFourDots = {
177       expr = subpath.isValid "....";
178       expected = true;
179     };
180     testSubpathIsValidThreeDotsComponent = {
181       expr = subpath.isValid "foo/.../bar";
182       expected = true;
183     };
184     testSubpathIsValidFourDotsComponent = {
185       expr = subpath.isValid "foo/..../bar";
186       expected = true;
187     };
189     # Test examples from the lib.path.subpath.join documentation
190     testSubpathJoinExample1 = {
191       expr = subpath.join [ "foo" "bar/baz" ];
192       expected = "./foo/bar/baz";
193     };
194     testSubpathJoinExample2 = {
195       expr = subpath.join [ "./foo" "." "bar//./baz/" ];
196       expected = "./foo/bar/baz";
197     };
198     testSubpathJoinExample3 = {
199       expr = subpath.join [ ];
200       expected = "./.";
201     };
202     testSubpathJoinExample4 = {
203       expr = (builtins.tryEval (subpath.join [ /foo ])).success;
204       expected = false;
205     };
206     testSubpathJoinExample5 = {
207       expr = (builtins.tryEval (subpath.join [ "" ])).success;
208       expected = false;
209     };
210     testSubpathJoinExample6 = {
211       expr = (builtins.tryEval (subpath.join [ "/foo" ])).success;
212       expected = false;
213     };
214     testSubpathJoinExample7 = {
215       expr = (builtins.tryEval (subpath.join [ "../foo" ])).success;
216       expected = false;
217     };
219     # Test examples from the lib.path.subpath.normalise documentation
220     testSubpathNormaliseExample1 = {
221       expr = subpath.normalise "foo//bar";
222       expected = "./foo/bar";
223     };
224     testSubpathNormaliseExample2 = {
225       expr = subpath.normalise "foo/./bar";
226       expected = "./foo/bar";
227     };
228     testSubpathNormaliseExample3 = {
229       expr = subpath.normalise "foo/bar";
230       expected = "./foo/bar";
231     };
232     testSubpathNormaliseExample4 = {
233       expr = subpath.normalise "foo/bar/";
234       expected = "./foo/bar";
235     };
236     testSubpathNormaliseExample5 = {
237       expr = subpath.normalise "foo/bar/.";
238       expected = "./foo/bar";
239     };
240     testSubpathNormaliseExample6 = {
241       expr = subpath.normalise ".";
242       expected = "./.";
243     };
244     testSubpathNormaliseExample7 = {
245       expr = (builtins.tryEval (subpath.normalise "foo/../bar")).success;
246       expected = false;
247     };
248     testSubpathNormaliseExample8 = {
249       expr = (builtins.tryEval (subpath.normalise "")).success;
250       expected = false;
251     };
252     testSubpathNormaliseExample9 = {
253       expr = (builtins.tryEval (subpath.normalise "/foo")).success;
254       expected = false;
255     };
256     # Some extra tests
257     testSubpathNormaliseIsValidDots = {
258       expr = subpath.normalise "./foo/.bar/.../baz...qux";
259       expected = "./foo/.bar/.../baz...qux";
260     };
261     testSubpathNormaliseWrongType = {
262       expr = (builtins.tryEval (subpath.normalise null)).success;
263       expected = false;
264     };
265     testSubpathNormaliseTwoDots = {
266       expr = (builtins.tryEval (subpath.normalise "..")).success;
267       expected = false;
268     };
270     testSubpathComponentsExample1 = {
271       expr = subpath.components ".";
272       expected = [ ];
273     };
274     testSubpathComponentsExample2 = {
275       expr = subpath.components "./foo//bar/./baz/";
276       expected = [ "foo" "bar" "baz" ];
277     };
278     testSubpathComponentsExample3 = {
279       expr = (builtins.tryEval (subpath.components "/foo")).success;
280       expected = false;
281     };
282   };
284   if cases == [] then "Unit tests successful"
285   else throw "Path unit tests failed: ${lib.generators.toPretty {} cases}"