diff options
Diffstat (limited to 'src/tests/audio/test_variable_tempo.cc')
| -rw-r--r-- | src/tests/audio/test_variable_tempo.cc | 69 |
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"); } |
