2-point Curve Linear Interpolation Test
authorRobin Gareus <robin@gareus.org>
Mon, 19 Jan 2015 22:53:52 +0000 (23:53 +0100)
committerRobin Gareus <robin@gareus.org>
Mon, 19 Jan 2015 22:55:52 +0000 (23:55 +0100)
libs/evoral/test/CurveTest.cpp
libs/evoral/test/CurveTest.hpp

index 8e6c8011f5a01ef41290ac01152109957e10dc02..f4e2d606b60b878e55e47bd8020494f64e9e739c 100644 (file)
@@ -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<Evoral::ControlList> 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]);
 }
index d634886bc931466802f1f9c49e7b0169f6ad0a7b..042ee908432647902b05101d625be7cb06bc65db 100644 (file)
@@ -1,14 +1,21 @@
 #include <cppunit/TestFixture.h>
 #include <cppunit/extensions/HelperMacros.h>
+#include <boost/shared_ptr.hpp>
+#include "evoral/ControlList.hpp"
 
 class CurveTest : public CppUnit::TestFixture
 {
        CPPUNIT_TEST_SUITE (CurveTest);
-       CPPUNIT_TEST (interpolateTest1);
+       CPPUNIT_TEST (twoPointLinear);
        CPPUNIT_TEST_SUITE_END ();
 
 public:
-       void interpolateTest1 ();
-};
+       void twoPointLinear ();
 
-       
+private:
+       boost::shared_ptr<Evoral::ControlList> TestCtrlList() {
+               Evoral::Parameter param (Evoral::Parameter(0));
+               const Evoral::ParameterDescriptor desc;
+               return boost::shared_ptr<Evoral::ControlList> (new Evoral::ControlList(param, desc));
+       }
+};