source: mainline/uspace/lib/c/test/qsort.c@ d7f7a4a

Last change on this file since d7f7a4a was d7f7a4a, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 3 years ago

Replace some license headers with SPDX identifier

Headers are replaced using tools/transorm-copyright.sh only
when it can be matched verbatim with the license header used
throughout most of the codebase.

  • Property mode set to 100644
File size: 2.6 KB
Line 
1/*
2 * SPDX-FileCopyrightText: 2017 Jiri Svoboda
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <pcut/pcut.h>
8#include <qsort.h>
9#include <stdio.h>
10#include <stdlib.h>
11
12enum {
13 /** Length of test number sequences */
14 test_seq_len = 5
15};
16
17/** Test compare function.
18 *
19 * @param a First key
20 * @param b Second key
21 * @return <0, 0, >0 if @a a is less than, equal or greater than @a b
22 */
23static int test_cmp(const void *a, const void *b)
24{
25 int *ia = (int *)a;
26 int *ib = (int *)b;
27
28 return *ia - *ib;
29}
30
31static void bubble_sort(int *seq, size_t nmemb)
32{
33 size_t i;
34 size_t j;
35 int t;
36
37 for (i = 0; i < nmemb - 1; i++)
38 for (j = 0; j < nmemb - 1; j++) {
39 if (seq[j] > seq[j + 1]) {
40 t = seq[j];
41 seq[j] = seq[j + 1];
42 seq[j + 1] = t;
43 }
44 }
45}
46
47PCUT_INIT;
48
49PCUT_TEST_SUITE(qsort);
50
51/** Test sorting already sorted increasing sequence */
52PCUT_TEST(incr_seq)
53{
54 int *seq;
55 int i;
56
57 seq = calloc(test_seq_len, sizeof(int));
58 PCUT_ASSERT_NOT_NULL(seq);
59
60 for (i = 0; i < test_seq_len; i++)
61 seq[i] = i;
62
63 qsort(seq, test_seq_len, sizeof(int), test_cmp);
64
65 for (i = 0; i < test_seq_len; i++) {
66 PCUT_ASSERT_INT_EQUALS(i, seq[i]);
67 }
68
69 free(seq);
70}
71
72/** Test sorting reverse-sorted decreasing sequence. */
73PCUT_TEST(decr_seq)
74{
75 int *seq;
76 int i;
77
78 seq = calloc(test_seq_len, sizeof(int));
79 PCUT_ASSERT_NOT_NULL(seq);
80
81 for (i = 0; i < test_seq_len; i++)
82 seq[i] = test_seq_len - 1 - i;
83
84 qsort(seq, test_seq_len, sizeof(int), test_cmp);
85
86 for (i = 0; i < test_seq_len; i++) {
87 PCUT_ASSERT_INT_EQUALS(i, seq[i]);
88 }
89
90 free(seq);
91}
92
93/** Test sorting reverse-sorted decreasing sequence where each member repeats twice. */
94PCUT_TEST(decr2_seq)
95{
96 int *seq;
97 int i;
98
99 seq = calloc(test_seq_len, sizeof(int));
100 PCUT_ASSERT_NOT_NULL(seq);
101
102 for (i = 0; i < test_seq_len; i++) {
103 seq[i] = (test_seq_len - 1 - i) / 2;
104 }
105
106 qsort(seq, test_seq_len, sizeof(int), test_cmp);
107
108 for (i = 0; i < test_seq_len; i++) {
109 PCUT_ASSERT_INT_EQUALS(i / 2, seq[i]);
110 }
111
112 free(seq);
113}
114
115/** Generate pseudorandom sequence. */
116static int seq_next(int cur)
117{
118 return (cur * 1951) % 1000000;
119}
120
121/** Test sorting pseudorandom sequence. */
122PCUT_TEST(pseudorandom_seq)
123{
124 int *seq, *seq2;
125 int i;
126 int v;
127
128 seq = calloc(test_seq_len, sizeof(int));
129 PCUT_ASSERT_NOT_NULL(seq);
130
131 seq2 = calloc(test_seq_len, sizeof(int));
132 PCUT_ASSERT_NOT_NULL(seq);
133
134 v = 1;
135 for (i = 0; i < test_seq_len; i++) {
136 seq[i] = v;
137 seq2[i] = v;
138 v = seq_next(v);
139 }
140
141 qsort(seq, test_seq_len, sizeof(int), test_cmp);
142 bubble_sort(seq2, test_seq_len);
143
144 for (i = 0; i < test_seq_len; i++) {
145 PCUT_ASSERT_INT_EQUALS(seq2[i], seq[i]);
146 }
147
148 free(seq);
149 free(seq2);
150}
151
152PCUT_EXPORT(qsort);
Note: See TracBrowser for help on using the repository browser.