cannam@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@0: cannam@0: /* cannam@0: Vamp Plugin Fuzz Tester cannam@0: Chris Cannam, cannam@all-day-breakfast.com cannam@0: Centre for Digital Music, Queen Mary, University of London. cannam@0: Copyright 2009 QMUL. cannam@0: cannam@0: This program loads a Vamp plugin and tests its susceptibility to a cannam@0: number of common pitfalls, including handling of extremes of input cannam@0: data. If you can think of any additional useful tests that are cannam@0: easily added, please send them to me. cannam@0: cannam@0: Permission is hereby granted, free of charge, to any person cannam@0: obtaining a copy of this software and associated documentation cannam@0: files (the "Software"), to deal in the Software without cannam@0: restriction, including without limitation the rights to use, copy, cannam@0: modify, merge, publish, distribute, sublicense, and/or sell copies cannam@0: of the Software, and to permit persons to whom the Software is cannam@0: furnished to do so, subject to the following conditions: cannam@0: cannam@0: The above copyright notice and this permission notice shall be cannam@0: included in all copies or substantial portions of the Software. cannam@0: cannam@0: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, cannam@0: EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF cannam@0: MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND cannam@0: NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR cannam@0: ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF cannam@0: CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION cannam@0: WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. cannam@0: cannam@0: Except as contained in this notice, the names of the Centre for cannam@0: Digital Music; Queen Mary, University of London; and Chris Cannam cannam@0: shall not be used in advertising or otherwise to promote the sale, cannam@0: use or other dealings in this Software without prior written cannam@0: authorization. cannam@0: */ cannam@0: cannam@0: #include "Test.h" cannam@0: cannam@0: #include cannam@0: cannam@0: using namespace Vamp; cannam@0: using namespace Vamp::HostExt; cannam@0: cannam@0: Test::Test() { } cannam@0: Test::~Test() { } cannam@0: cannam@0: Plugin * cannam@0: Test::load(std::string key, float rate) cannam@0: { cannam@0: return PluginLoader::getInstance()->loadPlugin cannam@0: (key, rate, PluginLoader::ADAPT_ALL); cannam@0: } cannam@0: cannam@0: void cannam@0: Test::appendFeatures(Plugin::FeatureSet &a, const Plugin::FeatureSet &b) cannam@0: { cannam@0: for (Plugin::FeatureSet::const_iterator i = b.begin(); i != b.end(); ++i) { cannam@0: int output = i->first; cannam@0: const Plugin::FeatureList &fl = i->second; cannam@0: Plugin::FeatureList &target = a[output]; cannam@0: for (Plugin::FeatureList::const_iterator j = fl.begin(); j != fl.end(); ++j) { cannam@0: target.push_back(*j); cannam@0: } cannam@0: } cannam@0: } cannam@0: cannam@0: bool cannam@0: operator==(const Plugin::FeatureSet &a, const Plugin::FeatureSet &b) cannam@0: { cannam@0: if (a.size() != b.size()) return false; cannam@0: for (Plugin::FeatureSet::const_iterator ai = a.begin(); cannam@0: ai != a.end(); ++ai) { cannam@0: int output = ai->first; cannam@0: Plugin::FeatureSet::const_iterator bi = b.find(output); cannam@0: if (bi == b.end()) return false; cannam@0: if (!(ai->second == bi->second)) return false; cannam@0: } cannam@0: return true; cannam@0: } cannam@0: cannam@0: bool cannam@0: operator==(const Plugin::FeatureList &a, const Plugin::FeatureList &b) cannam@0: { cannam@0: if (a.size() != b.size()) return false; cannam@0: for (int i = 0; i < (int)a.size(); ++i) { cannam@0: if (!(a[i] == b[i])) return false; cannam@0: } cannam@0: return true; cannam@0: } cannam@0: cannam@0: bool cannam@0: operator==(const Plugin::Feature &a, const Plugin::Feature &b) cannam@0: { cannam@0: if (a.hasTimestamp != b.hasTimestamp) return false; cannam@0: if (a.hasTimestamp && (a.timestamp != b.timestamp)) return false; cannam@0: if (a.hasDuration != b.hasDuration) return false; cannam@0: if (a.hasDuration && (a.duration != b.duration)) return false; cannam@0: if (a.values != b.values) return false; cannam@0: if (a.label != b.label) return false; cannam@0: return true; cannam@0: } cannam@0: