From 41e79d4c4f3376a5da1d42783c1088ab1c8ec1b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Micha=C3=ABl=20Celerier?= Date: Sun, 3 Nov 2024 10:15:39 -0500 Subject: [PATCH] [tests] Fix scenario tests due to unpropagated change after interval stopped auto-ticking on start --- src/ossia/audio/audio_parameter.cpp | 42 ---- src/ossia/audio/fade.cpp | 43 ++++ src/ossia/audio/fade.hpp | 10 + src/ossia/dataflow/nodes/dummy.hpp | 4 + src/ossia/dataflow/nodes/messages.hpp | 1 + src/ossia/dataflow/nodes/percentage.hpp | 1 + src/ossia/dataflow/nodes/sound.hpp | 7 +- .../scenario/detail/scenario_execution.cpp | 4 + src/ossia/editor/scenario/time_interval.cpp | 1 - src/ossia_sources.cmake | 6 +- tests/CMakeLists.txt | 4 +- tests/Editor/ScenarioAlgoTest.cpp | 184 +++++++++++------- tests/Editor/TestUtils.hpp | 42 ++-- tests/Network/MIDITest.cpp | 6 +- 14 files changed, 214 insertions(+), 141 deletions(-) create mode 100644 src/ossia/audio/fade.cpp create mode 100644 src/ossia/audio/fade.hpp diff --git a/src/ossia/audio/audio_parameter.cpp b/src/ossia/audio/audio_parameter.cpp index bca94e55489..61b104245e8 100644 --- a/src/ossia/audio/audio_parameter.cpp +++ b/src/ossia/audio/audio_parameter.cpp @@ -3,7 +3,6 @@ #include "audio_protocol.hpp" #include -#include #include namespace ossia @@ -165,45 +164,4 @@ mapped_audio_parameter::~mapped_audio_parameter() = static_cast(get_node().get_device().get_protocol()); proto.unregister_parameter(*this); } - -namespace snd -{ -void do_fade( - bool start_discontinuous, bool end_discontinuous, audio_channel& ap, - std::size_t start, std::size_t end) -{ - using namespace std; - if(end < start) - swap(start, end); - const auto decrement = (1. / (end - start)); - double gain = 1.0; - - if(!start_discontinuous && !end_discontinuous) - return; - else if(start_discontinuous && !end_discontinuous) - { - for(std::size_t j = start; j < end; j++) - { - ap[j] *= (1. - gain); - gain -= decrement; - } - } - else if(!start_discontinuous && end_discontinuous) - { - for(std::size_t j = start; j < end; j++) - { - ap[j] *= std::pow(2., gain) - 1.; - gain -= decrement; - } - } - else - { - for(std::size_t j = start; j < end; j++) - { - ap[j] *= (2. * (gain * (1. - gain))); - gain -= decrement; - } - } -} -} } diff --git a/src/ossia/audio/fade.cpp b/src/ossia/audio/fade.cpp new file mode 100644 index 00000000000..c00e8ad3a7d --- /dev/null +++ b/src/ossia/audio/fade.cpp @@ -0,0 +1,43 @@ +#include "fade.hpp" +namespace ossia::snd +{ + +void do_fade( + bool start_discontinuous, bool end_discontinuous, audio_channel& ap, + std::size_t start, std::size_t end) +{ + using namespace std; + if(end < start) + swap(start, end); + const auto decrement = (1. / (end - start)); + double gain = 1.0; + + if(!start_discontinuous && !end_discontinuous) + return; + else if(start_discontinuous && !end_discontinuous) + { + for(std::size_t j = start; j < end; j++) + { + ap[j] *= (1. - gain); + gain -= decrement; + } + } + else if(!start_discontinuous && end_discontinuous) + { + for(std::size_t j = start; j < end; j++) + { + ap[j] *= std::pow(2., gain) - 1.; + gain -= decrement; + } + } + else + { + for(std::size_t j = start; j < end; j++) + { + ap[j] *= (2. * (gain * (1. - gain))); + gain -= decrement; + } + } +} + +} diff --git a/src/ossia/audio/fade.hpp b/src/ossia/audio/fade.hpp new file mode 100644 index 00000000000..2558f3cad3c --- /dev/null +++ b/src/ossia/audio/fade.hpp @@ -0,0 +1,10 @@ +#pragma once +#include + +namespace ossia::snd +{ +OSSIA_EXPORT +void do_fade( + bool start_discontinuous, bool end_discontinuous, audio_channel& ap, + std::size_t start, std::size_t end); +} diff --git a/src/ossia/dataflow/nodes/dummy.hpp b/src/ossia/dataflow/nodes/dummy.hpp index 6178f98889f..c7f9f53779e 100644 --- a/src/ossia/dataflow/nodes/dummy.hpp +++ b/src/ossia/dataflow/nodes/dummy.hpp @@ -10,6 +10,7 @@ class dummy_node : public ossia::graph_node dummy_node() = default; void run(const token_request& t, exec_state_facade) noexcept override { } + std::string label() const noexcept override { return "dummy"; } }; class dummy_audio_node : public ossia::graph_node @@ -27,6 +28,7 @@ class dummy_audio_node : public ossia::graph_node auto& o = *m_outlets[0]->target(); o = i; } + std::string label() const noexcept override { return "dummy_audio_node"; } }; class dummy_midi_node : public ossia::graph_node @@ -44,6 +46,7 @@ class dummy_midi_node : public ossia::graph_node auto o = m_outlets[0]->target(); o->messages = i->messages; } + std::string label() const noexcept override { return "dummy_midi_node"; } }; class dummy_value_node : public ossia::graph_node @@ -61,6 +64,7 @@ class dummy_value_node : public ossia::graph_node auto o = m_outlets[0]->target(); o->set_data(i->get_data()); } + std::string label() const noexcept override { return "dummy_value_node"; } }; } diff --git a/src/ossia/dataflow/nodes/messages.hpp b/src/ossia/dataflow/nodes/messages.hpp index 15849a086a6..de5615d4d86 100644 --- a/src/ossia/dataflow/nodes/messages.hpp +++ b/src/ossia/dataflow/nodes/messages.hpp @@ -13,6 +13,7 @@ class messages final : public ossia::graph_node public: messages() { } + std::string label() const noexcept override { return "messages"; } void run(const ossia::token_request&, ossia::exec_state_facade e) noexcept override { for(auto& msg : data) diff --git a/src/ossia/dataflow/nodes/percentage.hpp b/src/ossia/dataflow/nodes/percentage.hpp index f83c8d2b040..c52018802c3 100644 --- a/src/ossia/dataflow/nodes/percentage.hpp +++ b/src/ossia/dataflow/nodes/percentage.hpp @@ -15,6 +15,7 @@ class percentage final : public ossia::nonowning_graph_node m_outlets.push_back(&outlet); } + std::string label() const noexcept override { return "percentage"; } void run(const ossia::token_request& tk, ossia::exec_state_facade e) noexcept override { const auto [tick_start, d] = e.timings(tk); diff --git a/src/ossia/dataflow/nodes/sound.hpp b/src/ossia/dataflow/nodes/sound.hpp index beab60c87ee..d2d9cb4fe77 100644 --- a/src/ossia/dataflow/nodes/sound.hpp +++ b/src/ossia/dataflow/nodes/sound.hpp @@ -1,4 +1,5 @@ #pragma once +#include #include #include #include @@ -91,12 +92,6 @@ inline void perform_start_offset(const std::size_t start, ossia::audio_port& ap) ap.get().insert(ap.get().begin(), start, ossia::audio_channel{}); } } - -OSSIA_EXPORT -void do_fade( - bool start_discontinuous, bool end_discontinuous, audio_channel& ap, - std::size_t start, std::size_t end); - } template diff --git a/src/ossia/editor/scenario/detail/scenario_execution.cpp b/src/ossia/editor/scenario/detail/scenario_execution.cpp index 677f8e50928..ca2becb665b 100644 --- a/src/ossia/editor/scenario/detail/scenario_execution.cpp +++ b/src/ossia/editor/scenario/detail/scenario_execution.cpp @@ -160,6 +160,10 @@ void scenario::run_interval( { interval.tick_offset_speed_precomputed(max_tick, offset, tk); } + else if(max_tick == 0_tv) + { + interval.tick_offset_speed_precomputed(max_tick, offset, tk); + } const auto ot = ossia::time_value{int64_t(diff)}; const auto node_it = m_overticks.lower_bound(end_node); diff --git a/src/ossia/editor/scenario/time_interval.cpp b/src/ossia/editor/scenario/time_interval.cpp index 1e8513d1075..a508bcebc35 100644 --- a/src/ossia/editor/scenario/time_interval.cpp +++ b/src/ossia/editor/scenario/time_interval.cpp @@ -9,7 +9,6 @@ #include -#include #include namespace ossia diff --git a/src/ossia_sources.cmake b/src/ossia_sources.cmake index 1fe23ee9800..169b6893d1c 100644 --- a/src/ossia_sources.cmake +++ b/src/ossia_sources.cmake @@ -668,10 +668,12 @@ set(OSSIA_DATAFLOW_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/audio_parameter.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/audio_engine.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/audio_device.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/audio_protocol.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/audio_tick.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/drwav_handle.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/drwav_write_handle.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/fade.hpp" + + "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/audio_protocol.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/alsa_protocol.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/dummy_protocol.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/jack_protocol.hpp" @@ -782,6 +784,8 @@ set(OSSIA_DATAFLOW_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/audio_protocol.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/audio_device.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/audio_engine.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ossia/audio/fade.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ossia/dataflow/execution/execution_policy.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/dataflow/execution/default_policy.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/dataflow/execution/direct_policy.cpp" diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 1da1acdb49c..7b9b14f10a9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -90,7 +90,9 @@ if(OSSIA_DATAFLOW) ossia_add_test(TickMethodTest "${CMAKE_CURRENT_SOURCE_DIR}/Dataflow/TickMethodTest.cpp") ossia_add_test(TokenRequestTest "${CMAKE_CURRENT_SOURCE_DIR}/Dataflow/TokenRequestTest.cpp") ossia_add_test(SoundTest "${CMAKE_CURRENT_SOURCE_DIR}/Dataflow/SoundTest.cpp") - target_link_libraries(ossia_SoundTest PRIVATE rubberband samplerate) + if(TARGET rubberband AND TARGET samplerate) + target_link_libraries(ossia_SoundTest PRIVATE rubberband samplerate) + endif() endif() if(OSSIA_QML) diff --git a/tests/Editor/ScenarioAlgoTest.cpp b/tests/Editor/ScenarioAlgoTest.cpp index 0fd575a4f60..bba4cfb3873 100644 --- a/tests/Editor/ScenarioAlgoTest.cpp +++ b/tests/Editor/ScenarioAlgoTest.cpp @@ -203,7 +203,7 @@ TEST_CASE("test_exec_chain_tokens", "test_exec_chain_tokens") REQUIRE(c1->get_date() == 40_tv); for(auto tok : n->requested_tokens) { - std::cerr << tok; + std::cout << tok << "\n"; } REQUIRE((int)n->requested_tokens.size() == (int)1); @@ -216,7 +216,7 @@ TEST_CASE("test_exec_chain_tokens", "test_exec_chain_tokens") REQUIRE(c1->get_date() == 90_tv); for(auto tok : n->requested_tokens) { - std::cerr << tok; + std::cout << tok << "\n"; } REQUIRE((int)n->requested_tokens.size() == (int)1); @@ -251,7 +251,7 @@ TEST_CASE("test_exec_chain_multi", "test_exec_chain_multi") start_and_tick(s.interval); s.interval->tick(5_tv, default_request()); - std::cerr << e0->get_status() << " " << e1->get_status() << " " << e2->get_status() + std::cout << e0->get_status() << " " << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() << std::endl; REQUIRE(c0->get_date() == 0_tv); @@ -294,8 +294,8 @@ TEST_CASE("test_exec_chain_multi_infinite", "test_exec_chain_multi_infinite") start_and_tick(s.interval); { s.interval->tick(5_tv, default_request()); - std::cerr << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() - << " " << e4->get_status(); + std::cout << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() + << " " << e4->get_status() << std::endl; REQUIRE(c0->get_date() == 5_tv); REQUIRE(e1->get_status() == time_event::status::PENDING); @@ -316,8 +316,8 @@ TEST_CASE("test_exec_chain_multi_infinite", "test_exec_chain_multi_infinite") // The "interactivity" tick introduced { s.interval->tick(5_tv, default_request()); - std::cerr << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() - << " " << e4->get_status(); + std::cout << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() + << " " << e4->get_status() << std::endl; REQUIRE(c0->get_date() == 0_tv); REQUIRE(e1->get_status() & time_event::status::FINISHED); @@ -334,8 +334,8 @@ TEST_CASE("test_exec_chain_multi_infinite", "test_exec_chain_multi_infinite") { s.interval->tick(5_tv, default_request()); - std::cerr << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() - << " " << e4->get_status(); + std::cout << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() + << " " << e4->get_status() << std::endl; REQUIRE(c0->get_date() == 0_tv); REQUIRE(e1->get_status() & time_event::status::FINISHED); @@ -388,7 +388,8 @@ TEST_CASE("test_exec_two_branch_infinite", "test_exec_two_branch_infinite") start_and_tick(s.interval); { s.interval->tick(5_tv, default_request()); - std::cerr << e1->get_status() << " " << e2->get_status() << " " << e3->get_status(); + std::cout << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() + << std::endl; REQUIRE(c0->get_date() == 5_tv); REQUIRE(e1->get_status() == time_event::status::PENDING); @@ -404,7 +405,8 @@ TEST_CASE("test_exec_two_branch_infinite", "test_exec_two_branch_infinite") { s.interval->tick(30_tv, default_request()); - std::cerr << e1->get_status() << " " << e2->get_status() << " " << e3->get_status(); + std::cout << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() + << std::endl; REQUIRE(c0->get_date() == 25_tv); REQUIRE(e1->get_status() == time_event::status::PENDING); @@ -426,7 +428,8 @@ TEST_CASE("test_exec_two_branch_infinite", "test_exec_two_branch_infinite") // however this means that c2 would not execute at all... { s.interval->tick(2_tv, default_request()); - std::cerr << e1->get_status() << " " << e2->get_status() << " " << e3->get_status(); + std::cout << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() + << std::endl; // FIXME there is some indeterminism here. Hypothesis is that this is due because of a pointer set. //REQUIRE(c0->get_date() == 0_tv); @@ -446,7 +449,8 @@ TEST_CASE("test_exec_two_branch_infinite", "test_exec_two_branch_infinite") { s.interval->tick(2_tv, default_request()); - std::cerr << e1->get_status() << " " << e2->get_status() << " " << e3->get_status(); + std::cout << e1->get_status() << " " << e2->get_status() << " " << e3->get_status() + << std::endl; REQUIRE(c0->get_date() == 0_tv); REQUIRE(e1->get_status() & time_event::status::FINISHED); @@ -597,9 +601,59 @@ TEST_CASE("test_unconnected", "test_unconnected") REQUIRE(e1->get_status() == time_event::status::NONE); } -TEST_CASE("test_simulated_state", "test_simulated_state") +TEST_CASE("test_1_len_interval_state", "test_1_len_interval_state") { + using namespace ossia; + root_scenario s; + TestDevice utils; + + ossia::scenario& scenario = *s.scenario; + std::shared_ptr e0 = start_event(scenario); + std::shared_ptr e1 = create_event(scenario); + std::shared_ptr e2 = create_event(scenario); + std::shared_ptr e3 = create_event(scenario); + + std::shared_ptr c0 = create_interval({}, *e0, *e1, 2_tv, 2_tv, 2_tv); + s.scenario->add_time_interval(c0); + std::shared_ptr c1 = create_interval({}, *e1, *e2, 1_tv, 1_tv, 1_tv); + s.scenario->add_time_interval(c1); + std::shared_ptr c2 = create_interval({}, *e2, *e3, 20_tv, 20_tv, 20_tv); + s.scenario->add_time_interval(c2); + + auto msg_node = std::make_shared(); + msg_node->data.push_back({*utils.float_addr, ossia::value(1.234)}); + + auto msg_proc = std::make_shared(msg_node); + c1->add_time_process(msg_proc); + s.interval->start(); + s.interval->tick(10_tv, default_request()); + + for(auto tr : msg_node->requested_tokens) + std::cout << " -- " << tr << "\n"; + REQUIRE(e0->get_status() & ossia::time_event::status::FINISHED); + REQUIRE(e1->get_status() & ossia::time_event::status::FINISHED); + REQUIRE(e2->get_status() & ossia::time_event::status::FINISHED); + REQUIRE((int)msg_node->requested_tokens.size() == (int)1); + auto t0 = msg_node->requested_tokens[0]; + auto expected = simple_token_request{.prev_date = 0_tv, .date = 1_tv, .offset = 2_tv}; + REQUIRE(t0 == expected); + + REQUIRE(utils.float_addr->value() == ossia::value(float(0.))); + + auto gg = std::make_unique(); + auto& g = *gg; + ossia::execution_state e; + g.add_node(msg_node); + g.state(e); + e.commit(); + + REQUIRE(utils.float_addr->value() == ossia::value(float(1.234))); + REQUIRE(c2->get_date() == 7_tv); +} + +TEST_CASE("test_0_len_interval_state", "test_0_len_interval_state") +{ using namespace ossia; root_scenario s; TestDevice utils; @@ -627,7 +681,10 @@ TEST_CASE("test_simulated_state", "test_simulated_state") s.interval->tick(10_tv, default_request()); for(auto tr : msg_node->requested_tokens) - std::cerr << tr; + std::cout << " -- " << tr << "\n"; + REQUIRE(e0->get_status() & ossia::time_event::status::FINISHED); + REQUIRE(e1->get_status() & ossia::time_event::status::FINISHED); + REQUIRE(e2->get_status() & ossia::time_event::status::FINISHED); REQUIRE((int)msg_node->requested_tokens.size() == (int)1); auto t0 = msg_node->requested_tokens[0]; auto expected = simple_token_request{.prev_date = 0_tv, .date = 0_tv, .offset = 2_tv}; @@ -672,13 +729,13 @@ TEST_CASE("test_trigger", "test_trigger") REQUIRE(c1->get_date() == 0_tv); s.interval->tick(15_tv, default_request()); - std::cerr << c0->get_date() << c1->get_date(); + std::cout << c0->get_date() << c1->get_date() << std::endl; REQUIRE(c0->get_date() == 0_tv); // executed, we go on to the next one REQUIRE(c1->get_date() == 0_tv); - REQUIRE(e1->get_status() == ossia::time_event::status::FINISHED); + REQUIRE(e1->get_status() & ossia::time_event::status::FINISHED); s.interval->tick(15_tv, default_request()); - std::cerr << c0->get_date() << c1->get_date(); + std::cout << c0->get_date() << c1->get_date() << std::endl; REQUIRE(c0->get_date() == 0_tv); REQUIRE(c1->get_date() == 15_tv); } @@ -736,19 +793,16 @@ TEST_CASE("test_tokens", "test_tokens") s.interval->tick(700_tv, default_request()); ossia::simple_token_request_vec expected0{ - {.prev_date = 0_tv, .date = 0_tv, .parent_duration = 300_tv}, {.prev_date = 0_tv, .date = 300_tv, .parent_duration = 300_tv}}; REQUIRE(c0->node->requested_tokens == expected0); - std::cerr << c1->node->requested_tokens.size(); - std::cerr << c1->node->requested_tokens[0]; + std::cout << c1->node->requested_tokens.size() << std::endl; + std::cout << c1->node->requested_tokens[0] << std::endl; - REQUIRE(c1->node->requested_tokens.size() == 2); - std::cerr << c1->node->requested_tokens[1]; + REQUIRE(c1->node->requested_tokens.size() == 1); ossia::simple_token_request_vec expected1{ - {.prev_date = 0_tv, .date = 0_tv, .parent_duration = 500_tv, .offset = 300_tv}, {.prev_date = 0_tv, .date = 400_tv, .parent_duration = 500_tv, .offset = 300_tv}}; REQUIRE(c1->node->requested_tokens == expected1); } @@ -779,15 +833,12 @@ TEST_CASE("test_tokens_max", "test_tokens_max") // In this case (when there are flexible bounds) we go as far as possible in the tick. // Else this would cause deadlocks if one interval reached its max before another reached its min ossia::simple_token_request_vec expected0{ - {.prev_date = 0_tv, .date = 0_tv, .parent_duration = 300_tv, .offset = 0_tv}, {.prev_date = 0_tv, .date = 300_tv, .parent_duration = 300_tv, .offset = 0_tv}}; REQUIRE(c0->node->requested_tokens == expected0); - std::cerr << c1->node->requested_tokens.size(); - std::cerr << c1->node->requested_tokens[0]; - REQUIRE(c1->node->requested_tokens.size() == 2); - std::cerr << c1->node->requested_tokens[1]; + std::cout << c1->node->requested_tokens.size() << std::endl; + std::cout << c1->node->requested_tokens[0] << std::endl; + REQUIRE(c1->node->requested_tokens.size() == 1); ossia::simple_token_request_vec expected1{ - {.prev_date = 0_tv, .date = 0_tv, .parent_duration = 500_tv, .offset = 0_tv}, {.prev_date = 0_tv, .date = 700_tv, .parent_duration = 500_tv, .offset = 0_tv}}; REQUIRE(c1->node->requested_tokens == expected1); } @@ -814,15 +865,12 @@ TEST_CASE("test_tokens_min", "test_tokens_min") { s.interval->tick(20_tv, default_request()); ossia::simple_token_request_vec expected0{ - {.prev_date = 0_tv, .date = 0_tv, .offset = 0_tv}, {.prev_date = 0_tv, .date = 20_tv, .offset = 0_tv}}; REQUIRE(c0->node->requested_tokens == expected0); - std::cerr << c1->node->requested_tokens.size(); - std::cerr << c1->node->requested_tokens[0]; - REQUIRE(c1->node->requested_tokens.size() == 2); - std::cerr << c1->node->requested_tokens[1]; + std::cout << c1->node->requested_tokens.size() << std::endl; + std::cout << c1->node->requested_tokens[0] << std::endl; + REQUIRE(c1->node->requested_tokens.size() == 1); ossia::simple_token_request_vec expected1{ - {.prev_date = 0_tv, .date = 0_tv, .offset = 0_tv}, {.prev_date = 0_tv, .date = 10_tv, .offset = 0_tv}}; REQUIRE(c1->node->requested_tokens == expected1); @@ -837,8 +885,8 @@ TEST_CASE("test_tokens_min", "test_tokens_min") s.interval->tick(20_tv, default_request()); ossia::simple_token_request_vec expected0{ {.prev_date = 20_tv, .date = 30_tv, .offset = 0_tv}}; - std::cerr << c0->node->requested_tokens; - std::cerr << c1->node->requested_tokens; + std::cout << c0->node->requested_tokens << std::endl; + std::cout << c1->node->requested_tokens << std::endl; REQUIRE(c0->node->requested_tokens.size() == 1); REQUIRE(c0->node->requested_tokens == expected0); @@ -944,12 +992,11 @@ TEST_CASE("test_percentage", "test_percentage") c0->add_time_process(proc); g.add_node(node); - start_and_tick(s.interval); + s.interval->start(); { ossia::execution_state s; g.state(s); - REQUIRE(get_value_state(s).size() == 1); - REQUIRE(get_value_state(s).begin()->second.back().first.value == ossia::value(0.f)); + REQUIRE(get_value_state(s).size() == 0); } s.interval->tick(1_tv, default_request()); @@ -997,15 +1044,18 @@ TEST_CASE("test_percentage_long", "test_percentage_long") c0->add_time_process(proc); g.add_node(node); - start_and_tick(s.interval); + s.interval->start(); + s.interval->tick(1_tv, default_request()); + REQUIRE(node->requested_tokens.size() == 1); { ossia::execution_state s; g.state(s); + REQUIRE(node->requested_tokens.size() == 0); REQUIRE(get_value_state(s).size() == 1); - REQUIRE(get_value_state(s).begin()->second.back().first.value == ossia::value(0.f)); + REQUIRE(get_value_state(s).begin()->second.back().first.value == ossia::value(0.2f)); } - s.interval->tick(3_tv, default_request()); + s.interval->tick(2_tv, default_request()); { ossia::execution_state s; g.state(s); @@ -1055,7 +1105,7 @@ TEST_CASE("test_offset", "test_offset") // { // auto st = s.interval->offset(7_tv); - // ossia::print(std::cerr, st); + // ossia::print(std::cout, st); // ossia::state expected; // { @@ -1072,7 +1122,7 @@ TEST_CASE("test_offset", "test_offset") // ossia::state expected; // s.interval->start_and_tick(st); - // ossia::print(std::cerr, st); + // ossia::print(std::cout, st); // REQUIRE(st == expected); // } @@ -1081,7 +1131,7 @@ TEST_CASE("test_offset", "test_offset") // { // auto st = s.interval->offset(13_tv); - // ossia::print(std::cerr, st); + // ossia::print(std::cout, st); // ossia::state expected; // { @@ -1098,7 +1148,7 @@ TEST_CASE("test_offset", "test_offset") // ossia::state expected; // s.interval->start_and_tick(st); - // ossia::print(std::cerr, st); + // ossia::print(std::cout, st); // REQUIRE(st == expected); // } @@ -1190,9 +1240,9 @@ TEST_CASE("test_musical_bar", "test_musical_bar") req.musical_start_position = 1; req.musical_end_position = 5; req.signature = {4, 4}; - std::cerr << "start musical tick:" << std::endl; + std::cout << "start musical tick:" << std::endl; s.interval->tick(88200_tv, req); // go forward a whole bar - std::cerr << std::flush; + std::cout << std::flush; std::cout << std::flush; REQUIRE(e1->get_status() & time_event::status::FINISHED); @@ -1206,13 +1256,8 @@ TEST_CASE("test_musical_bar", "test_musical_bar") ossia::simple_token_request_vec expected1{ ossia::simple_token_request{ - .prev_date = 0_tv, - .date = 0_tv, - .offset = 66149_tv}, // == 88200_tv - 22050_tv - ossia::simple_token_request{ - .prev_date = 0_tv, - .date = 22051_tv, - .offset = 66149_tv} // == 88200_tv - 22050_tv + .prev_date = 0_tv, .date = 22051_tv, .offset = 66149_tv} + // == 88200_tv - 22050_tv }; REQUIRE(c1->get_date() == 22051_tv); @@ -1305,9 +1350,9 @@ TEST_CASE("test_musical_bar_offset", "test_musical_bar_offset") req.musical_start_position = (88200_tv * 2 + 500_tv).impl / 22050.; req.musical_end_position = (88200_tv * 3 + 500_tv).impl / 22050.; req.signature = {4, 4}; - std::cerr << "start musical tick:" << std::endl; + std::cout << "start musical tick:" << std::endl; s.interval->tick(88200_tv, req); // go forward a whole bar - std::cerr << std::flush; + std::cout << std::flush; std::cout << std::flush; REQUIRE(e1->get_status() & time_event::status::FINISHED); @@ -1320,7 +1365,6 @@ TEST_CASE("test_musical_bar_offset", "test_musical_bar_offset") REQUIRE(c0->node->requested_tokens == expected0); ossia::simple_token_request_vec expected1{ - {.prev_date = 0_tv, .date = 0_tv, .offset = 88200_tv - 501_tv}, {.prev_date = 0_tv, .date = 501_tv, .offset = 88200_tv - 501_tv}}; REQUIRE(c1->get_date() == 501_tv); @@ -1406,9 +1450,9 @@ TEST_CASE("test_musical_quarter", "test_musical_quarter") req.musical_start_position = 20050. / 22050.; req.musical_end_position = 25050. / 22050.; req.signature = {4, 4}; - std::cerr << "start musical tick:" << std::endl; + std::cout << "start musical tick:" << std::endl; s.interval->tick(5000_tv, req); // go forward past the first quarter note - std::cerr << std::flush; + std::cout << std::flush; std::cout << std::flush; REQUIRE(e1->get_status() & time_event::status::FINISHED); @@ -1422,13 +1466,8 @@ TEST_CASE("test_musical_quarter", "test_musical_quarter") ossia::simple_token_request_vec expected1{ ossia::simple_token_request{ - .prev_date = 0_tv, - .date = 0_tv, - .offset = 1999_tv}, // == 5000 - (22050 - 20050) - ossia::simple_token_request{ - .prev_date = 0_tv, - .date = 3001_tv, - .offset = 1999_tv} // == 88200_tv - 22050_tv + .prev_date = 0_tv, .date = 3001_tv, .offset = 1999_tv} + // == 88200_tv - 22050_tv }; REQUIRE(c1->get_date() == 3001_tv); @@ -1513,9 +1552,9 @@ TEST_CASE("test_musical_eighth", "test_musical_eighth") req.musical_start_position = 60. / 22050.; req.musical_end_position = (60. + 20000.) / 22050.; req.signature = {4, 4}; - std::cerr << "start musical tick:" << std::endl; + std::cout << "start musical tick:" << std::endl; s.interval->tick(20000_tv, req); // go forward past the first quarter note - std::cerr << std::flush; + std::cout << std::flush; std::cout << std::flush; REQUIRE(e1->get_status() & time_event::status::FINISHED); @@ -1528,7 +1567,6 @@ TEST_CASE("test_musical_eighth", "test_musical_eighth") REQUIRE(c0->node->requested_tokens == expected0); ossia::simple_token_request_vec expected1{ - {.prev_date = 0_tv, .date = 0_tv, .offset = 10964_tv}, {.prev_date = 0_tv, .date = 9036_tv, .offset = 10964_tv}}; REQUIRE(c1->get_date() == 9036_tv); @@ -1555,7 +1593,7 @@ TEST_CASE("test_exec_chain_loop", "test_exec_chain_loop") s.scenario->add_time_interval(c1); auto print = [&] { - std::cerr << e0->get_status() << " " << e1->get_status() << " -- " << c0->get_date() + std::cout << e0->get_status() << " " << e1->get_status() << " -- " << c0->get_date() << " " << c1->get_date() << std::endl; }; diff --git a/tests/Editor/TestUtils.hpp b/tests/Editor/TestUtils.hpp index b42a99d1715..ff234901352 100644 --- a/tests/Editor/TestUtils.hpp +++ b/tests/Editor/TestUtils.hpp @@ -96,22 +96,16 @@ struct root_scenario } }; -inline -std::ostream& operator<<(std::ostream& s, ossia::time_event::status st) +inline auto dummy_process() { - switch(st) + struct node final : ossia::graph_node { - case ossia::time_event::status::NONE: s << "none"; break; - case ossia::time_event::status::PENDING: s << "pending"; break; - case ossia::time_event::status::HAPPENED: s << "happened"; break; - case ossia::time_event::status::DISPOSED: s << "disposed"; break; - case ossia::time_event::status::FINISHED: s << "finished"; break; - } - return s; -} - -inline auto dummy_process() { return std::make_shared(std::make_shared()); } + using ossia::graph_node::graph_node; + std::string label() const noexcept override { return "node"; } + }; + return std::make_shared(std::make_shared()); +} /* inline QDebug operator<<(QDebug d, ossia::time_event::status st) @@ -194,4 +188,26 @@ std::ostream& operator<<(std::ostream& d, const decltype(ossia::graph_node::requ d << "}\n"; return d; } +inline std::ostream& operator<<(std::ostream& s, ossia::time_event::status st) +{ + switch(st) + { + case ossia::time_event::status::NONE: + s << "none"; + break; + case ossia::time_event::status::PENDING: + s << "pending"; + break; + case ossia::time_event::status::HAPPENED: + s << "happened"; + break; + case ossia::time_event::status::DISPOSED: + s << "disposed"; + break; + case ossia::time_event::status::FINISHED: + s << "finished"; + break; + } + return s; +} } diff --git a/tests/Network/MIDITest.cpp b/tests/Network/MIDITest.cpp index 5921cb17c7e..eae5fdcb78c 100644 --- a/tests/Network/MIDITest.cpp +++ b/tests/Network/MIDITest.cpp @@ -31,8 +31,7 @@ TEST_CASE("test_midi", "test_midi") = std::make_unique(ctx, port.display_name, conf, api_conf); proto->set_info(midi_info{midi_info::Type::Input, port, false}); - midi_device dev(std::move(proto)); - dev.set_name("test"); + midi_device dev("test", std::move(proto)); dev.create_full_tree(); } for(auto port : obs.get_output_ports()) @@ -44,8 +43,7 @@ TEST_CASE("test_midi", "test_midi") = std::make_unique(ctx, port.display_name, conf, api_conf); proto->set_info(midi_info{midi_info::Type::Input, port, false}); - midi_device dev(std::move(proto)); - dev.set_name("test"); + midi_device dev("test", std::move(proto)); dev.create_full_tree(); } }