#include #include #include "../src/btdmp.h" struct BtdmpTestEnvironment { Teakra::CoreTiming core_timing; Teakra::Btdmp btdmp{core_timing}; int interrupt_counter = 0; std::queue> sample_queue; BtdmpTestEnvironment() { btdmp.SetInterruptHandler([&]() { interrupt_counter++; }); btdmp.SetAudioCallback( [&](std::array samples) { sample_queue.push(samples); }); } }; TEST_CASE("Btdmp queueing", "[btdmp]") { BtdmpTestEnvironment env; REQUIRE(env.btdmp.GetMaxSkip() == Teakra::CoreTiming::Callbacks::Infinity); env.btdmp.SetTransmitEnable(1); env.btdmp.SetTransmitPeriod(1000); REQUIRE(env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); REQUIRE(env.btdmp.GetMaxSkip() == Teakra::CoreTiming::Callbacks::Infinity); env.btdmp.Skip(3050); REQUIRE(env.interrupt_counter == 0); REQUIRE(env.btdmp.GetMaxSkip() == Teakra::CoreTiming::Callbacks::Infinity); REQUIRE(env.sample_queue.size() == 3); REQUIRE(env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); for (int i = 0; i < 3; ++i) { auto samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{0, 0}}); } env.btdmp.Skip(949); REQUIRE(env.interrupt_counter == 0); REQUIRE(env.btdmp.GetMaxSkip() == Teakra::CoreTiming::Callbacks::Infinity); REQUIRE(env.sample_queue.size() == 0); REQUIRE(env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); env.btdmp.Tick(); REQUIRE(env.interrupt_counter == 0); REQUIRE(env.btdmp.GetMaxSkip() == Teakra::CoreTiming::Callbacks::Infinity); REQUIRE(env.sample_queue.size() == 1); REQUIRE(env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); auto samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{0, 0}}); env.btdmp.Skip(999); REQUIRE(env.interrupt_counter == 0); REQUIRE(env.btdmp.GetMaxSkip() == Teakra::CoreTiming::Callbacks::Infinity); REQUIRE(env.sample_queue.size() == 0); REQUIRE(env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); env.btdmp.Skip(1); REQUIRE(env.interrupt_counter == 0); REQUIRE(env.btdmp.GetMaxSkip() == Teakra::CoreTiming::Callbacks::Infinity); REQUIRE(env.sample_queue.size() == 1); REQUIRE(env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{0, 0}}); env.btdmp.Skip(100); env.btdmp.Send(0x1234); REQUIRE(env.interrupt_counter == 0); REQUIRE(env.btdmp.GetMaxSkip() == 899); REQUIRE(env.sample_queue.size() == 0); REQUIRE(!env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); env.btdmp.Skip(899); REQUIRE(env.interrupt_counter == 0); REQUIRE(env.btdmp.GetMaxSkip() == 0); REQUIRE(env.sample_queue.size() == 0); REQUIRE(!env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); env.btdmp.Tick(); REQUIRE(env.interrupt_counter == 1); REQUIRE(env.btdmp.GetMaxSkip() == Teakra::CoreTiming::Callbacks::Infinity); REQUIRE(env.sample_queue.size() == 1); REQUIRE(env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{0x1234, 0}}); env.btdmp.Skip(100); env.btdmp.Send(11); env.btdmp.Send(22); env.btdmp.Send(33); env.btdmp.Send(44); env.btdmp.Send(55); REQUIRE(env.interrupt_counter == 1); REQUIRE(env.btdmp.GetMaxSkip() == 900 + 1000 + 1000 - 1); REQUIRE(env.sample_queue.size() == 0); REQUIRE(!env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); env.btdmp.Skip(1500); REQUIRE(env.interrupt_counter == 1); REQUIRE(env.btdmp.GetMaxSkip() == 900 + 1000 + 1000 - 1 - 1500); REQUIRE(env.sample_queue.size() == 1); REQUIRE(!env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{11, 22}}); for (int i = 0; i < 13; ++i) { REQUIRE(!env.btdmp.GetTransmitFull()); env.btdmp.Send(i); } REQUIRE(env.interrupt_counter == 1); REQUIRE(env.btdmp.GetMaxSkip() == 1000 * 8 - 600 - 1); REQUIRE(env.sample_queue.size() == 0); REQUIRE(!env.btdmp.GetTransmitEmpty()); REQUIRE(env.btdmp.GetTransmitFull()); for (int i = 0; i < 4567; ++i) { env.btdmp.Tick(); } REQUIRE(env.interrupt_counter == 1); REQUIRE(env.btdmp.GetMaxSkip() == 1000 * 8 - 600 - 1 - 4567); REQUIRE(env.sample_queue.size() == 5); REQUIRE(!env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); env.btdmp.Skip(1000 * 7 - 600 - 1 - 4567); REQUIRE(env.interrupt_counter == 1); REQUIRE(env.btdmp.GetMaxSkip() == 1000); REQUIRE(env.sample_queue.size() == 6); REQUIRE(!env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); env.btdmp.Tick(); REQUIRE(env.interrupt_counter == 1); REQUIRE(env.btdmp.GetMaxSkip() == 999); REQUIRE(env.sample_queue.size() == 7); REQUIRE(!env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{33, 44}}); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{55, 0}}); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{1, 2}}); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{3, 4}}); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{5, 6}}); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{7, 8}}); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{9, 10}}); env.btdmp.Skip(999); REQUIRE(env.interrupt_counter == 1); REQUIRE(env.btdmp.GetMaxSkip() == 0); REQUIRE(env.sample_queue.size() == 0); REQUIRE(!env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); env.btdmp.Tick(); REQUIRE(env.interrupt_counter == 2); REQUIRE(env.btdmp.GetMaxSkip() == Teakra::CoreTiming::Callbacks::Infinity); REQUIRE(env.sample_queue.size() == 1); REQUIRE(env.btdmp.GetTransmitEmpty()); REQUIRE(!env.btdmp.GetTransmitFull()); samples = env.sample_queue.front(); env.sample_queue.pop(); REQUIRE(samples == std::array{{11, 12}}); }