From 92d82866e0f0715f337bdecda019293dd3be37a2 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 21 Feb 2022 11:55:44 -0700 Subject: [PATCH] temporal: add some basic BBT time tests Some of the subtraction tests may need revising because it is not immediately clear that the current answers are correct. --- libs/temporal/test/BBTTest.cc | 83 ++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/libs/temporal/test/BBTTest.cc b/libs/temporal/test/BBTTest.cc index 03f2a68f14..9e066e5002 100644 --- a/libs/temporal/test/BBTTest.cc +++ b/libs/temporal/test/BBTTest.cc @@ -1,6 +1,7 @@ #include #include "temporal/bbt_time.h" +#include "temporal/tempo.h" #include "BBTTest.h" @@ -11,16 +12,97 @@ using namespace Temporal; void BBTTest::createTest() { + CPPUNIT_ASSERT_THROW_MESSAGE ("- zero-bar BBT_Time;", BBT_Time (0, 1, 0), IllegalBBTTimeException); + CPPUNIT_ASSERT_THROW_MESSAGE ("- zero-beat BBT_Time;", BBT_Time (1, 0, 0), IllegalBBTTimeException); + CPPUNIT_ASSERT_THROW_MESSAGE ("- zero-bar-and-beat BBT_Time;", BBT_Time (0, 0, 0), IllegalBBTTimeException); + + /* This test checks that BBT_Time cannot convert ticks to beats etc., so the explicit 1920 ticks remains + that in the constructed BBT_Time, rather than being converted to an additional beat. This has to be true + because BBT_Time has no clue what the meter is. + */ + BBT_Time a (1, 1, 1920); + CPPUNIT_ASSERT(BBT_Time (1,2,0) != a); + + /* by contrast, a zero-distance "walk" from that location should return a canonicalized BBT_Time, which given a 4/4 meter + will be 1|2|0 + */ + + TempoMap::SharedPtr tmap (TempoMap::fetch()); + BBT_Offset b (0, 0, 0); + BBT_Time r = tmap->bbt_walk (a, b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (1,2,0), r); + } void BBTTest::addTest() { + TempoMap::SharedPtr tmap (TempoMap::fetch()); + BBT_Time a(1,1,0); + BBT_Offset b(1,0,0); + BBT_Time r = tmap->bbt_walk (a, b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (2,1,0), r); + + b = BBT_Offset (0, 1, 0); + r = tmap->bbt_walk (a, b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (1,2,0), r); + + b = BBT_Offset (0, 0, 1); + r = tmap->bbt_walk (a, b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (1,1,1), r); + + b = BBT_Offset (0, 0, ticks_per_beat - 1); + r = tmap->bbt_walk (a, b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (1,1,ticks_per_beat - 1), r); + + b = BBT_Offset (0, 0, ticks_per_beat); + r = tmap->bbt_walk (a, b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (1,2,0), r); + + b = BBT_Offset (0, 0, ticks_per_beat * 2); + r = tmap->bbt_walk (a, b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (1,3,0), r); + + /* assumes 4/4 time */ + + b = BBT_Offset (0, 4, 0); + r = tmap->bbt_walk (a, b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (2,1,0), r); + + b = BBT_Offset (1, 0, 0); + r = tmap->bbt_walk (a, b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (2,1,0), r); + + b = BBT_Offset (0, 0, ticks_per_beat * 4); + r = tmap->bbt_walk (a, b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (2,1,0), r); + } void BBTTest::subtractTest() { + TempoMap::SharedPtr tmap (TempoMap::fetch()); + BBT_Time a (1,1,0); + BBT_Offset b (1,0,0); + BBT_Time r = tmap->bbt_walk (a, -b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (-1,1,0), r); + + b = BBT_Offset (0, 1, 0); + r = tmap->bbt_walk (a, -b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (1,-1,0), r); /* Not sure this is actually the correct answer */ + + b = BBT_Offset (0, 0, 1); + r = tmap->bbt_walk (a, -b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (1,1,-1), r); /* Not sure this is actually the correct answer */ + + b = BBT_Offset (0, 0, ticks_per_beat); + r = tmap->bbt_walk (a, -b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (1,1,-ticks_per_beat), r); /* Not sure this is actually the correct answer */ + + b = BBT_Offset (0, 0, ticks_per_beat + 1); + r = tmap->bbt_walk (a, -b); + CPPUNIT_ASSERT_EQUAL(BBT_Time (1,1,-(ticks_per_beat+1)), r); /* Not sure this is actually the correct answer */ } void @@ -37,4 +119,3 @@ void BBTTest::convertTest() { } -