Files
Lucina3DS/externals/teakra/tests/btdmp.cpp
2025-02-06 22:24:29 +08:00

194 lines
6.9 KiB
C++

#include <catch.hpp>
#include <queue>
#include "../src/btdmp.h"
struct BtdmpTestEnvironment {
Teakra::CoreTiming core_timing;
Teakra::Btdmp btdmp{core_timing};
int interrupt_counter = 0;
std::queue<std::array<std::int16_t, 2>> sample_queue;
BtdmpTestEnvironment() {
btdmp.SetInterruptHandler([&]() { interrupt_counter++; });
btdmp.SetAudioCallback(
[&](std::array<std::int16_t, 2> 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<std::int16_t, 2>{{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<std::int16_t, 2>{{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<std::int16_t, 2>{{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<std::int16_t, 2>{{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<std::int16_t, 2>{{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<std::int16_t, 2>{{33, 44}});
samples = env.sample_queue.front();
env.sample_queue.pop();
REQUIRE(samples == std::array<std::int16_t, 2>{{55, 0}});
samples = env.sample_queue.front();
env.sample_queue.pop();
REQUIRE(samples == std::array<std::int16_t, 2>{{1, 2}});
samples = env.sample_queue.front();
env.sample_queue.pop();
REQUIRE(samples == std::array<std::int16_t, 2>{{3, 4}});
samples = env.sample_queue.front();
env.sample_queue.pop();
REQUIRE(samples == std::array<std::int16_t, 2>{{5, 6}});
samples = env.sample_queue.front();
env.sample_queue.pop();
REQUIRE(samples == std::array<std::int16_t, 2>{{7, 8}});
samples = env.sample_queue.front();
env.sample_queue.pop();
REQUIRE(samples == std::array<std::int16_t, 2>{{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<std::int16_t, 2>{{11, 12}});
}