OSC: Add system osc preset directory
[ardour.git] / libs / evoral / test / SMFTest.cpp
index 2a299be1f3a258ffecd5eda3a4b83c16b7100d6e..b177ca91084fb1066d0cc1f8f47c52b9605ecef7 100644 (file)
@@ -1,5 +1,10 @@
 #include "SMFTest.hpp"
 
+#include <glibmm/fileutils.h>
+#include <glibmm/miscutils.h>
+
+#include "pbd/file_utils.h"
+
 using namespace std;
 
 CPPUNIT_TEST_SUITE_REGISTRATION( SMFTest );
@@ -8,44 +13,107 @@ void
 SMFTest::createNewFileTest ()
 {
        TestSMF smf;
-       smf.create("NewFile.mid");
+
+       string output_dir_path = PBD::tmp_writable_directory (PACKAGE, "createNewFileTest");
+       string new_file_path = Glib::build_filename (output_dir_path, "NewFile.mid");
+       smf.create(new_file_path);
        smf.close();
-       CPPUNIT_ASSERT(access("NewFile.mid", R_OK) == 0);
-       unlink(smf.path().c_str());
+       CPPUNIT_ASSERT(Glib::file_test (new_file_path, Glib::FILE_TEST_IS_REGULAR));
+}
+
+PBD::Searchpath
+test_search_path ()
+{
+#ifdef PLATFORM_WINDOWS
+       if (!getenv("EVORAL_TEST_PATH")) {
+               string wsp(g_win32_get_package_installation_directory_of_module(NULL));
+               return Glib::build_filename (wsp,  "evoral_testdata");
+       }
+#endif
+       return Glib::getenv("EVORAL_TEST_PATH");
 }
 
 void
 SMFTest::takeFiveTest ()
 {
        TestSMF smf;
-       smf.open("./test/testdata/TakeFive.mid");
+       string testdata_path;
+       CPPUNIT_ASSERT (find_file (test_search_path (), "TakeFive.mid", testdata_path));
+       CPPUNIT_ASSERT (SMF::test(testdata_path));
+
+       smf.open(testdata_path);
        CPPUNIT_ASSERT(!smf.is_empty());
-       
+
+       CPPUNIT_ASSERT_EQUAL((uint16_t)1, smf.num_tracks());
+       CPPUNIT_ASSERT_EQUAL(0, smf.seek_to_track(1));
+
        seq->start_write();
        smf.seek_to_start();
 
        uint64_t time = 0; /* in SMF ticks */
-       Evoral::Event<double> ev;
-       
-       const double frames_per_beat = 100.0;
-       
+       Evoral::Event<Evoral::Beats> ev;
+
        uint32_t delta_t = 0;
        uint32_t size    = 0;
        uint8_t* buf     = NULL;
        int ret;
        while ((ret = smf.read_event(&delta_t, &size, &buf)) >= 0) {
-               ev.set(buf, size, 0.0);
+               ev.set(buf, size, Evoral::Beats());
                time += delta_t;
-               
+
                if (ret > 0) { // didn't skip (meta) event
                        //cerr << "read smf event type " << hex << int(buf[0]) << endl;
-                       // make ev.time absolute time in frames
-                       ev.time() = time * frames_per_beat / (double)smf.ppqn();
-                       ev.set_event_type(type_map->midi_event_type(buf[0]));
-                       seq->append(ev);
+                       ev.set_time(Evoral::Beats::ticks_at_rate(time, smf.ppqn()));
+                       ev.set_event_type(Evoral::MIDI_EVENT);
+                       seq->append(ev, next_event_id ());
                }
        }
 
-       seq->end_write(false);
+       seq->end_write (Sequence<Time>::Relax,
+                       Evoral::Beats::ticks_at_rate(time, smf.ppqn()));
        CPPUNIT_ASSERT(!seq->empty());
+
+       // Iterate over all notes
+       bool   on          = true;
+       size_t num_notes   = 0;
+       size_t num_sysexes = 0;
+       for (Sequence<Time>::const_iterator i = seq->begin(Evoral::Beats()); i != seq->end(); ++i) {
+               if (i->is_note_on()) {
+                       ++num_notes;
+               } else if (i->is_sysex()) {
+                       ++num_sysexes;
+               }
+       }
+       CPPUNIT_ASSERT_EQUAL(size_t(3833), seq->notes().size());
+       CPPUNIT_ASSERT_EQUAL(size_t(3833), num_notes);
+       CPPUNIT_ASSERT_EQUAL(size_t(232), seq->sysexes().size());
+       CPPUNIT_ASSERT_EQUAL(size_t(232), num_sysexes);
+}
+
+void
+SMFTest::writeTest ()
+{
+       TestSMF smf;
+       string  testdata_path;
+       CPPUNIT_ASSERT (find_file (test_search_path (), "TakeFive.mid", testdata_path));
+
+       smf.open(testdata_path);
+       CPPUNIT_ASSERT(!smf.is_empty());
+
+       TestSMF out;
+       const string output_dir_path = PBD::tmp_writable_directory (PACKAGE, "writeTest");
+       const string new_file_path   = Glib::build_filename (output_dir_path, "TakeFiveCopy.mid");
+       CPPUNIT_ASSERT_EQUAL (0, out.create(new_file_path, 1, 1920));
+       out.begin_write();
+
+       uint32_t delta_t = 0;
+       uint32_t size    = 0;
+       uint8_t* buf     = NULL;
+       while (smf.read_event(&delta_t, &size, &buf) >= 0) {
+               out.append_event_delta(delta_t, size, buf, 0);
+       }
+
+       out.end_write(new_file_path);
+
+       // TODO: Check files are actually equivalent
 }