LCOV - code coverage report
Current view: top level - libreoffice/sw/qa/core - Test-BigPtrArray.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 320 325 98.5 %
Date: 2012-12-27 Functions: 37 40 92.5 %
Legend: Lines: hit not hit

          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             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <sal/types.h>
      21             : #include <cppunit/TestAssert.h>
      22             : #include <cppunit/TestFixture.h>
      23             : #include <cppunit/extensions/HelperMacros.h>
      24             : #include <cppunit/plugin/TestPlugIn.h>
      25             : 
      26             : //#define TIMELOG for measuring performance
      27             : 
      28             : #include <string.h>
      29             : #include <stdlib.h>
      30             : 
      31             : #include <rtl/logfile.hxx>
      32             : 
      33             : #include <bparr.hxx>
      34             : 
      35             : using namespace std;
      36             : 
      37             : 
      38             : namespace /* private */
      39             : {
      40             :     const sal_uLong NUM_ENTRIES = 10;
      41             : 
      42             :     class BigPtrEntryMock : public BigPtrEntry
      43             :     {
      44             :     public:
      45         177 :         BigPtrEntryMock(sal_uLong count) : count_(count)
      46             :         {
      47         177 :         }
      48             : 
      49         354 :         ~BigPtrEntryMock()
      50         177 :         {
      51         354 :         }
      52             : 
      53         262 :         sal_uLong getCount() const
      54             :         {
      55         262 :             return count_;
      56             :         }
      57             : 
      58          20 :         void setCount(sal_uLong newCount)
      59             :         {
      60          20 :             count_ = newCount;
      61          20 :         }
      62             : 
      63         224 :         sal_uLong Position() const
      64             :         {
      65         224 :             return GetPos();
      66             :         }
      67             : 
      68             :     private:
      69             :         sal_uLong count_;
      70             :     };
      71             : 
      72          20 :     bool AddToCount(const ElementPtr& rElem, void* pArgs)
      73             :     {
      74          20 :         BigPtrEntryMock* const pbem = static_cast<BigPtrEntryMock* const>(rElem);
      75          20 :         pbem->setCount(pbem->getCount() + *((sal_uLong*)pArgs));
      76          20 :         return true;
      77             :     }
      78             : 
      79          85 :     void dumpBigPtrArray(const BigPtrArray& bparr)
      80             :     {
      81             :         (void)bparr;
      82          85 :     }
      83             : 
      84          15 :     void fillBigPtrArray(BigPtrArray& bparr, sal_uLong numEntries)
      85             :     {
      86         165 :         for (sal_uLong i = 0; i < numEntries; i++)
      87         150 :             bparr.Insert(new BigPtrEntryMock(i), bparr.Count());
      88          15 :     }
      89             : 
      90          17 :     void printMethodName(const char* name)
      91             :     {
      92             :         (void)name;
      93          17 :     }
      94             : 
      95          41 :     bool checkElementPositions(const BigPtrArray& bparr)
      96             :     {
      97         265 :         for (sal_uLong i = 0; i < bparr.Count(); i++)
      98             :         {
      99         224 :             if (static_cast<BigPtrEntryMock*>(bparr[i])->Position() != i)
     100           0 :                 return false;
     101             :         }
     102          41 :         return true;
     103             :     }
     104             : 
     105          12 :     void releaseBigPtrArrayContent(BigPtrArray& bparr)
     106             :     {
     107         139 :         for (sal_uLong i = 0; i < bparr.Count(); i++)
     108         127 :             delete bparr[i];
     109          12 :     }
     110             : 
     111             : #ifdef TIMELOG
     112             :     RTL_LOGFILE_CONTEXT(logFile, "BigPtrArray performance measures" );
     113             : #endif
     114             : }
     115             : 
     116          34 : class BigPtrArrayUnittest : public CppUnit::TestFixture
     117             : {
     118             : public:
     119             : 
     120          17 :     BigPtrArrayUnittest()
     121          17 :     {
     122          17 :     }
     123             : 
     124             :     /** Test constructor/destructor
     125             :         The size of the BigPtrArray
     126             :         aka the 'Count' should be 0
     127             :         initially.
     128             :     */
     129           1 :     void test_ctor()
     130             :     {
     131           1 :         printMethodName("test_ctor\n");
     132             : 
     133           1 :         BigPtrArray bparr;
     134             : 
     135           2 :         CPPUNIT_ASSERT_MESSAGE
     136             :         (
     137             :             "BigPtrArray ctor failed",
     138             :             bparr.Count() == 0
     139           2 :         );
     140           1 :     }
     141             : 
     142           1 :     void test_insert_entries_at_front()
     143             :     {
     144           1 :         printMethodName("test_insert_entries_at_front\n");
     145             : 
     146             : #ifdef TIMELOG
     147             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, "START: test_insert_entries_at_front");
     148             : #endif
     149             : 
     150           1 :         BigPtrArray bparr;
     151             : 
     152          11 :         for (sal_uLong i = 0; i < NUM_ENTRIES; i++)
     153             :         {
     154          10 :             sal_uLong oldCount = bparr.Count();
     155          10 :             bparr.Insert(new BigPtrEntryMock(i), 0);
     156          20 :             CPPUNIT_ASSERT_MESSAGE
     157             :             (
     158             :                 "test_insert_entries_at_front failed",
     159             :                 (bparr.Count() == oldCount + 1)
     160          10 :             );
     161             :         }
     162             : 
     163             : #ifdef TIMELOG
     164             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, "END: test_insert_entries_at_front");
     165             : #endif
     166             : 
     167          11 :         for (sal_uLong i = 0, j = NUM_ENTRIES - 1; i < NUM_ENTRIES; i++, j--)
     168             :         {
     169          20 :             CPPUNIT_ASSERT_MESSAGE
     170             :             (
     171             :                 "test_insert_entries_at_front failed",
     172             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == j
     173          10 :             );
     174             :         }
     175             : 
     176           2 :         CPPUNIT_ASSERT_MESSAGE
     177             :         (
     178             :             "test_insert_entries_at_front failed",
     179             :             checkElementPositions(bparr)
     180           1 :         );
     181             : 
     182           1 :         releaseBigPtrArrayContent(bparr);
     183           1 :         dumpBigPtrArray(bparr);
     184           1 :     }
     185             : 
     186           1 :     void test_insert_entries_in_the_middle()
     187             :     {
     188           1 :         printMethodName("test_insert_entries_in_the_middle\n");
     189             : 
     190             : #ifdef TIMELOG
     191             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, "START: test_insert_entries_in_the_middle");
     192             : #endif
     193             : 
     194           1 :         BigPtrArray bparr;
     195             : 
     196           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     197           1 :         dumpBigPtrArray(bparr);
     198             : 
     199           1 :         sal_uLong oldCount = bparr.Count();
     200             : 
     201           1 :         bparr.Insert(new BigPtrEntryMock(NUM_ENTRIES), bparr.Count() / 2);
     202             : 
     203             : #ifdef TIMELOG
     204             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, "END: test_insert_entries_in_the_middle");
     205             : #endif
     206             : 
     207           2 :         CPPUNIT_ASSERT_MESSAGE
     208             :         (
     209             :             "test_insert_entries_in_the_middle failed",
     210             :             (oldCount + 1 == bparr.Count() && static_cast<BigPtrEntryMock*>(bparr[bparr.Count() / 2])->getCount() == NUM_ENTRIES)
     211           1 :         );
     212             : 
     213           2 :         CPPUNIT_ASSERT_MESSAGE
     214             :         (
     215             :             "test_insert_entries_in_the_middle failed",
     216             :             checkElementPositions(bparr)
     217           1 :         );
     218             : 
     219           1 :         releaseBigPtrArrayContent(bparr);
     220           1 :         dumpBigPtrArray(bparr);
     221           1 :     }
     222             : 
     223           1 :     void test_insert_at_already_used_index()
     224             :     {
     225           1 :         printMethodName("test_insert_at_already_used_index\n");
     226             : 
     227             : #ifdef TIMELOG
     228             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, "START: test_insert_at_already_used_index");
     229             : #endif
     230             : 
     231           1 :         BigPtrArray bparr;
     232             : 
     233           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     234           1 :         dumpBigPtrArray(bparr);
     235             : 
     236           1 :         sal_uLong oldCount = bparr.Count();
     237             : 
     238           6 :         for (sal_uLong i = 0, j = -5; i < 5; i++, j++)
     239           5 :             bparr.Insert(new BigPtrEntryMock(j), i);
     240             : 
     241             : #ifdef TIMELOG
     242             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, "END: test_insert_at_already_used_index");
     243             : #endif
     244             : 
     245           2 :         CPPUNIT_ASSERT_MESSAGE
     246             :         (
     247             :             "test_insert_at_already_used_index failed",
     248             :             (oldCount + 5 == bparr.Count())
     249           1 :         );
     250             : 
     251          16 :         for (sal_uLong i = 0, j = -5; i < bparr.Count(); i++, j++)
     252             :         {
     253          30 :             CPPUNIT_ASSERT_MESSAGE
     254             :             (
     255             :                 "test_insert_at_already_used_index failed",
     256             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == j
     257          15 :             );
     258             :         }
     259             : 
     260           2 :         CPPUNIT_ASSERT_MESSAGE
     261             :         (
     262             :             "test_insert_at_already_used_index failed",
     263             :             checkElementPositions(bparr)
     264           1 :         );
     265             : 
     266           1 :         releaseBigPtrArrayContent(bparr);
     267           1 :         dumpBigPtrArray(bparr);
     268           1 :     }
     269             : 
     270           1 :     void test_insert_at_end()
     271             :     {
     272           1 :         printMethodName("test_insert_at_end\n");
     273             : 
     274           1 :         BigPtrArray bparr;
     275             : 
     276           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     277           1 :         dumpBigPtrArray(bparr);
     278             : 
     279           1 :         sal_uLong oldCount = bparr.Count();
     280           1 :         bparr.Insert(new BigPtrEntryMock(NUM_ENTRIES), bparr.Count());
     281             : 
     282           2 :         CPPUNIT_ASSERT_MESSAGE
     283             :         (
     284             :             "test_insert_at_end failed",
     285             :             (oldCount + 1 == bparr.Count() && static_cast<BigPtrEntryMock*>(bparr[bparr.Count()-1])->getCount() == NUM_ENTRIES)
     286           1 :         );
     287             : 
     288           2 :         CPPUNIT_ASSERT_MESSAGE
     289             :         (
     290             :             "test_insert_at_end failed",
     291             :             checkElementPositions(bparr)
     292           1 :         );
     293             : 
     294           1 :         releaseBigPtrArrayContent(bparr);
     295           1 :         dumpBigPtrArray(bparr);
     296           1 :     }
     297             : 
     298           1 :     void test_remove_at_front()
     299             :     {
     300           1 :         printMethodName("test_remove_at_front\n");
     301             : 
     302             : #ifdef TIMELOG
     303             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, "START: test_remove_at_front");
     304             : #endif
     305             : 
     306           1 :         BigPtrArray bparr;
     307             : 
     308           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     309           1 :         dumpBigPtrArray(bparr);
     310             : 
     311          11 :         for (sal_uLong i = 0; i < NUM_ENTRIES; i++)
     312             :         {
     313          10 :             sal_uLong oldCount = bparr.Count();
     314             : 
     315          10 :             delete bparr[0]; // release content
     316          10 :             bparr.Remove(0); // remove item from container
     317             : 
     318          20 :             CPPUNIT_ASSERT_MESSAGE
     319             :             (
     320             :                 "test_remove_at_front failed (wrong count)",
     321             :                 (oldCount - 1 == bparr.Count())
     322          10 :             );
     323             : 
     324          55 :             for (sal_uLong j = 0, k = i + 1; j < bparr.Count(); j++, k++)
     325             :             {
     326          90 :                 CPPUNIT_ASSERT_MESSAGE
     327             :                 (
     328             :                     "test_remove_at_front failed",
     329             :                     static_cast<BigPtrEntryMock*>(bparr[j])->getCount() == k
     330          45 :                 );
     331             :             }
     332             : 
     333          20 :             CPPUNIT_ASSERT_MESSAGE
     334             :             (
     335             :                 "test_remove_at_front failed",
     336             :                 checkElementPositions(bparr)
     337          10 :             );
     338             : 
     339          10 :             dumpBigPtrArray(bparr);
     340           1 :         }
     341             : 
     342             : #ifdef TIMELOG
     343             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, "END: test_remove_at_front");
     344             : #endif
     345           1 :     }
     346             : 
     347           1 :     void test_remove_at_back()
     348             :     {
     349           1 :         printMethodName("test_remove_at_back\n");
     350             : 
     351           1 :         BigPtrArray bparr;
     352             : 
     353           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     354           1 :         dumpBigPtrArray(bparr);
     355             : 
     356          11 :         for (int i = NUM_ENTRIES - 1; i >= 0; i--)
     357             :         {
     358          10 :             sal_uLong oldCount = bparr.Count();
     359          10 :             delete bparr[i];
     360          10 :             bparr.Remove(i);
     361             : 
     362          20 :             CPPUNIT_ASSERT_MESSAGE
     363             :             (
     364             :                 "test_remove_at_back failed (wrong count)",
     365             :                 (oldCount - 1 == bparr.Count())
     366          10 :             );
     367             : 
     368          55 :             for (sal_uLong j = 0; j < bparr.Count(); j++)
     369             :             {
     370          90 :                 CPPUNIT_ASSERT_MESSAGE
     371             :                 (
     372             :                     "test_remove_at_back failed",
     373             :                     static_cast<BigPtrEntryMock*>(bparr[j])->getCount() == j
     374          45 :                 );
     375             :             }
     376             : 
     377          20 :             CPPUNIT_ASSERT_MESSAGE
     378             :             (
     379             :                 "test_remove_at_back failed",
     380             :                 checkElementPositions(bparr)
     381          10 :             );
     382             : 
     383          10 :             dumpBigPtrArray(bparr);
     384           1 :         }
     385           1 :     }
     386             : 
     387           1 :     void test_remove_in_the_middle()
     388             :     {
     389           1 :         printMethodName("test_remove_in_the_middle\n");
     390             : 
     391             : #ifdef TIMELOG
     392             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, "START: test_remove_in_the_middle");
     393             : #endif
     394             : 
     395           1 :         BigPtrArray bparr;
     396             : 
     397           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     398           1 :         dumpBigPtrArray(bparr);
     399             : 
     400          12 :         while (bparr.Count())
     401             :         {
     402          10 :             sal_uLong oldCount = bparr.Count();
     403          10 :             sal_uLong oldElement = static_cast<BigPtrEntryMock*>(bparr[bparr.Count() / 2])->getCount();
     404             : 
     405          10 :             delete bparr[bparr.Count() / 2];
     406          10 :             bparr.Remove(bparr.Count() / 2);
     407             : 
     408          20 :             CPPUNIT_ASSERT_MESSAGE
     409             :             (
     410             :                 "test_remove_in_the_middle failed (wrong count)",
     411             :                 (oldCount - 1 == bparr.Count())
     412          10 :             );
     413             : 
     414          55 :             for (sal_uLong i = 0; i < bparr.Count(); i++)
     415             :             {
     416          90 :                 CPPUNIT_ASSERT_MESSAGE
     417             :                 (
     418             :                     "test_remove_in_the_middle failed",
     419             :                     static_cast<BigPtrEntryMock*>(bparr[i])->getCount() != oldElement
     420          45 :                 );
     421             :             }
     422             : 
     423          20 :             CPPUNIT_ASSERT_MESSAGE
     424             :             (
     425             :                 "test_remove_in_the_middle failed",
     426             :                 checkElementPositions(bparr)
     427          10 :             );
     428             : 
     429          10 :             dumpBigPtrArray(bparr);
     430           1 :         }
     431             : #ifdef TIMELOG
     432             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, "END: test_remove_in_the_middle");
     433             : #endif
     434           1 :     }
     435             : 
     436           1 :     void test_remove_multiple_elements_at_once()
     437             :     {
     438           1 :         printMethodName("test_remove_multiple_elements_at_once\n");
     439             : 
     440           1 :         BigPtrArray bparr;
     441             : 
     442           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     443           1 :         dumpBigPtrArray(bparr);
     444             : 
     445           6 :         while(bparr.Count())
     446             :         {
     447           4 :             sal_uLong nRemove = (bparr.Count() > 3) ? 3 : bparr.Count();
     448           4 :             sal_uLong oldCount = bparr.Count();
     449             : 
     450          14 :             for (sal_uLong i = 0; i < nRemove; i++)
     451          10 :                 delete bparr[i];
     452             : 
     453           4 :             bparr.Remove(0, nRemove);
     454             : 
     455           8 :             CPPUNIT_ASSERT_MESSAGE
     456             :             (
     457             :                 "test_remove_multiple_elements_at_once failed",
     458             :                 (oldCount - nRemove == bparr.Count())
     459           4 :             );
     460             : 
     461           8 :             CPPUNIT_ASSERT_MESSAGE
     462             :             (
     463             :                 "test_remove_multiple_elements_at_once failed",
     464             :                 checkElementPositions(bparr)
     465           4 :             );
     466             : 
     467           4 :             dumpBigPtrArray(bparr);
     468           1 :         }
     469           1 :     }
     470             : 
     471           1 :     void test_remove_all_elements_at_once()
     472             :     {
     473           1 :         printMethodName("test_remove_all_elements_at_once\n");
     474             : 
     475           1 :         BigPtrArray bparr;
     476             : 
     477           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     478           1 :         dumpBigPtrArray(bparr);
     479             : 
     480           1 :         releaseBigPtrArrayContent(bparr);
     481           1 :         bparr.Remove(0, bparr.Count());
     482             : 
     483           2 :         CPPUNIT_ASSERT_MESSAGE
     484             :         (
     485             :             "test_remove_all_elements_at_once failed",
     486             :             bparr.Count() == 0
     487           1 :         );
     488             : 
     489           1 :         dumpBigPtrArray(bparr);
     490           1 :     }
     491             : 
     492           1 :     void test_move_elements_from_lower_to_higher_pos()
     493             :     {
     494           1 :         printMethodName("test_move_elements_from_lower_to_higher_pos\n");
     495             : 
     496           1 :         BigPtrArray bparr;
     497             : 
     498           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     499           1 :         dumpBigPtrArray(bparr);
     500             : 
     501          10 :         for (sal_uLong i = 0; i < NUM_ENTRIES - 1; i++)
     502             :         {
     503           9 :             bparr.Move(i, i + 2);
     504           9 :             dumpBigPtrArray(bparr);
     505             :         }
     506             : 
     507          10 :         for (sal_uLong i = 0; i < (NUM_ENTRIES - 1); i++)
     508             :         {
     509          18 :             CPPUNIT_ASSERT_MESSAGE
     510             :             (
     511             :                 "test_move_elements_from_lower_to_higher_pos failed",
     512             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i + 1)
     513           9 :             );
     514             :         }
     515             : 
     516           2 :         CPPUNIT_ASSERT_MESSAGE
     517             :         (
     518             :             "test_move_elements_from_lower_to_higher_pos failed",
     519             :             static_cast<BigPtrEntryMock*>(bparr[NUM_ENTRIES -1])->getCount() == 0
     520           1 :         );
     521             : 
     522           2 :         CPPUNIT_ASSERT_MESSAGE
     523             :         (
     524             :             "test_move_elements_from_lower_to_higher_pos failed",
     525             :             checkElementPositions(bparr)
     526           1 :         );
     527             : 
     528           1 :         releaseBigPtrArrayContent(bparr);
     529           1 :     }
     530             : 
     531           1 :     void test_move_elements_from_higher_to_lower_pos()
     532             :     {
     533           1 :         printMethodName("test_move_elements_from_higher_to_lower_pos\n");
     534             : 
     535           1 :         BigPtrArray bparr;
     536             : 
     537           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     538           1 :         dumpBigPtrArray(bparr);
     539             : 
     540          10 :         for (int i = NUM_ENTRIES - 1; i >= 1; i--)
     541             :         {
     542           9 :             bparr.Move(i, i - 1);
     543           9 :             dumpBigPtrArray(bparr);
     544             :         }
     545             : 
     546           2 :         CPPUNIT_ASSERT_MESSAGE
     547             :         (
     548             :             "test_move_elements_from_higher_to_lower_pos failed",
     549             :             static_cast<BigPtrEntryMock*>(bparr[0])->getCount() == (NUM_ENTRIES - 1)
     550           1 :         );
     551             : 
     552          10 :         for (sal_uLong i = 1; i < NUM_ENTRIES; i++)
     553             :         {
     554          18 :             CPPUNIT_ASSERT_MESSAGE
     555             :             (
     556             :                 "test_move_elements_from_higher_to_lower_pos failed",
     557             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i - 1)
     558           9 :             );
     559             :         }
     560             : 
     561           2 :         CPPUNIT_ASSERT_MESSAGE
     562             :         (
     563             :             "test_move_elements_from_higher_to_lower_pos failed",
     564             :             checkElementPositions(bparr)
     565           1 :         );
     566             : 
     567           1 :         releaseBigPtrArrayContent(bparr);
     568           1 :     }
     569             : 
     570             :     void test_move_to_same_position()
     571             :     {
     572             :         printMethodName("test_move_to_same_position\n");
     573             : 
     574             :         BigPtrArray bparr;
     575             : 
     576             :         fillBigPtrArray(bparr, NUM_ENTRIES);
     577             :         dumpBigPtrArray(bparr);
     578             : 
     579             :         for (sal_uLong i = 0; i < NUM_ENTRIES; i++)
     580             :         {
     581             :             bparr.Move(i, i);
     582             :         }
     583             : 
     584             :         dumpBigPtrArray(bparr);
     585             : 
     586             :         for (sal_uLong i = 0; i < NUM_ENTRIES; i++)
     587             :         {
     588             :             CPPUNIT_ASSERT_MESSAGE
     589             :             (
     590             :                 "test_move_to_same_position failed",
     591             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == i
     592             :             );
     593             :         }
     594             : 
     595             :         CPPUNIT_ASSERT_MESSAGE
     596             :         (
     597             :             "test_move_to_same_position failed",
     598             :             checkElementPositions(bparr)
     599             :         );
     600             : 
     601             :         releaseBigPtrArrayContent(bparr);
     602             :         dumpBigPtrArray(bparr);
     603             :     }
     604             : 
     605           1 :     void test_replace_elements()
     606             :     {
     607           1 :         printMethodName("test_replace_elements\n");
     608             : 
     609           1 :         BigPtrArray bparr;
     610             : 
     611           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     612           1 :         dumpBigPtrArray(bparr);
     613             : 
     614          11 :         for (sal_uLong i = 0, j = NUM_ENTRIES - 1; i < NUM_ENTRIES; i++, j--)
     615             :         {
     616          10 :             delete bparr[i];
     617          10 :             bparr.Replace(i, new BigPtrEntryMock(j));
     618          10 :             dumpBigPtrArray(bparr);
     619             :         }
     620             : 
     621          11 :         for (sal_uLong i = 0; i < NUM_ENTRIES; i++)
     622             :         {
     623          20 :             CPPUNIT_ASSERT_MESSAGE
     624             :             (
     625             :                 "test_replace_elements failed",
     626             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (NUM_ENTRIES - i - 1)
     627          10 :             );
     628             :         }
     629             : 
     630           2 :         CPPUNIT_ASSERT_MESSAGE
     631             :         (
     632             :             "test_replace_elements failed",
     633             :             checkElementPositions(bparr)
     634           1 :         );
     635             : 
     636           1 :         releaseBigPtrArrayContent(bparr);
     637           1 :     }
     638             : 
     639           1 :     void test_for_each()
     640             :     {
     641           1 :         printMethodName("test_for_each\n");
     642             : 
     643           1 :         BigPtrArray bparr;
     644             : 
     645           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     646           1 :         dumpBigPtrArray(bparr);
     647             : 
     648           1 :         sal_uLong addCount = 1;
     649           1 :         bparr.ForEach(AddToCount, &addCount);
     650             : 
     651          11 :         for (sal_uLong i = 0; i < NUM_ENTRIES; i++)
     652             :         {
     653          20 :             CPPUNIT_ASSERT_MESSAGE
     654             :             (
     655             :                 "test_for_each failed",
     656             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i+1)
     657          10 :             );
     658             :         }
     659             : 
     660           1 :         releaseBigPtrArrayContent(bparr);
     661           1 :         dumpBigPtrArray(bparr);
     662           1 :     }
     663             : 
     664           1 :     void test_for_some1()
     665             :     {
     666           1 :         printMethodName("test_for_some1\n");
     667             : 
     668           1 :         BigPtrArray bparr;
     669             : 
     670           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     671           1 :         dumpBigPtrArray(bparr);
     672             : 
     673           1 :         sal_uLong addCount = 1;
     674           1 :         bparr.ForEach(0, NUM_ENTRIES / 2, AddToCount, &addCount);
     675             : 
     676           1 :         sal_uLong i = 0;
     677           6 :         for (/* */; i < NUM_ENTRIES / 2; i++)
     678             :         {
     679          10 :             CPPUNIT_ASSERT_MESSAGE
     680             :             (
     681             :                 "test_for_some1 failed",
     682             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i+1)
     683           5 :             );
     684             :         }
     685             : 
     686           6 :         for (/* */; i < NUM_ENTRIES; i++)
     687             :         {
     688          10 :             CPPUNIT_ASSERT_MESSAGE
     689             :             (
     690             :                 "test_for_some1 failed",
     691             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i)
     692           5 :             );
     693             :         }
     694             : 
     695           1 :         releaseBigPtrArrayContent(bparr);
     696           1 :         dumpBigPtrArray(bparr);
     697           1 :     }
     698             : 
     699           1 :     void test_for_some2()
     700             :     {
     701           1 :         printMethodName("test_for_some2\n");
     702             : 
     703           1 :         BigPtrArray bparr;
     704             : 
     705           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     706           1 :         dumpBigPtrArray(bparr);
     707             : 
     708           1 :         sal_uLong addCount = 1;
     709           1 :         bparr.ForEach(NUM_ENTRIES / 2, NUM_ENTRIES, AddToCount, &addCount);
     710             : 
     711           1 :         sal_uLong i = 0;
     712           6 :         for (/* */; i < NUM_ENTRIES / 2; i++)
     713             :         {
     714          10 :             CPPUNIT_ASSERT_MESSAGE
     715             :             (
     716             :                 "test_for_some2 failed",
     717             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i)
     718           5 :             );
     719             :         }
     720             : 
     721           6 :         for (/* */; i < NUM_ENTRIES; i++)
     722             :         {
     723          10 :             CPPUNIT_ASSERT_MESSAGE
     724             :             (
     725             :                 "test_for_some2 failed",
     726             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == (i+1)
     727           5 :             );
     728             :         }
     729             : 
     730           1 :         releaseBigPtrArrayContent(bparr);
     731           1 :         dumpBigPtrArray(bparr);
     732           1 :     }
     733             : 
     734           1 :     void test_for_some3()
     735             :     {
     736           1 :         printMethodName("test_for_some3\n");
     737             : 
     738           1 :         BigPtrArray bparr;
     739             : 
     740           1 :         fillBigPtrArray(bparr, NUM_ENTRIES);
     741           1 :         dumpBigPtrArray(bparr);
     742             : 
     743           1 :         sal_uLong addCount = 1;
     744           1 :         bparr.ForEach(0, 0, AddToCount, &addCount);
     745             : 
     746          11 :         for (sal_uLong i = 0; i < NUM_ENTRIES; i++)
     747             :         {
     748          20 :             CPPUNIT_ASSERT_MESSAGE
     749             :             (
     750             :                 "test_for_some3 failed",
     751             :                 static_cast<BigPtrEntryMock*>(bparr[i])->getCount() == i
     752          10 :             );
     753             :         }
     754           1 :         releaseBigPtrArrayContent(bparr);
     755           1 :     }
     756             : 
     757           2 :     CPPUNIT_TEST_SUITE(BigPtrArrayUnittest);
     758           1 :     CPPUNIT_TEST(test_ctor);
     759           1 :     CPPUNIT_TEST(test_insert_entries_at_front);
     760           1 :     CPPUNIT_TEST(test_insert_entries_in_the_middle);
     761           1 :     CPPUNIT_TEST(test_insert_at_already_used_index);
     762           1 :     CPPUNIT_TEST(test_insert_at_end);
     763           1 :     CPPUNIT_TEST(test_remove_at_front);
     764           1 :     CPPUNIT_TEST(test_remove_at_back);
     765           1 :     CPPUNIT_TEST(test_remove_in_the_middle);
     766           1 :     CPPUNIT_TEST(test_remove_multiple_elements_at_once);
     767           1 :     CPPUNIT_TEST(test_remove_all_elements_at_once);
     768           1 :     CPPUNIT_TEST(test_move_elements_from_lower_to_higher_pos);
     769           1 :     CPPUNIT_TEST(test_move_elements_from_higher_to_lower_pos);
     770           1 :     CPPUNIT_TEST(test_replace_elements);
     771           1 :     CPPUNIT_TEST(test_for_each);
     772           1 :     CPPUNIT_TEST(test_for_some1);
     773           1 :     CPPUNIT_TEST(test_for_some2);
     774           1 :     CPPUNIT_TEST(test_for_some3);
     775           2 :     CPPUNIT_TEST_SUITE_END();
     776             : };
     777             : 
     778             : const char* START = "START: ";
     779             : const char* END = "END: ";
     780             : 
     781             : class PerformanceTracer
     782             : {
     783             : public:
     784             : 
     785             : public:
     786             :     PerformanceTracer(const string& methodName) :
     787             :         startString_(START),
     788             :         endString_(END)
     789             :     {
     790             :         startString_ += methodName;
     791             :         endString_ += methodName;
     792             : #ifdef TIMELOG
     793             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, startString_.c_str());
     794             : #endif
     795             :     }
     796             : 
     797             :     ~PerformanceTracer()
     798             :     {
     799             : #ifdef TIMELOG
     800             :         RTL_LOGFILE_CONTEXT_TRACE(logFile, endString_.c_str());
     801             : #endif
     802             :     }
     803             : 
     804             : private:
     805             :     string startString_;
     806             :     string endString_;
     807             : };
     808             : 
     809           0 : class BigPtrArrayPerformanceTest : public CppUnit::TestFixture
     810             : {
     811             : public:
     812           0 :     BigPtrArrayPerformanceTest()
     813           0 :     {
     814           0 :     }
     815             : 
     816             :     void test_insert_at_end_1000()
     817             :     { test_insert_at_end("1000"); }
     818             : 
     819             :     void test_insert_at_end_10000()
     820             :     { test_insert_at_end("10000"); }
     821             : 
     822             :     void test_insert_at_end_100000()
     823             :     { test_insert_at_end("100000"); }
     824             : 
     825             :     void test_insert_at_end_1000000()
     826             :     { test_insert_at_end("1000000"); }
     827             : 
     828             :     void test_insert_at_front_1000()
     829             :     { test_insert_at_front("1000"); }
     830             : 
     831             :     void test_insert_at_front_10000()
     832             :     { test_insert_at_front("10000"); }
     833             : 
     834             :     void test_insert_at_front_100000()
     835             :     { test_insert_at_front("100000"); }
     836             : 
     837             :     void test_insert_at_front_1000000()
     838             :     { test_insert_at_front("1000000"); }
     839             : 
     840             :     CPPUNIT_TEST_SUITE(BigPtrArrayPerformanceTest);
     841             :     CPPUNIT_TEST(test_insert_at_end_1000);
     842             :     CPPUNIT_TEST(test_insert_at_end_10000);
     843             :     CPPUNIT_TEST(test_insert_at_end_100000);
     844             :     CPPUNIT_TEST(test_insert_at_end_1000000);
     845             :     CPPUNIT_TEST(test_insert_at_front_1000);
     846             :     CPPUNIT_TEST(test_insert_at_front_10000);
     847             :     CPPUNIT_TEST(test_insert_at_front_100000);
     848             :     CPPUNIT_TEST(test_insert_at_front_1000000);
     849             :     CPPUNIT_TEST_SUITE_END();
     850             : 
     851             : private:
     852             :     void test_insert_at_end(const char* numElements)
     853             :     {
     854             :         char buff[100] = { 0 };
     855             :         strcat(buff, "test_insert_at_end ");
     856             :         strcat(buff, numElements);
     857             :         int n = atoi(numElements);
     858             :         PerformanceTracer tracer(buff);
     859             :         BigPtrArray bparr;
     860             :         for (int i = 0; i < n; i++)
     861             :             bparr.Insert(new BigPtrEntryMock(i), bparr.Count());
     862             : 
     863             :         releaseBigPtrArrayContent(bparr);
     864             :     }
     865             : 
     866             :     void test_insert_at_front(const char* numElements)
     867             :     {
     868             :         char buff[100] = { 0 };
     869             :         strcat(buff, "test_insert_at_front ");
     870             :         strcat(buff, numElements);
     871             :         int n = atoi(numElements);
     872             :         PerformanceTracer tracer(buff);
     873             :         BigPtrArray bparr;
     874             :         for (int i = 0; i < n; i++)
     875             :             bparr.Insert(new BigPtrEntryMock(i), 0);
     876             : 
     877             :         releaseBigPtrArrayContent(bparr);
     878             :     }
     879             : };
     880             : 
     881             : // register test suites
     882           3 : CPPUNIT_TEST_SUITE_REGISTRATION(BigPtrArrayUnittest);
     883             : #ifdef TIMELOG
     884             : CPPUNIT_TEST_SUITE_REGISTRATION(BigPtrArrayPerformanceTest);
     885             : #endif
     886             : 
     887             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10