aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJP Cimalando <jpcima@users.noreply.github.com>2018-07-24 04:55:55 +0200
committerJP Cimalando <jpcima@users.noreply.github.com>2018-07-24 04:55:55 +0200
commit86b97d103fdeab8d285189d96ec6b316ec8c3530 (patch)
treebf14b0d9d4c7cbf9483443516d1cbf193916d8cf /test
parent9544965f28ce42b69f97e6aaeb881c9a20bfbad4 (diff)
downloadlibADLMIDI-86b97d103fdeab8d285189d96ec6b316ec8c3530.tar.gz
libADLMIDI-86b97d103fdeab8d285189d96ec6b316ec8c3530.tar.bz2
libADLMIDI-86b97d103fdeab8d285189d96ec6b316ec8c3530.zip
add unit test to check internal instrument conversions
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt1
-rw-r--r--test/conversion/CMakeLists.txt12
-rw-r--r--test/conversion/conversion.cpp82
3 files changed, 95 insertions, 0 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index bb5615e..ee02087 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -2,6 +2,7 @@
set(CMAKE_CXX_STANDARD 11)
add_subdirectory(bankmap)
+add_subdirectory(conversion)
add_library(Catch-objects OBJECT "common/catch_main.cpp")
target_include_directories(Catch-objects PRIVATE "common")
diff --git a/test/conversion/CMakeLists.txt b/test/conversion/CMakeLists.txt
new file mode 100644
index 0000000..361c7e8
--- /dev/null
+++ b/test/conversion/CMakeLists.txt
@@ -0,0 +1,12 @@
+
+set(CMAKE_CXX_STANDARD 11)
+
+include_directories(
+ ${CMAKE_CURRENT_SOURCE_DIR}/../common
+ ${CMAKE_SOURCE_DIR}/include
+ ${CMAKE_SOURCE_DIR}/src)
+
+add_executable(ConversionTest conversion.cpp $<TARGET_OBJECTS:Catch-objects>)
+
+set_target_properties(ConversionTest PROPERTIES COMPILE_DEFINITIONS "GSL_THROW_ON_CONTRACT_VIOLATION")
+add_test(NAME ConversionTest COMMAND ConversionTest)
diff --git a/test/conversion/conversion.cpp b/test/conversion/conversion.cpp
new file mode 100644
index 0000000..f78c363
--- /dev/null
+++ b/test/conversion/conversion.cpp
@@ -0,0 +1,82 @@
+#include <catch.hpp>
+#include <random>
+#include "adlmidi.h"
+#include "adlmidi_cvt.hpp"
+
+static std::mt19937 rng;
+
+static ADL_Instrument random_instrument()
+{
+ ADL_Instrument ins;
+ ins.version = ADLMIDI_InstrumentVersion;
+ ins.note_offset1 = std::uniform_int_distribution<int>(-128, 127)(rng);
+ ins.note_offset2 = std::uniform_int_distribution<int>(-128, 127)(rng);
+ ins.midi_velocity_offset = std::uniform_int_distribution<int>(-128, 127)(rng);
+ ins.second_voice_detune = std::uniform_int_distribution<int>(-128, 127)(rng);
+ ins.percussion_key_number = std::uniform_int_distribution<unsigned>(0, 127)(rng);
+ ins.inst_flags =
+ std::uniform_int_distribution<unsigned>(0, 255)(rng) &
+ (ADLMIDI_Ins_IsBlank|ADLMIDI_Ins_RhythmModeMask);
+ switch (std::uniform_int_distribution<unsigned>(0, 3)(rng)) {
+ case 0: // 2op
+ ins.inst_flags |= ADLMIDI_Ins_2op;
+ break;
+ case 1: // pseudo 4op
+ ins.inst_flags |= ADLMIDI_Ins_Pseudo4op;
+ // fall through
+ case 2: // real 4op
+ ins.inst_flags |= ADLMIDI_Ins_4op;
+ break;
+ }
+ ins.fb_conn1_C0 = std::uniform_int_distribution<unsigned>(0, 255)(rng);
+ ins.fb_conn2_C0 = std::uniform_int_distribution<unsigned>(0, 255)(rng);
+ ins.delay_on_ms = std::uniform_int_distribution<unsigned>(0, 40000)(rng);
+ ins.delay_off_ms = std::uniform_int_distribution<unsigned>(0, 40000)(rng);
+ for (unsigned op = 0; op < 4; ++op) {
+ ins.operators[op].avekf_20 = std::uniform_int_distribution<unsigned>(0, 255)(rng);
+ ins.operators[op].ksl_l_40 = std::uniform_int_distribution<unsigned>(0, 255)(rng);
+ ins.operators[op].atdec_60 = std::uniform_int_distribution<unsigned>(0, 255)(rng);
+ ins.operators[op].susrel_80 = std::uniform_int_distribution<unsigned>(0, 255)(rng);
+ ins.operators[op].waveform_E0 = std::uniform_int_distribution<unsigned>(0, 255)(rng);
+ }
+ return ins;
+}
+
+static void check_instrument_equality(const ADL_Instrument &a, const ADL_Instrument &b)
+{
+ REQUIRE((int)a.note_offset1 == (int)b.note_offset1);
+ REQUIRE((int)a.note_offset2 == (int)b.note_offset2);
+ #pragma message("velocity offset: uncomment this test when it's implemented")
+ // REQUIRE((int)a.midi_velocity_offset == (int)b.midi_velocity_offset);
+ REQUIRE((int)a.second_voice_detune == (int)b.second_voice_detune);
+ REQUIRE((int)a.percussion_key_number == (int)b.percussion_key_number);
+ REQUIRE((int)a.inst_flags == (int)b.inst_flags);
+ REQUIRE((int)a.fb_conn1_C0 == (int)b.fb_conn1_C0);
+ REQUIRE((int)a.fb_conn2_C0 == (int)b.fb_conn2_C0);
+ REQUIRE((int)a.delay_on_ms == (int)b.delay_on_ms);
+ REQUIRE((int)a.delay_off_ms == (int)b.delay_off_ms);
+ for (unsigned op = 0; op < 4; ++op) {
+ REQUIRE((int)a.operators[op].avekf_20 == (int)b.operators[op].avekf_20);
+ REQUIRE((int)a.operators[op].ksl_l_40 == (int)b.operators[op].ksl_l_40);
+ REQUIRE((int)a.operators[op].atdec_60 == (int)b.operators[op].atdec_60);
+ REQUIRE((int)a.operators[op].susrel_80 == (int)b.operators[op].susrel_80);
+ REQUIRE((int)a.operators[op].waveform_E0 == (int)b.operators[op].waveform_E0);
+ }
+}
+
+TEST_CASE("[Conversion] Main")
+{
+ rng.seed(777);
+
+ for (unsigned i = 0; i < 1000000; ++i) {
+ ADL_Instrument adl_ins = random_instrument();
+
+ adlinsdata2 internal_ins;
+ cvt_generic_to_FMIns(internal_ins, adl_ins);
+
+ ADL_Instrument adl_ins2;
+ cvt_FMIns_to_generic(adl_ins2, internal_ins);
+
+ check_instrument_equality(adl_ins, adl_ins2);
+ }
+}