summaryrefslogtreecommitdiff
path: root/src/tests/audio/test_variable_tempo.cc
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/test_variable_tempo.cc
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/test_variable_tempo.cc')
-rw-r--r--src/tests/audio/test_variable_tempo.cc69
1 files changed, 33 insertions, 36 deletions
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");
}