OpenWalnut  1.5.0dev
WValue_test.h
1 //---------------------------------------------------------------------------
2 //
3 // Project: OpenWalnut ( http://www.openwalnut.org )
4 //
5 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
6 // For more information see http://www.openwalnut.org/copying
7 //
8 // This file is part of OpenWalnut.
9 //
10 // OpenWalnut is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU Lesser General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // OpenWalnut is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public License
21 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
22 //
23 //---------------------------------------------------------------------------
24 
25 #ifndef WVALUE_TEST_H
26 #define WVALUE_TEST_H
27 
28 #include <string>
29 
30 #include <cxxtest/TestSuite.h>
31 
32 #include "../WValue.h"
33 
34 
35 /**
36  * Testsuite for WValue.
37  */
38 class WValueTest : public CxxTest::TestSuite
39 {
40 private:
41  double delta; //!< Some values are allowed to differ by delta.
42 
43 public:
44  /**
45  * Called before every test.
46  */
47  void setUp( void )
48  {
49  delta = 1e-12;
50  }
51 
52  /**
53  * Instantiation should throw nothing.
54  */
55  void testInstantiation( void )
56  {
57  TS_ASSERT_THROWS_NOTHING( WValue< double > value( 3 ) );
58  TS_ASSERT_THROWS_NOTHING( WValue< float > value( 3 ) );
59  }
60 
61  /**
62  * size should give the value we have put into the constructor
63  */
64  void testSize( void )
65  {
66  const size_t size = 3;
67  WValue< double > value( size );
68  TS_ASSERT_EQUALS( value.size(), size );
69  }
70 
71  /**
72  * Element access operator should return the right values
73  */
75  {
76  const size_t size = 3;
77  WValue< double > value( size );
78  TS_ASSERT_EQUALS( value[0], 0. );
79  TS_ASSERT_EQUALS( value[1], 0. );
80  TS_ASSERT_EQUALS( value[2], 0. );
81 
82  const double a = 3.14;
83  value[1] = a;
84  TS_ASSERT_EQUALS( value[1], a );
85  }
86 
87  /**
88  * Const element access operator should return the right values.
89  */
91  {
92  const size_t size = 3;
93  const WValue< double > value( size );
94  TS_ASSERT_EQUALS( value[0], 0. );
95  TS_ASSERT_EQUALS( value[1], 0. );
96  TS_ASSERT_EQUALS( value[2], 0. );
97  }
98 
99  /**
100  * == operator should return true if the WValues contain the same elements and false if the don't.
101  */
102  void testEqualityOperator( void )
103  {
104  const size_t size = 3;
105  const double a = 1.2, b = 3.4, c = 5.6;
106  WValue< double > value1( size );
107  WValue< double > value2( size );
108 
109  value1[0] = a;
110  value1[1] = b;
111  value1[2] = c;
112 
113  value2[0] = a;
114  value2[1] = b;
115  value2[2] = c;
116 
117  TS_ASSERT_EQUALS( value1 == value2, true );
118 
119  value2[0] += 1;
120 
121  TS_ASSERT_EQUALS( value1 == value2, false );
122  }
123 
124  /**
125  * != operator should return false if the WValues contain the same elements and false if the don't.
126  */
128  {
129  const size_t size = 3;
130  const double a = 1.2, b = 3.4, c = 5.6;
131  WValue< double > value1( size );
132  WValue< double > value2( size );
133 
134  value1[0] = a;
135  value1[1] = b;
136  value1[2] = c;
137 
138  value2[0] = a;
139  value2[1] = b;
140  value2[2] = c;
141 
142  TS_ASSERT_EQUALS( value1 != value2, false );
143 
144  value2[0] += 1;
145 
146  TS_ASSERT_EQUALS( value1 != value2, true );
147  }
148 
149  /**
150  * assignment operator= should assign the correct values
151  */
153  {
154  const size_t size = 3;
155  const double a = 1.2, b = 3.4, c = 5.6;
156  WValue< double > value1( size );
157  WValue< double > value2( size );
158 
159  value1[0] = a;
160  value1[1] = b;
161  value1[2] = c;
162 
163  value2[0] = a + 1;
164  value2[1] = b + 2;
165  value2[2] = c + 3;
166 
167  // this should be the precondition for the test
168  TS_ASSERT_EQUALS( value1 == value2, false );
169 
170  // test simple assignment
171  value1 = value2;
172  TS_ASSERT_EQUALS( value1 == value2, true );
173 
174  WValue< double > value3( size );
175  WValue< double > value4( size );
176 
177  // this should be the precondition for the test
178  TS_ASSERT_EQUALS( value2 == value3, false );
179  TS_ASSERT_EQUALS( value2 == value4, false );
180 
181  // test whether return the reference to self works
182  // for multiple assignment
183  value4 = value3 = value2;
184  TS_ASSERT_EQUALS( value2 == value3, true );
185  TS_ASSERT_EQUALS( value2 == value4, true );
186  TS_ASSERT_EQUALS( value3 == value4, true );
187  }
188 
189  /**
190  * plus assignment operator-= should assign the correct values
191  */
193  {
194  const size_t size = 3;
195  const double a = 1.2, b = 3.4, c = 5.6;
196  WValue< double > value1( size );
197  WValue< double > value2( size );
198 
199  value1[0] = a;
200  value1[1] = b;
201  value1[2] = c;
202 
203  value2[0] = a + 1;
204  value2[1] = b + 2;
205  value2[2] = c + 3;
206 
207  // this should be the precondition for the test
208  TS_ASSERT_EQUALS( value1 == value2, false );
209 
210  // test simple plus assignement
211  value1 += value2;
212  TS_ASSERT_DELTA( value1[0], 1. + 2. * a, delta );
213  TS_ASSERT_DELTA( value1[1], 2. + 2. * b, delta );
214  TS_ASSERT_DELTA( value1[2], 3. + 2. * c, delta );
215 
216  WValue< double > value3( size );
217  WValue< double > value4( size );
218 
219  // this should be the precondition for the test
220  TS_ASSERT_EQUALS( value2 == value3, false );
221  TS_ASSERT_EQUALS( value2 == value4, false );
222 
223  // test whether return the reference to self works
224  // for multiple plus assignment
225  value4 += value3 += value2;
226  TS_ASSERT_EQUALS( value2 == value3, true );
227  TS_ASSERT_EQUALS( value2 == value4, true );
228  TS_ASSERT_EQUALS( value3 == value4, true );
229  }
230 
231  /**
232  * minus assignment operator-= should assign the correct values
233  */
235  {
236  const size_t size = 3;
237  const double a = 1.2, b = 3.4, c = 5.6;
238  WValue< double > value1( size );
239  WValue< double > value2( size );
240 
241  value1[0] = a;
242  value1[1] = b;
243  value1[2] = c;
244 
245  value2[0] = a + 1;
246  value2[1] = b + 2;
247  value2[2] = c + 3;
248 
249  // this should be the precondition for the test
250  TS_ASSERT_EQUALS( value1 == value2, false );
251 
252  // test simple minus assignement
253  value1 -= value2;
254  TS_ASSERT_DELTA( value1[0], -1., delta );
255  TS_ASSERT_DELTA( value1[1], -2., delta );
256  TS_ASSERT_DELTA( value1[2], -3., delta );
257 
258  WValue< double > value3( size );
259  WValue< double > value4( size );
260 
261  // this should be the precondition for the test
262  TS_ASSERT_EQUALS( value2 == value3, false );
263  TS_ASSERT_EQUALS( value2 == value4, false );
264 
265  // test whether return the reference to self works
266  // for multiple minus assignment
267  value4 -= value3 -= value2;
268  TS_ASSERT_DELTA( value3[0], -value2[0], delta );
269  TS_ASSERT_DELTA( value3[1], -value2[1], delta );
270  TS_ASSERT_DELTA( value3[2], -value2[2], delta );
271  TS_ASSERT_DELTA( value4[0], value2[0], delta );
272  TS_ASSERT_DELTA( value4[1], value2[1], delta );
273  TS_ASSERT_DELTA( value4[2], value2[2], delta );
274  }
275 
276  /**
277  * product with scalar assignment operator*= should assign the correct values
278  */
280  {
281  const size_t size = 3;
282  const double a = 1.2, b = 3.4, c = 5.6;
283  WValue< double > value1( size );
284  const double scalar = 32.32;
285 
286  value1[0] = a;
287  value1[1] = b;
288  value1[2] = c;
289 
290  // test simple product with scalar assignement
291  value1 *= scalar;
292  double expected[] = { 38.784, 109.888, 180.992 };
293  TS_ASSERT_DELTA( value1[0], expected[0], delta );
294  TS_ASSERT_DELTA( value1[1], expected[1], delta );
295  TS_ASSERT_DELTA( value1[2], expected[2], delta );
296 
297  WValue< double > value2( size );
298 
299  // reinitialize value
300  value1[0] = a;
301  value1[1] = b;
302  value1[2] = c;
303 
304  // this should be the precondition for the test
305  TS_ASSERT_EQUALS( value2 == value1, false );
306 
307  // test whether return the reference to self works
308  // for multiple assignments
309  value2 = value1 *= scalar;
310  TS_ASSERT_DELTA( value1[0], expected[0], delta );
311  TS_ASSERT_DELTA( value1[1], expected[1], delta );
312  TS_ASSERT_DELTA( value1[2], expected[2], delta );
313  TS_ASSERT_DELTA( value2[0], value1[0], delta );
314  TS_ASSERT_DELTA( value2[1], value1[1], delta );
315  TS_ASSERT_DELTA( value2[2], value1[2], delta );
316  }
317  /**
318  * componentwise product assignment operator*= should assign the correct values
319  */
321  {
322  const size_t size = 3;
323  const double a = 1.2, b = 3.4, c = 5.6;
324  WValue< double > value1( size );
325  WValue< double > value2( size );
326 
327  value1[0] = a;
328  value1[1] = b;
329  value1[2] = c;
330 
331  value2[0] = a + 1;
332  value2[1] = b + 2;
333  value2[2] = c + 3;
334 
335  // test simple componentwise product assignement
336  value1 *= value2;
337  double expected[] = { 2.64, 18.36, 48.16 };
338  TS_ASSERT_DELTA( value1[0], expected[0], delta );
339  TS_ASSERT_DELTA( value1[1], expected[1], delta );
340  TS_ASSERT_DELTA( value1[2], expected[2], delta );
341 
342  // reinitialize value
343  value1[0] = a;
344  value1[1] = b;
345  value1[2] = c;
346 
347  WValue< double > value3( size );
348 
349  value3[0] = a + 1.1;
350  value3[1] = b + 2.2;
351  value3[2] = c + 3.3;
352 
353  double expected2[] = { 6.072, 102.816, 428.624 };
354 
355  // test whether return the reference to self works
356  // for multiple assignments
357  value3 *= value1 *= value2;
358  TS_ASSERT_DELTA( value1[0], expected[0], delta );
359  TS_ASSERT_DELTA( value1[1], expected[1], delta );
360  TS_ASSERT_DELTA( value1[2], expected[2], delta );
361  TS_ASSERT_DELTA( value3[0], expected2[0], delta );
362  TS_ASSERT_DELTA( value3[1], expected2[1], delta );
363  TS_ASSERT_DELTA( value3[2], expected2[2], delta );
364  }
365 
366  /**
367  * plus operator+
368  */
369  void testPlusOperator( void )
370  {
371  const size_t size = 3;
372  const double a = 1.2, b = 3.4, c = 5.6;
373  WValue< double > value1( size );
374  WValue< double > value2( size );
375  WValue< double > value3( size );
376 
377  value1[0] = a;
378  value1[1] = b;
379  value1[2] = c;
380 
381  value2[0] = a + 1;
382  value2[1] = b + 2;
383  value2[2] = c + 3;
384 
385  // test addition
386  value3 = value1 + value2;
387 
388  TS_ASSERT_DELTA( value3[0], 2 * a + 1, delta );
389  TS_ASSERT_DELTA( value3[1], 2 * b + 2, delta );
390  TS_ASSERT_DELTA( value3[2], 2 * c + 3, delta );
391 
392  // Ensure that value1 and value2 have not been altered
393  TS_ASSERT_EQUALS( value1[0], a );
394  TS_ASSERT_EQUALS( value1[1], b );
395  TS_ASSERT_EQUALS( value1[2], c );
396  TS_ASSERT_EQUALS( value2[0], a + 1 );
397  TS_ASSERT_EQUALS( value2[1], b + 2 );
398  TS_ASSERT_EQUALS( value2[2], c + 3 );
399  }
400 
401  /**
402  * minus operator+-
403  */
404  void testMinusOperator( void )
405  {
406  const size_t size = 3;
407  const double a = 1.2, b = 3.4, c = 5.6;
408  WValue< double > value1( size );
409  WValue< double > value2( size );
410  WValue< double > value3( size );
411 
412  value1[0] = a;
413  value1[1] = b;
414  value1[2] = c;
415 
416  value2[0] = a + 1;
417  value2[1] = b + 2;
418  value2[2] = c + 3;
419 
420  // test subtraction
421  value3 = value1 - value2;
422 
423  TS_ASSERT_DELTA( value3[0], -1, delta );
424  TS_ASSERT_DELTA( value3[1], -2, delta );
425  TS_ASSERT_DELTA( value3[2], -3, delta );
426 
427  // Ensure that value1 and value2 have not been altered
428  TS_ASSERT_EQUALS( value1[0], a );
429  TS_ASSERT_EQUALS( value1[1], b );
430  TS_ASSERT_EQUALS( value1[2], c );
431  TS_ASSERT_EQUALS( value2[0], a + 1 );
432  TS_ASSERT_EQUALS( value2[1], b + 2 );
433  TS_ASSERT_EQUALS( value2[2], c + 3 );
434  }
435 
436  /**
437  * componentwise multiplication operator*
438  */
440  {
441  const size_t size = 3;
442  const double a = 1.2, b = 3.4, c = 5.6;
443  WValue< double > value1( size );
444  WValue< double > value2( size );
445  WValue< double > value3( size );
446 
447  value1[0] = a;
448  value1[1] = b;
449  value1[2] = c;
450 
451  value2[0] = a + 1;
452  value2[1] = b + 2;
453  value2[2] = c + 3;
454 
455  // test subtraction
456  value3 = value1 * value2;
457 
458  double expected[] = { 2.64, 18.36, 48.16 };
459  TS_ASSERT_DELTA( value3[0], expected[0], delta );
460  TS_ASSERT_DELTA( value3[1], expected[1], delta );
461  TS_ASSERT_DELTA( value3[2], expected[2], delta );
462 
463  // Ensure that value1 and value2 have not been altered
464  TS_ASSERT_EQUALS( value1[0], a );
465  TS_ASSERT_EQUALS( value1[1], b );
466  TS_ASSERT_EQUALS( value1[2], c );
467  TS_ASSERT_EQUALS( value2[0], a + 1 );
468  TS_ASSERT_EQUALS( value2[1], b + 2 );
469  TS_ASSERT_EQUALS( value2[2], c + 3 );
470  }
471 
472  /**
473  * norm with doubles
474  */
475  void testNormDouble( void )
476  {
477  const size_t size = 3;
478  const double a = 1.2, b = 3.4, c = 5.6;
479  WValue< double > value1( size );
480 
481  value1[0] = a;
482  value1[1] = b;
483  value1[2] = c;
484  TS_ASSERT_DELTA( value1.norm(), 6.660330322, 1e-7 );
485  }
486 
487  /**
488  * norm int
489  */
490  void testNormInt( void )
491  {
492  const size_t size = 3;
493  const int a = 1, b = 2, c = 3;
494  WValue< int > value1( size );
495 
496  value1[0] = a;
497  value1[1] = b;
498  value1[2] = c;
499  TS_ASSERT_DELTA( value1.norm(), 3.74165738677, 1e-7 );
500  }
501 
502  /**
503  * normsquare
504  */
505  void testNormSquare( void )
506  {
507  const size_t size = 3;
508  const double a = 1.2, b = 3.4, c = 5.6;
509  WValue< double > value1( size );
510 
511  value1[0] = a;
512  value1[1] = b;
513  value1[2] = c;
514  TS_ASSERT_DELTA( value1.normSquare(), 44.36, delta );
515  }
516 
517  /**
518  * test normalization of the current WValue
519  */
520  void testNormalize( void )
521  {
522  const size_t size = 3;
523  const double a = 1.2, b = 3.4, c = 5.6;
524  WValue< double > value1( size );
525 
526  value1[0] = a;
527  value1[1] = b;
528  value1[2] = c;
529 
530  TS_ASSERT( std::abs( value1.norm() - 1. ) > 1e-9 );
531  value1.normalize();
532  TS_ASSERT_DELTA( value1.norm(), 1., delta );
533  }
534 
535  /**
536  * test returning normalized version
537  */
538  void testNormalized( void )
539  {
540  const size_t size = 3;
541  const double a = 1.2, b = 3.4, c = 5.6;
542  WValue< double > value1( size );
543 
544  value1[0] = a;
545  value1[1] = b;
546  value1[2] = c;
547  WValue< double > valueCopy = value1;
548 
549  TS_ASSERT( std::abs( value1.norm() - 1. ) > 1e-9 );
550  WValue< double > value2 = value1.normalized();
551 
552  // value1 should not have been changed
553  TS_ASSERT( std::abs( value1.norm() - 1. ) > 1e-9 );
554  TS_ASSERT_EQUALS( value1, valueCopy );
555 
556  // value2 should contain the normalized version
557  TS_ASSERT_DELTA( value2.norm(), 1., delta );
558  }
559 
560  /**
561  * scaling operator, scalar left hand side
562  */
564  {
565  const size_t size = 3;
566  const double a = 1.2, b = 3.4, c = 5.6;
567  WValue< double > value1( size );
568  WValue< double > value2( size );
569  const double scalar = 32.32;
570 
571  value1[0] = a;
572  value1[1] = b;
573  value1[2] = c;
574 
575  // test scaling with scalar left hand side
576  value2 = scalar * value1;
577 
578  double expected[] = { 38.784, 109.888, 180.992 };
579  TS_ASSERT_DELTA( value2[0], expected[0], delta );
580  TS_ASSERT_DELTA( value2[1], expected[1], delta );
581  TS_ASSERT_DELTA( value2[2], expected[2], delta );
582  }
583 
584  /**
585  * scaling operator, scalar right hand side
586  */
588  {
589  const size_t size = 3;
590  const double a = 1.2, b = 3.4, c = 5.6;
591  WValue< double > value1( size );
592  WValue< double > value2( size );
593  const double scalar = 32.32;
594 
595  value1[0] = a;
596  value1[1] = b;
597  value1[2] = c;
598 
599  // test scaling with scalar right hand side
600  value2 = value1 * scalar;
601 
602  double expected[] = { 38.784, 109.888, 180.992 };
603  TS_ASSERT_DELTA( value2[0], expected[0], delta );
604  TS_ASSERT_DELTA( value2[1], expected[1], delta );
605  TS_ASSERT_DELTA( value2[2], expected[2], delta );
606  }
607 
608  /**
609  * ensure scaling operator commutativity
610  */
612  {
613  const size_t size = 3;
614  const double a = 1.2, b = 3.4, c = 5.6;
615  WValue< double > value1( size );
616  WValue< double > value2( size );
617  WValue< double > value3( size );
618  const double scalar = 32.32;
619 
620  value1[0] = a;
621  value1[1] = b;
622  value1[2] = c;
623 
624 
625  // test scaling with scalar right hand side
626  value2 = value1 * scalar;
627  value3 = scalar * value1;
628 
629  TS_ASSERT_EQUALS( value2, value3 );
630  }
631 
632  /**
633  * Every WValue should have an operator<< for writing to ostreams
634  */
636  {
637  WValue< double > val( 2 );
638  val[0] = 1.;
639  val[1] = 5.;
640  std::string expected( "[1.0000000000000000e+00, 5.0000000000000000e+00]" );
641  std::stringstream ss;
642  ss << val;
643  TS_ASSERT_EQUALS( ss.str(), expected );
644  }
645 
646  /**
647  * Test the mean calculation.
648  */
649  void testMean( void )
650  {
651  WValue< double > val( 3 );
652  val[0] = 1.0;
653  val[1] = 2.0;
654  val[2] = 3.0;
655  TS_ASSERT_EQUALS( val.mean(), 2.0 );
656  }
657 
658  /**
659  * Test the median calculation.
660  */
661  void testMedian( void )
662  {
663  WValue< double > val( 3 );
664  val[0] = 1.0;
665  val[1] = 2.0;
666  val[2] = 3.0;
667  TS_ASSERT_EQUALS( val.mean(), 2.0 );
668  }
669 };
670 
671 #endif // WVALUE_TEST_H
Testsuite for WValue.
Definition: WValue_test.h:39
void testProductWithScalarAssignmentOperator(void)
product with scalar assignment operator*= should assign the correct values
Definition: WValue_test.h:279
void testComponentWiseProductOperator(void)
componentwise multiplication operator*
Definition: WValue_test.h:439
void testMean(void)
Test the mean calculation.
Definition: WValue_test.h:649
void testScalingLeftHandSide(void)
scaling operator, scalar left hand side
Definition: WValue_test.h:563
void testPlusOperator(void)
plus operator+
Definition: WValue_test.h:369
void testScalingRightHandSide(void)
scaling operator, scalar right hand side
Definition: WValue_test.h:587
void testPlusAssignmentOperator(void)
plus assignment operator-= should assign the correct values
Definition: WValue_test.h:192
void testConstElementAccessOperator(void)
Const element access operator should return the right values.
Definition: WValue_test.h:90
void testNormDouble(void)
norm with doubles
Definition: WValue_test.h:475
void testSize(void)
size should give the value we have put into the constructor
Definition: WValue_test.h:64
void testInEqualityOperator(void)
!= operator should return false if the WValues contain the same elements and false if the don't.
Definition: WValue_test.h:127
void testInstantiation(void)
Instantiation should throw nothing.
Definition: WValue_test.h:55
void testMinusAssignmentOperator(void)
minus assignment operator-= should assign the correct values
Definition: WValue_test.h:234
void testScalingCommutativity(void)
ensure scaling operator commutativity
Definition: WValue_test.h:611
void setUp(void)
Called before every test.
Definition: WValue_test.h:47
void testEqualityOperator(void)
== operator should return true if the WValues contain the same elements and false if the don't.
Definition: WValue_test.h:102
void testNormalize(void)
test normalization of the current WValue
Definition: WValue_test.h:520
void testMedian(void)
Test the median calculation.
Definition: WValue_test.h:661
void testMinusOperator(void)
minus operator+-
Definition: WValue_test.h:404
double delta
Some values are allowed to differ by delta.
Definition: WValue_test.h:41
void testComponentWiseProductAssignmentOperator(void)
componentwise product assignment operator*= should assign the correct values
Definition: WValue_test.h:320
void testNormSquare(void)
normsquare
Definition: WValue_test.h:505
void testAssignmentOperator(void)
assignment operator= should assign the correct values
Definition: WValue_test.h:152
void testNormInt(void)
norm int
Definition: WValue_test.h:490
void testNormalized(void)
test returning normalized version
Definition: WValue_test.h:538
void testOutputStreamOperator(void)
Every WValue should have an operator<< for writing to ostreams.
Definition: WValue_test.h:635
void testElementAccessOperator(void)
Element access operator should return the right values.
Definition: WValue_test.h:74
Base class for all higher level values like tensors, vectors, matrices and so on.
Definition: WValue.h:41
WValue normalized() const
Return a normalized version of the current WValue without modifying it.
Definition: WValue.h:331
size_t size() const
Get number of components the value consists of.
Definition: WValue.h:116
double norm() const
Square root of sum of squares of elements.
Definition: WValue.h:288
T mean() const
Returns the mean value of all values stored in this WValue.
Definition: WValue.h:342
void normalize()
Make the norm of this WValue be 1 by dividing by WValue::norm()
Definition: WValue.h:317
double normSquare() const
Sum of squares of elements.
Definition: WValue.h:302