1 // Special tests for erase_begin, erase_end and clear methods.
2 
3 // Copyright (c) 2009 Jan Gaspar
4 
5 // Use, modification, and distribution is subject to the Boost Software
6 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 
9 #define BOOST_CB_DISABLE_DEBUG
10 
11 #include "test.hpp"
12 
13 int MyInteger::ms_exception_trigger = 0;
14 int InstanceCounter::ms_count = 0;
15 
erase_begin_test()16 void erase_begin_test() {
17 
18     circular_buffer<int> cb1(5);
19     cb1.push_back(1);
20     cb1.push_back(2);
21     cb1.push_back(3);
22     cb1.push_back(4);
23     cb1.push_back(5);
24     cb1.push_back(6);
25 
26     circular_buffer<int>::pointer p = &cb1[0];
27 
28     cb1.erase_begin(2);
29 
30     BOOST_CHECK(cb1.size() == 3);
31     BOOST_CHECK(cb1[0] == 4);
32     BOOST_CHECK(cb1[1] == 5);
33     BOOST_CHECK(cb1[2] == 6);
34 
35     cb1.erase_begin(3);
36     BOOST_CHECK(cb1.empty());
37     BOOST_CHECK(*p == 2);
38     BOOST_CHECK(*(p + 1) == 3);
39     BOOST_CHECK(*(p + 2) == 4);
40 
41     cb1.push_back(10);
42     cb1.push_back(11);
43     cb1.push_back(12);
44 
45     BOOST_CHECK(cb1.size() == 3);
46     BOOST_CHECK(cb1[0] == 10);
47     BOOST_CHECK(cb1[1] == 11);
48     BOOST_CHECK(cb1[2] == 12);
49 
50     circular_buffer<InstanceCounter> cb2(5, InstanceCounter());
51 
52     BOOST_CHECK(cb2.size() == 5);
53     BOOST_CHECK(InstanceCounter::count() == 5);
54 
55     cb2.erase_begin(2);
56 
57     BOOST_CHECK(cb2.size() == 3);
58     BOOST_CHECK(InstanceCounter::count() == 3);
59 
60     circular_buffer<MyInteger> cb3(5);
61     cb3.push_back(1);
62     cb3.push_back(2);
63     cb3.push_back(3);
64     cb3.push_back(4);
65     cb3.push_back(5);
66     cb3.push_back(6);
67     cb3.erase_begin(2);
68 
69     BOOST_CHECK(cb3.size() == 3);
70     BOOST_CHECK(cb3[0] == 4);
71     BOOST_CHECK(cb3[1] == 5);
72     BOOST_CHECK(cb3[2] == 6);
73 }
74 
erase_end_test()75 void erase_end_test() {
76 
77     circular_buffer<int> cb1(5);
78     cb1.push_back(1);
79     cb1.push_back(2);
80     cb1.push_back(3);
81     cb1.push_back(4);
82     cb1.push_back(5);
83     cb1.push_back(6);
84 
85     circular_buffer<int>::pointer p = &cb1[3];
86 
87     cb1.erase_end(2);
88 
89     BOOST_CHECK(cb1.size() == 3);
90     BOOST_CHECK(cb1[0] == 2);
91     BOOST_CHECK(cb1[1] == 3);
92     BOOST_CHECK(cb1[2] ==4);
93 
94     cb1.erase_end(3);
95     BOOST_CHECK(cb1.empty());
96     BOOST_CHECK(*p == 5);
97     BOOST_CHECK(*(p - 1) == 4);
98     BOOST_CHECK(*(p - 2) == 3);
99 
100     cb1.push_back(10);
101     cb1.push_back(11);
102     cb1.push_back(12);
103 
104     BOOST_CHECK(cb1.size() == 3);
105     BOOST_CHECK(cb1[0] == 10);
106     BOOST_CHECK(cb1[1] == 11);
107     BOOST_CHECK(cb1[2] == 12);
108 
109     circular_buffer<InstanceCounter> cb2(5, InstanceCounter());
110 
111     BOOST_CHECK(cb2.size() == 5);
112     BOOST_CHECK(InstanceCounter::count() == 5);
113 
114     cb2.erase_end(2);
115 
116     BOOST_CHECK(cb2.size() == 3);
117     BOOST_CHECK(InstanceCounter::count() == 3);
118 
119     circular_buffer<MyInteger> cb3(5);
120     cb3.push_back(1);
121     cb3.push_back(2);
122     cb3.push_back(3);
123     cb3.push_back(4);
124     cb3.push_back(5);
125     cb3.push_back(6);
126     cb3.erase_end(2);
127 
128     BOOST_CHECK(cb3.size() == 3);
129     BOOST_CHECK(cb3[0] == 2);
130     BOOST_CHECK(cb3[1] == 3);
131     BOOST_CHECK(cb3[2] == 4);
132 }
133 
clear_test()134 void clear_test() {
135 
136     circular_buffer<int> cb1(5);
137     cb1.push_back(1);
138     cb1.push_back(2);
139     cb1.push_back(3);
140     cb1.push_back(4);
141     cb1.push_back(5);
142     cb1.push_back(6);
143 
144     circular_buffer<int>::pointer p = &cb1[0];
145 
146     cb1.clear();
147 
148     BOOST_CHECK(cb1.empty());
149     BOOST_CHECK(*p == 2);
150     BOOST_CHECK(*(p + 1) == 3);
151     BOOST_CHECK(*(p + 2) == 4);
152     BOOST_CHECK(*(p + 3) == 5);
153     BOOST_CHECK(*(p - 1) == 6);
154 
155     circular_buffer<InstanceCounter> cb2(5, InstanceCounter());
156 
157     BOOST_CHECK(cb2.size() == 5);
158     BOOST_CHECK(InstanceCounter::count() == 5);
159 
160     cb2.clear();
161 
162     BOOST_CHECK(cb2.empty());
163     BOOST_CHECK(InstanceCounter::count() == 0);
164 
165     circular_buffer<MyInteger> cb3(5);
166     cb3.push_back(1);
167     cb3.push_back(2);
168     cb3.push_back(3);
169     cb3.push_back(4);
170     cb3.push_back(5);
171     cb3.push_back(6);
172     cb3.clear();
173 
174     BOOST_CHECK(cb3.empty());
175 }
176 
177 // test main
init_unit_test_suite(int,char * [])178 test_suite* init_unit_test_suite(int /*argc*/, char* /*argv*/[]) {
179 
180     test_suite* tests = BOOST_TEST_SUITE("Unit tests for erase_begin/end and clear methods of the circular_buffer.");
181 
182     tests->add(BOOST_TEST_CASE(&erase_begin_test));
183     tests->add(BOOST_TEST_CASE(&erase_end_test));
184     tests->add(BOOST_TEST_CASE(&clear_test));
185 
186     return tests;
187 }
188