Test: Queue covers LIFO and FIFO/LIFO mixed insertion
[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 #if 0
119 // Template for new harness-driven tests
120 bool test_foo()
121 {
122   Queue q = CqsCreate();
123   
124   bool result = ;
125   CqsDelete(q);
126   return result;
127 }
128 #endif
129
130 struct main : public CBase_main
131 {
132   main(CkArgMsg *)
133   {
134     int tests = 0, success = 0, fail = 0;
135     char message[100];
136
137     RUN_TEST(test_empty);
138     RUN_TEST(test_one);
139     RUN_TEST(test_two);
140     RUN_TEST(test_fifo);
141     RUN_TEST(test_lifo);
142     RUN_TEST(test_enqueue_mixed);
143
144     if (fail) {
145       sprintf(message, "%d/%d tests failed\n", fail, tests);
146       CkAbort(message);
147     }
148     else {
149       CkPrintf("All %d tests passed\n", tests);
150       CkExit();
151     }
152   }
153
154 };
155
156 #include "main.def.h"