summaryrefslogtreecommitdiff
path: root/libs/evoral/test
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-01-19 23:53:52 +0100
committerRobin Gareus <robin@gareus.org>2015-01-19 23:55:52 +0100
commit5190cbc9b2180ab3b98f3e1eb443653c50beecce (patch)
treef75a58b723e0e0359a0ba87d51e5675ee59eaf76 /libs/evoral/test
parent24b747383190536a928169c76b2152595a6ed2f8 (diff)
2-point Curve Linear Interpolation Test
Diffstat (limited to 'libs/evoral/test')
-rw-r--r--libs/evoral/test/CurveTest.cpp71
-rw-r--r--libs/evoral/test/CurveTest.hpp15
2 files changed, 69 insertions, 17 deletions
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<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]);
}
diff --git a/libs/evoral/test/CurveTest.hpp b/libs/evoral/test/CurveTest.hpp
index d634886bc9..042ee90843 100644
--- a/libs/evoral/test/CurveTest.hpp
+++ b/libs/evoral/test/CurveTest.hpp
@@ -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));
+ }
+};