1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
11 #include <cppunit/TestAssert.h>
12 #include <cppunit/TestFixture.h>
13 #include <cppunit/extensions/HelperMacros.h>
15 #include <o3tl/sorted_vector.hxx>
16 #include <rtl/ustring.hxx>
18 using namespace ::o3tl
;
28 explicit SwContent(int x_
) : x(x_
) {}
30 bool operator<( const SwContent
&rCmp
) const
38 class sorted_vector_test
: public CppUnit::TestFixture
43 o3tl::sorted_vector
<SwContent
*, o3tl::less_ptr_to
<SwContent
> > aVec
;
45 // create 4 test elements
46 std::unique_ptr
<SwContent
> p1( new SwContent(1) );
47 std::unique_ptr
<SwContent
> p2( new SwContent(2) );
48 SwContent
*p3
= new SwContent(3);
49 std::unique_ptr
<SwContent
> p4( new SwContent(4) );
51 // insert p3, p1 -> not present -> second is true
52 CPPUNIT_ASSERT( aVec
.insert(p3
).second
);
53 CPPUNIT_ASSERT( aVec
.insert(p1
.get()).second
);
54 // insert p3 again -> already present -> second is false
55 CPPUNIT_ASSERT( !aVec
.insert(p3
).second
);
57 // 2 element should be present
58 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(2), aVec
.size() );
60 // check the order -> should be p1, p3
62 CPPUNIT_ASSERT_EQUAL( p1
.get(), aVec
[0] );
63 CPPUNIT_ASSERT_EQUAL( p3
, aVec
[1] );
65 CPPUNIT_ASSERT_EQUAL( p1
.get(), *aVec
.begin() );
66 CPPUNIT_ASSERT_EQUAL( p3
, *(aVec
.end()-1) );
68 CPPUNIT_ASSERT_EQUAL( p1
.get(), aVec
.front() );
69 CPPUNIT_ASSERT_EQUAL( p3
, aVec
.back() );
72 CPPUNIT_ASSERT( aVec
.find(p1
.get()) != aVec
.end() );
73 CPPUNIT_ASSERT_EQUAL( static_cast<std::ptrdiff_t>(0), aVec
.find(p1
.get()) - aVec
.begin() );
74 CPPUNIT_ASSERT( aVec
.find(p3
) != aVec
.end() );
75 CPPUNIT_ASSERT_EQUAL( static_cast<std::ptrdiff_t>(1), aVec
.find(p3
) - aVec
.begin() );
76 CPPUNIT_ASSERT( bool(aVec
.find(p2
.get()) == aVec
.end()) );
77 CPPUNIT_ASSERT( bool(aVec
.find(p4
.get()) == aVec
.end()) );
79 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(1), aVec
.erase(p1
.get()) );
80 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(1), aVec
.size() );
81 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(0), aVec
.erase(p2
.get()) );
83 aVec
.DeleteAndDestroyAll();
88 o3tl::sorted_vector
<SwContent
*, o3tl::less_ptr_to
<SwContent
> > aVec
;
89 SwContent
*p1
= new SwContent(1);
90 SwContent
*p2
= new SwContent(2);
91 SwContent
*p3
= new SwContent(3);
92 std::unique_ptr
<SwContent
> p4( new SwContent(4) );
98 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(1), aVec
.erase(p1
) );
99 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(2), aVec
.size() );
102 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(1), aVec
.size() );
104 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(0), aVec
.erase(p4
.get()) );
107 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(0), aVec
.size() );
112 aVec
.DeleteAndDestroyAll();
113 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(0), aVec
.size() );
116 void testInsertRange()
118 o3tl::sorted_vector
<SwContent
*, o3tl::less_ptr_to
<SwContent
> > aVec1
;
119 std::unique_ptr
<SwContent
> p1( new SwContent(1) );
120 std::unique_ptr
<SwContent
> p2( new SwContent(2) );
121 std::unique_ptr
<SwContent
> p3( new SwContent(3) );
123 aVec1
.insert(p1
.get());
124 aVec1
.insert(p2
.get());
125 aVec1
.insert(p3
.get());
127 o3tl::sorted_vector
<SwContent
*, o3tl::less_ptr_to
<SwContent
> > aVec2
;
128 aVec2
.insert( aVec1
);
130 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(3), aVec2
.size() );
133 void testLowerBound()
135 o3tl::sorted_vector
<SwContent
*, o3tl::less_ptr_to
<SwContent
> > aVec
;
136 std::unique_ptr
<SwContent
> p1( new SwContent(1) );
137 std::unique_ptr
<SwContent
> p2( new SwContent(2) );
138 std::unique_ptr
<SwContent
> p3( new SwContent(3) );
139 std::unique_ptr
<SwContent
> p4( new SwContent(4) );
141 aVec
.insert(p1
.get());
142 aVec
.insert(p2
.get());
143 aVec
.insert(p3
.get());
145 CPPUNIT_ASSERT( bool(aVec
.lower_bound(p1
.get()) == aVec
.begin()) );
146 CPPUNIT_ASSERT( bool(aVec
.lower_bound(p4
.get()) == aVec
.end()) );
149 void testBasics_FindPtr()
151 o3tl::sorted_vector
<SwContent
*, o3tl::less_ptr_to
<SwContent
>,
152 o3tl::find_partialorder_ptrequals
> aVec
;
153 std::unique_ptr
<SwContent
> p1( new SwContent(1) );
154 std::unique_ptr
<SwContent
> p2( new SwContent(2) );
155 SwContent
*p2_2
= new SwContent(2);
156 std::unique_ptr
<SwContent
> p2_3( new SwContent(2) );
157 SwContent
*p2_4
= new SwContent(2);
158 SwContent
*p3
= new SwContent(3);
159 std::unique_ptr
<SwContent
> p4( new SwContent(4) );
161 CPPUNIT_ASSERT( aVec
.insert(p3
).second
);
162 CPPUNIT_ASSERT( aVec
.insert(p1
.get()).second
);
163 CPPUNIT_ASSERT( !aVec
.insert(p3
).second
);
165 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(2), aVec
.size() );
167 CPPUNIT_ASSERT_EQUAL( p1
.get(), aVec
[0] );
168 CPPUNIT_ASSERT_EQUAL( p3
, aVec
[1] );
170 CPPUNIT_ASSERT( aVec
.insert(p2_2
).second
);
171 CPPUNIT_ASSERT( aVec
.insert(p2_3
.get()).second
);
172 CPPUNIT_ASSERT( !aVec
.insert(p2_2
).second
);
173 CPPUNIT_ASSERT( aVec
.insert(p2_4
).second
);
174 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(5), aVec
.size() );
176 CPPUNIT_ASSERT_EQUAL( p1
.get(), *aVec
.begin() );
177 CPPUNIT_ASSERT_EQUAL( p3
, *(aVec
.end()-1) );
179 CPPUNIT_ASSERT_EQUAL( p1
.get(), aVec
.front() );
180 CPPUNIT_ASSERT_EQUAL( p3
, aVec
.back() );
182 CPPUNIT_ASSERT( aVec
.find(p1
.get()) != aVec
.end() );
183 CPPUNIT_ASSERT_EQUAL( static_cast<std::ptrdiff_t>(0), aVec
.find(p1
.get()) - aVec
.begin() );
184 CPPUNIT_ASSERT( aVec
.find(p3
) != aVec
.end() );
185 CPPUNIT_ASSERT_EQUAL( static_cast<std::ptrdiff_t>(4), aVec
.find(p3
) - aVec
.begin() );
186 CPPUNIT_ASSERT( bool(aVec
.find(p2
.get()) == aVec
.end()) );
187 CPPUNIT_ASSERT( bool(aVec
.find(p4
.get()) == aVec
.end()) );
188 CPPUNIT_ASSERT( aVec
.find(p2_2
) != aVec
.end() );
189 CPPUNIT_ASSERT( aVec
.find(p2_2
) - aVec
.begin() >= 1 );
190 CPPUNIT_ASSERT( aVec
.find(p2_2
) - aVec
.begin() < 4 );
191 CPPUNIT_ASSERT( aVec
.find(p2_3
.get()) != aVec
.end() );
192 CPPUNIT_ASSERT( aVec
.find(p2_3
.get()) - aVec
.begin() >= 1 );
193 CPPUNIT_ASSERT( aVec
.find(p2_3
.get()) - aVec
.begin() < 4 );
194 CPPUNIT_ASSERT( aVec
.find(p2_4
) != aVec
.end() );
195 CPPUNIT_ASSERT( aVec
.find(p2_4
) - aVec
.begin() >= 1 );
196 CPPUNIT_ASSERT( aVec
.find(p2_4
) - aVec
.begin() < 4 );
198 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(1), aVec
.erase(p1
.get()) );
199 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(4), aVec
.size() );
200 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(0), aVec
.erase(p2
.get()) );
201 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(1), aVec
.erase(p2_3
.get()) );
202 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(3), aVec
.size() );
204 aVec
.DeleteAndDestroyAll();
207 void testErase_FindPtr()
209 o3tl::sorted_vector
<SwContent
*, o3tl::less_ptr_to
<SwContent
>,
210 o3tl::find_partialorder_ptrequals
> aVec
;
211 std::unique_ptr
<SwContent
> p1( new SwContent(1) );
212 SwContent
*p1_2
= new SwContent(1);
213 std::unique_ptr
<SwContent
> p1_3( new SwContent(1) );
214 SwContent
*p2
= new SwContent(2);
215 SwContent
*p3
= new SwContent(3);
216 std::unique_ptr
<SwContent
> p4( new SwContent(4) );
218 aVec
.insert(p1
.get());
222 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(1), aVec
.erase(p1
.get()) );
223 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(2), aVec
.size() );
226 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(1), aVec
.size() );
228 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(0), aVec
.erase(p4
.get()) );
231 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(0), aVec
.size() );
233 aVec
.insert(p1
.get());
237 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(4), aVec
.size() );
238 aVec
.insert(p1_3
.get());
239 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(5), aVec
.size() );
240 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(1), aVec
.erase(p1
.get()) );
241 CPPUNIT_ASSERT( bool(aVec
.find(p1
.get()) == aVec
.end()) );
242 CPPUNIT_ASSERT( aVec
.find(p1_2
) != aVec
.end() );
243 CPPUNIT_ASSERT( aVec
.find(p1_3
.get()) != aVec
.end() );
244 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(1), aVec
.erase(p1_3
.get()) );
245 CPPUNIT_ASSERT( bool(aVec
.find(p1
.get()) == aVec
.end()) );
246 CPPUNIT_ASSERT( aVec
.find(p1_2
) != aVec
.end() );
247 CPPUNIT_ASSERT( bool(aVec
.find(p1_3
.get()) == aVec
.end()) );
248 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(0), aVec
.erase(p1_3
.get()) );
249 CPPUNIT_ASSERT( bool(aVec
.find(p1
.get()) == aVec
.end()) );
250 CPPUNIT_ASSERT( aVec
.find(p1_2
) != aVec
.end() );
251 CPPUNIT_ASSERT( bool(aVec
.find(p1_3
.get()) == aVec
.end()) );
253 aVec
.DeleteAndDestroyAll();
254 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(0), aVec
.size() );
257 void testUniquePtr1()
259 o3tl::sorted_vector
<std::unique_ptr
<OUString
>, o3tl::less_uniqueptr_to
<OUString
>> aVec
;
261 auto str_c
= aVec
.insert(std::make_unique
<OUString
>("c")).first
->get();
262 auto str_b1
= aVec
.insert(std::make_unique
<OUString
>("b")).first
->get();
263 CPPUNIT_ASSERT(!aVec
.insert(std::make_unique
<OUString
>("b")).second
);
264 aVec
.insert(std::make_unique
<OUString
>("a"));
265 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(3), aVec
.size() );
266 CPPUNIT_ASSERT_EQUAL( OUString("a"), *aVec
[0] );
267 CPPUNIT_ASSERT_EQUAL( OUString("b"), *aVec
[1] );
268 CPPUNIT_ASSERT_EQUAL( OUString("c"), *aVec
[2] );
270 CPPUNIT_ASSERT( aVec
.find(str_c
) != aVec
.end() );
271 CPPUNIT_ASSERT( aVec
.find(str_b1
) != aVec
.end() );
274 CPPUNIT_ASSERT( aVec
.find(&tmp
) != aVec
.end() );
276 CPPUNIT_ASSERT( bool(aVec
.find(&tmp2
) == aVec
.end()) );
279 void testUniquePtr2()
281 o3tl::sorted_vector
<std::unique_ptr
<OUString
>, o3tl::less_uniqueptr_to
<OUString
>,
282 o3tl::find_partialorder_ptrequals
> aVec
;
284 auto str_c
= aVec
.insert(std::make_unique
<OUString
>("c")).first
->get();
285 auto str_b1
= aVec
.insert(std::make_unique
<OUString
>("b")).first
->get();
286 auto str_b2
= aVec
.insert(std::make_unique
<OUString
>("b")).first
->get();
287 aVec
.insert(std::make_unique
<OUString
>("a"));
288 CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(4), aVec
.size() );
289 CPPUNIT_ASSERT_EQUAL( OUString("a"), *aVec
[0] );
290 CPPUNIT_ASSERT_EQUAL( OUString("b"), *aVec
[1] );
291 CPPUNIT_ASSERT_EQUAL( OUString("b"), *aVec
[2] );
292 CPPUNIT_ASSERT_EQUAL( OUString("c"), *aVec
[3] );
294 CPPUNIT_ASSERT( aVec
.find(str_c
) != aVec
.end() );
295 CPPUNIT_ASSERT( aVec
.find(str_b1
) != aVec
.end() );
296 CPPUNIT_ASSERT( aVec
.find(str_b2
) != aVec
.end() );
299 CPPUNIT_ASSERT( bool(aVec
.find(&tmp2
) == aVec
.end()) );
302 // Change the following lines only, if you add, remove or rename
303 // member functions of the current class,
304 // because these macros are need by auto register mechanism.
306 CPPUNIT_TEST_SUITE(sorted_vector_test
);
307 CPPUNIT_TEST(testBasics
);
308 CPPUNIT_TEST(testErase
);
309 CPPUNIT_TEST(testInsertRange
);
310 CPPUNIT_TEST(testLowerBound
);
311 CPPUNIT_TEST(testBasics_FindPtr
);
312 CPPUNIT_TEST(testErase_FindPtr
);
313 CPPUNIT_TEST(testUniquePtr1
);
314 CPPUNIT_TEST(testUniquePtr2
);
315 CPPUNIT_TEST_SUITE_END();
319 CPPUNIT_TEST_SUITE_REGISTRATION(sorted_vector_test
);
321 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */