xref: /llvm-project/libc/test/src/stdlib/SortingTest.h (revision 7cb6e6bced8ca5767c3e609f4826982638fd9543)
1a6d2da8bSlntue //===-- Unittests for sorting routines ------------------------------------===//
2a6d2da8bSlntue //
3a6d2da8bSlntue // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a6d2da8bSlntue // See https://llvm.org/LICENSE.txt for license information.
5a6d2da8bSlntue // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a6d2da8bSlntue //
7a6d2da8bSlntue //===----------------------------------------------------------------------===//
8a6d2da8bSlntue 
9a6d2da8bSlntue #include "src/__support/macros/config.h"
10a738d81cSLukas Bergdoll #include "src/stdlib/qsort.h"
11a6d2da8bSlntue #include "test/UnitTest/Test.h"
12a6d2da8bSlntue 
13a6d2da8bSlntue class SortingTest : public LIBC_NAMESPACE::testing::Test {
14a6d2da8bSlntue 
15a738d81cSLukas Bergdoll   using SortingRoutine = void (*)(void *array, size_t array_len,
16a738d81cSLukas Bergdoll                                   size_t elem_size,
17a738d81cSLukas Bergdoll                                   int (*compare)(const void *, const void *));
18a6d2da8bSlntue 
19a6d2da8bSlntue   static int int_compare(const void *l, const void *r) {
20a6d2da8bSlntue     int li = *reinterpret_cast<const int *>(l);
21a6d2da8bSlntue     int ri = *reinterpret_cast<const int *>(r);
22a738d81cSLukas Bergdoll 
23a6d2da8bSlntue     if (li == ri)
24a6d2da8bSlntue       return 0;
25a6d2da8bSlntue     else if (li > ri)
26a6d2da8bSlntue       return 1;
27a6d2da8bSlntue     else
28a6d2da8bSlntue       return -1;
29a6d2da8bSlntue   }
30a6d2da8bSlntue 
31a738d81cSLukas Bergdoll   static void int_sort(SortingRoutine sort_func, int *array, size_t array_len) {
32a738d81cSLukas Bergdoll     sort_func(reinterpret_cast<void *>(array), array_len, sizeof(int),
33a738d81cSLukas Bergdoll               int_compare);
34a738d81cSLukas Bergdoll   }
35a738d81cSLukas Bergdoll 
36a738d81cSLukas Bergdoll public:
37a6d2da8bSlntue   void test_sorted_array(SortingRoutine sort_func) {
38a6d2da8bSlntue     int array[25] = {10,   23,   33,   35,   55,   70,    71,   100,  110,
39a6d2da8bSlntue                      123,  133,  135,  155,  170,  171,   1100, 1110, 1123,
40a6d2da8bSlntue                      1133, 1135, 1155, 1170, 1171, 11100, 12310};
41a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
42a6d2da8bSlntue 
43a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
44a6d2da8bSlntue 
45a6d2da8bSlntue     ASSERT_LE(array[0], 10);
46a6d2da8bSlntue     ASSERT_LE(array[1], 23);
47a6d2da8bSlntue     ASSERT_LE(array[2], 33);
48a6d2da8bSlntue     ASSERT_LE(array[3], 35);
49a6d2da8bSlntue     ASSERT_LE(array[4], 55);
50a6d2da8bSlntue     ASSERT_LE(array[5], 70);
51a6d2da8bSlntue     ASSERT_LE(array[6], 71);
52a6d2da8bSlntue     ASSERT_LE(array[7], 100);
53a6d2da8bSlntue     ASSERT_LE(array[8], 110);
54a6d2da8bSlntue     ASSERT_LE(array[9], 123);
55a6d2da8bSlntue     ASSERT_LE(array[10], 133);
56a6d2da8bSlntue     ASSERT_LE(array[11], 135);
57a6d2da8bSlntue     ASSERT_LE(array[12], 155);
58a6d2da8bSlntue     ASSERT_LE(array[13], 170);
59a6d2da8bSlntue     ASSERT_LE(array[14], 171);
60a6d2da8bSlntue     ASSERT_LE(array[15], 1100);
61a6d2da8bSlntue     ASSERT_LE(array[16], 1110);
62a6d2da8bSlntue     ASSERT_LE(array[17], 1123);
63a6d2da8bSlntue     ASSERT_LE(array[18], 1133);
64a6d2da8bSlntue     ASSERT_LE(array[19], 1135);
65a6d2da8bSlntue     ASSERT_LE(array[20], 1155);
66a6d2da8bSlntue     ASSERT_LE(array[21], 1170);
67a6d2da8bSlntue     ASSERT_LE(array[22], 1171);
68a6d2da8bSlntue     ASSERT_LE(array[23], 11100);
69a6d2da8bSlntue     ASSERT_LE(array[24], 12310);
70a6d2da8bSlntue   }
71a6d2da8bSlntue 
72a6d2da8bSlntue   void test_reversed_sorted_array(SortingRoutine sort_func) {
73a6d2da8bSlntue     int array[] = {25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13,
74a6d2da8bSlntue                    12, 11, 10, 9,  8,  7,  6,  5,  4,  3,  2,  1};
75a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
76a6d2da8bSlntue 
77a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
78a6d2da8bSlntue 
79a738d81cSLukas Bergdoll     for (int i = 0; i < int(ARRAY_LEN - 1); ++i)
80a6d2da8bSlntue       ASSERT_EQ(array[i], i + 1);
81a6d2da8bSlntue   }
82a6d2da8bSlntue 
83a6d2da8bSlntue   void test_all_equal_elements(SortingRoutine sort_func) {
84a6d2da8bSlntue     int array[] = {100, 100, 100, 100, 100, 100, 100, 100, 100,
85a6d2da8bSlntue                    100, 100, 100, 100, 100, 100, 100, 100, 100,
86a6d2da8bSlntue                    100, 100, 100, 100, 100, 100, 100};
87a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
88a6d2da8bSlntue 
89a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
90a6d2da8bSlntue 
91a738d81cSLukas Bergdoll     for (size_t i = 0; i < ARRAY_LEN; ++i)
92a6d2da8bSlntue       ASSERT_EQ(array[i], 100);
93a6d2da8bSlntue   }
94a6d2da8bSlntue 
95a6d2da8bSlntue   void test_unsorted_array_1(SortingRoutine sort_func) {
96a6d2da8bSlntue     int array[25] = {10,  23,  8,    35,   55,   45,  40,  100, 110,
97a6d2da8bSlntue                      123, 90,  80,   70,   60,   171, 11,  1,   -1,
98a6d2da8bSlntue                      -5,  -10, 1155, 1170, 1171, 12,  -100};
99a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
100a6d2da8bSlntue 
101a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
102a6d2da8bSlntue 
103a6d2da8bSlntue     ASSERT_EQ(array[0], -100);
104a6d2da8bSlntue     ASSERT_EQ(array[1], -10);
105a6d2da8bSlntue     ASSERT_EQ(array[2], -5);
106a6d2da8bSlntue     ASSERT_EQ(array[3], -1);
107a6d2da8bSlntue     ASSERT_EQ(array[4], 1);
108a6d2da8bSlntue     ASSERT_EQ(array[5], 8);
109a6d2da8bSlntue     ASSERT_EQ(array[6], 10);
110a6d2da8bSlntue     ASSERT_EQ(array[7], 11);
111a6d2da8bSlntue     ASSERT_EQ(array[8], 12);
112a6d2da8bSlntue     ASSERT_EQ(array[9], 23);
113a6d2da8bSlntue     ASSERT_EQ(array[10], 35);
114a6d2da8bSlntue     ASSERT_EQ(array[11], 40);
115a6d2da8bSlntue     ASSERT_EQ(array[12], 45);
116a6d2da8bSlntue     ASSERT_EQ(array[13], 55);
117a6d2da8bSlntue     ASSERT_EQ(array[14], 60);
118a6d2da8bSlntue     ASSERT_EQ(array[15], 70);
119a6d2da8bSlntue     ASSERT_EQ(array[16], 80);
120a6d2da8bSlntue     ASSERT_EQ(array[17], 90);
121a6d2da8bSlntue     ASSERT_EQ(array[18], 100);
122a6d2da8bSlntue     ASSERT_EQ(array[19], 110);
123a6d2da8bSlntue     ASSERT_EQ(array[20], 123);
124a6d2da8bSlntue     ASSERT_EQ(array[21], 171);
125a6d2da8bSlntue     ASSERT_EQ(array[22], 1155);
126a6d2da8bSlntue     ASSERT_EQ(array[23], 1170);
127a6d2da8bSlntue     ASSERT_EQ(array[24], 1171);
128a6d2da8bSlntue   }
129a6d2da8bSlntue 
130a6d2da8bSlntue   void test_unsorted_array_2(SortingRoutine sort_func) {
131a6d2da8bSlntue     int array[7] = {10, 40, 45, 55, 35, 23, 60};
132a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
133a6d2da8bSlntue 
134a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
135a6d2da8bSlntue 
136a6d2da8bSlntue     ASSERT_EQ(array[0], 10);
137a6d2da8bSlntue     ASSERT_EQ(array[1], 23);
138a6d2da8bSlntue     ASSERT_EQ(array[2], 35);
139a6d2da8bSlntue     ASSERT_EQ(array[3], 40);
140a6d2da8bSlntue     ASSERT_EQ(array[4], 45);
141a6d2da8bSlntue     ASSERT_EQ(array[5], 55);
142a6d2da8bSlntue     ASSERT_EQ(array[6], 60);
143a6d2da8bSlntue   }
144a6d2da8bSlntue 
145a6d2da8bSlntue   void test_unsorted_array_duplicated_1(SortingRoutine sort_func) {
146a6d2da8bSlntue     int array[6] = {10, 10, 20, 20, 5, 5};
147a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
148a6d2da8bSlntue 
149a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
150a6d2da8bSlntue 
151a6d2da8bSlntue     ASSERT_EQ(array[0], 5);
152a6d2da8bSlntue     ASSERT_EQ(array[1], 5);
153a6d2da8bSlntue     ASSERT_EQ(array[2], 10);
154a6d2da8bSlntue     ASSERT_EQ(array[3], 10);
155a6d2da8bSlntue     ASSERT_EQ(array[4], 20);
156a6d2da8bSlntue     ASSERT_EQ(array[5], 20);
157a6d2da8bSlntue   }
158a6d2da8bSlntue 
159a6d2da8bSlntue   void test_unsorted_array_duplicated_2(SortingRoutine sort_func) {
160a6d2da8bSlntue     int array[10] = {20, 10, 10, 10, 10, 20, 21, 21, 21, 21};
161a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
162a6d2da8bSlntue 
163a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
164a6d2da8bSlntue 
165a6d2da8bSlntue     ASSERT_EQ(array[0], 10);
166a6d2da8bSlntue     ASSERT_EQ(array[1], 10);
167a6d2da8bSlntue     ASSERT_EQ(array[2], 10);
168a6d2da8bSlntue     ASSERT_EQ(array[3], 10);
169a6d2da8bSlntue     ASSERT_EQ(array[4], 20);
170a6d2da8bSlntue     ASSERT_EQ(array[5], 20);
171a6d2da8bSlntue     ASSERT_EQ(array[6], 21);
172a6d2da8bSlntue     ASSERT_EQ(array[7], 21);
173a6d2da8bSlntue     ASSERT_EQ(array[8], 21);
174a6d2da8bSlntue     ASSERT_EQ(array[9], 21);
175a6d2da8bSlntue   }
176a6d2da8bSlntue 
177a6d2da8bSlntue   void test_unsorted_array_duplicated_3(SortingRoutine sort_func) {
178a6d2da8bSlntue     int array[10] = {20, 30, 30, 30, 30, 20, 21, 21, 21, 21};
179a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
180a6d2da8bSlntue 
181a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
182a6d2da8bSlntue 
183a6d2da8bSlntue     ASSERT_EQ(array[0], 20);
184a6d2da8bSlntue     ASSERT_EQ(array[1], 20);
185a6d2da8bSlntue     ASSERT_EQ(array[2], 21);
186a6d2da8bSlntue     ASSERT_EQ(array[3], 21);
187a6d2da8bSlntue     ASSERT_EQ(array[4], 21);
188a6d2da8bSlntue     ASSERT_EQ(array[5], 21);
189a6d2da8bSlntue     ASSERT_EQ(array[6], 30);
190a6d2da8bSlntue     ASSERT_EQ(array[7], 30);
191a6d2da8bSlntue     ASSERT_EQ(array[8], 30);
192a6d2da8bSlntue     ASSERT_EQ(array[9], 30);
193a6d2da8bSlntue   }
194a6d2da8bSlntue 
195a6d2da8bSlntue   void test_unsorted_three_element_1(SortingRoutine sort_func) {
196a6d2da8bSlntue     int array[3] = {14999024, 0, 3};
197a6d2da8bSlntue 
198a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
199a6d2da8bSlntue 
200a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
201a6d2da8bSlntue 
202a6d2da8bSlntue     ASSERT_EQ(array[0], 0);
203a6d2da8bSlntue     ASSERT_EQ(array[1], 3);
204a6d2da8bSlntue     ASSERT_EQ(array[2], 14999024);
205a6d2da8bSlntue   }
206a6d2da8bSlntue 
207a6d2da8bSlntue   void test_unsorted_three_element_2(SortingRoutine sort_func) {
208a6d2da8bSlntue     int array[3] = {3, 14999024, 0};
209a6d2da8bSlntue 
210a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
211a6d2da8bSlntue 
212a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
213a6d2da8bSlntue 
214a6d2da8bSlntue     ASSERT_EQ(array[0], 0);
215a6d2da8bSlntue     ASSERT_EQ(array[1], 3);
216a6d2da8bSlntue     ASSERT_EQ(array[2], 14999024);
217a6d2da8bSlntue   }
218a6d2da8bSlntue 
219a6d2da8bSlntue   void test_unsorted_three_element_3(SortingRoutine sort_func) {
220a6d2da8bSlntue     int array[3] = {3, 0, 14999024};
221a6d2da8bSlntue 
222a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
223a6d2da8bSlntue 
224a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
225a6d2da8bSlntue 
226a6d2da8bSlntue     ASSERT_EQ(array[0], 0);
227a6d2da8bSlntue     ASSERT_EQ(array[1], 3);
228a6d2da8bSlntue     ASSERT_EQ(array[2], 14999024);
229a6d2da8bSlntue   }
230a6d2da8bSlntue 
231a6d2da8bSlntue   void test_same_three_element(SortingRoutine sort_func) {
232a6d2da8bSlntue     int array[3] = {12345, 12345, 12345};
233a6d2da8bSlntue 
234a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
235a6d2da8bSlntue 
236a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
237a6d2da8bSlntue 
238a6d2da8bSlntue     ASSERT_EQ(array[0], 12345);
239a6d2da8bSlntue     ASSERT_EQ(array[1], 12345);
240a6d2da8bSlntue     ASSERT_EQ(array[2], 12345);
241a6d2da8bSlntue   }
242a6d2da8bSlntue 
243a6d2da8bSlntue   void test_unsorted_two_element_1(SortingRoutine sort_func) {
244a6d2da8bSlntue     int array[] = {14999024, 0};
245a6d2da8bSlntue 
246a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
247a6d2da8bSlntue 
248a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
249a6d2da8bSlntue 
250a6d2da8bSlntue     ASSERT_EQ(array[0], 0);
251a6d2da8bSlntue     ASSERT_EQ(array[1], 14999024);
252a6d2da8bSlntue   }
253a6d2da8bSlntue 
254a6d2da8bSlntue   void test_unsorted_two_element_2(SortingRoutine sort_func) {
255a6d2da8bSlntue     int array[] = {0, 14999024};
256a6d2da8bSlntue 
257a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
258a6d2da8bSlntue 
259a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
260a6d2da8bSlntue 
261a6d2da8bSlntue     ASSERT_EQ(array[0], 0);
262a6d2da8bSlntue     ASSERT_EQ(array[1], 14999024);
263a6d2da8bSlntue   }
264a6d2da8bSlntue 
265a6d2da8bSlntue   void test_same_two_element(SortingRoutine sort_func) {
266a6d2da8bSlntue     int array[] = {12345, 12345};
267a6d2da8bSlntue 
268a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
269a6d2da8bSlntue 
270a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
271a6d2da8bSlntue 
272a6d2da8bSlntue     ASSERT_EQ(array[0], 12345);
273a6d2da8bSlntue     ASSERT_EQ(array[1], 12345);
274a6d2da8bSlntue   }
275a6d2da8bSlntue 
276a6d2da8bSlntue   void test_single_element(SortingRoutine sort_func) {
277a6d2da8bSlntue     int array[] = {12345};
278a6d2da8bSlntue 
279a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(array) / sizeof(int);
280a6d2da8bSlntue 
281a738d81cSLukas Bergdoll     int_sort(sort_func, array, ARRAY_LEN);
282a6d2da8bSlntue 
283a6d2da8bSlntue     ASSERT_EQ(array[0], 12345);
284a6d2da8bSlntue   }
285a738d81cSLukas Bergdoll 
286a738d81cSLukas Bergdoll   void test_different_elem_size(SortingRoutine sort_func) {
287a738d81cSLukas Bergdoll     // Random order of values [0,50) to avoid only testing pre-sorted handling.
288a738d81cSLukas Bergdoll     // Long enough to reach interesting code.
289a738d81cSLukas Bergdoll     constexpr uint8_t ARRAY_INITIAL_VALS[] = {
290a738d81cSLukas Bergdoll         42, 13, 8,  4,  17, 28, 20, 32, 22, 29, 7,  2,  46, 37, 26, 49, 24,
291a738d81cSLukas Bergdoll         38, 10, 18, 40, 36, 47, 15, 11, 48, 44, 33, 1,  5,  16, 35, 39, 41,
292a738d81cSLukas Bergdoll         14, 23, 3,  9,  6,  27, 21, 25, 31, 45, 12, 43, 34, 30, 19, 0};
293a738d81cSLukas Bergdoll 
294a738d81cSLukas Bergdoll     constexpr size_t ARRAY_LEN = sizeof(ARRAY_INITIAL_VALS);
295a738d81cSLukas Bergdoll     constexpr size_t MAX_ELEM_SIZE = 150;
296a738d81cSLukas Bergdoll     constexpr size_t BUF_SIZE = ARRAY_LEN * MAX_ELEM_SIZE;
297a738d81cSLukas Bergdoll 
298a738d81cSLukas Bergdoll     static_assert(ARRAY_LEN < 256); // so we can encode the values.
299a738d81cSLukas Bergdoll 
300a738d81cSLukas Bergdoll     // Minimum alignment to test implementation for bugs related to assuming
301*7cb6e6bcSJoseph Huber     // incorrect association between alignment and element size. The buffer is
302*7cb6e6bcSJoseph Huber     // 'static' as otherwise it will exhaust the stack on the GPU targets.
303*7cb6e6bcSJoseph Huber     alignas(1) static uint8_t buf[BUF_SIZE];
304a738d81cSLukas Bergdoll 
305de7f5311SSchrodinger ZHU Yifan     // GCC still requires capturing the constant ARRAY_INITIAL_VALS in the
306de7f5311SSchrodinger ZHU Yifan     // lambda hence, let's use & to implicitly capture all needed variables
307de7f5311SSchrodinger ZHU Yifan     // automatically.
308de7f5311SSchrodinger ZHU Yifan     const auto fill_buf = [&](size_t elem_size) {
309a738d81cSLukas Bergdoll       for (size_t i = 0; i < BUF_SIZE; ++i) {
310a738d81cSLukas Bergdoll         buf[i] = 0;
311a738d81cSLukas Bergdoll       }
312a738d81cSLukas Bergdoll 
313a738d81cSLukas Bergdoll       for (size_t elem_i = 0, buf_i = 0; elem_i < ARRAY_LEN; ++elem_i) {
314a738d81cSLukas Bergdoll         const uint8_t elem_val = ARRAY_INITIAL_VALS[elem_i];
315a738d81cSLukas Bergdoll         for (size_t elem_byte_i = 0; elem_byte_i < elem_size; ++elem_byte_i) {
316a738d81cSLukas Bergdoll           buf[buf_i] = elem_val;
317a738d81cSLukas Bergdoll           buf_i += 1;
318a738d81cSLukas Bergdoll         }
319a738d81cSLukas Bergdoll       }
320a738d81cSLukas Bergdoll     };
321a738d81cSLukas Bergdoll 
322a738d81cSLukas Bergdoll     for (size_t elem_size = 0; elem_size <= MAX_ELEM_SIZE; ++elem_size) {
323a738d81cSLukas Bergdoll       // Fill all bytes with data to ensure mistakes in elem swap are noticed.
324a738d81cSLukas Bergdoll       fill_buf(elem_size);
325a738d81cSLukas Bergdoll 
326a738d81cSLukas Bergdoll       sort_func(reinterpret_cast<void *>(buf), ARRAY_LEN, elem_size,
327a738d81cSLukas Bergdoll                 [](const void *a, const void *b) -> int {
328a738d81cSLukas Bergdoll                   const uint8_t a_val = *reinterpret_cast<const uint8_t *>(a);
329a738d81cSLukas Bergdoll                   const uint8_t b_val = *reinterpret_cast<const uint8_t *>(b);
330a738d81cSLukas Bergdoll 
331a738d81cSLukas Bergdoll                   if (a_val < b_val) {
332a738d81cSLukas Bergdoll                     return -1;
333a738d81cSLukas Bergdoll                   } else if (a_val > b_val) {
334a738d81cSLukas Bergdoll                     return 1;
335a738d81cSLukas Bergdoll                   } else {
336a738d81cSLukas Bergdoll                     return 0;
337a738d81cSLukas Bergdoll                   }
338a738d81cSLukas Bergdoll                 });
339a738d81cSLukas Bergdoll 
340a738d81cSLukas Bergdoll       for (size_t elem_i = 0, buf_i = 0; elem_i < ARRAY_LEN; ++elem_i) {
341a738d81cSLukas Bergdoll         const uint8_t expected_elem_val = static_cast<uint8_t>(elem_i);
342a738d81cSLukas Bergdoll 
343a738d81cSLukas Bergdoll         for (size_t elem_byte_i = 0; elem_byte_i < elem_size; ++elem_byte_i) {
344a738d81cSLukas Bergdoll           const uint8_t buf_val = buf[buf_i];
345a738d81cSLukas Bergdoll           // Check that every byte in the element has the expected value.
346a738d81cSLukas Bergdoll           ASSERT_EQ(buf_val, expected_elem_val)
347a738d81cSLukas Bergdoll               << "elem_size: " << elem_size << " buf_i: " << buf_i << '\n';
348a738d81cSLukas Bergdoll           buf_i += 1;
349a738d81cSLukas Bergdoll         }
350a738d81cSLukas Bergdoll       }
351a738d81cSLukas Bergdoll     }
352a738d81cSLukas Bergdoll   }
353a6d2da8bSlntue };
354a6d2da8bSlntue 
355a6d2da8bSlntue #define LIST_SORTING_TESTS(Name, Func)                                         \
356a6d2da8bSlntue   using LlvmLibc##Name##Test = SortingTest;                                    \
357a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, SortedArray) { test_sorted_array(Func); }       \
358a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, ReverseSortedArray) {                           \
359a6d2da8bSlntue     test_reversed_sorted_array(Func);                                          \
360a6d2da8bSlntue   }                                                                            \
361a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, AllEqualElements) {                             \
362a6d2da8bSlntue     test_all_equal_elements(Func);                                             \
363a6d2da8bSlntue   }                                                                            \
364a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, UnsortedArray1) {                               \
365a6d2da8bSlntue     test_unsorted_array_1(Func);                                               \
366a6d2da8bSlntue   }                                                                            \
367a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, UnsortedArray2) {                               \
368a6d2da8bSlntue     test_unsorted_array_2(Func);                                               \
369a6d2da8bSlntue   }                                                                            \
370a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, UnsortedArrayDuplicateElements1) {              \
371a6d2da8bSlntue     test_unsorted_array_duplicated_1(Func);                                    \
372a6d2da8bSlntue   }                                                                            \
373a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, UnsortedArrayDuplicateElements2) {              \
374a6d2da8bSlntue     test_unsorted_array_duplicated_2(Func);                                    \
375a6d2da8bSlntue   }                                                                            \
376a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, UnsortedArrayDuplicateElements3) {              \
377a6d2da8bSlntue     test_unsorted_array_duplicated_3(Func);                                    \
378a6d2da8bSlntue   }                                                                            \
379a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, UnsortedThreeElementArray1) {                   \
380a6d2da8bSlntue     test_unsorted_three_element_1(Func);                                       \
381a6d2da8bSlntue   }                                                                            \
382a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, UnsortedThreeElementArray2) {                   \
383a6d2da8bSlntue     test_unsorted_three_element_2(Func);                                       \
384a6d2da8bSlntue   }                                                                            \
385a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, UnsortedThreeElementArray3) {                   \
386a6d2da8bSlntue     test_unsorted_three_element_3(Func);                                       \
387a6d2da8bSlntue   }                                                                            \
388a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, SameElementThreeElementArray) {                 \
389a6d2da8bSlntue     test_same_three_element(Func);                                             \
390a6d2da8bSlntue   }                                                                            \
391a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, UnsortedTwoElementArray1) {                     \
392a6d2da8bSlntue     test_unsorted_two_element_1(Func);                                         \
393a6d2da8bSlntue   }                                                                            \
394a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, UnsortedTwoElementArray2) {                     \
395a6d2da8bSlntue     test_unsorted_two_element_2(Func);                                         \
396a6d2da8bSlntue   }                                                                            \
397a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, SameElementTwoElementArray) {                   \
398a6d2da8bSlntue     test_same_two_element(Func);                                               \
399a6d2da8bSlntue   }                                                                            \
400a6d2da8bSlntue   TEST_F(LlvmLibc##Name##Test, SingleElementArray) {                           \
401a6d2da8bSlntue     test_single_element(Func);                                                 \
402a6d2da8bSlntue   }                                                                            \
403a738d81cSLukas Bergdoll   TEST_F(LlvmLibc##Name##Test, DifferentElemSizeArray) {                       \
404a738d81cSLukas Bergdoll     test_different_elem_size(Func);                                            \
405a738d81cSLukas Bergdoll   }                                                                            \
406a6d2da8bSlntue   static_assert(true)
407