summaryrefslogtreecommitdiff
path: root/src/tests/audio
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-14 02:39:49 +0100
committerskal <pascal.massimino@gmail.com>2026-02-14 02:39:49 +0100
commit8dd77545b5ec2f45ce46b98dd7d94a3c4a13e290 (patch)
treea338b9c1356da64a609621155c81d8d96f7ca7fe /src/tests/audio
parentc007d7fa6ddb1936108aeca156b2a4bda425ca84 (diff)
Factor common test patterns into reusable utilitiesHEADmain
Refactor duplicated test setup/teardown code into shared fixtures: - test_math_helpers.h: Float comparison (test_near, test_near_vec3) - AudioTestFixture: RAII wrapper for AudioEngine lifecycle - EffectTestFixture: Combined WebGPU + AudioEngine + MainSequence Migrated 9 test files (3 math, 6 audio) to use fixtures. Net reduction: 54 LOC (178 insertions, 232 deletions). All 34 tests passing. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/tests/audio')
-rw-r--r--src/tests/audio/test_audio_engine.cc71
-rw-r--r--src/tests/audio/test_silent_backend.cc17
-rw-r--r--src/tests/audio/test_tracker.cc25
-rw-r--r--src/tests/audio/test_tracker_timing.cc60
-rw-r--r--src/tests/audio/test_variable_tempo.cc69
-rw-r--r--src/tests/audio/test_wav_dump.cc11
6 files changed, 106 insertions, 147 deletions
diff --git a/src/tests/audio/test_audio_engine.cc b/src/tests/audio/test_audio_engine.cc
index 3b29dcd..72c1653 100644
--- a/src/tests/audio/test_audio_engine.cc
+++ b/src/tests/audio/test_audio_engine.cc
@@ -4,6 +4,7 @@
#include "audio/audio_engine.h"
#include "audio/tracker.h"
#include "generated/assets.h"
+#include "../common/audio_test_fixture.h"
#include <assert.h>
#include <stdio.h>
@@ -13,19 +14,13 @@
void test_audio_engine_lifecycle() {
printf("Test: AudioEngine lifecycle...\n");
- AudioEngine engine;
- printf(" Created AudioEngine object...\n");
-
- engine.init();
- printf(" Initialized AudioEngine...\n");
+ AudioTestFixture fixture;
+ printf(" Created and initialized AudioEngine...\n");
// Verify initialization
- assert(engine.get_active_voice_count() == 0);
+ assert(fixture.engine().get_active_voice_count() == 0);
printf(" Verified voice count is 0...\n");
- engine.shutdown();
- printf(" Shutdown AudioEngine...\n");
-
printf(" ✓ AudioEngine lifecycle test passed\n");
}
@@ -33,16 +28,15 @@ void test_audio_engine_lifecycle() {
void test_audio_engine_music_loading() {
printf("Test: AudioEngine music data loading...\n");
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
// Load global music data
- engine.load_music_data(&g_tracker_score, g_tracker_samples,
- g_tracker_sample_assets, g_tracker_samples_count);
+ fixture.load_music(&g_tracker_score, g_tracker_samples,
+ g_tracker_sample_assets, g_tracker_samples_count);
// Verify resource manager was initialized (samples registered but not loaded
// yet)
- SpectrogramResourceManager* res_mgr = engine.get_resource_manager();
+ SpectrogramResourceManager* res_mgr = fixture.engine().get_resource_manager();
assert(res_mgr != nullptr);
// Initially, no samples should be loaded (lazy loading)
@@ -51,8 +45,6 @@ void test_audio_engine_music_loading() {
printf(" ✓ Music data loaded: %u samples registered\n",
g_tracker_samples_count);
- engine.shutdown();
-
printf(" ✓ AudioEngine music loading test passed\n");
}
@@ -60,14 +52,13 @@ void test_audio_engine_music_loading() {
void test_audio_engine_manual_resource_loading() {
printf("Test: AudioEngine manual resource loading...\n");
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
// Load music data
- engine.load_music_data(&g_tracker_score, g_tracker_samples,
- g_tracker_sample_assets, g_tracker_samples_count);
+ fixture.load_music(&g_tracker_score, g_tracker_samples,
+ g_tracker_sample_assets, g_tracker_samples_count);
- SpectrogramResourceManager* res_mgr = engine.get_resource_manager();
+ SpectrogramResourceManager* res_mgr = fixture.engine().get_resource_manager();
const int initial_loaded = res_mgr->get_loaded_count();
assert(initial_loaded == 0); // No samples loaded yet
@@ -89,8 +80,6 @@ void test_audio_engine_manual_resource_loading() {
assert(spec1 != nullptr);
assert(spec2 != nullptr);
- engine.shutdown();
-
printf(" ✓ AudioEngine manual resource loading test passed\n");
}
@@ -98,13 +87,12 @@ void test_audio_engine_manual_resource_loading() {
void test_audio_engine_reset() {
printf("Test: AudioEngine reset...\n");
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
- engine.load_music_data(&g_tracker_score, g_tracker_samples,
- g_tracker_sample_assets, g_tracker_samples_count);
+ fixture.load_music(&g_tracker_score, g_tracker_samples,
+ g_tracker_sample_assets, g_tracker_samples_count);
- SpectrogramResourceManager* res_mgr = engine.get_resource_manager();
+ SpectrogramResourceManager* res_mgr = fixture.engine().get_resource_manager();
// Manually load some samples
res_mgr->preload(0);
@@ -115,10 +103,10 @@ void test_audio_engine_reset() {
assert(loaded_before_reset == 3);
// Reset engine
- engine.reset();
+ fixture.engine().reset();
// After reset, state should be cleared
- assert(engine.get_active_voice_count() == 0);
+ assert(fixture.engine().get_active_voice_count() == 0);
// Resources should be marked as unloaded (but memory not freed)
const int loaded_after_reset = res_mgr->get_loaded_count();
@@ -126,8 +114,6 @@ void test_audio_engine_reset() {
loaded_before_reset, loaded_after_reset);
assert(loaded_after_reset == 0);
- engine.shutdown();
-
printf(" ✓ AudioEngine reset test passed\n");
}
@@ -136,25 +122,22 @@ void test_audio_engine_reset() {
void test_audio_engine_seeking() {
printf("Test: AudioEngine seeking...\n");
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
- engine.load_music_data(&g_tracker_score, g_tracker_samples,
- g_tracker_sample_assets, g_tracker_samples_count);
+ fixture.load_music(&g_tracker_score, g_tracker_samples,
+ g_tracker_sample_assets, g_tracker_samples_count);
// Seek to t=5.0s
- engine.seek(5.0f);
- assert(engine.get_time() == 5.0f);
+ fixture.engine().seek(5.0f);
+ assert(fixture.engine().get_time() == 5.0f);
// Seek backward to t=2.0s
- engine.seek(2.0f);
- assert(engine.get_time() == 2.0f);
+ fixture.engine().seek(2.0f);
+ assert(fixture.engine().get_time() == 2.0f);
// Seek to beginning
- engine.seek(0.0f);
- assert(engine.get_time() == 0.0f);
-
- engine.shutdown();
+ fixture.engine().seek(0.0f);
+ assert(fixture.engine().get_time() == 0.0f);
printf(" ✓ AudioEngine seeking test passed\n");
}
diff --git a/src/tests/audio/test_silent_backend.cc b/src/tests/audio/test_silent_backend.cc
index 8daacf7..cc98139 100644
--- a/src/tests/audio/test_silent_backend.cc
+++ b/src/tests/audio/test_silent_backend.cc
@@ -6,6 +6,7 @@
#include "audio/audio_engine.h"
#include "audio/backend/silent_backend.h"
#include "audio/synth.h"
+#include "../common/audio_test_fixture.h"
#include <assert.h>
#include <stdio.h>
@@ -80,8 +81,7 @@ void test_silent_backend_tracking() {
SilentBackend backend;
audio_set_backend(&backend);
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
// Initial state
assert(backend.get_frames_rendered() == 0);
@@ -105,7 +105,6 @@ void test_silent_backend_tracking() {
assert(backend.get_frames_rendered() == 0);
assert(backend.get_voice_trigger_count() == 0);
- engine.shutdown();
audio_shutdown();
printf("SilentBackend tracking test PASSED\n");
@@ -116,8 +115,7 @@ void test_audio_playback_time() {
SilentBackend backend;
audio_set_backend(&backend);
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
audio_start();
// Initial playback time should be 0
@@ -137,7 +135,6 @@ void test_audio_playback_time() {
float t2 = audio_get_playback_time();
assert(t2 >= t1); // Should continue advancing
- engine.shutdown();
audio_shutdown();
printf("Audio playback time test PASSED\n");
@@ -148,8 +145,7 @@ void test_audio_buffer_partial_writes() {
SilentBackend backend;
audio_set_backend(&backend);
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
audio_start();
// Fill buffer multiple times to test wraparound
@@ -164,7 +160,6 @@ void test_audio_buffer_partial_writes() {
// no audio callback to consume from the ring buffer
audio_update(); // Should not crash
- engine.shutdown();
audio_shutdown();
printf("Audio buffer partial writes test PASSED\n");
@@ -175,8 +170,7 @@ void test_audio_update() {
SilentBackend backend;
audio_set_backend(&backend);
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
audio_start();
// audio_update() should be callable without crashing
@@ -184,7 +178,6 @@ void test_audio_update() {
audio_update();
audio_update();
- engine.shutdown();
audio_shutdown();
printf("Audio update test PASSED\n");
diff --git a/src/tests/audio/test_tracker.cc b/src/tests/audio/test_tracker.cc
index 6be2a8d..1112e91 100644
--- a/src/tests/audio/test_tracker.cc
+++ b/src/tests/audio/test_tracker.cc
@@ -5,6 +5,7 @@
#include "audio/gen.h"
#include "audio/synth.h"
#include "audio/tracker.h"
+#include "../common/audio_test_fixture.h"
// #include "generated/music_data.h" // Will be generated by tracker_compiler
#include <assert.h>
#include <stdio.h>
@@ -17,15 +18,12 @@ extern const uint32_t g_tracker_patterns_count;
extern const TrackerScore g_tracker_score;
void test_tracker_init() {
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
printf("Tracker init test PASSED\n");
- engine.shutdown();
}
void test_tracker_pattern_triggering() {
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
// At time 0.0f, 3 patterns are triggered:
// - crash (1 event at beat 0.0)
@@ -37,31 +35,30 @@ void test_tracker_pattern_triggering() {
// drums_basic:
// 0.00, ASSET_KICK_1
// 0.00, NOTE_A4
- engine.update(0.0f, 0.0f);
+ fixture.engine().update(0.0f, 0.0f);
// Expect 2 voices: kick + note
- assert(engine.get_active_voice_count() == 2);
+ assert(fixture.engine().get_active_voice_count() == 2);
// Test 2: At music_time = 0.25f (beat 0.5 @ 120 BPM), snare event triggers
// 0.25, ASSET_SNARE_1
- engine.update(0.25f, 0.0f);
+ fixture.engine().update(0.25f, 0.0f);
// Expect at least 2 voices (snare + maybe others)
// Exact count depends on sample duration (kick/note might have finished)
- int voices = engine.get_active_voice_count();
+ int voices = fixture.engine().get_active_voice_count();
assert(voices >= 2);
// Test 3: At music_time = 0.5f (beat 1.0), kick event triggers
// 0.50, ASSET_KICK_1
- engine.update(0.5f, 0.0f);
+ fixture.engine().update(0.5f, 0.0f);
// Expect at least 3 voices (new kick + others)
- assert(engine.get_active_voice_count() >= 3);
+ assert(fixture.engine().get_active_voice_count() >= 3);
// Test 4: Advance to 2.0f - new patterns trigger at time 2.0f
- engine.update(2.0f, 0.0f);
+ fixture.engine().update(2.0f, 0.0f);
// Many events have triggered by now
- assert(engine.get_active_voice_count() > 5);
+ assert(fixture.engine().get_active_voice_count() > 5);
printf("Tracker pattern triggering test PASSED\n");
- engine.shutdown();
}
int main() {
diff --git a/src/tests/audio/test_tracker_timing.cc b/src/tests/audio/test_tracker_timing.cc
index 9f15197..7295de3 100644
--- a/src/tests/audio/test_tracker_timing.cc
+++ b/src/tests/audio/test_tracker_timing.cc
@@ -7,6 +7,7 @@
#include "audio/backend/mock_audio_backend.h"
#include "audio/synth.h"
#include "audio/tracker.h"
+#include "../common/audio_test_fixture.h"
#include <assert.h>
#include <cmath>
#include <stdio.h>
@@ -14,9 +15,10 @@
#if !defined(STRIP_ALL)
// Helper: Setup audio engine for testing
-static void setup_audio_test(MockAudioBackend& backend, AudioEngine& engine) {
+static AudioTestFixture*
+setup_audio_test(MockAudioBackend& backend) {
audio_set_backend(&backend);
- engine.init();
+ return new AudioTestFixture();
}
// Helper: Check if a timestamp exists in events within tolerance
@@ -66,10 +68,9 @@ void test_basic_event_recording() {
printf("Test: Basic event recording with mock backend...\n");
MockAudioBackend backend;
- AudioEngine engine;
- setup_audio_test(backend, engine);
+ AudioTestFixture* fixture = setup_audio_test(backend);
- engine.update(0.0f, 0.0f);
+ fixture->engine().update(0.0f, 0.0f);
const auto& events = backend.get_events();
printf(" Events triggered at t=0.0: %zu\n", events.size());
@@ -78,7 +79,7 @@ void test_basic_event_recording() {
assert(evt.timestamp_sec < 0.1f);
}
- engine.shutdown();
+ delete fixture;
printf(" ✓ Basic event recording works\n");
}
@@ -86,25 +87,24 @@ void test_progressive_triggering() {
printf("Test: Progressive pattern triggering...\n");
MockAudioBackend backend;
- AudioEngine engine;
- setup_audio_test(backend, engine);
+ AudioTestFixture* fixture = setup_audio_test(backend);
- engine.update(0.0f, 0.0f);
+ fixture->engine().update(0.0f, 0.0f);
const size_t events_at_0 = backend.get_events().size();
printf(" Events at t=0.0: %zu\n", events_at_0);
- engine.update(1.0f, 0.0f);
+ fixture->engine().update(1.0f, 0.0f);
const size_t events_at_1 = backend.get_events().size();
printf(" Events at t=1.0: %zu\n", events_at_1);
- engine.update(2.0f, 0.0f);
+ fixture->engine().update(2.0f, 0.0f);
const size_t events_at_2 = backend.get_events().size();
printf(" Events at t=2.0: %zu\n", events_at_2);
assert(events_at_1 >= events_at_0);
assert(events_at_2 >= events_at_1);
- engine.shutdown();
+ delete fixture;
printf(" ✓ Events accumulate over time\n");
}
@@ -112,11 +112,10 @@ void test_simultaneous_triggers() {
printf("Test: SIMULTANEOUS pattern triggers at same time...\n");
MockAudioBackend backend;
- AudioEngine engine;
- setup_audio_test(backend, engine);
+ AudioTestFixture* fixture = setup_audio_test(backend);
backend.clear_events();
- engine.update(0.0f, 0.0f);
+ fixture->engine().update(0.0f, 0.0f);
const auto& events = backend.get_events();
if (events.size() == 0) {
@@ -150,18 +149,17 @@ void test_simultaneous_triggers() {
printf(" ℹ Only one event at t=0.0, cannot verify simultaneity\n");
}
- engine.shutdown();
+ delete fixture;
}
void test_timing_monotonicity() {
printf("Test: Event timestamps are monotonically increasing...\n");
MockAudioBackend backend;
- AudioEngine engine;
- setup_audio_test(backend, engine);
+ AudioTestFixture* fixture = setup_audio_test(backend);
for (float t = 0.0f; t <= 5.0f; t += 0.5f) {
- engine.update(t, 0.5f);
+ fixture->engine().update(t, 0.5f);
}
const auto& events = backend.get_events();
@@ -172,7 +170,7 @@ void test_timing_monotonicity() {
assert(events[i].timestamp_sec >= events[i - 1].timestamp_sec);
}
- engine.shutdown();
+ delete fixture;
printf(" ✓ All timestamps monotonically increasing\n");
}
@@ -183,8 +181,7 @@ void test_seek_simulation() {
audio_set_backend(&backend);
audio_init();
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
// Simulate seeking to t=3.0s by rendering silent audio
// This should trigger all patterns in range [0, 3.0]
@@ -194,10 +191,10 @@ void test_seek_simulation() {
float t = 0.0f;
const float step = 0.1f;
while (t <= seek_target) {
- engine.update(t, step);
+ fixture.engine().update(t, step);
// Simulate audio rendering
float dummy_buffer[512 * 2];
- engine.render(dummy_buffer, 512);
+ fixture.engine().render(dummy_buffer, 512);
t += step;
}
@@ -214,7 +211,6 @@ void test_seek_simulation() {
assert(evt.timestamp_sec <= seek_target + 0.5f);
}
- engine.shutdown();
audio_shutdown();
printf(" ✓ Seek simulation works correctly\n");
@@ -226,12 +222,11 @@ void test_timestamp_clustering() {
MockAudioBackend backend;
audio_set_backend(&backend);
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
// Update through the first 4 seconds
for (float t = 0.0f; t <= 4.0f; t += 0.1f) {
- engine.update(t, 0.1f);
+ fixture.engine().update(t, 0.1f);
}
const auto& events = backend.get_events();
@@ -249,7 +244,6 @@ void test_timestamp_clustering() {
}
}
- engine.shutdown();
printf(" ✓ Timestamp clustering analyzed\n");
}
@@ -260,11 +254,10 @@ void test_render_integration() {
audio_set_backend(&backend);
audio_init();
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
// Trigger some patterns
- engine.update(0.0f, 0.0f);
+ fixture.engine().update(0.0f, 0.0f);
const size_t events_before = backend.get_events().size();
// Render 1 second of silent audio
@@ -276,13 +269,12 @@ void test_render_integration() {
assert(backend_time >= 0.9f && backend_time <= 1.1f);
// Trigger more patterns after time advance
- engine.update(1.0f, 0.0f);
+ fixture.engine().update(1.0f, 0.0f);
const size_t events_after = backend.get_events().size();
printf(" Events before: %zu, after: %zu\n", events_before, events_after);
assert(events_after >= events_before);
- engine.shutdown();
audio_shutdown();
printf(" ✓ audio_render_silent integration works\n");
diff --git a/src/tests/audio/test_variable_tempo.cc b/src/tests/audio/test_variable_tempo.cc
index bbc9ebf..da056c5 100644
--- a/src/tests/audio/test_variable_tempo.cc
+++ b/src/tests/audio/test_variable_tempo.cc
@@ -6,6 +6,7 @@
#include "audio/audio_engine.h"
#include "audio/backend/mock_audio_backend.h"
#include "audio/tracker.h"
+#include "../common/audio_test_fixture.h"
#include <assert.h>
#include <cmath>
#include <stdio.h>
@@ -13,11 +14,13 @@
#if !defined(STRIP_ALL)
// Helper: Setup audio engine for testing
-static void setup_audio_test(MockAudioBackend& backend, AudioEngine& engine) {
+static AudioTestFixture*
+setup_audio_test(MockAudioBackend& backend) {
audio_set_backend(&backend);
- engine.init();
- engine.load_music_data(&g_tracker_score, g_tracker_samples,
- g_tracker_sample_assets, g_tracker_samples_count);
+ AudioTestFixture* fixture = new AudioTestFixture();
+ fixture->load_music(&g_tracker_score, g_tracker_samples,
+ g_tracker_sample_assets, g_tracker_samples_count);
+ return fixture;
}
// Helper: Simulate tempo advancement with fixed steps
@@ -47,14 +50,13 @@ void test_basic_tempo_scaling() {
printf("Test: Basic tempo scaling (1.0x, 2.0x, 0.5x)...\n");
MockAudioBackend backend;
- AudioEngine engine;
- setup_audio_test(backend, engine);
+ AudioTestFixture* fixture = setup_audio_test(backend);
// Test 1: Normal tempo (1.0x)
{
backend.clear_events();
float music_time = 0.0f;
- simulate_tempo(engine, music_time, 1.0f, 1.0f);
+ simulate_tempo(fixture->engine(), music_time, 1.0f, 1.0f);
printf(" 1.0x tempo: music_time = %.3f (expected ~1.0)\n", music_time);
assert(std::abs(music_time - 1.0f) < 0.01f);
}
@@ -62,9 +64,9 @@ void test_basic_tempo_scaling() {
// Test 2: Fast tempo (2.0x)
{
backend.clear_events();
- engine.reset();
+ fixture->engine().reset();
float music_time = 0.0f;
- simulate_tempo(engine, music_time, 1.0f, 2.0f);
+ simulate_tempo(fixture->engine(), music_time, 1.0f, 2.0f);
printf(" 2.0x tempo: music_time = %.3f (expected ~2.0)\n", music_time);
assert(std::abs(music_time - 2.0f) < 0.01f);
}
@@ -72,14 +74,14 @@ void test_basic_tempo_scaling() {
// Test 3: Slow tempo (0.5x)
{
backend.clear_events();
- engine.reset();
+ fixture->engine().reset();
float music_time = 0.0f;
- simulate_tempo(engine, music_time, 1.0f, 0.5f);
+ simulate_tempo(fixture->engine(), music_time, 1.0f, 0.5f);
printf(" 0.5x tempo: music_time = %.3f (expected ~0.5)\n", music_time);
assert(std::abs(music_time - 0.5f) < 0.01f);
}
- engine.shutdown();
+ delete fixture;
printf(" ✓ Basic tempo scaling works correctly\n");
}
@@ -87,8 +89,7 @@ void test_2x_speedup_reset_trick() {
printf("Test: 2x SPEED-UP reset trick...\n");
MockAudioBackend backend;
- AudioEngine engine;
- setup_audio_test(backend, engine);
+ AudioTestFixture* fixture = setup_audio_test(backend);
float music_time = 0.0f;
float physical_time = 0.0f;
@@ -97,7 +98,7 @@ void test_2x_speedup_reset_trick() {
// Phase 1: Accelerate from 1.0x to 2.0x over 5 seconds
printf(" Phase 1: Accelerating 1.0x → 2.0x\n");
auto accel_fn = [](float t) { return fminf(1.0f + (t / 5.0f), 2.0f); };
- simulate_tempo_fn(engine, music_time, physical_time, 5.0f, dt, accel_fn);
+ simulate_tempo_fn(fixture->engine(), music_time, physical_time, 5.0f, dt, accel_fn);
const float tempo_scale = accel_fn(physical_time);
printf(" After 5s physical: tempo=%.2fx, music_time=%.3f\n", tempo_scale,
@@ -107,14 +108,14 @@ void test_2x_speedup_reset_trick() {
// Phase 2: RESET - back to 1.0x tempo
printf(" Phase 2: RESET to 1.0x tempo\n");
const float music_time_before_reset = music_time;
- simulate_tempo(engine, music_time, 2.0f, 1.0f, dt);
+ simulate_tempo(fixture->engine(), music_time, 2.0f, 1.0f, dt);
printf(" After reset + 2s: tempo=1.0x, music_time=%.3f\n", music_time);
const float music_time_delta = music_time - music_time_before_reset;
printf(" Music time delta: %.3f (expected ~2.0)\n", music_time_delta);
assert(std::abs(music_time_delta - 2.0f) < 0.1f);
- engine.shutdown();
+ delete fixture;
printf(" ✓ 2x speed-up reset trick verified\n");
}
@@ -122,8 +123,7 @@ void test_2x_slowdown_reset_trick() {
printf("Test: 2x SLOW-DOWN reset trick...\n");
MockAudioBackend backend;
- AudioEngine engine;
- setup_audio_test(backend, engine);
+ AudioTestFixture* fixture = setup_audio_test(backend);
float music_time = 0.0f;
float physical_time = 0.0f;
@@ -132,7 +132,7 @@ void test_2x_slowdown_reset_trick() {
// Phase 1: Decelerate from 1.0x to 0.5x over 5 seconds
printf(" Phase 1: Decelerating 1.0x → 0.5x\n");
auto decel_fn = [](float t) { return fmaxf(1.0f - (t / 10.0f), 0.5f); };
- simulate_tempo_fn(engine, music_time, physical_time, 5.0f, dt, decel_fn);
+ simulate_tempo_fn(fixture->engine(), music_time, physical_time, 5.0f, dt, decel_fn);
const float tempo_scale = decel_fn(physical_time);
printf(" After 5s physical: tempo=%.2fx, music_time=%.3f\n", tempo_scale,
@@ -142,14 +142,14 @@ void test_2x_slowdown_reset_trick() {
// Phase 2: RESET - back to 1.0x tempo
printf(" Phase 2: RESET to 1.0x tempo\n");
const float music_time_before_reset = music_time;
- simulate_tempo(engine, music_time, 2.0f, 1.0f, dt);
+ simulate_tempo(fixture->engine(), music_time, 2.0f, 1.0f, dt);
printf(" After reset + 2s: tempo=1.0x, music_time=%.3f\n", music_time);
const float music_time_delta = music_time - music_time_before_reset;
printf(" Music time delta: %.3f (expected ~2.0)\n", music_time_delta);
assert(std::abs(music_time_delta - 2.0f) < 0.1f);
- engine.shutdown();
+ delete fixture;
printf(" ✓ 2x slow-down reset trick verified\n");
}
@@ -157,34 +157,33 @@ void test_pattern_density_swap() {
printf("Test: Pattern density swap at reset points...\n");
MockAudioBackend backend;
- AudioEngine engine;
- setup_audio_test(backend, engine);
+ AudioTestFixture* fixture = setup_audio_test(backend);
float music_time = 0.0f;
// Phase 1: Sparse pattern at normal tempo
printf(" Phase 1: Sparse pattern, normal tempo\n");
- simulate_tempo(engine, music_time, 3.0f, 1.0f);
+ simulate_tempo(fixture->engine(), music_time, 3.0f, 1.0f);
const size_t sparse_events = backend.get_events().size();
printf(" Events during sparse phase: %zu\n", sparse_events);
// Phase 2: Accelerate to 2.0x
printf(" Phase 2: Accelerating to 2.0x\n");
- simulate_tempo(engine, music_time, 2.0f, 2.0f);
+ simulate_tempo(fixture->engine(), music_time, 2.0f, 2.0f);
const size_t events_at_2x = backend.get_events().size() - sparse_events;
printf(" Additional events during 2.0x: %zu\n", events_at_2x);
// Phase 3: Reset to 1.0x
printf(" Phase 3: Reset to 1.0x (simulating denser pattern)\n");
const size_t events_before_reset_phase = backend.get_events().size();
- simulate_tempo(engine, music_time, 2.0f, 1.0f);
+ simulate_tempo(fixture->engine(), music_time, 2.0f, 1.0f);
const size_t events_after_reset = backend.get_events().size();
printf(" Events during reset phase: %zu\n",
events_after_reset - events_before_reset_phase);
assert(backend.get_events().size() > 0);
- engine.shutdown();
+ delete fixture;
printf(" ✓ Pattern density swap points verified\n");
}
@@ -192,8 +191,7 @@ void test_continuous_acceleration() {
printf("Test: Continuous acceleration from 0.5x to 2.0x...\n");
MockAudioBackend backend;
- AudioEngine engine;
- setup_audio_test(backend, engine);
+ AudioTestFixture* fixture = setup_audio_test(backend);
float music_time = 0.0f;
float physical_time = 0.0f;
@@ -215,7 +213,7 @@ void test_continuous_acceleration() {
physical_time += dt;
const float tempo_scale = accel_fn(physical_time);
music_time += dt * tempo_scale;
- engine.update(music_time, dt * tempo_scale);
+ fixture->engine().update(music_time, dt * tempo_scale);
if (i % 50 == 0) {
printf(" t=%.1fs: tempo=%.2fx, music_time=%.3f\n", physical_time,
tempo_scale, music_time);
@@ -232,7 +230,7 @@ void test_continuous_acceleration() {
music_time);
assert(std::abs(music_time - expected_music_time) < 0.5f);
- engine.shutdown();
+ delete fixture;
printf(" ✓ Continuous acceleration verified\n");
}
@@ -240,8 +238,7 @@ void test_oscillating_tempo() {
printf("Test: Oscillating tempo (sine wave)...\n");
MockAudioBackend backend;
- AudioEngine engine;
- setup_audio_test(backend, engine);
+ AudioTestFixture* fixture = setup_audio_test(backend);
float music_time = 0.0f;
float physical_time = 0.0f;
@@ -256,7 +253,7 @@ void test_oscillating_tempo() {
physical_time += dt;
const float tempo_scale = oscil_fn(physical_time);
music_time += dt * tempo_scale;
- engine.update(music_time, dt * tempo_scale);
+ fixture->engine().update(music_time, dt * tempo_scale);
if (i % 25 == 0) {
printf(" t=%.2fs: tempo=%.3fx, music_time=%.3f\n", physical_time,
tempo_scale, music_time);
@@ -267,7 +264,7 @@ void test_oscillating_tempo() {
physical_time, music_time, physical_time);
assert(std::abs(music_time - physical_time) < 0.5f);
- engine.shutdown();
+ delete fixture;
printf(" ✓ Oscillating tempo verified\n");
}
diff --git a/src/tests/audio/test_wav_dump.cc b/src/tests/audio/test_wav_dump.cc
index 85b168d..9175153 100644
--- a/src/tests/audio/test_wav_dump.cc
+++ b/src/tests/audio/test_wav_dump.cc
@@ -5,6 +5,7 @@
#include "audio/audio_engine.h"
#include "audio/backend/wav_dump_backend.h"
#include "audio/ring_buffer.h"
+#include "../common/audio_test_fixture.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
@@ -38,8 +39,7 @@ void test_wav_format_matches_live_audio() {
audio_init();
// Initialize AudioEngine
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
// Create WAV dump backend
WavDumpBackend wav_backend;
@@ -59,7 +59,7 @@ void test_wav_format_matches_live_audio() {
float music_time = 0.0f;
for (float t = 0.0f; t < duration; t += update_dt) {
// Update audio engine (triggers patterns)
- engine.update(music_time, update_dt);
+ fixture.engine().update(music_time, update_dt);
music_time += update_dt;
// Render audio ahead
@@ -76,7 +76,6 @@ void test_wav_format_matches_live_audio() {
// Shutdown
wav_backend.shutdown();
- engine.shutdown();
audio_shutdown();
// Read and verify WAV header
@@ -192,8 +191,7 @@ void test_clipping_detection() {
const char* test_file = "test_clipping.wav";
audio_init();
- AudioEngine engine;
- engine.init();
+ AudioTestFixture fixture;
WavDumpBackend wav_backend;
wav_backend.set_output_file(test_file);
@@ -225,7 +223,6 @@ void test_clipping_detection() {
printf(" Detected %zu clipped samples (expected 200)\n", clipped);
wav_backend.shutdown();
- engine.shutdown();
audio_shutdown();
// Clean up