15eb6b827SSiva Chandra Reddy //===-- Unittests for qsort -----------------------------------------------===//
25eb6b827SSiva Chandra Reddy //
35eb6b827SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45eb6b827SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
55eb6b827SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65eb6b827SSiva Chandra Reddy //
75eb6b827SSiva Chandra Reddy //===----------------------------------------------------------------------===//
85eb6b827SSiva Chandra Reddy
95eb6b827SSiva Chandra Reddy #include "src/stdlib/qsort.h"
105eb6b827SSiva Chandra Reddy
115eb6b827SSiva Chandra Reddy #include "utils/UnitTest/Test.h"
125eb6b827SSiva Chandra Reddy
135eb6b827SSiva Chandra Reddy #include <stdlib.h>
145eb6b827SSiva Chandra Reddy
int_compare(const void * l,const void * r)155eb6b827SSiva Chandra Reddy static int int_compare(const void *l, const void *r) {
165eb6b827SSiva Chandra Reddy int li = *reinterpret_cast<const int *>(l);
175eb6b827SSiva Chandra Reddy int ri = *reinterpret_cast<const int *>(r);
185eb6b827SSiva Chandra Reddy if (li == ri)
195eb6b827SSiva Chandra Reddy return 0;
205eb6b827SSiva Chandra Reddy else if (li > ri)
215eb6b827SSiva Chandra Reddy return 1;
225eb6b827SSiva Chandra Reddy else
235eb6b827SSiva Chandra Reddy return -1;
245eb6b827SSiva Chandra Reddy }
255eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,SortedArray)265eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, SortedArray) {
275eb6b827SSiva Chandra Reddy int array[25] = {10, 23, 33, 35, 55, 70, 71, 100, 110,
285eb6b827SSiva Chandra Reddy 123, 133, 135, 155, 170, 171, 1100, 1110, 1123,
295eb6b827SSiva Chandra Reddy 1133, 1135, 1155, 1170, 1171, 11100, 12310};
30*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
315eb6b827SSiva Chandra Reddy
32*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
335eb6b827SSiva Chandra Reddy
345eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 10);
355eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 23);
365eb6b827SSiva Chandra Reddy ASSERT_LE(array[2], 33);
375eb6b827SSiva Chandra Reddy ASSERT_LE(array[3], 35);
385eb6b827SSiva Chandra Reddy ASSERT_LE(array[4], 55);
395eb6b827SSiva Chandra Reddy ASSERT_LE(array[5], 70);
405eb6b827SSiva Chandra Reddy ASSERT_LE(array[6], 71);
415eb6b827SSiva Chandra Reddy ASSERT_LE(array[7], 100);
425eb6b827SSiva Chandra Reddy ASSERT_LE(array[8], 110);
435eb6b827SSiva Chandra Reddy ASSERT_LE(array[9], 123);
445eb6b827SSiva Chandra Reddy ASSERT_LE(array[10], 133);
455eb6b827SSiva Chandra Reddy ASSERT_LE(array[11], 135);
465eb6b827SSiva Chandra Reddy ASSERT_LE(array[12], 155);
475eb6b827SSiva Chandra Reddy ASSERT_LE(array[13], 170);
485eb6b827SSiva Chandra Reddy ASSERT_LE(array[14], 171);
495eb6b827SSiva Chandra Reddy ASSERT_LE(array[15], 1100);
505eb6b827SSiva Chandra Reddy ASSERT_LE(array[16], 1110);
515eb6b827SSiva Chandra Reddy ASSERT_LE(array[17], 1123);
525eb6b827SSiva Chandra Reddy ASSERT_LE(array[18], 1133);
535eb6b827SSiva Chandra Reddy ASSERT_LE(array[19], 1135);
545eb6b827SSiva Chandra Reddy ASSERT_LE(array[20], 1155);
555eb6b827SSiva Chandra Reddy ASSERT_LE(array[21], 1170);
565eb6b827SSiva Chandra Reddy ASSERT_LE(array[22], 1171);
575eb6b827SSiva Chandra Reddy ASSERT_LE(array[23], 11100);
585eb6b827SSiva Chandra Reddy ASSERT_LE(array[24], 12310);
595eb6b827SSiva Chandra Reddy }
605eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,ReverseSortedArray)615eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, ReverseSortedArray) {
625eb6b827SSiva Chandra Reddy int array[25] = {25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13,
635eb6b827SSiva Chandra Reddy 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
64*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
655eb6b827SSiva Chandra Reddy
66*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
675eb6b827SSiva Chandra Reddy
68*25226f3eSMichael Jones for (int i = 0; i < int(ARRAY_SIZE - 1); ++i)
695eb6b827SSiva Chandra Reddy ASSERT_LE(array[i], i + 1);
705eb6b827SSiva Chandra Reddy }
715eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,AllEqualElements)725eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, AllEqualElements) {
735eb6b827SSiva Chandra Reddy int array[25] = {100, 100, 100, 100, 100, 100, 100, 100, 100,
745eb6b827SSiva Chandra Reddy 100, 100, 100, 100, 100, 100, 100, 100, 100,
755eb6b827SSiva Chandra Reddy 100, 100, 100, 100, 100, 100, 100};
76*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
775eb6b827SSiva Chandra Reddy
78*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
795eb6b827SSiva Chandra Reddy
80*25226f3eSMichael Jones for (size_t i = 0; i < ARRAY_SIZE - 1; ++i)
815eb6b827SSiva Chandra Reddy ASSERT_LE(array[i], 100);
825eb6b827SSiva Chandra Reddy }
835eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,UnsortedArray1)845eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, UnsortedArray1) {
855eb6b827SSiva Chandra Reddy int array[25] = {10, 23, 8, 35, 55, 45, 40, 100, 110, 123, 90, 80, 70,
865eb6b827SSiva Chandra Reddy 60, 171, 11, 1, -1, -5, -10, 1155, 1170, 1171, 12, -100};
87*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
885eb6b827SSiva Chandra Reddy
89*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
905eb6b827SSiva Chandra Reddy
915eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], -100);
925eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], -10);
935eb6b827SSiva Chandra Reddy ASSERT_LE(array[2], -5);
945eb6b827SSiva Chandra Reddy ASSERT_LE(array[3], -1);
955eb6b827SSiva Chandra Reddy ASSERT_LE(array[4], 1);
965eb6b827SSiva Chandra Reddy ASSERT_LE(array[5], 8);
975eb6b827SSiva Chandra Reddy ASSERT_LE(array[6], 10);
985eb6b827SSiva Chandra Reddy ASSERT_LE(array[7], 11);
995eb6b827SSiva Chandra Reddy ASSERT_LE(array[8], 12);
1005eb6b827SSiva Chandra Reddy ASSERT_LE(array[9], 23);
1015eb6b827SSiva Chandra Reddy ASSERT_LE(array[10], 35);
1025eb6b827SSiva Chandra Reddy ASSERT_LE(array[11], 40);
1035eb6b827SSiva Chandra Reddy ASSERT_LE(array[12], 45);
1045eb6b827SSiva Chandra Reddy ASSERT_LE(array[13], 55);
1055eb6b827SSiva Chandra Reddy ASSERT_LE(array[14], 60);
1065eb6b827SSiva Chandra Reddy ASSERT_LE(array[15], 70);
1075eb6b827SSiva Chandra Reddy ASSERT_LE(array[16], 80);
1085eb6b827SSiva Chandra Reddy ASSERT_LE(array[17], 90);
1095eb6b827SSiva Chandra Reddy ASSERT_LE(array[18], 100);
1105eb6b827SSiva Chandra Reddy ASSERT_LE(array[19], 110);
1115eb6b827SSiva Chandra Reddy ASSERT_LE(array[20], 123);
1125eb6b827SSiva Chandra Reddy ASSERT_LE(array[21], 171);
1135eb6b827SSiva Chandra Reddy ASSERT_LE(array[22], 1155);
1145eb6b827SSiva Chandra Reddy ASSERT_LE(array[23], 1170);
1155eb6b827SSiva Chandra Reddy ASSERT_LE(array[24], 1171);
1165eb6b827SSiva Chandra Reddy }
1175eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,UnsortedArray2)1185eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, UnsortedArray2) {
1195eb6b827SSiva Chandra Reddy int array[7] = {10, 40, 45, 55, 35, 23, 60};
120*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
1215eb6b827SSiva Chandra Reddy
122*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
1235eb6b827SSiva Chandra Reddy
1245eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 10);
1255eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 23);
1265eb6b827SSiva Chandra Reddy ASSERT_LE(array[2], 35);
1275eb6b827SSiva Chandra Reddy ASSERT_LE(array[3], 40);
1285eb6b827SSiva Chandra Reddy ASSERT_LE(array[4], 45);
1295eb6b827SSiva Chandra Reddy ASSERT_LE(array[5], 55);
1305eb6b827SSiva Chandra Reddy ASSERT_LE(array[6], 60);
1315eb6b827SSiva Chandra Reddy }
1325eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,UnsortedArrayDuplicateElements1)1335eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, UnsortedArrayDuplicateElements1) {
1345eb6b827SSiva Chandra Reddy int array[6] = {10, 10, 20, 20, 5, 5};
135*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
1365eb6b827SSiva Chandra Reddy
137*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
1385eb6b827SSiva Chandra Reddy
1395eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 5);
1405eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 5);
1415eb6b827SSiva Chandra Reddy ASSERT_LE(array[2], 10);
1425eb6b827SSiva Chandra Reddy ASSERT_LE(array[3], 10);
1435eb6b827SSiva Chandra Reddy ASSERT_LE(array[4], 20);
1445eb6b827SSiva Chandra Reddy ASSERT_LE(array[5], 20);
1455eb6b827SSiva Chandra Reddy }
1465eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,UnsortedArrayDuplicateElements2)1475eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, UnsortedArrayDuplicateElements2) {
1485eb6b827SSiva Chandra Reddy int array[10] = {20, 10, 10, 10, 10, 20, 21, 21, 21, 21};
149*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
1505eb6b827SSiva Chandra Reddy
151*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
1525eb6b827SSiva Chandra Reddy
1535eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 10);
1545eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 10);
1555eb6b827SSiva Chandra Reddy ASSERT_LE(array[2], 10);
1565eb6b827SSiva Chandra Reddy ASSERT_LE(array[3], 10);
1575eb6b827SSiva Chandra Reddy ASSERT_LE(array[4], 20);
1585eb6b827SSiva Chandra Reddy ASSERT_LE(array[5], 20);
1595eb6b827SSiva Chandra Reddy ASSERT_LE(array[6], 21);
1605eb6b827SSiva Chandra Reddy ASSERT_LE(array[7], 21);
1615eb6b827SSiva Chandra Reddy ASSERT_LE(array[8], 21);
1625eb6b827SSiva Chandra Reddy ASSERT_LE(array[9], 21);
1635eb6b827SSiva Chandra Reddy }
1645eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,UnsortedArrayDuplicateElements3)1655eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, UnsortedArrayDuplicateElements3) {
1665eb6b827SSiva Chandra Reddy int array[10] = {20, 30, 30, 30, 30, 20, 21, 21, 21, 21};
167*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
1685eb6b827SSiva Chandra Reddy
169*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
1705eb6b827SSiva Chandra Reddy
1715eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 20);
1725eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 20);
1735eb6b827SSiva Chandra Reddy ASSERT_LE(array[2], 21);
1745eb6b827SSiva Chandra Reddy ASSERT_LE(array[3], 21);
1755eb6b827SSiva Chandra Reddy ASSERT_LE(array[4], 21);
1765eb6b827SSiva Chandra Reddy ASSERT_LE(array[5], 21);
1775eb6b827SSiva Chandra Reddy ASSERT_LE(array[6], 30);
1785eb6b827SSiva Chandra Reddy ASSERT_LE(array[7], 30);
1795eb6b827SSiva Chandra Reddy ASSERT_LE(array[8], 30);
1805eb6b827SSiva Chandra Reddy ASSERT_LE(array[9], 30);
1815eb6b827SSiva Chandra Reddy }
1825eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,UnsortedThreeElementArray1)1835eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, UnsortedThreeElementArray1) {
1845eb6b827SSiva Chandra Reddy int array[3] = {14999024, 0, 3};
185*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
1865eb6b827SSiva Chandra Reddy
187*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
1885eb6b827SSiva Chandra Reddy
1895eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 0);
1905eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 3);
1915eb6b827SSiva Chandra Reddy ASSERT_LE(array[2], 14999024);
1925eb6b827SSiva Chandra Reddy }
1935eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,UnsortedThreeElementArray2)1945eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, UnsortedThreeElementArray2) {
1955eb6b827SSiva Chandra Reddy int array[3] = {3, 14999024, 0};
196*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
1975eb6b827SSiva Chandra Reddy
198*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
1995eb6b827SSiva Chandra Reddy
2005eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 0);
2015eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 3);
2025eb6b827SSiva Chandra Reddy ASSERT_LE(array[2], 14999024);
2035eb6b827SSiva Chandra Reddy }
2045eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,UnsortedThreeElementArray3)2055eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, UnsortedThreeElementArray3) {
2065eb6b827SSiva Chandra Reddy int array[3] = {3, 0, 14999024};
207*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
2085eb6b827SSiva Chandra Reddy
209*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
2105eb6b827SSiva Chandra Reddy
2115eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 0);
2125eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 3);
2135eb6b827SSiva Chandra Reddy ASSERT_LE(array[2], 14999024);
2145eb6b827SSiva Chandra Reddy }
2155eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,SameElementThreeElementArray)2165eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, SameElementThreeElementArray) {
2175eb6b827SSiva Chandra Reddy int array[3] = {12345, 12345, 12345};
218*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
2195eb6b827SSiva Chandra Reddy
220*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
2215eb6b827SSiva Chandra Reddy
2225eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 12345);
2235eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 12345);
2245eb6b827SSiva Chandra Reddy ASSERT_LE(array[2], 12345);
2255eb6b827SSiva Chandra Reddy }
2265eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,UnsortedTwoElementArray1)2275eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, UnsortedTwoElementArray1) {
2285eb6b827SSiva Chandra Reddy int array[2] = {14999024, 0};
229*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
2305eb6b827SSiva Chandra Reddy
231*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
2325eb6b827SSiva Chandra Reddy
2335eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 0);
2345eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 14999024);
2355eb6b827SSiva Chandra Reddy }
2365eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,UnsortedTwoElementArray2)2375eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, UnsortedTwoElementArray2) {
2385eb6b827SSiva Chandra Reddy int array[2] = {0, 14999024};
239*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
2405eb6b827SSiva Chandra Reddy
241*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
2425eb6b827SSiva Chandra Reddy
2435eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 0);
2445eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 14999024);
2455eb6b827SSiva Chandra Reddy }
2465eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQsortTest,SameElementTwoElementArray)2475eb6b827SSiva Chandra Reddy TEST(LlvmLibcQsortTest, SameElementTwoElementArray) {
2485eb6b827SSiva Chandra Reddy int array[2] = {12345, 12345};
249*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
2505eb6b827SSiva Chandra Reddy
251*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
2525eb6b827SSiva Chandra Reddy
2535eb6b827SSiva Chandra Reddy ASSERT_LE(array[0], 12345);
2545eb6b827SSiva Chandra Reddy ASSERT_LE(array[1], 12345);
2555eb6b827SSiva Chandra Reddy }
2565eb6b827SSiva Chandra Reddy
TEST(LlvmLibcQSortTest,SingleElementArray)2575eb6b827SSiva Chandra Reddy TEST(LlvmLibcQSortTest, SingleElementArray) {
258*25226f3eSMichael Jones constexpr int ELEM = 12345;
259*25226f3eSMichael Jones int array[1] = {ELEM};
260*25226f3eSMichael Jones constexpr size_t ARRAY_SIZE = sizeof(array) / sizeof(int);
2615eb6b827SSiva Chandra Reddy
262*25226f3eSMichael Jones __llvm_libc::qsort(array, ARRAY_SIZE, sizeof(int), int_compare);
2635eb6b827SSiva Chandra Reddy
264*25226f3eSMichael Jones ASSERT_LE(array[0], ELEM);
2655eb6b827SSiva Chandra Reddy }
266