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 }