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 : }
102 :
103 1 : void testInsertRange()
104 : {
105 1 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec1;
106 1 : SwContent *p1 = new SwContent(1);
107 1 : SwContent *p2 = new SwContent(2);
108 1 : SwContent *p3 = new SwContent(3);
109 :
110 1 : aVec1.insert(p1);
111 1 : aVec1.insert(p2);
112 1 : aVec1.insert(p3);
113 :
114 1 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec2;
115 1 : aVec2.insert( aVec1 );
116 :
117 1 : CPPUNIT_ASSERT( aVec2.size() == 3 );
118 1 : }
119 :
120 1 : void testLowerBound()
121 : {
122 1 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> > aVec;
123 1 : SwContent *p1 = new SwContent(1);
124 1 : SwContent *p2 = new SwContent(2);
125 1 : SwContent *p3 = new SwContent(3);
126 1 : SwContent *p4 = new SwContent(4);
127 :
128 1 : aVec.insert(p1);
129 1 : aVec.insert(p2);
130 1 : aVec.insert(p3);
131 :
132 1 : CPPUNIT_ASSERT( aVec.lower_bound(p1) == aVec.begin() );
133 1 : CPPUNIT_ASSERT( aVec.lower_bound(p4) == aVec.end() );
134 1 : }
135 :
136 1 : void testBasics_FindPtr()
137 : {
138 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
139 1 : o3tl::find_partialorder_ptrequals> aVec;
140 1 : SwContent *p1 = new SwContent(1);
141 1 : SwContent *p2 = new SwContent(2);
142 1 : SwContent *p2_2 = new SwContent(2);
143 1 : SwContent *p2_3 = new SwContent(2);
144 1 : SwContent *p2_4 = new SwContent(2);
145 1 : SwContent *p3 = new SwContent(3);
146 1 : SwContent *p4 = new SwContent(4);
147 :
148 1 : CPPUNIT_ASSERT( aVec.insert(p3).second );
149 1 : CPPUNIT_ASSERT( aVec.insert(p1).second );
150 1 : CPPUNIT_ASSERT( !aVec.insert(p3).second );
151 :
152 1 : CPPUNIT_ASSERT( aVec.size() == 2 );
153 :
154 1 : CPPUNIT_ASSERT( aVec[0] == p1 );
155 1 : CPPUNIT_ASSERT( aVec[1] == p3 );
156 :
157 1 : CPPUNIT_ASSERT( aVec.insert(p2_2).second );
158 1 : CPPUNIT_ASSERT( aVec.insert(p2_3).second );
159 1 : CPPUNIT_ASSERT( !aVec.insert(p2_2).second );
160 1 : CPPUNIT_ASSERT( aVec.insert(p2_4).second );
161 1 : CPPUNIT_ASSERT( aVec.size() == 5 );
162 :
163 1 : CPPUNIT_ASSERT( *aVec.begin() == p1 );
164 1 : CPPUNIT_ASSERT( *(aVec.end()-1) == p3 );
165 :
166 1 : CPPUNIT_ASSERT( aVec.front() == p1 );
167 1 : CPPUNIT_ASSERT( aVec.back() == p3 );
168 :
169 1 : CPPUNIT_ASSERT( aVec.find(p1) != aVec.end() );
170 1 : CPPUNIT_ASSERT( aVec.find(p1) - aVec.begin() == 0 );
171 1 : CPPUNIT_ASSERT( aVec.find(p3) != aVec.end() );
172 1 : CPPUNIT_ASSERT( aVec.find(p3) - aVec.begin() == 4 );
173 1 : CPPUNIT_ASSERT( aVec.find(p2) == aVec.end() );
174 1 : CPPUNIT_ASSERT( aVec.find(p4) == aVec.end() );
175 1 : CPPUNIT_ASSERT( aVec.find(p2_2) != aVec.end() );
176 1 : CPPUNIT_ASSERT( aVec.find(p2_2) - aVec.begin() >= 1 );
177 1 : CPPUNIT_ASSERT( aVec.find(p2_2) - aVec.begin() < 4 );
178 1 : CPPUNIT_ASSERT( aVec.find(p2_3) != aVec.end() );
179 1 : CPPUNIT_ASSERT( aVec.find(p2_3) - aVec.begin() >= 1 );
180 1 : CPPUNIT_ASSERT( aVec.find(p2_3) - aVec.begin() < 4 );
181 1 : CPPUNIT_ASSERT( aVec.find(p2_4) != aVec.end() );
182 1 : CPPUNIT_ASSERT( aVec.find(p2_4) - aVec.begin() >= 1 );
183 1 : CPPUNIT_ASSERT( aVec.find(p2_4) - aVec.begin() < 4 );
184 :
185 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
186 1 : CPPUNIT_ASSERT( aVec.size() == 4 );
187 1 : CPPUNIT_ASSERT( aVec.erase(p2) == 0 );
188 1 : CPPUNIT_ASSERT( aVec.erase(p2_3) == 1 );
189 1 : CPPUNIT_ASSERT( aVec.size() == 3 );
190 :
191 1 : aVec.DeleteAndDestroyAll();
192 1 : }
193 :
194 1 : void testErase_FindPtr()
195 : {
196 : o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
197 1 : o3tl::find_partialorder_ptrequals> aVec;
198 1 : SwContent *p1 = new SwContent(1);
199 1 : SwContent *p1_2 = new SwContent(1);
200 1 : SwContent *p1_3 = new SwContent(1);
201 1 : SwContent *p2 = new SwContent(2);
202 1 : SwContent *p3 = new SwContent(3);
203 1 : SwContent *p4 = new SwContent(4);
204 :
205 1 : aVec.insert(p1);
206 1 : aVec.insert(p2);
207 1 : aVec.insert(p3);
208 :
209 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
210 1 : CPPUNIT_ASSERT( aVec.size() == 2 );
211 :
212 1 : aVec.erase(1);
213 1 : CPPUNIT_ASSERT( aVec.size() == 1 );
214 :
215 1 : CPPUNIT_ASSERT( aVec.erase(p4) == 0 );
216 :
217 1 : aVec.clear();
218 1 : CPPUNIT_ASSERT( aVec.size() == 0 );
219 :
220 1 : aVec.insert(p1);
221 1 : aVec.insert(p2);
222 1 : aVec.insert(p3);
223 1 : aVec.insert(p1_2);
224 1 : CPPUNIT_ASSERT( aVec.size() == 4 );
225 1 : aVec.insert(p1_3);
226 1 : CPPUNIT_ASSERT( aVec.size() == 5 );
227 1 : CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
228 1 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
229 1 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
230 1 : CPPUNIT_ASSERT( aVec.find(p1_3) != aVec.end() );
231 1 : CPPUNIT_ASSERT( aVec.erase(p1_3) == 1 );
232 1 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
233 1 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
234 1 : CPPUNIT_ASSERT( aVec.find(p1_3) == aVec.end() );
235 1 : CPPUNIT_ASSERT( aVec.erase(p1_3) == 0 );
236 1 : CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
237 1 : CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
238 1 : CPPUNIT_ASSERT( aVec.find(p1_3) == aVec.end() );
239 :
240 1 : aVec.DeleteAndDestroyAll();
241 1 : CPPUNIT_ASSERT( aVec.size() == 0 );
242 1 : }
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 2 : CPPUNIT_TEST_SUITE(sorted_vector_test);
251 1 : CPPUNIT_TEST(testBasics);
252 1 : CPPUNIT_TEST(testErase);
253 1 : CPPUNIT_TEST(testInsertRange);
254 1 : CPPUNIT_TEST(testLowerBound);
255 1 : CPPUNIT_TEST(testBasics_FindPtr);
256 1 : CPPUNIT_TEST(testErase_FindPtr);
257 2 : CPPUNIT_TEST_SUITE_END();
258 : };
259 :
260 : // -----------------------------------------------------------------------------
261 3 : CPPUNIT_TEST_SUITE_REGISTRATION(sorted_vector_test);
262 :
263 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|