00001 #include <UnitTest++.h>
00002 #include "cddefines.h"
00003
00004 namespace {
00005
00006 struct LongIntFixtureBlank
00007 {
00008 flex_arr<long,false> arr;
00009 LongIntFixtureBlank() {}
00010 ~LongIntFixtureBlank() {}
00011 };
00012
00013 template<bool lgBC>
00014 struct LongIntFixtureGeneric
00015 {
00016 flex_arr<long,lgBC> arr;
00017 LongIntFixtureGeneric()
00018 {
00019 arr.alloc(5,10);
00020 for( int i=5; i < 10; ++i )
00021 arr[i] = i;
00022 }
00023 ~LongIntFixtureGeneric() {}
00024 };
00025
00026 typedef LongIntFixtureGeneric<false> LongIntFixture;
00027 typedef LongIntFixtureGeneric<true> LongIntFixtureBC;
00028
00029 struct LongIntFixtureFill
00030 {
00031 flex_arr<long,false> arr;
00032 LongIntFixtureFill()
00033 {
00034 arr.alloc(5,10);
00035 for( int i=5; i < 10; ++i )
00036 arr[i] = i;
00037 }
00038 ~LongIntFixtureFill() {}
00039 void myfill()
00040 {
00041 long i = 0;
00042 flex_arr<long,false>::iterator p;
00043 for( p=arr.begin(); p != arr.end(); ++p )
00044 *p = ++i;
00045 }
00046 };
00047
00048 struct RealNumFixture
00049 {
00050 flex_arr<realnum,false> arr;
00051 RealNumFixture()
00052 {
00053 arr.alloc(5,10);
00054 for( int i=5; i < 10; ++i )
00055 arr[i] = i;
00056 }
00057 ~RealNumFixture() {}
00058 };
00059
00060 struct DoubleFixture
00061 {
00062 flex_arr<double,false> arr;
00063 DoubleFixture()
00064 {
00065 arr.alloc(5,10);
00066 for( int i=5; i < 10; ++i )
00067 arr[i] = i;
00068 }
00069 ~DoubleFixture() {}
00070 };
00071
00072 struct StructWithConstructorFixture
00073 {
00074 struct a
00075 {
00076 long n;
00077 a() { n = 23; }
00078 ~a() {}
00079 };
00080 flex_arr<a,false> arr;
00081 StructWithConstructorFixture()
00082 {
00083 arr.alloc(7,12);
00084 }
00085 ~StructWithConstructorFixture() {}
00086 };
00087
00088 struct TestAllocFixture
00089 {
00090 TestAllocFixture() {}
00091 ~TestAllocFixture() {}
00092 long mytest()
00093 {
00094 flex_arr<long,true> a(2,20);
00095
00096 flex_arr<long,true>::iterator p;
00097
00098 a.zero();
00099
00100 long res = 0;
00101 for (int i=2; i<20; ++i)
00102 {
00103 p = a.ptr(i);
00104 res += ( *p != 0 );
00105 }
00106
00107 return res;
00108 }
00109 };
00110
00111 TEST_FIXTURE(LongIntFixture,TestZero)
00112 {
00113 arr.zero();
00114 for( int i=5; i < 10; ++i )
00115 CHECK_EQUAL(0,arr[i]);
00116 arr.clear();
00117 arr.zero();
00118 }
00119
00120 TEST_FIXTURE(LongIntFixture,TestInvalidate1)
00121 {
00122 arr.invalidate();
00123 for( int i=5; i < 10; ++i )
00124 CHECK_EQUAL(-1,arr[i]);
00125 arr.clear();
00126 arr.invalidate();
00127 }
00128
00129 TEST_FIXTURE(RealNumFixture,TestInvalidate2)
00130 {
00131 arr.invalidate();
00132 for( int i=5; i < 10; ++i )
00133 CHECK(isnan(arr[i]));
00134 arr.clear();
00135 arr.invalidate();
00136 }
00137
00138 TEST_FIXTURE(DoubleFixture,TestInvalidate3)
00139 {
00140 arr.invalidate();
00141 for( int i=5; i < 10; ++i )
00142 CHECK(isnan(arr[i]));
00143 arr.clear();
00144 arr.invalidate();
00145 }
00146
00147 TEST_FIXTURE(LongIntFixtureBC,TestAccess1)
00148 {
00149 for( int i=5; i < 10; ++i )
00150 CHECK_EQUAL(i,arr[i]);
00151 CHECK_THROW(arr[4],out_of_range);
00152 CHECK_THROW(arr[10],out_of_range);
00153 const flex_arr<long,true>* carr = &arr;
00154 for( int i=5; i < 10; ++i )
00155 CHECK_EQUAL(i,(*carr)[i]);
00156 CHECK_THROW((*carr)[4],out_of_range);
00157 CHECK_THROW((*carr)[10],out_of_range);
00158 }
00159
00160 TEST_FIXTURE(LongIntFixtureBC,TestAccess2)
00161 {
00162 for( int i=5; i < 10; ++i )
00163 CHECK_EQUAL(i,arr[i]);
00164 CHECK_THROW(arr[4],out_of_range);
00165 CHECK_THROW(arr[10],out_of_range);
00166 const flex_arr<long,true>* carr = &arr;
00167 for( int i=5; i < 10; ++i )
00168 CHECK_EQUAL(i,(*carr)[i]);
00169 CHECK_THROW((*carr)[4],out_of_range);
00170 CHECK_THROW((*carr)[10],out_of_range);
00171 }
00172
00173 TEST_FIXTURE(LongIntFixture,TestAccess3)
00174 {
00175 for( int i=5; i < 10; ++i )
00176 CHECK_EQUAL(i,*arr.ptr(i));
00177 const flex_arr<long,false>* carr = &arr;
00178 for( int i=5; i < 10; ++i )
00179 CHECK_EQUAL(i,*carr->ptr(i));
00180 }
00181
00182 TEST_FIXTURE(LongIntFixtureBC,TestAccess4)
00183 {
00184 for( int i=5; i < 10; ++i )
00185 CHECK_EQUAL(i,*arr.ptr(i));
00186 CHECK_THROW(*arr.ptr(4),out_of_range);
00187 CHECK_THROW(*arr.ptr(10),out_of_range);
00188 const flex_arr<long,true>* carr = &arr;
00189 for( int i=5; i < 10; ++i )
00190 CHECK_EQUAL(i,*carr->ptr(i));
00191 CHECK_THROW(*carr->ptr(4),out_of_range);
00192 CHECK_THROW(*carr->ptr(10),out_of_range);
00193 }
00194
00195 TEST_FIXTURE(LongIntFixture,TestAccess5)
00196 {
00197 for( int i=5; i < 10; ++i )
00198 CHECK_EQUAL(i,arr.at(i));
00199 CHECK_THROW(arr.at(4),out_of_range);
00200 CHECK_THROW(arr.at(10),out_of_range);
00201 const flex_arr<long,false>* carr = &arr;
00202 for( int i=5; i < 10; ++i )
00203 CHECK_EQUAL(i,carr->at(i));
00204 CHECK_THROW(carr->at(4),out_of_range);
00205 CHECK_THROW(carr->at(10),out_of_range);
00206 }
00207
00208
00209 TEST_FIXTURE(LongIntFixture,TestStateDo)
00210 {
00211 const char *fnam = "tfa.872GqS";
00212 FILE *io = fopen( fnam, "wb" );
00213 CHECK( io != NULL );
00214 arr.state_do( io, false );
00215 fclose( io );
00216 arr.invalidate();
00217 io = fopen( fnam, "rb" );
00218 CHECK( io != NULL );
00219 arr.state_do( io, true );
00220 fclose( io );
00221 remove(fnam);
00222 CHECK_EQUAL(7,arr[7]);
00223 }
00224
00225 TEST_FIXTURE(LongIntFixtureBC,TestBoundaries)
00226 {
00227 CHECK( arr.begin() == arr.ptr(5) );
00228 CHECK( arr.end() == arr.ptr(10) );
00229 CHECK( &arr.front() == &arr[5] );
00230 CHECK( &arr.back() == &arr[9] );
00231 CHECK( arr.data() == &arr[5] );
00232 const flex_arr<long,true>* carr = &arr;
00233 CHECK( carr->begin() == arr.ptr(5) );
00234 CHECK( carr->end() == arr.ptr(10) );
00235 CHECK( &carr->front() == &arr[5] );
00236 CHECK( &carr->back() == &arr[9] );
00237 CHECK( carr->data() == &arr[5] );
00238 }
00239
00240 TEST_FIXTURE(LongIntFixtureFill,TestRealloc)
00241 {
00242 myfill();
00243 for( int i=5; i < 10; ++i )
00244 CHECK_EQUAL( i-4, arr[i] );
00245 long *pold = arr.data();
00246 arr.realloc( 20 );
00247 long *pnew = arr.data();
00248 CHECK( pold != pnew );
00249 for( int i=5; i < 10; ++i )
00250 CHECK_EQUAL( i-4, arr[i] );
00251 }
00252
00253 TEST_FIXTURE(LongIntFixtureBlank,TestAllocationWithoutReservation)
00254 {
00255 CHECK_EQUAL(0L,arr.size());
00256 CHECK_EQUAL(0L,arr.capacity());
00257 CHECK( arr.empty() );
00258 arr.alloc(5,10);
00259 CHECK_EQUAL(5L,arr.size());
00260 CHECK_EQUAL(5L,arr.capacity());
00261 CHECK( !arr.empty() );
00262 arr.realloc(30);
00263 CHECK_EQUAL(25L,arr.size());
00264 CHECK_EQUAL(25L,arr.capacity());
00265 CHECK( !arr.empty() );
00266 arr.realloc(10);
00267 CHECK_EQUAL(5L,arr.size());
00268 CHECK_EQUAL(25L,arr.capacity());
00269 CHECK( !arr.empty() );
00270 arr.realloc(0);
00271 CHECK_EQUAL(0L,arr.size());
00272 CHECK_EQUAL(25L,arr.capacity());
00273 CHECK( arr.empty() );
00274 arr.clear();
00275 CHECK_EQUAL(0L,arr.size());
00276 CHECK_EQUAL(0L,arr.capacity());
00277 CHECK( arr.empty() );
00278 arr.alloc(-5,12);
00279 CHECK_EQUAL(17L,arr.size());
00280 CHECK_EQUAL(17L,arr.capacity());
00281 CHECK( !arr.empty() );
00282 arr.clear();
00283 CHECK_EQUAL(0L,arr.size());
00284 CHECK_EQUAL(0L,arr.capacity());
00285 CHECK( arr.empty() );
00286 arr.alloc(-5,-12);
00287 CHECK_EQUAL(0L,arr.size());
00288 CHECK_EQUAL(0L,arr.capacity());
00289 CHECK( arr.empty() );
00290 arr.realloc(30);
00291 CHECK_EQUAL(35L,arr.size());
00292 CHECK_EQUAL(35L,arr.capacity());
00293 CHECK( !arr.empty() );
00294 }
00295
00296 TEST_FIXTURE(LongIntFixtureBlank,TestAllocationWithReservation)
00297 {
00298 arr.reserve(100);
00299 CHECK_EQUAL(0L,arr.size());
00300 CHECK_EQUAL(100L,arr.capacity());
00301 CHECK( arr.empty() );
00302 arr.alloc(5,10);
00303 CHECK_EQUAL(5L,arr.size());
00304 CHECK_EQUAL(100L,arr.capacity());
00305 CHECK( !arr.empty() );
00306 arr.realloc(30);
00307 CHECK_EQUAL(25L,arr.size());
00308 CHECK_EQUAL(100L,arr.capacity());
00309 CHECK( !arr.empty() );
00310 arr.realloc(200);
00311 CHECK_EQUAL(195L,arr.size());
00312 CHECK_EQUAL(195L,arr.capacity());
00313 CHECK( !arr.empty() );
00314 arr.reserve(5);
00315 CHECK_EQUAL(0L,arr.size());
00316 CHECK_EQUAL(5L,arr.capacity());
00317 CHECK( arr.empty() );
00318 arr.alloc(-5,-10);
00319 CHECK_EQUAL(0L,arr.size());
00320 CHECK_EQUAL(5L,arr.capacity());
00321 CHECK( arr.empty() );
00322 arr.reserve(-5);
00323 CHECK_EQUAL(0L,arr.size());
00324 CHECK_EQUAL(0L,arr.capacity());
00325 CHECK( arr.empty() );
00326 arr.reserve(10);
00327 CHECK_EQUAL(0L,arr.size());
00328 CHECK_EQUAL(10L,arr.capacity());
00329 CHECK( arr.empty() );
00330 arr.alloc(-10,10);
00331 CHECK_EQUAL(20L,arr.size());
00332 CHECK_EQUAL(20L,arr.capacity());
00333 CHECK( !arr.empty() );
00334 }
00335
00336 TEST_FIXTURE(StructWithConstructorFixture,TestAllocationWithConstructor)
00337 {
00338 for( int i=7; i < 12; ++i )
00339 CHECK_EQUAL(23,arr[i].n);
00340 }
00341
00342
00343
00344 TEST_FIXTURE(TestAllocFixture,TestVariantAlloc)
00345 {
00346 CHECK_EQUAL(0,mytest());
00347 }
00348
00349 TEST_FIXTURE(LongIntFixtureBC,TestCopyOperator)
00350 {
00351 flex_arr<long,true> arr2(12,234);
00352 CHECK( arr.size() != arr2.size() );
00353 arr2.zero();
00354 CHECK_EQUAL(0,arr2[114]);
00355 arr2 = arr;
00356 CHECK( arr.size() == arr2.size() );
00357
00358 CHECK( &arr[5] != &arr2[5] );
00359 for (int i=5; i<10; ++i)
00360 CHECK_EQUAL(i,arr2[i]);
00361
00362 CHECK_THROW(arr2[4],out_of_range);
00363 CHECK_THROW(arr2[10],out_of_range);
00364
00365
00366 arr2 = arr2;
00367
00368 CHECK_EQUAL(9,arr2[9]);
00369
00370
00371 flex_arr<long,true> arr3 = arr;
00372 CHECK( arr.size() == arr3.size() );
00373
00374 CHECK( &arr[5] != &arr3[5] );
00375 for (int i=5; i<10; ++i)
00376 CHECK_EQUAL(i,arr3[i]);
00377
00378 arr.clear();
00379 arr2 = arr;
00380 CHECK_EQUAL(0L,arr2.size());
00381 arr2.reserve( 100 );
00382 }
00383
00384 }