remove michael_list_hrc.h
[libcds.git] / tests / test-hdr / stack / hdr_fcstack.cpp
1 //$$CDS-header$$
2
3 #include "cppunit/cppunit_proxy.h"
4 #include <cds/container/fcstack.h>
5
6 #include <vector>
7 #include <list>
8
9 namespace stack {
10
11     class TestFCStack: public CppUnitMini::TestCase
12     {
13         template <class Stack>
14         void test()
15         {
16             Stack s;
17             test_with( s );
18         }
19
20         template <class Stack>
21         void test_with( Stack& stack)
22         {
23             typedef typename Stack::value_type  value_type;
24             value_type v;
25
26             CPPUNIT_ASSERT( stack.empty() );
27             CPPUNIT_ASSERT( stack.size() == 0 );
28
29             CPPUNIT_ASSERT( stack.push(1));
30             CPPUNIT_ASSERT( !stack.empty() );
31             CPPUNIT_ASSERT( stack.size() == 1 );
32             CPPUNIT_ASSERT( stack.push(2));
33             CPPUNIT_ASSERT( !stack.empty() );
34             CPPUNIT_ASSERT( stack.size() == 2 );
35             CPPUNIT_ASSERT( stack.push(3));
36             CPPUNIT_ASSERT( !stack.empty() );
37             CPPUNIT_ASSERT( stack.size() == 3 );
38
39             CPPUNIT_ASSERT( stack.pop(v) );
40             CPPUNIT_ASSERT( v == 3 );
41             CPPUNIT_ASSERT( !stack.empty() );
42             CPPUNIT_ASSERT( stack.size() == 2 );
43             CPPUNIT_ASSERT( stack.pop(v) );
44             CPPUNIT_ASSERT( v == 2 );
45             CPPUNIT_ASSERT( !stack.empty() );
46             CPPUNIT_ASSERT( stack.size() == 1 );
47             CPPUNIT_ASSERT( stack.pop(v) );
48             CPPUNIT_ASSERT( v == 1 );
49             CPPUNIT_ASSERT( stack.empty() );
50             CPPUNIT_ASSERT( stack.size() == 0 );
51             v = 1000;
52             CPPUNIT_ASSERT( !stack.pop(v) );
53             CPPUNIT_ASSERT( v == 1000 );
54             CPPUNIT_ASSERT( stack.empty() );
55             CPPUNIT_ASSERT( stack.size() == 0 );
56
57             CPPUNIT_ASSERT( stack.push(10));
58             CPPUNIT_ASSERT( stack.push(20));
59             CPPUNIT_ASSERT( stack.push(30));
60             CPPUNIT_ASSERT( !stack.empty());
61             CPPUNIT_ASSERT( stack.size() == 3 );
62
63             while ( stack.pop(v) );
64
65             CPPUNIT_ASSERT( stack.empty() );
66             CPPUNIT_ASSERT( stack.size() == 0 );
67         }
68
69         void FCStack_default();
70         void FCStack_deque();
71         void FCStack_deque_elimination();
72         void FCStack_vector();
73         void FCStack_vector_elimination();
74         void FCStack_list();
75         void FCStack_list_elimination();
76
77         CPPUNIT_TEST_SUITE(TestFCStack);
78             CPPUNIT_TEST( FCStack_default )
79             CPPUNIT_TEST( FCStack_deque )
80             CPPUNIT_TEST( FCStack_deque_elimination )
81             CPPUNIT_TEST( FCStack_vector )
82             CPPUNIT_TEST( FCStack_vector_elimination )
83             CPPUNIT_TEST( FCStack_list )
84             CPPUNIT_TEST( FCStack_list_elimination )
85         CPPUNIT_TEST_SUITE_END();
86     };
87
88     void TestFCStack::FCStack_default()
89     {
90         typedef cds::container::FCStack< unsigned int > stack_type;
91         test<stack_type>();
92     }
93
94     void TestFCStack::FCStack_deque()
95     {
96         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::deque<unsigned int> > > stack_type;
97         test<stack_type>();
98     }
99
100     void TestFCStack::FCStack_deque_elimination()
101     {
102         struct stack_traits : public
103             cds::container::fcstack::make_traits <
104             cds::opt::enable_elimination < true >
105             > ::type
106         {};
107         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::deque<unsigned int> >, stack_traits > stack_type;
108         test<stack_type>();
109     }
110
111     void TestFCStack::FCStack_vector()
112     {
113         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::vector<unsigned int> > > stack_type;
114         test<stack_type>();
115     }
116
117     void TestFCStack::FCStack_vector_elimination()
118     {
119         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::vector<unsigned int> >,
120             cds::container::fcstack::make_traits<
121                 cds::opt::enable_elimination< true >
122             >::type
123         > stack_type;
124         test<stack_type>();
125     }
126
127     void TestFCStack::FCStack_list()
128     {
129         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::list<unsigned int> > > stack_type;
130         test<stack_type>();
131     }
132
133     void TestFCStack::FCStack_list_elimination()
134     {
135         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::list<unsigned int> >,
136             cds::container::fcstack::make_traits<
137                 cds::opt::enable_elimination< true >
138             >::type
139         > stack_type;
140         test<stack_type>();
141     }
142
143     CPPUNIT_TEST_SUITE_REGISTRATION(stack::TestFCStack);
144 }   // namespace stack
145