Test: Move to a name that won't cause problems
[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 #if 0
87 // Template for new harness-driven tests
88 bool test_foo()
89 {
90   Queue q = CqsCreate();
91   
92   bool result = ;
93   CqsDelete(q);
94   return result;
95 }
96 #endif
97
98 struct main : public CBase_main
99 {
100   main(CkArgMsg *)
101   {
102     int tests = 0, success = 0, fail = 0;
103     RUN_TEST(test_empty);
104     RUN_TEST(test_one);
105     RUN_TEST(test_two);
106     RUN_TEST(test_fifo);
107
108     if (fail) {
109       char message[100];
110       sprintf(message, "%d/%d tests failed\n", fail, tests);
111       CkAbort(message);
112     }
113     else
114       CkExit();
115   }
116
117 };
118
119 #include "main.def.h"