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