-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_queue.c
More file actions
143 lines (122 loc) · 3.65 KB
/
test_queue.c
File metadata and controls
143 lines (122 loc) · 3.65 KB
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
* This file contains executable code for testing your queue implementation.
*/
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
#include "dynarray.h"
void print_int (void* a) {
int* ai = a;
if (ai == NULL){
printf("NULL\n");
return;
}
printf("%d\n", *ai);
return;
}
int main(int argc, char** argv) {
int simfront, simback, i, n = 16, k_deq = 4, k_enq = 8;
int* test_data;
int** simqueue;
struct queue* q;
/*
* Create array of testing data.
*/
test_data = malloc(n * sizeof(int));
for (i = 0; i < n; i++) {
test_data[i] = i * i;
}
/*
* Create queue and enqueue part of the testing data into it. Simulate a
* queue in the simqueue array (with current front/back kept track of in
* simfront/simback).
*/
q = queue_create();
simqueue = malloc(n * sizeof(int*));
simfront = simback = 0;
printf("== Enqueueing first %d of %d values.\n", k_enq, n);
for (i = 0; i < k_enq; i++) {
queue_enqueue(q, &test_data[i]);
simqueue[simback++] = &test_data[i];
}
printf("Print Queue out...\n");
queue_print(q, print_int);
/*
* Dequeue a few of the values held in the queue and make sure they're the
* correct values.
*/
printf("\n== Dequeueing some values: front / dequeued (expected)\n");
for (i = 0; i < k_deq; i++) {
int* expected = simqueue[simfront];
simqueue[simfront] = NULL;
simfront++;
int* front = queue_front(q);
int* dequeued = queue_dequeue(q);
if (front && dequeued) {
printf(" - %4d / %4d (%4d)\n", *front, *dequeued, *expected);
} else {
printf(" - front (%p) or dequeued (%p) is NULL (expected: %4d)\n", front,
dequeued, *expected);
}
}
printf("Print Queue out, check circular buffer: \n");
queue_print(q, print_int);
/*
* Enqueue more values into queue (and simulated queue).
*/
printf("\n== Enqueueing another %d of %d values.\n", n - k_enq - k_deq, n);
for (i = k_enq; i < k_enq + k_deq; i++) {
queue_enqueue(q, &test_data[i]);
simqueue[simback++] = &test_data[i];
}
printf("Print Queue out, check circular buffer: \n");
queue_print(q, print_int);
/*
* Enqueue remaining values into queue (and simulated queue).
*/
printf("\n== Enqueueing remaining %d of %d values.\n", n - k_enq - k_deq, n);
for (i = k_enq + k_deq; i < n; i++) {
queue_enqueue(q, &test_data[i]);
simqueue[simback++] = &test_data[i];
}
printf("Print Queue out, check resize...: \n");
queue_print(q, print_int);
/*
* Dequeue the remaining values held in the queue and make sure they're the
* correct values.
*/
printf("\n== Dequeueing remaining values: front / dequeued (expected)\n");
while (simfront < simback && !queue_isempty(q)) {
int* expected = simqueue[simfront];
simqueue[simfront] = NULL;
simfront++;
int* front = queue_front(q);
int* dequeued = queue_dequeue(q);
if (front && dequeued) {
printf(" - %4d / %4d (%4d)\n", *front, *dequeued, *expected);
} else {
printf(" - front (%p) or dequeued (%p) is NULL (expected: %4d)\n", front,
dequeued, *expected);
}
}
printf("Print Queue: \n");
queue_print(q, print_int);
/*
* Make sure the queue is actually empty and also exhausted all actual data.
*/
printf("\n== Is queue empty (expect 1)? %d\n", queue_isempty(q));
printf("== Saw all test data (expect 1)? %d\n", simfront == simback);
/*
* add some values to the queue to fully test queue_free() function
*/
struct dynarray** dy = (struct dynarray**) q;
if (dy){
for (i = 0; i < k_enq; i++) {
dynarray_insert(*dy, &test_data[i]);
}
}
queue_free(q);
free(test_data);
free(simqueue);
return 0;
}