ac6e5e422c0d1da35d387eab44b3a3177ca5a8a4
[charm.git] / tests / charm++ / queue / pgm.C
1 #include <iostream>
2 #include <cstdlib>
3 #include <cstdio>
4
5 using std::cerr;
6 using std::endl;
7 using std::sprintf;
8
9 #include "queueing.h"
10 #include "main.decl.h"
11
12 #define CmiFree free
13
14 #define RUN_TEST(f) do { \
15   ++tests; \
16   if (f()) { \
17     ++success; \
18   } else { \
19     ++fail; \
20     cerr << "Test \"" #f "\" failed" << endl; \
21   } \
22 } while (0)
23
24 // A newly created Queue should be empty, which corresponds to a
25 // length of 0
26 bool test_empty()
27 {
28   Queue q = CqsCreate();
29   bool result = (0 == CqsLength(q)) && (1 == CqsEmpty(q));
30   CqsDelete(q);
31   return result;
32 }
33
34 // Enqueueing an element should show that there is an element
35 // present. We should get the same thing back when we dequeue
36 //
37 // The queue is not allowed to dereference the void* we give it
38 bool test_one()
39 {
40   Queue q = CqsCreate();
41   void *p = 0;
42   CqsEnqueue(q, p);
43   bool result = (1 == CqsLength(q)) && (0 == CqsEmpty(q));
44   void *r;
45   CqsDequeue(q, &r);
46   result &= (r == p) 
47     && (0 == CqsLength(q)) 
48     && (1 == CqsEmpty(q));
49   CqsDelete(q);
50   return result;
51 }
52
53 // Put two in, see if we get the same two back. Order unspecified
54 bool test_two()
55 {
56   Queue q = CqsCreate();
57   void *i = 0, *j = (char *)1;
58   void *r, *s;
59   CqsEnqueue(q, i);
60   CqsEnqueue(q, j);
61   bool result = (2 == CqsLength(q));
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   CmiFree(e);
140   CqsDelete(q);
141   return result;
142 }
143
144 bool test_general_fifo()
145 {
146   Queue q = CqsCreate();
147   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
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   CqsDelete(q);
157   return result;
158 }
159
160 bool test_general_ififo()
161 {
162   Queue q = CqsCreate();
163   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
164   unsigned int a = -1, b = 0, c = 1;
165   CqsEnqueueGeneral(q, i, CQS_QUEUEING_IFIFO, 8*sizeof(int), &c);
166   CqsEnqueueGeneral(q, j, CQS_QUEUEING_IFIFO, 8*sizeof(int), &b);
167   CqsEnqueueGeneral(q, k, CQS_QUEUEING_IFIFO, 8*sizeof(int), &a);
168   void *r, *s, *t;
169   CqsDequeue(q, &r);
170   CqsDequeue(q, &s);
171   CqsDequeue(q, &t);
172   bool result = (r == k) && (s == j) && (t == i);
173   CqsDelete(q);
174   return result;
175 }
176
177 #if 0
178 // Template for new harness-driven tests
179 bool test_foo()
180 {
181   Queue q = CqsCreate();
182   
183   bool result = ;
184   CqsDelete(q);
185   return result;
186 }
187 #endif
188
189 struct main : public CBase_main
190 {
191   main(CkArgMsg *)
192   {
193     int tests = 0, success = 0, fail = 0;
194     char message[100];
195
196     RUN_TEST(test_empty);
197     RUN_TEST(test_one);
198     RUN_TEST(test_two);
199     RUN_TEST(test_fifo);
200     RUN_TEST(test_lifo);
201     RUN_TEST(test_enqueue_mixed);
202     RUN_TEST(test_enumerate);
203     RUN_TEST(test_general_fifo);
204     RUN_TEST(test_general_ififo);
205
206     if (fail) {
207       sprintf(message, "%d/%d tests failed\n", fail, tests);
208       CkAbort(message);
209     }
210     else {
211       CkPrintf("All %d tests passed\n", tests);
212       CkExit();
213     }
214   }
215
216 };
217
218 #include "main.def.h"