FCStack refactoring
[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 cds::container::fcstack::traits
103         {
104             static CDS_CONSTEXPR const bool enable_elimination = true;
105         };
106         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::deque<unsigned int> >, stack_traits > stack_type;
107         test<stack_type>();
108     }
109
110     void TestFCStack::FCStack_vector()
111     {
112         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::vector<unsigned int> > > stack_type;
113         test<stack_type>();
114     }
115
116     void TestFCStack::FCStack_vector_elimination()
117     {
118         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::vector<unsigned int> >,
119             cds::container::fcstack::make_traits<
120                 cds::opt::enable_elimination< true >
121             >::type
122         > stack_type;
123         test<stack_type>();
124     }
125
126     void TestFCStack::FCStack_list()
127     {
128         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::list<unsigned int> > > stack_type;
129         test<stack_type>();
130     }
131
132     void TestFCStack::FCStack_list_elimination()
133     {
134         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::list<unsigned int> >,
135             cds::container::fcstack::make_traits<
136                 cds::opt::enable_elimination< true >
137             >::type
138         > stack_type;
139         test<stack_type>();
140     }
141
142     CPPUNIT_TEST_SUITE_REGISTRATION(stack::TestFCStack);
143 }   // namespace stack
144