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 56 : SwContent(int x_) : x(x_) {}
26 :
27 468 : bool operator<( const SwContent &rCmp) const
28 : {
29 468 : return x < rCmp.x;
30 : }
31 : };
32 :
33 36 : class sorted_vector_test : public CppUnit::TestFixture
34 : {
35 : public:
36 2 : void testBasics()
37 : {
38 2 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec;
39 2 : SwContent *p1 = new SwContent(1);
40 2 : SwContent *p2 = new SwContent(2);
41 2 : SwContent *p3 = new SwContent(3);
42 2 : SwContent *p4 = new SwContent(4);
43 :
44 2 : CPPUNIT_ASSERT( aVec.insert(p3).second );
45 2 : CPPUNIT_ASSERT( aVec.insert(p1).second );
46 2 : CPPUNIT_ASSERT( !aVec.insert(p3).second );
47 :
48 2 : CPPUNIT_ASSERT( aVec.size() == 2 );
49 :
50 2 : CPPUNIT_ASSERT( aVec[0] == p1 );
51 2 : CPPUNIT_ASSERT( aVec[1] == p3 );
52 :
53 2 : CPPUNIT_ASSERT( *aVec.begin() == p1 );
54 2 : CPPUNIT_ASSERT( *(aVec.end()-1) == p3 );
55 :
56 2 : CPPUNIT_ASSERT( aVec.front() == p1 );
57 2 : CPPUNIT_ASSERT( aVec.back() == p3 );
58 :
59 2 : CPPUNIT_ASSERT( aVec.find(p1) != aVec.end() );
60 2 : CPPUNIT_ASSERT( aVec.find(p1) - aVec.begin() == 0 );
61 2 : CPPUNIT_ASSERT( aVec.find(p3) != aVec.end() );
62 2 : CPPUNIT_ASSERT( aVec.find(p3) - aVec.begin() == 1 );
63 2 : CPPUNIT_ASSERT( aVec.find(p2) == aVec.end() );
64 2 : CPPUNIT_ASSERT( aVec.find(p4) == aVec.end() );
65 :
66 2 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
67 2 : CPPUNIT_ASSERT( aVec.size() == 1 );
68 2 : CPPUNIT_ASSERT( aVec.erase(p2) == 0 );
69 :
70 2 : aVec.DeleteAndDestroyAll();
71 2 : delete p1;
72 2 : delete p2;
73 2 : delete p4;
74 2 : }
75 :
76 2 : void testErase()
77 : {
78 2 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec;
79 2 : SwContent *p1 = new SwContent(1);
80 2 : SwContent *p2 = new SwContent(2);
81 2 : SwContent *p3 = new SwContent(3);
82 2 : SwContent *p4 = new SwContent(4);
83 :
84 2 : aVec.insert(p1);
85 2 : aVec.insert(p2);
86 2 : aVec.insert(p3);
87 :
88 2 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
89 2 : CPPUNIT_ASSERT( aVec.size() == 2 );
90 :
91 2 : aVec.erase(1);
92 2 : CPPUNIT_ASSERT( aVec.size() == 1 );
93 :
94 2 : CPPUNIT_ASSERT( aVec.erase(p4) == 0 );
95 :
96 2 : aVec.clear();
97 2 : CPPUNIT_ASSERT( aVec.size() == 0 );
98 :
99 2 : aVec.insert(p1);
100 2 : aVec.insert(p2);
101 2 : aVec.insert(p3);
102 2 : aVec.DeleteAndDestroyAll();
103 2 : CPPUNIT_ASSERT( aVec.size() == 0 );
104 2 : delete p4;
105 2 : }
106 :
107 2 : void testInsertRange()
108 : {
109 2 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec1;
110 2 : SwContent *p1 = new SwContent(1);
111 2 : SwContent *p2 = new SwContent(2);
112 2 : SwContent *p3 = new SwContent(3);
113 :
114 2 : aVec1.insert(p1);
115 2 : aVec1.insert(p2);
116 2 : aVec1.insert(p3);
117 :
118 4 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec2;
119 2 : aVec2.insert( aVec1 );
120 :
121 2 : CPPUNIT_ASSERT( aVec2.size() == 3 );
122 2 : delete p1;
123 2 : delete p2;
124 4 : delete p3;
125 2 : }
126 :
127 2 : void testLowerBound()
128 : {
129 2 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec;
130 2 : SwContent *p1 = new SwContent(1);
131 2 : SwContent *p2 = new SwContent(2);
132 2 : SwContent *p3 = new SwContent(3);
133 2 : SwContent *p4 = new SwContent(4);
134 :
135 2 : aVec.insert(p1);
136 2 : aVec.insert(p2);
137 2 : aVec.insert(p3);
138 :
139 2 : CPPUNIT_ASSERT( aVec.lower_bound(p1) == aVec.begin() );
140 2 : CPPUNIT_ASSERT( aVec.lower_bound(p4) == aVec.end() );
141 2 : delete p1;
142 2 : delete p2;
143 2 : delete p3;
144 2 : delete p4;
145 2 : }
146 :
147 2 : void testBasics_FindPtr()
148 : {
149 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
150 2 : o3tl::find_partialorder_ptrequals> aVec;
151 2 : SwContent *p1 = new SwContent(1);
152 2 : SwContent *p2 = new SwContent(2);
153 2 : SwContent *p2_2 = new SwContent(2);
154 2 : SwContent *p2_3 = new SwContent(2);
155 2 : SwContent *p2_4 = new SwContent(2);
156 2 : SwContent *p3 = new SwContent(3);
157 2 : SwContent *p4 = new SwContent(4);
158 :
159 2 : CPPUNIT_ASSERT( aVec.insert(p3).second );
160 2 : CPPUNIT_ASSERT( aVec.insert(p1).second );
161 2 : CPPUNIT_ASSERT( !aVec.insert(p3).second );
162 :
163 2 : CPPUNIT_ASSERT( aVec.size() == 2 );
164 :
165 2 : CPPUNIT_ASSERT( aVec[0] == p1 );
166 2 : CPPUNIT_ASSERT( aVec[1] == p3 );
167 :
168 2 : CPPUNIT_ASSERT( aVec.insert(p2_2).second );
169 2 : CPPUNIT_ASSERT( aVec.insert(p2_3).second );
170 2 : CPPUNIT_ASSERT( !aVec.insert(p2_2).second );
171 2 : CPPUNIT_ASSERT( aVec.insert(p2_4).second );
172 2 : CPPUNIT_ASSERT( aVec.size() == 5 );
173 :
174 2 : CPPUNIT_ASSERT( *aVec.begin() == p1 );
175 2 : CPPUNIT_ASSERT( *(aVec.end()-1) == p3 );
176 :
177 2 : CPPUNIT_ASSERT( aVec.front() == p1 );
178 2 : CPPUNIT_ASSERT( aVec.back() == p3 );
179 :
180 2 : CPPUNIT_ASSERT( aVec.find(p1) != aVec.end() );
181 2 : CPPUNIT_ASSERT( aVec.find(p1) - aVec.begin() == 0 );
182 2 : CPPUNIT_ASSERT( aVec.find(p3) != aVec.end() );
183 2 : CPPUNIT_ASSERT( aVec.find(p3) - aVec.begin() == 4 );
184 2 : CPPUNIT_ASSERT( aVec.find(p2) == aVec.end() );
185 2 : CPPUNIT_ASSERT( aVec.find(p4) == aVec.end() );
186 2 : CPPUNIT_ASSERT( aVec.find(p2_2) != aVec.end() );
187 2 : CPPUNIT_ASSERT( aVec.find(p2_2) - aVec.begin() >= 1 );
188 2 : CPPUNIT_ASSERT( aVec.find(p2_2) - aVec.begin() < 4 );
189 2 : CPPUNIT_ASSERT( aVec.find(p2_3) != aVec.end() );
190 2 : CPPUNIT_ASSERT( aVec.find(p2_3) - aVec.begin() >= 1 );
191 2 : CPPUNIT_ASSERT( aVec.find(p2_3) - aVec.begin() < 4 );
192 2 : CPPUNIT_ASSERT( aVec.find(p2_4) != aVec.end() );
193 2 : CPPUNIT_ASSERT( aVec.find(p2_4) - aVec.begin() >= 1 );
194 2 : CPPUNIT_ASSERT( aVec.find(p2_4) - aVec.begin() < 4 );
195 :
196 2 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
197 2 : CPPUNIT_ASSERT( aVec.size() == 4 );
198 2 : CPPUNIT_ASSERT( aVec.erase(p2) == 0 );
199 2 : CPPUNIT_ASSERT( aVec.erase(p2_3) == 1 );
200 2 : CPPUNIT_ASSERT( aVec.size() == 3 );
201 :
202 2 : aVec.DeleteAndDestroyAll();
203 2 : delete p1;
204 2 : delete p2;
205 2 : delete p2_3;
206 2 : delete p4;
207 2 : }
208 :
209 2 : void testErase_FindPtr()
210 : {
211 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
212 2 : o3tl::find_partialorder_ptrequals> aVec;
213 2 : SwContent *p1 = new SwContent(1);
214 2 : SwContent *p1_2 = new SwContent(1);
215 2 : SwContent *p1_3 = new SwContent(1);
216 2 : SwContent *p2 = new SwContent(2);
217 2 : SwContent *p3 = new SwContent(3);
218 2 : SwContent *p4 = new SwContent(4);
219 :
220 2 : aVec.insert(p1);
221 2 : aVec.insert(p2);
222 2 : aVec.insert(p3);
223 :
224 2 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
225 2 : CPPUNIT_ASSERT( aVec.size() == 2 );
226 :
227 2 : aVec.erase(1);
228 2 : CPPUNIT_ASSERT( aVec.size() == 1 );
229 :
230 2 : CPPUNIT_ASSERT( aVec.erase(p4) == 0 );
231 :
232 2 : aVec.clear();
233 2 : CPPUNIT_ASSERT( aVec.size() == 0 );
234 :
235 2 : aVec.insert(p1);
236 2 : aVec.insert(p2);
237 2 : aVec.insert(p3);
238 2 : aVec.insert(p1_2);
239 2 : CPPUNIT_ASSERT( aVec.size() == 4 );
240 2 : aVec.insert(p1_3);
241 2 : CPPUNIT_ASSERT( aVec.size() == 5 );
242 2 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
243 2 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
244 2 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
245 2 : CPPUNIT_ASSERT( aVec.find(p1_3) != aVec.end() );
246 2 : CPPUNIT_ASSERT( aVec.erase(p1_3) == 1 );
247 2 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
248 2 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
249 2 : CPPUNIT_ASSERT( aVec.find(p1_3) == aVec.end() );
250 2 : CPPUNIT_ASSERT( aVec.erase(p1_3) == 0 );
251 2 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
252 2 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
253 2 : CPPUNIT_ASSERT( aVec.find(p1_3) == aVec.end() );
254 :
255 2 : aVec.DeleteAndDestroyAll();
256 2 : CPPUNIT_ASSERT( aVec.size() == 0 );
257 2 : delete p1;
258 2 : delete p1_3;
259 2 : delete p4;
260 2 : }
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 4 : CPPUNIT_TEST_SUITE(sorted_vector_test);
269 2 : CPPUNIT_TEST(testBasics);
270 2 : CPPUNIT_TEST(testErase);
271 2 : CPPUNIT_TEST(testInsertRange);
272 2 : CPPUNIT_TEST(testLowerBound);
273 2 : CPPUNIT_TEST(testBasics_FindPtr);
274 2 : CPPUNIT_TEST(testErase_FindPtr);
275 4 : CPPUNIT_TEST_SUITE_END();
276 : };
277 :
278 :
279 6 : CPPUNIT_TEST_SUITE_REGISTRATION(sorted_vector_test);
280 :
281 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|