1efeef26fSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3efeef26fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4efeef26fSAndrew Rist * or more contributor license agreements. See the NOTICE file 5efeef26fSAndrew Rist * distributed with this work for additional information 6efeef26fSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7efeef26fSAndrew Rist * to you under the Apache License, Version 2.0 (the 8efeef26fSAndrew Rist * "License"); you may not use this file except in compliance 9efeef26fSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13efeef26fSAndrew Rist * Unless required by applicable law or agreed to in writing, 14efeef26fSAndrew Rist * software distributed under the License is distributed on an 15efeef26fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16efeef26fSAndrew Rist * KIND, either express or implied. See the License for the 17efeef26fSAndrew Rist * specific language governing permissions and limitations 18efeef26fSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20efeef26fSAndrew Rist *************************************************************/ 21efeef26fSAndrew Rist 22efeef26fSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sw.hxx" 26cdf0e10cSrcweir #define TIMELOG 27cdf0e10cSrcweir 284bafcef0SDamjan Jovanovic #include "gtest/gtest.h" 29cdf0e10cSrcweir #include <bparr.hxx> 30cdf0e10cSrcweir #include <string> 31cdf0e10cSrcweir #include <stdlib.h> 32cdf0e10cSrcweir #include <rtl/logfile.hxx> 33cdf0e10cSrcweir 34cdf0e10cSrcweir #undef ENABLE_DEBUG_OUTPUT 35cdf0e10cSrcweir 364bafcef0SDamjan Jovanovic // FIXME: 374bafcef0SDamjan Jovanovic #define RUN_OLD_FAILING_TESTS 0 384bafcef0SDamjan Jovanovic 39cdf0e10cSrcweir using namespace std; 40cdf0e10cSrcweir 41cdf0e10cSrcweir 42cdf0e10cSrcweir namespace /* private */ 43cdf0e10cSrcweir { 444bafcef0SDamjan Jovanovic const int NUM_ENTRIES = 1000; 45cdf0e10cSrcweir 46cdf0e10cSrcweir class BigPtrEntryMock : public BigPtrEntry 47cdf0e10cSrcweir { 48cdf0e10cSrcweir public: 49cdf0e10cSrcweir BigPtrEntryMock(int count) : count_(count) 50cdf0e10cSrcweir { 51cdf0e10cSrcweir } 52cdf0e10cSrcweir 53cdf0e10cSrcweir ~BigPtrEntryMock() 54cdf0e10cSrcweir { 55cdf0e10cSrcweir #ifdef ENABLE_DEBUG_OUTPUT 56cdf0e10cSrcweir printf("Destructor called (%i)\n", count_); 57cdf0e10cSrcweir #endif 58cdf0e10cSrcweir } 59cdf0e10cSrcweir 60cdf0e10cSrcweir int getCount() const 61cdf0e10cSrcweir { 62cdf0e10cSrcweir return count_; 63cdf0e10cSrcweir } 64cdf0e10cSrcweir 65cdf0e10cSrcweir void setCount(int newCount) 66cdf0e10cSrcweir { 67cdf0e10cSrcweir count_ = newCount; 68cdf0e10cSrcweir } 69cdf0e10cSrcweir 70cdf0e10cSrcweir sal_uLong Position() const 71cdf0e10cSrcweir { 72cdf0e10cSrcweir return GetPos(); 73cdf0e10cSrcweir } 74cdf0e10cSrcweir 75cdf0e10cSrcweir private: 76cdf0e10cSrcweir int count_; 77cdf0e10cSrcweir }; 78cdf0e10cSrcweir 79cdf0e10cSrcweir sal_Bool AddToCount(const ElementPtr& rElem, void* pArgs) 80cdf0e10cSrcweir { 81cdf0e10cSrcweir BigPtrEntryMock* const pbem = static_cast<BigPtrEntryMock* const>(rElem); 82cdf0e10cSrcweir pbem->setCount(pbem->getCount() + *((int*)pArgs)); 83cdf0e10cSrcweir return true; 84cdf0e10cSrcweir } 85cdf0e10cSrcweir 86cdf0e10cSrcweir void dumpBigPtrArray(const BigPtrArray& bparr) 87cdf0e10cSrcweir { 88cdf0e10cSrcweir #ifdef ENABLE_DEBUG_OUTPUT 89cdf0e10cSrcweir for (int i = 0; i < bparr.Count(); i++) 90cdf0e10cSrcweir printf("bparr[%i,%i]: %i\n", i, static_cast<BigPtrEntryMock*>(bparr[i])->Position(), static_cast<BigPtrEntryMock*>(bparr[i])->getCount()); 91cdf0e10cSrcweir 92cdf0e10cSrcweir printf("\n"); 93cdf0e10cSrcweir #endif 94cdf0e10cSrcweir } 95cdf0e10cSrcweir 96cdf0e10cSrcweir void fillBigPtrArray(BigPtrArray& bparr, sal_uLong numEntries) 97cdf0e10cSrcweir { 98cdf0e10cSrcweir for (int i = 0; i < numEntries; i++) 99cdf0e10cSrcweir bparr.Insert(new BigPtrEntryMock(i), bparr.Count()); 100cdf0e10cSrcweir } 101cdf0e10cSrcweir 102cdf0e10cSrcweir void printMethodName(const char* name) 103cdf0e10cSrcweir { 104cdf0e10cSrcweir #ifdef ENABLE_DEBUG_OUTPUT 105cdf0e10cSrcweir printf(name); 106cdf0e10cSrcweir #endif 107cdf0e10cSrcweir } 108cdf0e10cSrcweir 109cdf0e10cSrcweir bool checkElementPositions(const BigPtrArray& bparr) 110cdf0e10cSrcweir { 111cdf0e10cSrcweir for (int i = 0; i < bparr.Count(); i++) 112cdf0e10cSrcweir { 113cdf0e10cSrcweir if (static_cast<BigPtrEntryMock*>(bparr[i])->Position() != i) 114cdf0e10cSrcweir return false; 115cdf0e10cSrcweir } 116cdf0e10cSrcweir return true; 117cdf0e10cSrcweir } 118cdf0e10cSrcweir 119cdf0e10cSrcweir void releaseBigPtrArrayContent(BigPtrArray& bparr) 120cdf0e10cSrcweir { 121cdf0e10cSrcweir for (int i = 0; i < bparr.Count(); i++) 122cdf0e10cSrcweir delete bparr[i]; 123cdf0e10cSrcweir } 124cdf0e10cSrcweir 125cdf0e10cSrcweir RTL_LOGFILE_CONTEXT(logFile, "BigPtrArray performance measures" ); 126cdf0e10cSrcweir } 127cdf0e10cSrcweir 1284bafcef0SDamjan Jovanovic class BigPtrArrayUnittest : public ::testing::Test 129cdf0e10cSrcweir { 130cdf0e10cSrcweir public: 131cdf0e10cSrcweir 132cdf0e10cSrcweir BigPtrArrayUnittest() 133cdf0e10cSrcweir { 134cdf0e10cSrcweir } 1354bafcef0SDamjan Jovanovic }; 136cdf0e10cSrcweir 137cdf0e10cSrcweir /** Test constructor/destructor 138cdf0e10cSrcweir The size of the BigPtrArray 139cdf0e10cSrcweir aka the 'Count' should be 0 140cdf0e10cSrcweir initially. 141cdf0e10cSrcweir */ 1424bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_ctor) 143cdf0e10cSrcweir { 144cdf0e10cSrcweir printMethodName("test_ctor\n"); 145cdf0e10cSrcweir 146cdf0e10cSrcweir BigPtrArray bparr; 147cdf0e10cSrcweir 148*a22fd41bSmseidel ASSERT_TRUE(bparr.Count() == 0) << "BigPtrArray ctor failed"; 149cdf0e10cSrcweir } 150cdf0e10cSrcweir 1514bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_insert_entries_at_front) 152cdf0e10cSrcweir { 153cdf0e10cSrcweir printMethodName("test_insert_entries_at_front\n"); 154cdf0e10cSrcweir 155cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, "START: test_insert_entries_at_front"); 156cdf0e10cSrcweir 157cdf0e10cSrcweir BigPtrArray bparr; 158cdf0e10cSrcweir 159cdf0e10cSrcweir for (int i = 0; i < NUM_ENTRIES; i++) 160cdf0e10cSrcweir { 161cdf0e10cSrcweir sal_uLong oldCount = bparr.Count(); 162cdf0e10cSrcweir bparr.Insert(new BigPtrEntryMock(i), 0); 1634bafcef0SDamjan Jovanovic ASSERT_TRUE((bparr.Count() == oldCount + 1)) << "test_insert_entries_at_front failed"; 164cdf0e10cSrcweir } 165cdf0e10cSrcweir 166cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, "END: test_insert_entries_at_front"); 167cdf0e10cSrcweir 168cdf0e10cSrcweir for (int i = 0, j = NUM_ENTRIES - 1; i < NUM_ENTRIES; i++, j--) 169cdf0e10cSrcweir { 1704bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == j) << "test_insert_entries_at_front failed"; 171cdf0e10cSrcweir } 172cdf0e10cSrcweir 1734bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_insert_entries_at_front failed"; 174cdf0e10cSrcweir 175cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 176cdf0e10cSrcweir dumpBigPtrArray(bparr); 177cdf0e10cSrcweir } 178cdf0e10cSrcweir 1794bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_insert_entries_in_the_middle) 180cdf0e10cSrcweir { 181cdf0e10cSrcweir printMethodName("test_insert_entries_in_the_middle\n"); 182cdf0e10cSrcweir 183cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, "START: test_insert_entries_in_the_middle"); 184cdf0e10cSrcweir 185cdf0e10cSrcweir BigPtrArray bparr; 186cdf0e10cSrcweir 187cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 188cdf0e10cSrcweir dumpBigPtrArray(bparr); 189cdf0e10cSrcweir 190cdf0e10cSrcweir sal_uLong oldCount = bparr.Count(); 191cdf0e10cSrcweir 192cdf0e10cSrcweir bparr.Insert(new BigPtrEntryMock(NUM_ENTRIES), bparr.Count() / 2); 193cdf0e10cSrcweir 194cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, "END: test_insert_entries_in_the_middle"); 195cdf0e10cSrcweir 1964bafcef0SDamjan Jovanovic ASSERT_TRUE((oldCount + 1 == bparr.Count() && static_cast<BigPtrEntryMock*>(bparr[bparr.Count() / 2])->getCount() == NUM_ENTRIES)) << "test_insert_entries_in_the_middle failed"; 197cdf0e10cSrcweir 1984bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_insert_entries_in_the_middle failed"; 199cdf0e10cSrcweir 200cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 201cdf0e10cSrcweir dumpBigPtrArray(bparr); 202cdf0e10cSrcweir } 203cdf0e10cSrcweir 2044bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_insert_at_already_used_index) 205cdf0e10cSrcweir { 206cdf0e10cSrcweir printMethodName("test_insert_at_already_used_index\n"); 207cdf0e10cSrcweir 208cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, "START: test_insert_at_already_used_index"); 209cdf0e10cSrcweir 210cdf0e10cSrcweir BigPtrArray bparr; 211cdf0e10cSrcweir 212cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 213cdf0e10cSrcweir dumpBigPtrArray(bparr); 214cdf0e10cSrcweir 215cdf0e10cSrcweir int oldCount = bparr.Count(); 216cdf0e10cSrcweir 217cdf0e10cSrcweir for (int i = 0, j = -5; i < 5; i++, j++) 218cdf0e10cSrcweir bparr.Insert(new BigPtrEntryMock(j), i); 219cdf0e10cSrcweir 220cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, "END: test_insert_at_already_used_index"); 221cdf0e10cSrcweir 2224bafcef0SDamjan Jovanovic ASSERT_TRUE((oldCount + 5 == bparr.Count())) << "test_insert_at_already_used_index failed"; 223cdf0e10cSrcweir 224cdf0e10cSrcweir for (int i = 0, j = -5; i < bparr.Count(); i++, j++) 225cdf0e10cSrcweir { 2264bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == j) << "test_insert_at_already_used_index failed"; 227cdf0e10cSrcweir } 228cdf0e10cSrcweir 2294bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_insert_at_already_used_index failed"; 230cdf0e10cSrcweir 231cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 232cdf0e10cSrcweir dumpBigPtrArray(bparr); 233cdf0e10cSrcweir } 234cdf0e10cSrcweir 2354bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_insert_at_end) 236cdf0e10cSrcweir { 237cdf0e10cSrcweir printMethodName("test_insert_at_end\n"); 238cdf0e10cSrcweir 239cdf0e10cSrcweir BigPtrArray bparr; 240cdf0e10cSrcweir 241cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 242cdf0e10cSrcweir dumpBigPtrArray(bparr); 243cdf0e10cSrcweir 244cdf0e10cSrcweir sal_uLong oldCount = bparr.Count(); 245cdf0e10cSrcweir bparr.Insert(new BigPtrEntryMock(NUM_ENTRIES), bparr.Count()); 246cdf0e10cSrcweir 2474bafcef0SDamjan Jovanovic ASSERT_TRUE((oldCount + 1 == bparr.Count() && static_cast<BigPtrEntryMock*>(bparr[bparr.Count()-1])->getCount() == NUM_ENTRIES)) << "test_insert_at_end failed"; 248cdf0e10cSrcweir 2494bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_insert_at_end failed"; 250cdf0e10cSrcweir 251cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 252cdf0e10cSrcweir dumpBigPtrArray(bparr); 253cdf0e10cSrcweir } 254cdf0e10cSrcweir 2554bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_remove_at_front) 256cdf0e10cSrcweir { 257cdf0e10cSrcweir printMethodName("test_remove_at_front\n"); 258cdf0e10cSrcweir 259cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, "START: test_remove_at_front"); 260cdf0e10cSrcweir 261cdf0e10cSrcweir BigPtrArray bparr; 262cdf0e10cSrcweir 263cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 264cdf0e10cSrcweir dumpBigPtrArray(bparr); 265cdf0e10cSrcweir 266cdf0e10cSrcweir for (int i = 0; i < NUM_ENTRIES; i++) 267cdf0e10cSrcweir { 268cdf0e10cSrcweir sal_uLong oldCount = bparr.Count(); 269cdf0e10cSrcweir 270cdf0e10cSrcweir delete bparr[0]; // release content 271cdf0e10cSrcweir bparr.Remove(0); // remove item from container 272cdf0e10cSrcweir 2734bafcef0SDamjan Jovanovic ASSERT_TRUE((oldCount - 1 == bparr.Count())) << "test_remove_at_front failed (wrong count)"; 274cdf0e10cSrcweir 275cdf0e10cSrcweir for (int j = 0, k = i + 1; j < bparr.Count(); j++, k++) 276cdf0e10cSrcweir { 2774bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[j])->getCount() == k) << "test_remove_at_front failed"; 278cdf0e10cSrcweir } 279cdf0e10cSrcweir 2804bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_remove_at_front failed"; 281cdf0e10cSrcweir 282cdf0e10cSrcweir dumpBigPtrArray(bparr); 283cdf0e10cSrcweir } 284cdf0e10cSrcweir 285cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, "END: test_remove_at_front"); 286cdf0e10cSrcweir } 287cdf0e10cSrcweir 2884bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_remove_at_back) 289cdf0e10cSrcweir { 290cdf0e10cSrcweir printMethodName("test_remove_at_back\n"); 291cdf0e10cSrcweir 292cdf0e10cSrcweir BigPtrArray bparr; 293cdf0e10cSrcweir 294cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 295cdf0e10cSrcweir dumpBigPtrArray(bparr); 296cdf0e10cSrcweir 297cdf0e10cSrcweir for (int i = NUM_ENTRIES - 1; i >= 0; i--) 298cdf0e10cSrcweir { 299cdf0e10cSrcweir sal_uLong oldCount = bparr.Count(); 300cdf0e10cSrcweir delete bparr[i]; 301cdf0e10cSrcweir bparr.Remove(i); 302cdf0e10cSrcweir 3034bafcef0SDamjan Jovanovic ASSERT_TRUE((oldCount - 1 == bparr.Count())) << "test_remove_at_back failed (wrong count)"; 304cdf0e10cSrcweir 305cdf0e10cSrcweir for (int j = 0; j < bparr.Count(); j++) 306cdf0e10cSrcweir { 3074bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[j])->getCount() == j) << "test_remove_at_back failed"; 308cdf0e10cSrcweir } 309cdf0e10cSrcweir 3104bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_remove_at_back failed"; 311cdf0e10cSrcweir 312cdf0e10cSrcweir dumpBigPtrArray(bparr); 313cdf0e10cSrcweir } 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 3164bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_remove_in_the_middle) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir printMethodName("test_remove_in_the_middle\n"); 319cdf0e10cSrcweir 320cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, "START: test_remove_in_the_middle"); 321cdf0e10cSrcweir 322cdf0e10cSrcweir BigPtrArray bparr; 323cdf0e10cSrcweir 324cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 325cdf0e10cSrcweir dumpBigPtrArray(bparr); 326cdf0e10cSrcweir 327cdf0e10cSrcweir while (bparr.Count()) 328cdf0e10cSrcweir { 329cdf0e10cSrcweir sal_uLong oldCount = bparr.Count(); 330cdf0e10cSrcweir int oldElement = static_cast<BigPtrEntryMock*>(bparr[bparr.Count() / 2])->getCount(); 331cdf0e10cSrcweir 332cdf0e10cSrcweir delete bparr[bparr.Count() / 2]; 333cdf0e10cSrcweir bparr.Remove(bparr.Count() / 2); 334cdf0e10cSrcweir 3354bafcef0SDamjan Jovanovic ASSERT_TRUE((oldCount - 1 == bparr.Count())) << "test_remove_in_the_middle failed (wrong count)"; 336cdf0e10cSrcweir 337cdf0e10cSrcweir for (int i = 0; i < bparr.Count(); i++) 338cdf0e10cSrcweir { 3394bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() != oldElement) << "test_remove_in_the_middle failed"; 340cdf0e10cSrcweir } 341cdf0e10cSrcweir 3424bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_remove_in_the_middle failed"; 343cdf0e10cSrcweir 344cdf0e10cSrcweir dumpBigPtrArray(bparr); 345cdf0e10cSrcweir } 346cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, "END: test_remove_in_the_middle"); 347cdf0e10cSrcweir } 348cdf0e10cSrcweir 3494bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_remove_multiple_elements_at_once) 350cdf0e10cSrcweir { 351cdf0e10cSrcweir printMethodName("test_remove_multiple_elements_at_once\n"); 352cdf0e10cSrcweir 353cdf0e10cSrcweir BigPtrArray bparr; 354cdf0e10cSrcweir 355cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 356cdf0e10cSrcweir dumpBigPtrArray(bparr); 357cdf0e10cSrcweir 358cdf0e10cSrcweir while(bparr.Count()) 359cdf0e10cSrcweir { 360cdf0e10cSrcweir sal_uLong nRemove = (bparr.Count() > 3) ? 3 : bparr.Count(); 361cdf0e10cSrcweir sal_uLong oldCount = bparr.Count(); 362cdf0e10cSrcweir 363cdf0e10cSrcweir for (int i = 0; i < nRemove; i++) 364cdf0e10cSrcweir delete bparr[i]; 365cdf0e10cSrcweir 366cdf0e10cSrcweir bparr.Remove(0, nRemove); 367cdf0e10cSrcweir 3684bafcef0SDamjan Jovanovic ASSERT_TRUE((oldCount - nRemove == bparr.Count())) << "test_remove_multiple_elements_at_once failed"; 369cdf0e10cSrcweir 3704bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_remove_multiple_elements_at_once failed"; 371cdf0e10cSrcweir 372cdf0e10cSrcweir dumpBigPtrArray(bparr); 373cdf0e10cSrcweir } 374cdf0e10cSrcweir } 375cdf0e10cSrcweir 3764bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_remove_all_elements_at_once) 377cdf0e10cSrcweir { 378cdf0e10cSrcweir printMethodName("test_remove_all_elements_at_once\n"); 379cdf0e10cSrcweir 380cdf0e10cSrcweir BigPtrArray bparr; 381cdf0e10cSrcweir 382cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 383cdf0e10cSrcweir dumpBigPtrArray(bparr); 384cdf0e10cSrcweir 385cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 386cdf0e10cSrcweir bparr.Remove(0, bparr.Count()); 387cdf0e10cSrcweir 3884bafcef0SDamjan Jovanovic ASSERT_TRUE(bparr.Count() == 0) << "test_remove_all_elements_at_once failed"; 389cdf0e10cSrcweir 390cdf0e10cSrcweir dumpBigPtrArray(bparr); 391cdf0e10cSrcweir } 392cdf0e10cSrcweir 3934bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_move_elements_from_lower_to_higher_pos) 394cdf0e10cSrcweir { 395cdf0e10cSrcweir printMethodName("test_move_elements_from_lower_to_higher_pos\n"); 396cdf0e10cSrcweir 397cdf0e10cSrcweir BigPtrArray bparr; 398cdf0e10cSrcweir 399cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 400cdf0e10cSrcweir dumpBigPtrArray(bparr); 401cdf0e10cSrcweir 402cdf0e10cSrcweir for (int i = 0; i < NUM_ENTRIES - 1; i++) 403cdf0e10cSrcweir { 404cdf0e10cSrcweir bparr.Move(i, i + 2); 405cdf0e10cSrcweir dumpBigPtrArray(bparr); 406cdf0e10cSrcweir } 407cdf0e10cSrcweir 408cdf0e10cSrcweir for (int i = 0; i < (NUM_ENTRIES - 1); i++) 409cdf0e10cSrcweir { 4104bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i + 1)) << "test_move_elements_from_lower_to_higher_pos failed"; 411cdf0e10cSrcweir } 412cdf0e10cSrcweir 4134bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[NUM_ENTRIES -1])->getCount() == 0) << "test_move_elements_from_lower_to_higher_pos failed"; 414cdf0e10cSrcweir 4154bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_move_elements_from_lower_to_higher_pos failed"; 416cdf0e10cSrcweir 417cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 418cdf0e10cSrcweir } 419cdf0e10cSrcweir 4204bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_move_elements_from_higher_to_lower_pos) 421cdf0e10cSrcweir { 422cdf0e10cSrcweir printMethodName("test_move_elements_from_higher_to_lower_pos\n"); 423cdf0e10cSrcweir 424cdf0e10cSrcweir BigPtrArray bparr; 425cdf0e10cSrcweir 426cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 427cdf0e10cSrcweir dumpBigPtrArray(bparr); 428cdf0e10cSrcweir 429cdf0e10cSrcweir for (int i = NUM_ENTRIES - 1; i >= 1; i--) 430cdf0e10cSrcweir { 431cdf0e10cSrcweir bparr.Move(i, i - 1); 432cdf0e10cSrcweir dumpBigPtrArray(bparr); 433cdf0e10cSrcweir } 434cdf0e10cSrcweir 4354bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[0])->getCount() == (NUM_ENTRIES - 1)) << "test_move_elements_from_higher_to_lower_pos failed"; 436cdf0e10cSrcweir 437cdf0e10cSrcweir for (int i = 1; i < NUM_ENTRIES; i++) 438cdf0e10cSrcweir { 4394bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i - 1)) << "test_move_elements_from_higher_to_lower_pos failed"; 440cdf0e10cSrcweir } 441cdf0e10cSrcweir 4424bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_move_elements_from_higher_to_lower_pos failed"; 443cdf0e10cSrcweir 444cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 445cdf0e10cSrcweir } 446cdf0e10cSrcweir 4474bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_move_to_same_position) 448cdf0e10cSrcweir { 449cdf0e10cSrcweir printMethodName("test_move_to_same_position\n"); 450cdf0e10cSrcweir 451cdf0e10cSrcweir BigPtrArray bparr; 452cdf0e10cSrcweir 453cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 454cdf0e10cSrcweir dumpBigPtrArray(bparr); 455cdf0e10cSrcweir 456cdf0e10cSrcweir for (int i = 0; i < NUM_ENTRIES; i++) 457cdf0e10cSrcweir { 458cdf0e10cSrcweir bparr.Move(i, i); 459cdf0e10cSrcweir } 460cdf0e10cSrcweir 4614bafcef0SDamjan Jovanovic #if RUN_OLD_FAILING_TESTS 4624bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_move_to_same_position failed"; 4634bafcef0SDamjan Jovanovic #endif 4644bafcef0SDamjan Jovanovic 465cdf0e10cSrcweir dumpBigPtrArray(bparr); 466cdf0e10cSrcweir 467cdf0e10cSrcweir for (int i = 0; i < NUM_ENTRIES; i++) 468cdf0e10cSrcweir { 4694bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == i) << "test_move_to_same_position failed"; 470cdf0e10cSrcweir } 471cdf0e10cSrcweir 4724bafcef0SDamjan Jovanovic #if RUN_OLD_FAILING_TESTS 4734bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_move_to_same_position failed"; 4744bafcef0SDamjan Jovanovic #endif 475cdf0e10cSrcweir 476cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 477cdf0e10cSrcweir dumpBigPtrArray(bparr); 478cdf0e10cSrcweir } 479cdf0e10cSrcweir 4804bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_replace_elements) 481cdf0e10cSrcweir { 482cdf0e10cSrcweir printMethodName("test_replace_elements\n"); 483cdf0e10cSrcweir 484cdf0e10cSrcweir BigPtrArray bparr; 485cdf0e10cSrcweir 486cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 487cdf0e10cSrcweir dumpBigPtrArray(bparr); 488cdf0e10cSrcweir 489cdf0e10cSrcweir for (int i = 0, j = NUM_ENTRIES - 1; i < NUM_ENTRIES; i++, j--) 490cdf0e10cSrcweir { 491cdf0e10cSrcweir delete bparr[i]; 492cdf0e10cSrcweir bparr.Replace(i, new BigPtrEntryMock(j)); 493cdf0e10cSrcweir dumpBigPtrArray(bparr); 494cdf0e10cSrcweir } 495cdf0e10cSrcweir 496cdf0e10cSrcweir for (int i = 0; i < NUM_ENTRIES; i++) 497cdf0e10cSrcweir { 4984bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (NUM_ENTRIES - i - 1)) << "test_replace_elements failed"; 499cdf0e10cSrcweir } 500cdf0e10cSrcweir 5014bafcef0SDamjan Jovanovic ASSERT_TRUE(checkElementPositions(bparr)) << "test_replace_elements failed"; 502cdf0e10cSrcweir 503cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 504cdf0e10cSrcweir } 505cdf0e10cSrcweir 5064bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_for_each) 507cdf0e10cSrcweir { 508cdf0e10cSrcweir printMethodName("test_for_each\n"); 509cdf0e10cSrcweir 510cdf0e10cSrcweir BigPtrArray bparr; 511cdf0e10cSrcweir 512cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 513cdf0e10cSrcweir dumpBigPtrArray(bparr); 514cdf0e10cSrcweir 515cdf0e10cSrcweir int addCount = 1; 516cdf0e10cSrcweir bparr.ForEach(AddToCount, &addCount); 517cdf0e10cSrcweir 518cdf0e10cSrcweir for (int i = 0; i < NUM_ENTRIES; i++) 519cdf0e10cSrcweir { 5204bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i+1)) << "test_for_each failed"; 521cdf0e10cSrcweir } 522cdf0e10cSrcweir 523cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 524cdf0e10cSrcweir dumpBigPtrArray(bparr); 525cdf0e10cSrcweir } 526cdf0e10cSrcweir 5274bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_for_some1) 528cdf0e10cSrcweir { 529cdf0e10cSrcweir printMethodName("test_for_some1\n"); 530cdf0e10cSrcweir 531cdf0e10cSrcweir BigPtrArray bparr; 532cdf0e10cSrcweir 533cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 534cdf0e10cSrcweir dumpBigPtrArray(bparr); 535cdf0e10cSrcweir 536cdf0e10cSrcweir int addCount = 1; 537cdf0e10cSrcweir bparr.ForEach(0, NUM_ENTRIES / 2, AddToCount, &addCount); 538cdf0e10cSrcweir 539cdf0e10cSrcweir int i = 0; 540cdf0e10cSrcweir for (/* */; i < NUM_ENTRIES / 2; i++) 541cdf0e10cSrcweir { 5424bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i+1)) << "test_for_some1 failed"; 543cdf0e10cSrcweir } 544cdf0e10cSrcweir 545cdf0e10cSrcweir for (/* */; i < NUM_ENTRIES; i++) 546cdf0e10cSrcweir { 5474bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i)) << "test_for_some1 failed"; 548cdf0e10cSrcweir } 549cdf0e10cSrcweir 550cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 551cdf0e10cSrcweir dumpBigPtrArray(bparr); 552cdf0e10cSrcweir } 553cdf0e10cSrcweir 5544bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_for_some2) 555cdf0e10cSrcweir { 556cdf0e10cSrcweir printMethodName("test_for_some2\n"); 557cdf0e10cSrcweir 558cdf0e10cSrcweir BigPtrArray bparr; 559cdf0e10cSrcweir 560cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 561cdf0e10cSrcweir dumpBigPtrArray(bparr); 562cdf0e10cSrcweir 563cdf0e10cSrcweir int addCount = 1; 564cdf0e10cSrcweir bparr.ForEach(NUM_ENTRIES / 2, NUM_ENTRIES, AddToCount, &addCount); 565cdf0e10cSrcweir 566cdf0e10cSrcweir int i = 0; 567cdf0e10cSrcweir for (/* */; i < NUM_ENTRIES / 2; i++) 568cdf0e10cSrcweir { 5694bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i)) << "test_for_some2 failed"; 570cdf0e10cSrcweir } 571cdf0e10cSrcweir 572cdf0e10cSrcweir for (/* */; i < NUM_ENTRIES; i++) 573cdf0e10cSrcweir { 5744bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i+1)) << "test_for_some2 failed"; 575cdf0e10cSrcweir } 576cdf0e10cSrcweir 577cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 578cdf0e10cSrcweir dumpBigPtrArray(bparr); 579cdf0e10cSrcweir } 580cdf0e10cSrcweir 5814bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayUnittest, test_for_some3) 582cdf0e10cSrcweir { 583cdf0e10cSrcweir printMethodName("test_for_some3\n"); 584cdf0e10cSrcweir 585cdf0e10cSrcweir BigPtrArray bparr; 586cdf0e10cSrcweir 587cdf0e10cSrcweir fillBigPtrArray(bparr, NUM_ENTRIES); 588cdf0e10cSrcweir dumpBigPtrArray(bparr); 589cdf0e10cSrcweir 590cdf0e10cSrcweir int addCount = 1; 591cdf0e10cSrcweir bparr.ForEach(0, 0, AddToCount, &addCount); 592cdf0e10cSrcweir 593cdf0e10cSrcweir for (int i = 0; i < NUM_ENTRIES; i++) 594cdf0e10cSrcweir { 5954bafcef0SDamjan Jovanovic ASSERT_TRUE(static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == i) << "test_for_some3 failed"; 596cdf0e10cSrcweir } 597cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 598cdf0e10cSrcweir } 599cdf0e10cSrcweir 600cdf0e10cSrcweir 601cdf0e10cSrcweir const char* START = "START: "; 602cdf0e10cSrcweir const char* END = "END: "; 603cdf0e10cSrcweir 604cdf0e10cSrcweir class PerformanceTracer 605cdf0e10cSrcweir { 606cdf0e10cSrcweir public: 607cdf0e10cSrcweir 608cdf0e10cSrcweir public: 609cdf0e10cSrcweir PerformanceTracer(const string& methodName) : 610cdf0e10cSrcweir startString_(START), 611cdf0e10cSrcweir endString_(END) 612cdf0e10cSrcweir { 613cdf0e10cSrcweir startString_ += methodName; 614cdf0e10cSrcweir endString_ += methodName; 615cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, startString_.c_str()); 616cdf0e10cSrcweir } 617cdf0e10cSrcweir 618cdf0e10cSrcweir ~PerformanceTracer() 619cdf0e10cSrcweir { 620cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_TRACE(logFile, endString_.c_str()); 621cdf0e10cSrcweir } 622cdf0e10cSrcweir 623cdf0e10cSrcweir private: 624cdf0e10cSrcweir string startString_; 625cdf0e10cSrcweir string endString_; 626cdf0e10cSrcweir }; 627cdf0e10cSrcweir 6284bafcef0SDamjan Jovanovic class BigPtrArrayPerformanceTest : public ::testing::Test 629cdf0e10cSrcweir { 630cdf0e10cSrcweir public: 631cdf0e10cSrcweir BigPtrArrayPerformanceTest() 632cdf0e10cSrcweir { 633cdf0e10cSrcweir } 634cdf0e10cSrcweir 6354bafcef0SDamjan Jovanovic protected: 636cdf0e10cSrcweir void test_insert_at_end(const char* numElements) 637cdf0e10cSrcweir { 638cdf0e10cSrcweir char buff[100] = { 0 }; 639cdf0e10cSrcweir strcat(buff, "test_insert_at_end "); 640cdf0e10cSrcweir strcat(buff, numElements); 641cdf0e10cSrcweir int n = atoi(numElements); 642cdf0e10cSrcweir PerformanceTracer tracer(buff); 643cdf0e10cSrcweir BigPtrArray bparr; 644cdf0e10cSrcweir for (int i = 0; i < n; i++) 645cdf0e10cSrcweir bparr.Insert(new BigPtrEntryMock(i), bparr.Count()); 646cdf0e10cSrcweir 647cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 648cdf0e10cSrcweir } 649cdf0e10cSrcweir 650cdf0e10cSrcweir void test_insert_at_front(const char* numElements) 651cdf0e10cSrcweir { 652cdf0e10cSrcweir char buff[100] = { 0 }; 653cdf0e10cSrcweir strcat(buff, "test_insert_at_front "); 654cdf0e10cSrcweir strcat(buff, numElements); 655cdf0e10cSrcweir int n = atoi(numElements); 656cdf0e10cSrcweir PerformanceTracer tracer(buff); 657cdf0e10cSrcweir BigPtrArray bparr; 658cdf0e10cSrcweir for (int i = 0; i < n; i++) 659cdf0e10cSrcweir bparr.Insert(new BigPtrEntryMock(i), 0); 660cdf0e10cSrcweir 661cdf0e10cSrcweir releaseBigPtrArrayContent(bparr); 662cdf0e10cSrcweir } 663cdf0e10cSrcweir }; 664cdf0e10cSrcweir 6654bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayPerformanceTest, test_insert_at_end_1000) 6664bafcef0SDamjan Jovanovic { test_insert_at_end("1000"); } 6674bafcef0SDamjan Jovanovic 6684bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayPerformanceTest, test_insert_at_end_10000) 6694bafcef0SDamjan Jovanovic { test_insert_at_end("10000"); } 6704bafcef0SDamjan Jovanovic 6714bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayPerformanceTest, test_insert_at_end_100000) 6724bafcef0SDamjan Jovanovic { test_insert_at_end("100000"); } 6734bafcef0SDamjan Jovanovic 6744bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayPerformanceTest, test_insert_at_end_1000000) 6754bafcef0SDamjan Jovanovic { test_insert_at_end("1000000"); } 6764bafcef0SDamjan Jovanovic 6774bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayPerformanceTest, test_insert_at_front_1000) 6784bafcef0SDamjan Jovanovic { test_insert_at_front("1000"); } 6794bafcef0SDamjan Jovanovic 6804bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayPerformanceTest, test_insert_at_front_10000) 6814bafcef0SDamjan Jovanovic { test_insert_at_front("10000"); } 6824bafcef0SDamjan Jovanovic 6834bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayPerformanceTest, test_insert_at_front_100000) 6844bafcef0SDamjan Jovanovic { test_insert_at_front("100000"); } 6854bafcef0SDamjan Jovanovic 6864bafcef0SDamjan Jovanovic TEST_F(BigPtrArrayPerformanceTest, test_insert_at_front_1000000) 6874bafcef0SDamjan Jovanovic { test_insert_at_front("1000000"); } 6884bafcef0SDamjan Jovanovic 689cdf0e10cSrcweir 690cdf0e10cSrcweir //##################################### 691cdf0e10cSrcweir 6924bafcef0SDamjan Jovanovic int main(int argc, char **argv) 6934bafcef0SDamjan Jovanovic { 6944bafcef0SDamjan Jovanovic ::testing::InitGoogleTest(&argc, argv); 6954bafcef0SDamjan Jovanovic return RUN_ALL_TESTS(); 6964bafcef0SDamjan Jovanovic } 697