queue not long from CmiAlloc
[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 CmiFree free
12
13 #define RUN_TEST(f) do { \
14   ++tests; \
15   if (f()) { \
16     ++success; \
17   } else { \
18     ++fail; \
19     cerr << "Test \"" #f "\" failed" << endl; \
20   } \
21 } while (0)
22
23 // A newly created Queue should be empty, which corresponds to a
24 // length of 0
25 bool test_empty()
26 {
27   Queue q = CqsCreate();
28   bool result = (0 == CqsLength(q)) && (1 == CqsEmpty(q));
29   CqsDelete(q);
30   return result;
31 }
32
33 // Enqueueing an element should show that there is an element
34 // present. We should get the same thing back when we dequeue
35 //
36 // The queue is not allowed to dereference the void* we give it
37 bool test_one()
38 {
39   Queue q = CqsCreate();
40   void *p = 0;
41   CqsEnqueue(q, p);
42   bool result = (1 == CqsLength(q)) && (0 == CqsEmpty(q));
43   void *r;
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   CqsDequeue(q, &r);
62   CqsDequeue(q, &s);
63   result &= (r == i && s == j) || (r == j && s == i);
64   result &= 1 == CqsEmpty(q);
65   CqsDelete(q);
66   return result;
67 }
68
69 bool test_fifo()
70 {
71   Queue q = CqsCreate();
72   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
73   void *r, *s, *t;
74   CqsEnqueueFifo(q, i);
75   CqsEnqueueFifo(q, j);
76   CqsEnqueueFifo(q, k);
77   CqsDequeue(q, &r);
78   CqsDequeue(q, &s);
79   CqsDequeue(q, &t);
80   bool result = (r == i) && (s == j) && (t == k);
81   CqsDelete(q);
82   return result;
83 }
84
85 bool test_lifo()
86 {
87   Queue q = CqsCreate();
88   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
89   void *r, *s, *t;
90   CqsEnqueueLifo(q, i);
91   CqsEnqueueLifo(q, j);
92   CqsEnqueueLifo(q, k);
93   CqsDequeue(q, &r);
94   CqsDequeue(q, &s);
95   CqsDequeue(q, &t);
96   bool result = (r == k) && (s == j) && (t == i);
97   CqsDelete(q);
98   return result;
99 }
100
101 bool test_enqueue_mixed()
102 {
103   Queue q = CqsCreate();
104   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
105   void *r, *s, *t;
106   CqsEnqueueFifo(q, i);
107   CqsEnqueueFifo(q, j);
108   CqsEnqueueLifo(q, k);
109   CqsDequeue(q, &r);
110   CqsDequeue(q, &s);
111   CqsDequeue(q, &t);
112   bool result = (r == k) && (s == i) && (t == j);
113   CqsDelete(q);
114   return result;
115 }
116
117 static bool findEntry(void ** const e, int num, void * const t)
118 {
119     for (int i = 0; i < num; ++i)
120     {
121         if (e[i] == t)
122             return true;
123     }
124     return false;
125 }
126
127 bool test_enumerate()
128 {
129   Queue q = CqsCreate();
130   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
131   void **e;
132   CqsEnqueueFifo(q, i);
133   CqsEnqueueFifo(q, j);
134   CqsEnqueueLifo(q, k);
135   CqsEnumerateQueue(q, &e);
136   int n = CqsLength(q);
137   bool result = findEntry(e, n, i) && findEntry(e, n, j) && findEntry(e, n, k);
138   CmiFree(e);
139   CqsDelete(q);
140   return result;
141 }
142
143 bool test_general_fifo()
144 {
145   Queue q = CqsCreate();
146   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
147   void **e;
148   CqsEnqueueGeneral(q, i, CQS_QUEUEING_FIFO, 1, 0);
149   CqsEnqueueGeneral(q, j, CQS_QUEUEING_FIFO, 2, 0);
150   CqsEnqueueGeneral(q, k, CQS_QUEUEING_FIFO, 42, 0);
151   void *r, *s, *t;
152   CqsDequeue(q, &r);
153   CqsDequeue(q, &s);
154   CqsDequeue(q, &t);
155   bool result = (r == i) && (s == j) && (t == k);
156   cerr << "r s t" << r << s << t;
157   CqsDelete(q);
158   return result;
159 }
160
161 bool test_general_ififo()
162 {
163   Queue q = CqsCreate();
164   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
165   void **e;
166   unsigned int a = -1, b = 0, c = 1;
167   CqsEnqueueGeneral(q, i, CQS_QUEUEING_IFIFO, 8*sizeof(int), &c);
168   CqsEnqueueGeneral(q, j, CQS_QUEUEING_IFIFO, 8*sizeof(int), &b);
169   CqsEnqueueGeneral(q, k, CQS_QUEUEING_IFIFO, 8*sizeof(int), &a);
170   void *r, *s, *t;
171   CqsDequeue(q, &r);
172   CqsDequeue(q, &s);
173   CqsDequeue(q, &t);
174   bool result = (r == k) && (s == j) && (t == i);
175   cerr << "r s t" << r << s << t;
176   CqsDelete(q);
177   return result;
178 }
179
180 #if 0
181 // Template for new harness-driven tests
182 bool test_foo()
183 {
184   Queue q = CqsCreate();
185   
186   bool result = ;
187   CqsDelete(q);
188   return result;
189 }
190 #endif
191
192 struct main : public CBase_main
193 {
194   main(CkArgMsg *)
195   {
196     int tests = 0, success = 0, fail = 0;
197     char message[100];
198
199     RUN_TEST(test_empty);
200     RUN_TEST(test_one);
201     RUN_TEST(test_two);
202     RUN_TEST(test_fifo);
203     RUN_TEST(test_lifo);
204     RUN_TEST(test_enqueue_mixed);
205     RUN_TEST(test_enumerate);
206     RUN_TEST(test_general_fifo);
207     RUN_TEST(test_general_ififo);
208
209     if (fail) {
210       sprintf(message, "%d/%d tests failed\n", fail, tests);
211       CkAbort(message);
212     }
213     else {
214       CkPrintf("All %d tests passed\n", tests);
215       CkExit();
216     }
217   }
218
219 };
220
221 #include "main.def.h"