changeset 34:a2d9aed55a2a

Check that a reset call does not change parameter values
author Chris Cannam
date Mon, 16 Dec 2013 13:28:28 +0000
parents 005ac7a3d827
children b700f37dc118
files TestDefaults.cpp TestDefaults.h
diffstat 2 files changed, 76 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/TestDefaults.cpp	Wed Nov 06 13:01:03 2013 +0000
+++ b/TestDefaults.cpp	Mon Dec 16 13:28:28 2013 +0000
@@ -58,6 +58,9 @@
 Tester::TestRegistrar<TestDefaultParameters>
 TestDefaultParameters::m_registrar("E2 Inconsistent default parameters");
 
+Tester::TestRegistrar<TestParametersOnReset>
+TestParametersOnReset::m_registrar("E3 Parameter retention through reset");
+
 static const size_t _step = 1000;
 
 Test::Results
@@ -168,3 +171,66 @@
 
     return r;
 }
+
+Test::Results
+TestParametersOnReset::test(string key, Options options)
+{
+    Plugin::FeatureSet f[2];
+    int rate = 44100;
+    Results r;
+    float **data = 0;
+    size_t channels = 0;
+    size_t count = 100;
+
+    for (int run = 0; run < 2; ++run) {
+        auto_ptr<Plugin> p(load(key, rate));
+	if (p->getParameterDescriptors().empty()) return r;
+
+        // Set all parameters to non-default values
+        Plugin::ParameterList pl = p->getParameterDescriptors();
+        for (int i = 0; i < (int)pl.size(); ++i) {
+            if (pl[i].defaultValue == pl[i].minValue) {
+                p->setParameter(pl[i].identifier, pl[i].maxValue);
+            } else {
+                p->setParameter(pl[i].identifier, pl[i].minValue);
+            }
+        }
+
+        if (!initAdapted(p.get(), channels, _step, _step, r)) return r;
+
+        //  First run: construct, set params, init, process
+        // Second run: construct, set params, init, reset, process
+        // We expect these to produce the same results
+        if (run == 1) p->reset();
+
+        if (!data) data = createTestAudio(channels, _step, count);
+        for (size_t i = 0; i < count; ++i) {
+#ifdef __GNUC__
+            float *ptr[channels];
+#else
+            float **ptr = (float **)alloca(channels * sizeof(float));
+#endif
+            size_t idx = i * _step;
+            for (size_t c = 0; c < channels; ++c) ptr[c] = data[c] + idx;
+            RealTime timestamp = RealTime::frame2RealTime(idx, rate);
+            Plugin::FeatureSet fs = p->process(ptr, timestamp);
+            appendFeatures(f[run], fs);
+        }
+        Plugin::FeatureSet fs = p->getRemainingFeatures();
+        appendFeatures(f[run], fs);
+    }
+    if (data) destroyTestAudio(data, channels);
+
+    if (!(f[0] == f[1])) {
+        string message = "Call to reset after setting parameters, but before processing, changes the results (parameter values not retained through reset?)";
+        Result res;
+        if (options & NonDeterministic) res = note(message);
+        else res = error(message);
+        if (options & Verbose) dump(res, f[0], f[1]);
+        r.push_back(res);
+    } else {
+        r.push_back(success());
+    }
+
+    return r;
+}
--- a/TestDefaults.h	Wed Nov 06 13:01:03 2013 +0000
+++ b/TestDefaults.h	Mon Dec 16 13:28:28 2013 +0000
@@ -63,4 +63,14 @@
     static Tester::TestRegistrar<TestDefaultParameters> m_registrar;
 };
 
+class TestParametersOnReset : public Test
+{
+public:
+    TestParametersOnReset() : Test() { }
+    Results test(std::string key, Options options);
+    
+protected:
+    static Tester::TestRegistrar<TestParametersOnReset> m_registrar;
+};
+
 #endif