Test: Queue's enumerate functionality
[charm.git] / tests / charm++ / queue / pgm.C
1 #include <iostream>
2 #include <cstdlib>
3
4 using std::cerr;
5 using std::endl;
6 using std::sprintf;
7
8 #include "queueing.h"
9 #include "main.decl.h"
10
11 #define RUN_TEST(f) do { \
12   ++tests; \
13   if (f()) { \
14     ++success; \
15   } else { \
16     ++fail; \
17     cerr << "Test \"" #f "\" failed" << endl; \
18   } \
19 } while (0)
20
21 // A newly created Queue should be empty, which corresponds to a
22 // length of 0
23 bool test_empty()
24 {
25   Queue q = CqsCreate();
26   bool result = (0 == CqsLength(q)) && (1 == CqsEmpty(q));
27   result &= CqsMaxLength(q) >= 0;
28   CqsDelete(q);
29   return result;
30 }
31
32 // Enqueueing an element should show that there is an element
33 // present. We should get the same thing back when we dequeue
34 //
35 // The queue is not allowed to dereference the void* we give it
36 bool test_one()
37 {
38   Queue q = CqsCreate();
39   void *p = 0;
40   CqsEnqueue(q, p);
41   bool result = (1 == CqsLength(q)) && (0 == CqsEmpty(q));
42   void *r;
43   result &= CqsMaxLength(q) >= 1;
44   CqsDequeue(q, &r);
45   result &= (r == p) 
46     && (0 == CqsLength(q)) 
47     && (1 == CqsEmpty(q));
48   CqsDelete(q);
49   return result;
50 }
51
52 // Put two in, see if we get the same two back. Order unspecified
53 bool test_two()
54 {
55   Queue q = CqsCreate();
56   void *i = 0, *j = (char *)1;
57   void *r, *s;
58   CqsEnqueue(q, i);
59   CqsEnqueue(q, j);
60   bool result = (2 == CqsLength(q));
61   result &= CqsMaxLength(q) >= 2;
62   CqsDequeue(q, &r);
63   CqsDequeue(q, &s);
64   result &= (r == i && s == j) || (r == j && s == i);
65   result &= 1 == CqsEmpty(q);
66   CqsDelete(q);
67   return result;
68 }
69
70 bool test_fifo()
71 {
72   Queue q = CqsCreate();
73   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
74   void *r, *s, *t;
75   CqsEnqueueFifo(q, i);
76   CqsEnqueueFifo(q, j);
77   CqsEnqueueFifo(q, k);
78   CqsDequeue(q, &r);
79   CqsDequeue(q, &s);
80   CqsDequeue(q, &t);
81   bool result = (r == i) && (s == j) && (t == k);
82   CqsDelete(q);
83   return result;
84 }
85
86 bool test_lifo()
87 {
88   Queue q = CqsCreate();
89   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
90   void *r, *s, *t;
91   CqsEnqueueLifo(q, i);
92   CqsEnqueueLifo(q, j);
93   CqsEnqueueLifo(q, k);
94   CqsDequeue(q, &r);
95   CqsDequeue(q, &s);
96   CqsDequeue(q, &t);
97   bool result = (r == k) && (s == j) && (t == i);
98   CqsDelete(q);
99   return result;
100 }
101
102 bool test_enqueue_mixed()
103 {
104   Queue q = CqsCreate();
105   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
106   void *r, *s, *t;
107   CqsEnqueueFifo(q, i);
108   CqsEnqueueFifo(q, j);
109   CqsEnqueueLifo(q, k);
110   CqsDequeue(q, &r);
111   CqsDequeue(q, &s);
112   CqsDequeue(q, &t);
113   bool result = (r == k) && (s == i) && (t == j);
114   CqsDelete(q);
115   return result;
116 }
117
118 static bool findEntry(void ** const e, int num, void * const t)
119 {
120     for (int i = 0; i < num; ++i)
121     {
122         if (e[i] == t)
123             return true;
124     }
125     return false;
126 }
127
128 bool test_enumerate()
129 {
130   Queue q = CqsCreate();
131   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
132   void **e;
133   CqsEnqueueFifo(q, i);
134   CqsEnqueueFifo(q, j);
135   CqsEnqueueLifo(q, k);
136   CqsEnumerateQueue(q, &e);
137   int n = CqsLength(q);
138   bool result = findEntry(e, n, i) && findEntry(e, n, j) && findEntry(e, n, k);
139   CqsDelete(q);
140   return result;
141 }
142
143 #if 0
144 // Template for new harness-driven tests
145 bool test_foo()
146 {
147   Queue q = CqsCreate();
148   
149   bool result = ;
150   CqsDelete(q);
151   return result;
152 }
153 #endif
154
155 struct main : public CBase_main
156 {
157   main(CkArgMsg *)
158   {
159     int tests = 0, success = 0, fail = 0;
160     char message[100];
161
162     RUN_TEST(test_empty);
163     RUN_TEST(test_one);
164     RUN_TEST(test_two);
165     RUN_TEST(test_fifo);
166     RUN_TEST(test_lifo);
167     RUN_TEST(test_enqueue_mixed);
168     RUN_TEST(test_enumerate);
169
170     if (fail) {
171       sprintf(message, "%d/%d tests failed\n", fail, tests);
172       CkAbort(message);
173     }
174     else {
175       CkPrintf("All %d tests passed\n", tests);
176       CkExit();
177     }
178   }
179
180 };
181
182 #include "main.def.h"