00001 #include <UnitTest++.h> 00002 #include "cddefines.h" 00003 #include "monointerp.h" 00004 00005 #undef NUMVALS 00006 #define NUMVALS(a) sizeof(a)/sizeof((a)[0]) 00007 00008 namespace { 00009 static double xvals1[] = {0.0,1.0}, 00010 yvals1[] = {0.0,1.0}, 00011 xvals2[] = {0.0,1.0,2.0,3.0,4.0}, 00012 yvals2[] = {0.0,1.0,4.0,9.0,16.0}, 00013 xvals3[] = {0.0,1.0, 2.0,3.0,4.0,5.0,6.0}, 00014 yvals3[] = {0.0,1.0,-1.0,2.0,1.0,1.0,0.0}; 00015 struct MonoInterpFixture 00016 { 00017 Monointerp m1, m2, m3; 00018 00019 MonoInterpFixture () : 00020 m1(xvals1,yvals1,NUMVALS(xvals1)), 00021 m2(xvals2,yvals2,NUMVALS(xvals2)), 00022 m3(xvals3,yvals3,NUMVALS(xvals3)) 00023 {} 00024 ~MonoInterpFixture () {} 00025 }; 00026 TEST_FIXTURE(MonoInterpFixture,TestMonoInterpLimits) 00027 { 00028 CHECK( fp_equal(0.0,m1(0.0)) ); 00029 CHECK( fp_equal(1.0,m1(1.0)) ); 00030 } 00031 TEST_FIXTURE(MonoInterpFixture,TestMonoInterpInterp) 00032 { 00033 CHECK( fp_equal(0.5,m1(0.5)) ); 00034 CHECK( fp_equal(0.333,m1(0.333)) ); 00035 CHECK( fp_equal(0.99,m1(0.99)) ); 00036 } 00037 TEST_FIXTURE(MonoInterpFixture,TestMonoInterpExtrap) 00038 { 00039 CHECK( fp_equal(0.,m1(-0.5)) ); 00040 CHECK( fp_equal(1.,m1(1.5)) ); 00041 } 00042 TEST_FIXTURE(MonoInterpFixture,TestMonoInterpQuad) 00043 { 00044 for (unsigned int i=0; i<NUMVALS(xvals2); ++i) 00045 CHECK( fp_equal(yvals2[i],m2(xvals2[i])) ); 00046 CHECK_CLOSE(1.5*1.5,m2(1.5),5e-2); 00047 CHECK_CLOSE(1.1*1.1,m2(1.1),5e-2); 00048 CHECK_CLOSE(1.9*1.9,m2(1.9),5e-2); 00049 } 00050 TEST_FIXTURE(MonoInterpFixture,TestMonoInterpQuadExtrap) 00051 { 00052 CHECK( fp_equal(yvals2[0],m2(-0.5)) ); 00053 CHECK( fp_equal(yvals2[NUMVALS(yvals2)-1],m2(NUMVALS(yvals2)-0.5)) ); 00054 } 00055 TEST_FIXTURE(MonoInterpFixture,TestMonoInterpJump) 00056 { 00057 for (unsigned int i=0; i<NUMVALS(xvals3); ++i) 00058 CHECK( fp_equal(yvals3[i],m3(xvals3[i])) ); 00059 } 00060 TEST_FIXTURE(MonoInterpFixture,TestMonoInterpJumpExtrap) 00061 { 00062 CHECK( fp_equal(yvals3[0],m3(-0.5)) ); 00063 CHECK( fp_equal(yvals3[NUMVALS(yvals3)-1],m3(NUMVALS(yvals3)-0.5)) ); 00064 } 00065 TEST_FIXTURE(MonoInterpFixture,TestMonoInterpJumpMonotonic) 00066 { 00067 const double eps=1e-5; 00068 for (unsigned int i=0; i<NUMVALS(xvals3)-1; ++i) 00069 { 00070 CHECK((yvals3[i]-m3(xvals3[i]+eps))*(yvals3[i+1]-m3(xvals3[i]+eps))<=0); 00071 CHECK((yvals3[i]-m3(xvals3[i+1]-eps)) 00072 *(yvals3[i+1]-m3(xvals3[i+1]-eps))<=0); 00073 } 00074 } 00075 }