summaryrefslogtreecommitdiff
path: root/ccan/asort/test/run.c
blob: 69bab9755fba43c34caa61960d3dcf2269e99810 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <ccan/asort/asort.h>
#include <ccan/asort/asort.c>
#include <ccan/array_size/array_size.h>
#include <ccan/tap/tap.h>
#include <limits.h>
#include <stdbool.h>

static int test_cmp(const int *key, const int *elt, int *flag)
{
	if (*key < *elt)
		return -1 * *flag;
	else if (*key > *elt)
		return 1 * *flag;

	return 0;
}

static bool is_sorted(const int arr[], unsigned int size)
{
	unsigned int i;

	for (i = 1; i < size; i++)
		if (arr[i] < arr[i-1])
			return false;
	return true;
}

static bool is_reverse_sorted(const int arr[], unsigned int size)
{
	unsigned int i;

	for (i = 1; i < size; i++)
		if (arr[i] > arr[i-1])
			return false;
	return true;
}

static void psuedo_random_array(int arr[], unsigned int size)
{
	unsigned int i;

	for (i = 0; i < size; i++)
		arr[i] = i * (INT_MAX / 4 - 7);
}

#define TEST_SIZE 100

int main(void)
{
	int tmparr[TEST_SIZE];
	int multiplier = 1;

	plan_tests(4);

	psuedo_random_array(tmparr, TEST_SIZE);
	ok1(!is_sorted(tmparr, TEST_SIZE));
	ok1(!is_reverse_sorted(tmparr, TEST_SIZE));

	asort(tmparr, TEST_SIZE, test_cmp, &multiplier);
	ok1(is_sorted(tmparr, TEST_SIZE));

	psuedo_random_array(tmparr, TEST_SIZE);
	multiplier = -1;
	asort(tmparr, TEST_SIZE, test_cmp, &multiplier);
	ok1(is_reverse_sorted(tmparr, TEST_SIZE));

	return exit_status();
}