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 : }
72 :
73 1 : void testErase()
74 : {
75 1 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec;
76 1 : SwContent *p1 = new SwContent(1);
77 1 : SwContent *p2 = new SwContent(2);
78 1 : SwContent *p3 = new SwContent(3);
79 1 : SwContent *p4 = new SwContent(4);
80 :
81 1 : aVec.insert(p1);
82 1 : aVec.insert(p2);
83 1 : aVec.insert(p3);
84 :
85 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
86 1 : CPPUNIT_ASSERT( aVec.size() == 2 );
87 :
88 1 : aVec.erase(1);
89 1 : CPPUNIT_ASSERT( aVec.size() == 1 );
90 :
91 1 : CPPUNIT_ASSERT( aVec.erase(p4) == 0 );
92 :
93 1 : aVec.clear();
94 1 : CPPUNIT_ASSERT( aVec.size() == 0 );
95 :
96 1 : aVec.insert(p1);
97 1 : aVec.insert(p2);
98 1 : aVec.insert(p3);
99 1 : aVec.DeleteAndDestroyAll();
100 1 : CPPUNIT_ASSERT( aVec.size() == 0 );
101 1 : delete p4;
102 1 : }
103 :
104 1 : void testInsertRange()
105 : {
106 1 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec1;
107 1 : SwContent *p1 = new SwContent(1);
108 1 : SwContent *p2 = new SwContent(2);
109 1 : SwContent *p3 = new SwContent(3);
110 :
111 1 : aVec1.insert(p1);
112 1 : aVec1.insert(p2);
113 1 : aVec1.insert(p3);
114 :
115 2 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec2;
116 1 : aVec2.insert( aVec1 );
117 :
118 2 : CPPUNIT_ASSERT( aVec2.size() == 3 );
119 1 : }
120 :
121 1 : void testLowerBound()
122 : {
123 1 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec;
124 1 : SwContent *p1 = new SwContent(1);
125 1 : SwContent *p2 = new SwContent(2);
126 1 : SwContent *p3 = new SwContent(3);
127 1 : SwContent *p4 = new SwContent(4);
128 :
129 1 : aVec.insert(p1);
130 1 : aVec.insert(p2);
131 1 : aVec.insert(p3);
132 :
133 1 : CPPUNIT_ASSERT( aVec.lower_bound(p1) == aVec.begin() );
134 1 : CPPUNIT_ASSERT( aVec.lower_bound(p4) == aVec.end() );
135 1 : delete p4;
136 1 : }
137 :
138 1 : void testBasics_FindPtr()
139 : {
140 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
141 1 : o3tl::find_partialorder_ptrequals> aVec;
142 1 : SwContent *p1 = new SwContent(1);
143 1 : SwContent *p2 = new SwContent(2);
144 1 : SwContent *p2_2 = new SwContent(2);
145 1 : SwContent *p2_3 = new SwContent(2);
146 1 : SwContent *p2_4 = new SwContent(2);
147 1 : SwContent *p3 = new SwContent(3);
148 1 : SwContent *p4 = new SwContent(4);
149 :
150 1 : CPPUNIT_ASSERT( aVec.insert(p3).second );
151 1 : CPPUNIT_ASSERT( aVec.insert(p1).second );
152 1 : CPPUNIT_ASSERT( !aVec.insert(p3).second );
153 :
154 1 : CPPUNIT_ASSERT( aVec.size() == 2 );
155 :
156 1 : CPPUNIT_ASSERT( aVec[0] == p1 );
157 1 : CPPUNIT_ASSERT( aVec[1] == p3 );
158 :
159 1 : CPPUNIT_ASSERT( aVec.insert(p2_2).second );
160 1 : CPPUNIT_ASSERT( aVec.insert(p2_3).second );
161 1 : CPPUNIT_ASSERT( !aVec.insert(p2_2).second );
162 1 : CPPUNIT_ASSERT( aVec.insert(p2_4).second );
163 1 : CPPUNIT_ASSERT( aVec.size() == 5 );
164 :
165 1 : CPPUNIT_ASSERT( *aVec.begin() == p1 );
166 1 : CPPUNIT_ASSERT( *(aVec.end()-1) == p3 );
167 :
168 1 : CPPUNIT_ASSERT( aVec.front() == p1 );
169 1 : CPPUNIT_ASSERT( aVec.back() == p3 );
170 :
171 1 : CPPUNIT_ASSERT( aVec.find(p1) != aVec.end() );
172 1 : CPPUNIT_ASSERT( aVec.find(p1) - aVec.begin() == 0 );
173 1 : CPPUNIT_ASSERT( aVec.find(p3) != aVec.end() );
174 1 : CPPUNIT_ASSERT( aVec.find(p3) - aVec.begin() == 4 );
175 1 : CPPUNIT_ASSERT( aVec.find(p2) == aVec.end() );
176 1 : CPPUNIT_ASSERT( aVec.find(p4) == aVec.end() );
177 1 : CPPUNIT_ASSERT( aVec.find(p2_2) != aVec.end() );
178 1 : CPPUNIT_ASSERT( aVec.find(p2_2) - aVec.begin() >= 1 );
179 1 : CPPUNIT_ASSERT( aVec.find(p2_2) - aVec.begin() < 4 );
180 1 : CPPUNIT_ASSERT( aVec.find(p2_3) != aVec.end() );
181 1 : CPPUNIT_ASSERT( aVec.find(p2_3) - aVec.begin() >= 1 );
182 1 : CPPUNIT_ASSERT( aVec.find(p2_3) - aVec.begin() < 4 );
183 1 : CPPUNIT_ASSERT( aVec.find(p2_4) != aVec.end() );
184 1 : CPPUNIT_ASSERT( aVec.find(p2_4) - aVec.begin() >= 1 );
185 1 : CPPUNIT_ASSERT( aVec.find(p2_4) - aVec.begin() < 4 );
186 :
187 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
188 1 : CPPUNIT_ASSERT( aVec.size() == 4 );
189 1 : CPPUNIT_ASSERT( aVec.erase(p2) == 0 );
190 1 : CPPUNIT_ASSERT( aVec.erase(p2_3) == 1 );
191 1 : CPPUNIT_ASSERT( aVec.size() == 3 );
192 :
193 1 : aVec.DeleteAndDestroyAll();
194 1 : }
195 :
196 1 : void testErase_FindPtr()
197 : {
198 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
199 1 : o3tl::find_partialorder_ptrequals> aVec;
200 1 : SwContent *p1 = new SwContent(1);
201 1 : SwContent *p1_2 = new SwContent(1);
202 1 : SwContent *p1_3 = new SwContent(1);
203 1 : SwContent *p2 = new SwContent(2);
204 1 : SwContent *p3 = new SwContent(3);
205 1 : SwContent *p4 = new SwContent(4);
206 :
207 1 : aVec.insert(p1);
208 1 : aVec.insert(p2);
209 1 : aVec.insert(p3);
210 :
211 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
212 1 : CPPUNIT_ASSERT( aVec.size() == 2 );
213 :
214 1 : aVec.erase(1);
215 1 : CPPUNIT_ASSERT( aVec.size() == 1 );
216 :
217 1 : CPPUNIT_ASSERT( aVec.erase(p4) == 0 );
218 :
219 1 : aVec.clear();
220 1 : CPPUNIT_ASSERT( aVec.size() == 0 );
221 :
222 1 : aVec.insert(p1);
223 1 : aVec.insert(p2);
224 1 : aVec.insert(p3);
225 1 : aVec.insert(p1_2);
226 1 : CPPUNIT_ASSERT( aVec.size() == 4 );
227 1 : aVec.insert(p1_3);
228 1 : CPPUNIT_ASSERT( aVec.size() == 5 );
229 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
230 1 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
231 1 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
232 1 : CPPUNIT_ASSERT( aVec.find(p1_3) != aVec.end() );
233 1 : CPPUNIT_ASSERT( aVec.erase(p1_3) == 1 );
234 1 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
235 1 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
236 1 : CPPUNIT_ASSERT( aVec.find(p1_3) == aVec.end() );
237 1 : CPPUNIT_ASSERT( aVec.erase(p1_3) == 0 );
238 1 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
239 1 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
240 1 : CPPUNIT_ASSERT( aVec.find(p1_3) == aVec.end() );
241 :
242 1 : aVec.DeleteAndDestroyAll();
243 1 : CPPUNIT_ASSERT( aVec.size() == 0 );
244 1 : delete p4;
245 1 : }
246 :
247 :
248 :
249 : // Change the following lines only, if you add, remove or rename
250 : // member functions of the current class,
251 : // because these macros are need by auto register mechanism.
252 :
253 2 : CPPUNIT_TEST_SUITE(sorted_vector_test);
254 1 : CPPUNIT_TEST(testBasics);
255 1 : CPPUNIT_TEST(testErase);
256 1 : CPPUNIT_TEST(testInsertRange);
257 1 : CPPUNIT_TEST(testLowerBound);
258 1 : CPPUNIT_TEST(testBasics_FindPtr);
259 1 : CPPUNIT_TEST(testErase_FindPtr);
260 2 : CPPUNIT_TEST_SUITE_END();
261 : };
262 :
263 : // -----------------------------------------------------------------------------
264 3 : CPPUNIT_TEST_SUITE_REGISTRATION(sorted_vector_test);
265 :
266 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|