diff options
Diffstat (limited to 'libs/midi++2/test/MidnamTest.cpp')
-rw-r--r-- | libs/midi++2/test/MidnamTest.cpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/libs/midi++2/test/MidnamTest.cpp b/libs/midi++2/test/MidnamTest.cpp new file mode 100644 index 0000000000..b993f2d65e --- /dev/null +++ b/libs/midi++2/test/MidnamTest.cpp @@ -0,0 +1,125 @@ +#include "MidnamTest.hpp" + +#include <glibmm/fileutils.h> + +#include "pbd/xml++.h" +#include "pbd/file_utils.h" +#include "midi++/midnam_patch.h" + +using namespace std; +using namespace MIDI::Name; + +CPPUNIT_TEST_SUITE_REGISTRATION( MidnamTest ); + +static string const prefix = "../../../patchfiles/"; + +void MidnamTest::protoolsPatchFileTest() { + XMLTree xmldoc(prefix + "ProtoolsPatchFile.midnam"); + boost::shared_ptr<XMLSharedNodeList> result = xmldoc.find( + "//MIDINameDocument"); + CPPUNIT_ASSERT(result->size() == 1); + + result = xmldoc.find("//ChannelNameSet"); + CPPUNIT_ASSERT(result->size() == 2); + + MIDINameDocument doc(prefix + "ProtoolsPatchFile.midnam"); + CPPUNIT_ASSERT(doc.all_models().size() == 1); + CPPUNIT_ASSERT(doc.author().find("Mark of the Unicorn") == 0); + + const string model = doc.all_models().front(); + CPPUNIT_ASSERT_EQUAL(string("SC-88 Pro"), model); + boost::shared_ptr<MasterDeviceNames> masterDeviceNames = + doc.master_device_names_by_model().find(model)->second; + CPPUNIT_ASSERT_EQUAL(string("Roland"), masterDeviceNames->manufacturer()); + + string modename = masterDeviceNames->custom_device_mode_names().front(); + CPPUNIT_ASSERT_EQUAL(string("Mode 1"), modename); + + boost::shared_ptr<CustomDeviceMode> mode = + masterDeviceNames->custom_device_mode_by_name(modename); + + CPPUNIT_ASSERT_EQUAL(modename, mode->name()); + + string ns1 = string("Name Set 1"); + string ns2 = string("Name Set 2"); + + for (uint8_t i = 0; i <= 15; i++) { + if (i != 9) + CPPUNIT_ASSERT_EQUAL(ns1, + mode->channel_name_set_name_by_channel(i)); + else + CPPUNIT_ASSERT_EQUAL(ns2, + mode->channel_name_set_name_by_channel(i)); + } + + boost::shared_ptr<ChannelNameSet> nameSet1 = + masterDeviceNames->channel_name_set_by_device_mode_and_channel( + modename, 0); + boost::shared_ptr<ChannelNameSet> nameSet2 = + masterDeviceNames->channel_name_set_by_device_mode_and_channel( + modename, 9); + + CPPUNIT_ASSERT_EQUAL(ns1, nameSet1->name()); + CPPUNIT_ASSERT_EQUAL(ns2, nameSet2->name()); + + const ChannelNameSet::PatchBanks& banks1 = nameSet1->patch_banks(); + const ChannelNameSet::PatchBanks& banks2 = nameSet2->patch_banks(); + CPPUNIT_ASSERT(banks1.size() == 16); + CPPUNIT_ASSERT(banks2.size() == 1); + + boost::shared_ptr<PatchBank> bank = banks1.front(); + CPPUNIT_ASSERT_EQUAL(string("Piano"), bank->name()); + const PatchBank::PatchNameList& plist1 = bank->patch_name_list(); + CPPUNIT_ASSERT(plist1.size() == 110); + + bank = banks2.front(); + CPPUNIT_ASSERT_EQUAL(string("Drum sets"), bank->name()); + const PatchBank::PatchNameList& plist2 = bank->patch_name_list(); + CPPUNIT_ASSERT(plist2.size() == 49); +} + +void +MidnamTest::loadAllMidnamsTest () +{ + assert (Glib::file_test (prefix, Glib::FILE_TEST_IS_DIR)); + + Glib::PatternSpec pattern(string("*.midnam")); + vector<std::string> result; + + PBD::find_matching_files_in_directory (prefix, pattern, result); + + cout << "Loading " << result.size() << " MIDI patches from " << prefix << endl; + + for (vector<std::string>::iterator i = result.begin(); i != result.end(); ++i) { + cout << "Processing file " << *i << endl; + boost::shared_ptr<MIDINameDocument> document(new MIDINameDocument(*i)); + + XMLTree xmldoc(*i); + boost::shared_ptr<XMLSharedNodeList> result = xmldoc.find("//MIDINameDocument"); + CPPUNIT_ASSERT(result->size() == 1); + + result = xmldoc.find("//MasterDeviceNames"); + CPPUNIT_ASSERT(result->size() == 1); + + result = xmldoc.find("//ChannelNameSet"); + CPPUNIT_ASSERT(result->size() >= 1); + + result = xmldoc.find("//PatchBank"); + int banks = result->size(); + + + result = xmldoc.find("//CustomDeviceMode[1]"); + string deviceModeName = result->front()->property("Name")->value(); + + MIDINameDocument::MasterDeviceNamesList::const_iterator device = + document->master_device_names_by_model().begin(); + + string modename = device->second->custom_device_mode_names().front(); + cerr << "modename:" << modename << endl; + boost::shared_ptr<CustomDeviceMode> mode = device->second->custom_device_mode_by_name(modename); + CPPUNIT_ASSERT_EQUAL(deviceModeName, mode->name()); + + boost::shared_ptr<ChannelNameSet> nameSet = device->second->channel_name_set_by_device_mode_and_channel(modename, 0); + } +} + |