1# NOTE: Tests related to sortArray go here.
2{
3 lib,
4 sortArray,
5 testers,
6}:
7let
8 inherit (lib.attrsets) recurseIntoAttrs;
9 inherit (testers) shellcheck shfmt testEqualArrayOrMap;
10 check =
11 {
12 name,
13 valuesArray,
14 expectedArray,
15 }:
16 (testEqualArrayOrMap {
17 inherit name valuesArray expectedArray;
18 script = ''
19 set -eu
20 nixLog "running sortArray with valuesArray to populate actualArray"
21 sortArray valuesArray actualArray
22 '';
23 }).overrideAttrs
24 (prevAttrs: {
25 nativeBuildInputs = prevAttrs.nativeBuildInputs or [ ] ++ [ sortArray ];
26 });
27
28 checkInPlace =
29 {
30 name,
31 valuesArray,
32 expectedArray,
33 }:
34 (testEqualArrayOrMap {
35 inherit name valuesArray expectedArray;
36 script = ''
37 set -eu
38 nixLog "running sortArray with valuesArray as input and output"
39 sortArray valuesArray valuesArray
40 nixLog "copying valuesArray to actualArray"
41 actualArray=("''${valuesArray[@]}")
42 '';
43 }).overrideAttrs
44 (prevAttrs: {
45 nativeBuildInputs = prevAttrs.nativeBuildInputs or [ ] ++ [ sortArray ];
46 });
47in
48recurseIntoAttrs {
49 shellcheck = shellcheck {
50 name = "sortArray";
51 src = ./sortArray.bash;
52 };
53
54 shfmt = shfmt {
55 name = "sortArray";
56 src = ./sortArray.bash;
57 };
58
59 empty = check {
60 name = "empty";
61 valuesArray = [ ];
62 expectedArray = [ ];
63 };
64
65 singleton = check {
66 name = "singleton";
67 valuesArray = [ "apple" ];
68 expectedArray = [ "apple" ];
69 };
70
71 oneDuplicate = check {
72 name = "oneDuplicate";
73 valuesArray = [
74 "apple"
75 "apple"
76 ];
77 expectedArray = [
78 "apple"
79 "apple"
80 ];
81 };
82
83 oneUnique = check {
84 name = "oneUnique";
85 valuesArray = [
86 "bee"
87 "apple"
88 "bee"
89 ];
90 expectedArray = [
91 "apple"
92 "bee"
93 "bee"
94 ];
95 };
96
97 duplicatesWithSpacesAndLineBreaks = check {
98 name = "duplicatesWithSpacesAndLineBreaks";
99 valuesArray = [
100 "dog"
101 "bee"
102 ''
103 line
104 break
105 ''
106 "cat"
107 "zebra"
108 "bee"
109 "cat"
110 "elephant"
111 "dog with spaces"
112 ''
113 line
114 break
115 ''
116 ];
117 expectedArray = [
118 "bee"
119 "bee"
120 "cat"
121 "cat"
122 "dog"
123 "dog with spaces"
124 "elephant"
125 # NOTE: lead whitespace is removed, so the following entries start with `l`.
126 ''
127 line
128 break
129 ''
130 ''
131 line
132 break
133 ''
134 "zebra"
135 ];
136 };
137
138 duplicatesWithSpacesAndLineBreaksInPlace = checkInPlace {
139 name = "duplicatesWithSpacesAndLineBreaksInPlace";
140 valuesArray = [
141 "dog"
142 "bee"
143 ''
144 line
145 break
146 ''
147 "cat"
148 "zebra"
149 "bee"
150 "cat"
151 "elephant"
152 "dog with spaces"
153 ''
154 line
155 break
156 ''
157 ];
158 expectedArray = [
159 "bee"
160 "bee"
161 "cat"
162 "cat"
163 "dog"
164 "dog with spaces"
165 "elephant"
166 # NOTE: lead whitespace is removed, so the following entries start with `l`.
167 ''
168 line
169 break
170 ''
171 ''
172 line
173 break
174 ''
175 "zebra"
176 ];
177 };
178}