Tests: Remove some warnings and junk output
[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   CqsEnqueueGeneral(q, i, CQS_QUEUEING_FIFO, 1, 0);
148   CqsEnqueueGeneral(q, j, CQS_QUEUEING_FIFO, 2, 0);
149   CqsEnqueueGeneral(q, k, CQS_QUEUEING_FIFO, 42, 0);
150   void *r, *s, *t;
151   CqsDequeue(q, &r);
152   CqsDequeue(q, &s);
153   CqsDequeue(q, &t);
154   bool result = (r == i) && (s == j) && (t == k);
155   CqsDelete(q);
156   return result;
157 }
158
159 bool test_general_ififo()
160 {
161   Queue q = CqsCreate();
162   void *i = (char *)1, *j = (char *)2, *k = (char *)3;
163   unsigned int a = -1, b = 0, c = 1;
164   CqsEnqueueGeneral(q, i, CQS_QUEUEING_IFIFO, 8*sizeof(int), &c);
165   CqsEnqueueGeneral(q, j, CQS_QUEUEING_IFIFO, 8*sizeof(int), &b);
166   CqsEnqueueGeneral(q, k, CQS_QUEUEING_IFIFO, 8*sizeof(int), &a);
167   void *r, *s, *t;
168   CqsDequeue(q, &r);
169   CqsDequeue(q, &s);
170   CqsDequeue(q, &t);
171   bool result = (r == k) && (s == j) && (t == i);
172   CqsDelete(q);
173   return result;
174 }
175
176 #if 0
177 // Template for new harness-driven tests
178 bool test_foo()
179 {
180   Queue q = CqsCreate();
181   
182   bool result = ;
183   CqsDelete(q);
184   return result;
185 }
186 #endif
187
188 struct main : public CBase_main
189 {
190   main(CkArgMsg *)
191   {
192     int tests = 0, success = 0, fail = 0;
193     char message[100];
194
195     RUN_TEST(test_empty);
196     RUN_TEST(test_one);
197     RUN_TEST(test_two);
198     RUN_TEST(test_fifo);
199     RUN_TEST(test_lifo);
200     RUN_TEST(test_enqueue_mixed);
201     RUN_TEST(test_enumerate);
202     RUN_TEST(test_general_fifo);
203     RUN_TEST(test_general_ififo);
204
205     if (fail) {
206       sprintf(message, "%d/%d tests failed\n", fail, tests);
207       CkAbort(message);
208     }
209     else {
210       CkPrintf("All %d tests passed\n", tests);
211       CkExit();
212     }
213   }
214
215 };
216
217 #include "main.def.h"