From 5190cbc9b2180ab3b98f3e1eb443653c50beecce Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 19 Jan 2015 23:53:52 +0100 Subject: 2-point Curve Linear Interpolation Test --- libs/evoral/test/CurveTest.cpp | 71 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 13 deletions(-) (limited to 'libs/evoral/test/CurveTest.cpp') diff --git a/libs/evoral/test/CurveTest.cpp b/libs/evoral/test/CurveTest.cpp index 8e6c8011f5..f4e2d606b6 100644 --- a/libs/evoral/test/CurveTest.cpp +++ b/libs/evoral/test/CurveTest.cpp @@ -7,26 +7,71 @@ CPPUNIT_TEST_SUITE_REGISTRATION (CurveTest); using namespace Evoral; +// linear y = Y0 + YS * x ; with x = i * (X1 - X0) + X0; and i = [0..1023] +#define VEC1024LINCMP(X0, X1, Y0, YS) \ + cl->curve ().get_vector ((X0), (X1), vec, 1024); \ + for (int i = 0; i < 1024; ++i) { \ + char msg[64]; \ + snprintf (msg, 64, "at i=%d (x0=%.1f, x1=%.1f, y0=%.1f, ys=%.3f)", \ + i, X0, X1, Y0, YS); \ + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE ( \ + msg, \ + (Y0) + i * (YS), vec[i], \ + 1e-24 \ + ); \ + } + void -CurveTest::interpolateTest1 () +CurveTest::twoPointLinear () { float vec[1024]; - Parameter param (Parameter(0)); - const Evoral::ParameterDescriptor desc; - ControlList *cl (new ControlList(param, desc)); + boost::shared_ptr cl = TestCtrlList(); + + cl->create_curve (); + cl->set_interpolation (ControlList::Linear); + + // add two points to curve + cl->fast_simple_add ( 0.0 , 2048.0); + cl->fast_simple_add (8192.0 , 4096.0); + + cl->curve ().get_vector (1024.0, 2047.0, vec, 1024); + + VEC1024LINCMP (1024.0, 2047.0, 2304.f, .25f); + VEC1024LINCMP (2048.0, 2559.5, 2560.f, .125f); + VEC1024LINCMP ( 0.0, 4092.0, 2048.f, 1.f); + + // greetings to tartina + cl->curve ().get_vector (2048.0, 2048.0, vec, 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=1 @ 2048-2048", 2560.f, vec[0]); + + /* XXX WHAT DO WE EXPECT WITH veclen=1 AND x1 > x0 ? */ +#if 0 + /* .. interpolated value at (x1+x0)/2 */ + cl->curve ().get_vector (2048.0, 2049.0, vec, 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=1 @ 2048-2049", 2560.125f, vec[0]); - cl->create_curve(); + cl->curve ().get_vector (2048.0, 2056.0, vec, 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=1 @ 2048-2049", 2561.f, vec[0]); +#else + /* .. value at x0 */ + cl->curve ().get_vector (2048.0, 2049.0, vec, 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=1 , 2048-2049", 2560.f, vec[0]); - cl->fast_simple_add(0.0 , 0.0); - cl->fast_simple_add(8191.0 , 8191.0); + cl->curve ().get_vector (2048.0, 2056.0, vec, 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=1 , 2048-2049", 2560.f, vec[0]); +#endif - cl->curve().get_vector(1024, 2047, vec, 1024); + cl->curve ().get_vector (2048.0, 2048.0, vec, 2); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=2 , 2048-2048 @ 0", 2560.f, vec[0]); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=2 , 2048-2048 @ 1", 2560.f, vec[1]); - for (int i = 0; i < 1024; ++i) { - CPPUNIT_ASSERT_EQUAL (1024.f + i, vec[i]); - } + cl->curve ().get_vector (2048.0, 2056.0, vec, 2); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=2 , 2048-2056 @ 0", 2560.f, vec[0]); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=2 , 2048-2056 @ 0", 2562.f, vec[1]); - cl->destroy_curve(); - delete cl; + cl->curve ().get_vector (2048.0, 2056.0, vec, 3); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=3 , 2048-2056 @ 0", 2560.f, vec[0]); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=3 , 2048-2056 @ 1", 2561.f, vec[1]); + CPPUNIT_ASSERT_EQUAL_MESSAGE ("veclen=3 , 2048-2056 @ 2", 2562.f, vec[2]); } -- cgit v1.2.3