Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : #include "cppunit/TestAssert.h"
11 : #include "cppunit/TestFixture.h"
12 : #include "cppunit/extensions/HelperMacros.h"
13 :
14 : #include <o3tl/sorted_vector.hxx>
15 :
16 : using namespace ::o3tl;
17 :
18 :
19 : // helper class
20 : class SwContent
21 : {
22 : public:
23 : int x;
24 :
25 28 : SwContent(int x_) : x(x_) {}
26 :
27 234 : bool operator<( const SwContent &rCmp) const
28 : {
29 234 : return x < rCmp.x;
30 : }
31 : };
32 :
33 18 : class sorted_vector_test : public CppUnit::TestFixture
34 : {
35 : public:
36 1 : void testBasics()
37 : {
38 1 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec;
39 1 : SwContent *p1 = new SwContent(1);
40 1 : SwContent *p2 = new SwContent(2);
41 1 : SwContent *p3 = new SwContent(3);
42 1 : SwContent *p4 = new SwContent(4);
43 :
44 1 : CPPUNIT_ASSERT( aVec.insert(p3).second );
45 1 : CPPUNIT_ASSERT( aVec.insert(p1).second );
46 1 : CPPUNIT_ASSERT( !aVec.insert(p3).second );
47 :
48 1 : CPPUNIT_ASSERT( aVec.size() == 2 );
49 :
50 1 : CPPUNIT_ASSERT( aVec[0] == p1 );
51 1 : CPPUNIT_ASSERT( aVec[1] == p3 );
52 :
53 1 : CPPUNIT_ASSERT( *aVec.begin() == p1 );
54 1 : CPPUNIT_ASSERT( *(aVec.end()-1) == p3 );
55 :
56 1 : CPPUNIT_ASSERT( aVec.front() == p1 );
57 1 : CPPUNIT_ASSERT( aVec.back() == p3 );
58 :
59 1 : CPPUNIT_ASSERT( aVec.find(p1) != aVec.end() );
60 1 : CPPUNIT_ASSERT( aVec.find(p1) - aVec.begin() == 0 );
61 1 : CPPUNIT_ASSERT( aVec.find(p3) != aVec.end() );
62 1 : CPPUNIT_ASSERT( aVec.find(p3) - aVec.begin() == 1 );
63 1 : CPPUNIT_ASSERT( aVec.find(p2) == aVec.end() );
64 1 : CPPUNIT_ASSERT( aVec.find(p4) == aVec.end() );
65 :
66 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
67 1 : CPPUNIT_ASSERT( aVec.size() == 1 );
68 1 : CPPUNIT_ASSERT( aVec.erase(p2) == 0 );
69 :
70 1 : aVec.DeleteAndDestroyAll();
71 1 : delete p1;
72 1 : delete p2;
73 1 : delete p4;
74 1 : }
75 :
76 1 : void testErase()
77 : {
78 1 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec;
79 1 : SwContent *p1 = new SwContent(1);
80 1 : SwContent *p2 = new SwContent(2);
81 1 : SwContent *p3 = new SwContent(3);
82 1 : SwContent *p4 = new SwContent(4);
83 :
84 1 : aVec.insert(p1);
85 1 : aVec.insert(p2);
86 1 : aVec.insert(p3);
87 :
88 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
89 1 : CPPUNIT_ASSERT( aVec.size() == 2 );
90 :
91 1 : aVec.erase(1);
92 1 : CPPUNIT_ASSERT( aVec.size() == 1 );
93 :
94 1 : CPPUNIT_ASSERT( aVec.erase(p4) == 0 );
95 :
96 1 : aVec.clear();
97 1 : CPPUNIT_ASSERT( aVec.size() == 0 );
98 :
99 1 : aVec.insert(p1);
100 1 : aVec.insert(p2);
101 1 : aVec.insert(p3);
102 1 : aVec.DeleteAndDestroyAll();
103 1 : CPPUNIT_ASSERT( aVec.size() == 0 );
104 1 : delete p4;
105 1 : }
106 :
107 1 : void testInsertRange()
108 : {
109 1 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec1;
110 1 : SwContent *p1 = new SwContent(1);
111 1 : SwContent *p2 = new SwContent(2);
112 1 : SwContent *p3 = new SwContent(3);
113 :
114 1 : aVec1.insert(p1);
115 1 : aVec1.insert(p2);
116 1 : aVec1.insert(p3);
117 :
118 2 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec2;
119 1 : aVec2.insert( aVec1 );
120 :
121 1 : CPPUNIT_ASSERT( aVec2.size() == 3 );
122 1 : delete p1;
123 1 : delete p2;
124 2 : delete p3;
125 1 : }
126 :
127 1 : void testLowerBound()
128 : {
129 1 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec;
130 1 : SwContent *p1 = new SwContent(1);
131 1 : SwContent *p2 = new SwContent(2);
132 1 : SwContent *p3 = new SwContent(3);
133 1 : SwContent *p4 = new SwContent(4);
134 :
135 1 : aVec.insert(p1);
136 1 : aVec.insert(p2);
137 1 : aVec.insert(p3);
138 :
139 1 : CPPUNIT_ASSERT( aVec.lower_bound(p1) == aVec.begin() );
140 1 : CPPUNIT_ASSERT( aVec.lower_bound(p4) == aVec.end() );
141 1 : delete p1;
142 1 : delete p2;
143 1 : delete p3;
144 1 : delete p4;
145 1 : }
146 :
147 1 : void testBasics_FindPtr()
148 : {
149 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
150 1 : o3tl::find_partialorder_ptrequals> aVec;
151 1 : SwContent *p1 = new SwContent(1);
152 1 : SwContent *p2 = new SwContent(2);
153 1 : SwContent *p2_2 = new SwContent(2);
154 1 : SwContent *p2_3 = new SwContent(2);
155 1 : SwContent *p2_4 = new SwContent(2);
156 1 : SwContent *p3 = new SwContent(3);
157 1 : SwContent *p4 = new SwContent(4);
158 :
159 1 : CPPUNIT_ASSERT( aVec.insert(p3).second );
160 1 : CPPUNIT_ASSERT( aVec.insert(p1).second );
161 1 : CPPUNIT_ASSERT( !aVec.insert(p3).second );
162 :
163 1 : CPPUNIT_ASSERT( aVec.size() == 2 );
164 :
165 1 : CPPUNIT_ASSERT( aVec[0] == p1 );
166 1 : CPPUNIT_ASSERT( aVec[1] == p3 );
167 :
168 1 : CPPUNIT_ASSERT( aVec.insert(p2_2).second );
169 1 : CPPUNIT_ASSERT( aVec.insert(p2_3).second );
170 1 : CPPUNIT_ASSERT( !aVec.insert(p2_2).second );
171 1 : CPPUNIT_ASSERT( aVec.insert(p2_4).second );
172 1 : CPPUNIT_ASSERT( aVec.size() == 5 );
173 :
174 1 : CPPUNIT_ASSERT( *aVec.begin() == p1 );
175 1 : CPPUNIT_ASSERT( *(aVec.end()-1) == p3 );
176 :
177 1 : CPPUNIT_ASSERT( aVec.front() == p1 );
178 1 : CPPUNIT_ASSERT( aVec.back() == p3 );
179 :
180 1 : CPPUNIT_ASSERT( aVec.find(p1) != aVec.end() );
181 1 : CPPUNIT_ASSERT( aVec.find(p1) - aVec.begin() == 0 );
182 1 : CPPUNIT_ASSERT( aVec.find(p3) != aVec.end() );
183 1 : CPPUNIT_ASSERT( aVec.find(p3) - aVec.begin() == 4 );
184 1 : CPPUNIT_ASSERT( aVec.find(p2) == aVec.end() );
185 1 : CPPUNIT_ASSERT( aVec.find(p4) == aVec.end() );
186 1 : CPPUNIT_ASSERT( aVec.find(p2_2) != aVec.end() );
187 1 : CPPUNIT_ASSERT( aVec.find(p2_2) - aVec.begin() >= 1 );
188 1 : CPPUNIT_ASSERT( aVec.find(p2_2) - aVec.begin() < 4 );
189 1 : CPPUNIT_ASSERT( aVec.find(p2_3) != aVec.end() );
190 1 : CPPUNIT_ASSERT( aVec.find(p2_3) - aVec.begin() >= 1 );
191 1 : CPPUNIT_ASSERT( aVec.find(p2_3) - aVec.begin() < 4 );
192 1 : CPPUNIT_ASSERT( aVec.find(p2_4) != aVec.end() );
193 1 : CPPUNIT_ASSERT( aVec.find(p2_4) - aVec.begin() >= 1 );
194 1 : CPPUNIT_ASSERT( aVec.find(p2_4) - aVec.begin() < 4 );
195 :
196 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
197 1 : CPPUNIT_ASSERT( aVec.size() == 4 );
198 1 : CPPUNIT_ASSERT( aVec.erase(p2) == 0 );
199 1 : CPPUNIT_ASSERT( aVec.erase(p2_3) == 1 );
200 1 : CPPUNIT_ASSERT( aVec.size() == 3 );
201 :
202 1 : aVec.DeleteAndDestroyAll();
203 1 : delete p1;
204 1 : delete p2;
205 1 : delete p2_3;
206 1 : delete p4;
207 1 : }
208 :
209 1 : void testErase_FindPtr()
210 : {
211 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
212 1 : o3tl::find_partialorder_ptrequals> aVec;
213 1 : SwContent *p1 = new SwContent(1);
214 1 : SwContent *p1_2 = new SwContent(1);
215 1 : SwContent *p1_3 = new SwContent(1);
216 1 : SwContent *p2 = new SwContent(2);
217 1 : SwContent *p3 = new SwContent(3);
218 1 : SwContent *p4 = new SwContent(4);
219 :
220 1 : aVec.insert(p1);
221 1 : aVec.insert(p2);
222 1 : aVec.insert(p3);
223 :
224 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
225 1 : CPPUNIT_ASSERT( aVec.size() == 2 );
226 :
227 1 : aVec.erase(1);
228 1 : CPPUNIT_ASSERT( aVec.size() == 1 );
229 :
230 1 : CPPUNIT_ASSERT( aVec.erase(p4) == 0 );
231 :
232 1 : aVec.clear();
233 1 : CPPUNIT_ASSERT( aVec.size() == 0 );
234 :
235 1 : aVec.insert(p1);
236 1 : aVec.insert(p2);
237 1 : aVec.insert(p3);
238 1 : aVec.insert(p1_2);
239 1 : CPPUNIT_ASSERT( aVec.size() == 4 );
240 1 : aVec.insert(p1_3);
241 1 : CPPUNIT_ASSERT( aVec.size() == 5 );
242 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
243 1 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
244 1 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
245 1 : CPPUNIT_ASSERT( aVec.find(p1_3) != aVec.end() );
246 1 : CPPUNIT_ASSERT( aVec.erase(p1_3) == 1 );
247 1 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
248 1 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
249 1 : CPPUNIT_ASSERT( aVec.find(p1_3) == aVec.end() );
250 1 : CPPUNIT_ASSERT( aVec.erase(p1_3) == 0 );
251 1 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
252 1 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
253 1 : CPPUNIT_ASSERT( aVec.find(p1_3) == aVec.end() );
254 :
255 1 : aVec.DeleteAndDestroyAll();
256 1 : CPPUNIT_ASSERT( aVec.size() == 0 );
257 1 : delete p1;
258 1 : delete p1_3;
259 1 : delete p4;
260 1 : }
261 :
262 :
263 :
264 : // Change the following lines only, if you add, remove or rename
265 : // member functions of the current class,
266 : // because these macros are need by auto register mechanism.
267 :
268 2 : CPPUNIT_TEST_SUITE(sorted_vector_test);
269 1 : CPPUNIT_TEST(testBasics);
270 1 : CPPUNIT_TEST(testErase);
271 1 : CPPUNIT_TEST(testInsertRange);
272 1 : CPPUNIT_TEST(testLowerBound);
273 1 : CPPUNIT_TEST(testBasics_FindPtr);
274 1 : CPPUNIT_TEST(testErase_FindPtr);
275 5 : CPPUNIT_TEST_SUITE_END();
276 : };
277 :
278 :
279 3 : CPPUNIT_TEST_SUITE_REGISTRATION(sorted_vector_test);
280 :
281 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|