cloudy  trunk
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
TestFlexArr.cpp
Go to the documentation of this file.
1 /* This file is part of Cloudy and is copyright (C)1978-2013 by Gary J. Ferland and
2  * others. For conditions of distribution and use see copyright notice in license.txt */
3 #include <UnitTest++.h>
4 #include "cddefines.h"
5 
6 namespace {
7 
8  struct LongIntFixtureBlank
9  {
11  LongIntFixtureBlank() {}
12  ~LongIntFixtureBlank() {}
13  };
14 
15  template<bool lgBC>
16  struct LongIntFixtureGeneric
17  {
19  LongIntFixtureGeneric()
20  {
21  arr.alloc(5,10);
22  for( int i=5; i < 10; ++i )
23  arr[i] = i;
24  }
25  ~LongIntFixtureGeneric() {}
26  };
27 
28  typedef LongIntFixtureGeneric<false> LongIntFixture;
29  typedef LongIntFixtureGeneric<true> LongIntFixtureBC;
30 
31  struct LongIntFixtureFill
32  {
34  LongIntFixtureFill()
35  {
36  arr.alloc(5,10);
37  for( int i=5; i < 10; ++i )
38  arr[i] = i;
39  }
40  ~LongIntFixtureFill() {}
41  void myfill()
42  {
43  long i = 0;
45  for( p=arr.begin(); p != arr.end(); ++p )
46  *p = ++i;
47  }
48  };
49 
50  struct RealNumFixture
51  {
53  RealNumFixture()
54  {
55  arr.alloc(5,10);
56  for( int i=5; i < 10; ++i )
57  arr[i] = i;
58  }
59  ~RealNumFixture() {}
60  };
61 
62  struct DoubleFixture
63  {
65  DoubleFixture()
66  {
67  arr.alloc(5,10);
68  for( int i=5; i < 10; ++i )
69  arr[i] = i;
70  }
71  ~DoubleFixture() {}
72  };
73 
74  struct StructWithConstructorFixture
75  {
76  struct a
77  {
78  long n;
79  a() { n = 23; }
80  ~a() {}
81  };
83  StructWithConstructorFixture()
84  {
85  arr.alloc(7,12);
86  }
87  ~StructWithConstructorFixture() {}
88  };
89 
90  struct TestAllocFixture
91  {
92  TestAllocFixture() {}
93  ~TestAllocFixture() {}
94  long mytest()
95  {
96  flex_arr<long,true> a(2,20);
97 
99 
100  a.zero();
101 
102  long res = 0;
103  for (int i=2; i<20; ++i)
104  {
105  p = a.ptr(i);
106  res += ( *p != 0 );
107  }
108 
109  return res;
110  }
111  };
112 
113  TEST_FIXTURE(LongIntFixture,TestZero)
114  {
115  arr.zero();
116  for( int i=5; i < 10; ++i )
117  CHECK_EQUAL(0,arr[i]);
118  arr.clear();
119  arr.zero();
120  }
121 
122  TEST_FIXTURE(LongIntFixture,TestInvalidate1)
123  {
124  arr.invalidate();
125  for( int i=5; i < 10; ++i )
126  CHECK_EQUAL(-1,arr[i]);
127  arr.clear();
128  arr.invalidate();
129  }
130 
131  TEST_FIXTURE(RealNumFixture,TestInvalidate2)
132  {
133  arr.invalidate();
134  for( int i=5; i < 10; ++i )
135  CHECK(isnan(arr[i]));
136  arr.clear();
137  arr.invalidate();
138  }
139 
140  TEST_FIXTURE(DoubleFixture,TestInvalidate3)
141  {
142  arr.invalidate();
143  for( int i=5; i < 10; ++i )
144  CHECK(isnan(arr[i]));
145  arr.clear();
146  arr.invalidate();
147  }
148 
149  TEST_FIXTURE(LongIntFixtureBC,TestAccess1)
150  {
151  for( int i=5; i < 10; ++i )
152  CHECK_EQUAL(i,arr[i]);
153  CHECK_THROW(arr[4],out_of_range);
154  CHECK_THROW(arr[10],out_of_range);
155  const flex_arr<long,true>* carr = &arr;
156  for( int i=5; i < 10; ++i )
157  CHECK_EQUAL(i,(*carr)[i]);
158  CHECK_THROW((*carr)[4],out_of_range);
159  CHECK_THROW((*carr)[10],out_of_range);
160  }
161 
162  TEST_FIXTURE(LongIntFixtureBC,TestAccess2)
163  {
164  for( int i=5; i < 10; ++i )
165  CHECK_EQUAL(i,arr[i]);
166  CHECK_THROW(arr[4],out_of_range);
167  CHECK_THROW(arr[10],out_of_range);
168  const flex_arr<long,true>* carr = &arr;
169  for( int i=5; i < 10; ++i )
170  CHECK_EQUAL(i,(*carr)[i]);
171  CHECK_THROW((*carr)[4],out_of_range);
172  CHECK_THROW((*carr)[10],out_of_range);
173  }
174 
175  TEST_FIXTURE(LongIntFixture,TestAccess3)
176  {
177  for( int i=5; i < 10; ++i )
178  CHECK_EQUAL(i,*arr.ptr(i));
179  const flex_arr<long,false>* carr = &arr;
180  for( int i=5; i < 10; ++i )
181  CHECK_EQUAL(i,*carr->ptr(i));
182  }
183 
184  TEST_FIXTURE(LongIntFixtureBC,TestAccess4)
185  {
186  for( int i=5; i < 10; ++i )
187  CHECK_EQUAL(i,*arr.ptr(i));
188  CHECK_THROW(*arr.ptr(4),out_of_range);
189  CHECK_THROW(*arr.ptr(10),out_of_range);
190  const flex_arr<long,true>* carr = &arr;
191  for( int i=5; i < 10; ++i )
192  CHECK_EQUAL(i,*carr->ptr(i));
193  CHECK_THROW(*carr->ptr(4),out_of_range);
194  CHECK_THROW(*carr->ptr(10),out_of_range);
195  }
196 
197  TEST_FIXTURE(LongIntFixture,TestAccess5)
198  {
199  for( int i=5; i < 10; ++i )
200  CHECK_EQUAL(i,arr.at(i));
201  CHECK_THROW(arr.at(4),out_of_range);
202  CHECK_THROW(arr.at(10),out_of_range);
203  const flex_arr<long,false>* carr = &arr;
204  for( int i=5; i < 10; ++i )
205  CHECK_EQUAL(i,carr->at(i));
206  CHECK_THROW(carr->at(4),out_of_range);
207  CHECK_THROW(carr->at(10),out_of_range);
208  }
209 
210  // test the state_do function
211  TEST_FIXTURE(LongIntFixture,TestStateDo)
212  {
213  const char *fnam = "tfa.872GqS";
214  FILE *io = fopen( fnam, "wb" );
215  CHECK( io != NULL );
216  arr.state_do( io, false ); // dump state
217  fclose( io );
218  arr.invalidate(); // trash contents
219  io = fopen( fnam, "rb" );
220  CHECK( io != NULL );
221  arr.state_do( io, true ); // restore state
222  fclose( io );
223  remove(fnam);
224  CHECK_EQUAL(7,arr[7]);
225  }
226 
227  TEST_FIXTURE(LongIntFixtureBC,TestBoundaries)
228  {
229  CHECK( arr.begin() == arr.ptr(5) );
230  CHECK( arr.end() == arr.ptr(10) );
231  CHECK( &arr.front() == &arr[5] );
232  CHECK( &arr.back() == &arr[9] );
233  CHECK( arr.data() == &arr[5] );
234  const flex_arr<long,true>* carr = &arr;
235  CHECK( carr->begin() == arr.ptr(5) );
236  CHECK( carr->end() == arr.ptr(10) );
237  CHECK( &carr->front() == &arr[5] );
238  CHECK( &carr->back() == &arr[9] );
239  CHECK( carr->data() == &arr[5] );
240  }
241 
242  TEST_FIXTURE(LongIntFixtureFill,TestRealloc)
243  {
244  myfill();
245  for( int i=5; i < 10; ++i )
246  CHECK_EQUAL( i-4, arr[i] );
247  long *pold = arr.data();
248  arr.realloc( 20 );
249  long *pnew = arr.data();
250  CHECK( pold != pnew );
251  for( int i=5; i < 10; ++i )
252  CHECK_EQUAL( i-4, arr[i] );
253  }
254 
255  TEST_FIXTURE(LongIntFixtureBlank,TestAllocationWithoutReservation)
256  {
257  CHECK_EQUAL(0L,arr.size());
258  CHECK_EQUAL(0L,arr.capacity());
259  CHECK( arr.empty() );
260  arr.alloc(5,10);
261  CHECK_EQUAL(5L,arr.size());
262  CHECK_EQUAL(5L,arr.capacity());
263  CHECK( !arr.empty() );
264  arr.realloc(30);
265  CHECK_EQUAL(25L,arr.size());
266  CHECK_EQUAL(25L,arr.capacity());
267  CHECK( !arr.empty() );
268  arr.realloc(10);
269  CHECK_EQUAL(5L,arr.size());
270  CHECK_EQUAL(25L,arr.capacity());
271  CHECK( !arr.empty() );
272  arr.realloc(0);
273  CHECK_EQUAL(0L,arr.size());
274  CHECK_EQUAL(25L,arr.capacity());
275  CHECK( arr.empty() );
276  arr.clear();
277  CHECK_EQUAL(0L,arr.size());
278  CHECK_EQUAL(0L,arr.capacity());
279  CHECK( arr.empty() );
280  arr.alloc(-5,12);
281  CHECK_EQUAL(17L,arr.size());
282  CHECK_EQUAL(17L,arr.capacity());
283  CHECK( !arr.empty() );
284  arr.clear();
285  CHECK_EQUAL(0L,arr.size());
286  CHECK_EQUAL(0L,arr.capacity());
287  CHECK( arr.empty() );
288  arr.alloc(-5,-12);
289  CHECK_EQUAL(0L,arr.size());
290  CHECK_EQUAL(0L,arr.capacity());
291  CHECK( arr.empty() );
292  arr.realloc(30);
293  CHECK_EQUAL(35L,arr.size());
294  CHECK_EQUAL(35L,arr.capacity());
295  CHECK( !arr.empty() );
296  }
297 
298  TEST_FIXTURE(LongIntFixtureBlank,TestAllocationWithReservation)
299  {
300  arr.reserve(100);
301  CHECK_EQUAL(0L,arr.size());
302  CHECK_EQUAL(100L,arr.capacity());
303  CHECK( arr.empty() );
304  arr.alloc(5,10);
305  CHECK_EQUAL(5L,arr.size());
306  CHECK_EQUAL(100L,arr.capacity());
307  CHECK( !arr.empty() );
308  arr.realloc(30);
309  CHECK_EQUAL(25L,arr.size());
310  CHECK_EQUAL(100L,arr.capacity());
311  CHECK( !arr.empty() );
312  arr.realloc(200);
313  CHECK_EQUAL(195L,arr.size());
314  CHECK_EQUAL(195L,arr.capacity());
315  CHECK( !arr.empty() );
316  arr.reserve(5);
317  CHECK_EQUAL(0L,arr.size());
318  CHECK_EQUAL(5L,arr.capacity());
319  CHECK( arr.empty() );
320  arr.alloc(-5,-10);
321  CHECK_EQUAL(0L,arr.size());
322  CHECK_EQUAL(5L,arr.capacity());
323  CHECK( arr.empty() );
324  arr.reserve(-5);
325  CHECK_EQUAL(0L,arr.size());
326  CHECK_EQUAL(0L,arr.capacity());
327  CHECK( arr.empty() );
328  arr.reserve(10);
329  CHECK_EQUAL(0L,arr.size());
330  CHECK_EQUAL(10L,arr.capacity());
331  CHECK( arr.empty() );
332  arr.alloc(-10,10);
333  CHECK_EQUAL(20L,arr.size());
334  CHECK_EQUAL(20L,arr.capacity());
335  CHECK( !arr.empty() );
336  }
337 
338  TEST_FIXTURE(StructWithConstructorFixture,TestAllocationWithConstructor)
339  {
340  for( int i=7; i < 12; ++i )
341  CHECK_EQUAL(23,arr[i].n);
342  }
343 
344  // check whether the variant form for allocating works correctly
345  // this also tests p_iterator in bounds-checking mode
346  TEST_FIXTURE(TestAllocFixture,TestVariantAlloc)
347  {
348  CHECK_EQUAL(0,mytest());
349  }
350 
351  TEST_FIXTURE(LongIntFixtureBC,TestCopyOperator)
352  {
353  flex_arr<long,true> arr2(12,234);
354  CHECK( arr.size() != arr2.size() );
355  arr2.zero();
356  CHECK_EQUAL(0,arr2[114]);
357  arr2 = arr;
358  CHECK( arr.size() == arr2.size() );
359  // check that copies are distinct
360  CHECK( &arr[5] != &arr2[5] );
361  for (int i=5; i<10; ++i)
362  CHECK_EQUAL(i,arr2[i]);
363 
364  CHECK_THROW(arr2[4],out_of_range);
365  CHECK_THROW(arr2[10],out_of_range);
366 
367  // is it safe to copy to oneself?
368  arr2 = arr2;
369  // have the contents been preserved?
370  CHECK_EQUAL(9,arr2[9]);
371 
372  // now copy using constructor
373  flex_arr<long,true> arr3 = arr;
374  CHECK( arr.size() == arr3.size() );
375  // check that copies are distinct
376  CHECK( &arr[5] != &arr3[5] );
377  for (int i=5; i<10; ++i)
378  CHECK_EQUAL(i,arr3[i]);
379 
380  arr.clear();
381  arr2 = arr;
382  CHECK_EQUAL(0L,arr2.size());
383  arr2.reserve( 100 );
384  }
385 
386 }
pntr - interface class to replace normal pointers
size_type size() const
#define isnan
Definition: cddefines.h:624
void alloc(size_type begin, size_type end)
iterator ptr(size_type i)