* Evoral: Added Unit test for SMF
authorHans Baier <hansfbaier@googlemail.com>
Tue, 10 Feb 2009 23:58:02 +0000 (23:58 +0000)
committerHans Baier <hansfbaier@googlemail.com>
Tue, 10 Feb 2009 23:58:02 +0000 (23:58 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@4523 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/evoral/test/SMFTest.cpp
libs/evoral/test/SMFTest.hpp
libs/evoral/test/SequenceTest.hpp
libs/evoral/test/testdata/TakeFive.mid [new file with mode: 0755]
libs/evoral/wscript

index 369bc80e4552caabe3fbe4eb07c2dc385403085c..b5891ff23f6b64e9e60481f966ee8b89d41b4219 100644 (file)
@@ -1 +1,41 @@
 #include "SMFTest.hpp"
+
+using namespace std;
+
+CPPUNIT_TEST_SUITE_REGISTRATION( SMFTest );
+
+void
+SMFTest::takeFiveTest ()
+{
+       TestSMF<Time> smf;
+       smf.open("./test/testdata/TakeFive.mid");
+       CPPUNIT_ASSERT(!smf.is_empty());
+       
+       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;
+       
+       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) {
+               cerr << "read smf event type " << int(buf[0]) << endl;
+               ev.set(buf, size, 0.0);
+               time += delta_t;
+               
+               if (ret > 0) { // didn't skip (meta) event
+                       // 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);
+               }
+       }
+
+       seq->end_write(false);
+       CPPUNIT_ASSERT(!seq->empty());
+}
index 5b3d96a27bb9bcf39f123f2c2d85e4f8bc45578d..f63fec838aeeecde0d76c714f52f8f0579ef5001 100644 (file)
@@ -3,6 +3,51 @@
 
 #include <evoral/SMF.hpp>
 
+#include "SequenceTest.hpp"
+
 #include <sigc++/sigc++.h>
 
 #include <cassert>
+
+using namespace Evoral;
+
+template<typename Time>
+class TestSMF : public SMF<Time> {
+public:
+       int  open(const std::string& path) {
+               return SMF<Time>::open(path);
+       }
+       
+       int read_event(uint32_t* delta_t, uint32_t* size, uint8_t** buf) const {
+               return SMF<Time>::read_event(delta_t, size, buf);
+       }
+};
+
+class SMFTest : public CppUnit::TestFixture
+{
+    CPPUNIT_TEST_SUITE (SMFTest);
+    CPPUNIT_TEST (takeFiveTest);
+    CPPUNIT_TEST_SUITE_END ();
+
+    public:
+    
+       typedef double Time;
+               
+        void setUp (void) { 
+           type_map = new DummyTypeMap();
+           assert(type_map);
+           seq = new MySequence<Time>(*type_map, 0);
+           assert(seq);
+        }
+        
+        void tearDown (void) {
+               delete seq;
+               delete type_map;
+        }
+
+        void takeFiveTest (void);
+
+    private:
+               DummyTypeMap*       type_map;
+               MySequence<Time>*   seq;
+};
index 746c20cd0fae55ebdf04458621e8b5feda7e83f5..7800438456216214c2c9233ca0f444bf924a5075 100644 (file)
@@ -109,7 +109,6 @@ class SequenceTest : public CppUnit::TestFixture
                typedef std::vector<boost::shared_ptr<Note<Time> > > Notes;
                
         void setUp (void) { 
-               std::cerr << "SetUp" << std::endl;
                type_map = new DummyTypeMap();
                assert(type_map);
                seq = new MySequence<Time>(*type_map, 0);
diff --git a/libs/evoral/test/testdata/TakeFive.mid b/libs/evoral/test/testdata/TakeFive.mid
new file mode 100755 (executable)
index 0000000..0d472ac
Binary files /dev/null and b/libs/evoral/test/testdata/TakeFive.mid differ
index 32386f29f64615a6910018942393febcb8febac2..639c42b2282642cadc645659063bef5458d8d7d5 100644 (file)
@@ -64,6 +64,7 @@ def build(bld):
        obj              = bld.new_task_gen('cxx', 'program')
        obj.source       = '''
                test/SequenceTest.cpp
+               test/SMFTest.cpp
                test/testrunner.cpp
        '''
        obj.includes     = ['.', './src']