"""Tests for src/reaper_builder/ — RPPBuilder, rpp_writer.""" import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parents[1])) import pytest import tempfile from src.core.schema import SongDefinition, SongMeta, TrackDef, ClipDef, MidiNote from src.reaper_builder import RPPBuilder class TestRPPBuilderWrite: """Test RPPBuilder.write() produces valid .rpp output.""" def test_write_produces_reaper_project_marker(self): """RPPBuilder.write() produces a file containing 'REAPER_PROJECT'.""" meta = SongMeta(bpm=95, key="Am", title="Test") song = SongDefinition(meta=meta, tracks=[]) builder = RPPBuilder(song) with tempfile.NamedTemporaryFile( mode="w", suffix=".rpp", delete=False, encoding="utf-8" ) as f: tmp_path = f.name try: builder.write(tmp_path) content = Path(tmp_path).read_text(encoding="utf-8") assert "REAPER_PROJECT" in content finally: Path(tmp_path).unlink(missing_ok=True) def test_write_produces_tempo_line(self): """Output contains TEMPO line with correct BPM.""" meta = SongMeta(bpm=95, key="Am") song = SongDefinition(meta=meta, tracks=[]) builder = RPPBuilder(song) with tempfile.NamedTemporaryFile( mode="w", suffix=".rpp", delete=False, encoding="utf-8" ) as f: tmp_path = f.name try: builder.write(tmp_path) content = Path(tmp_path).read_text(encoding="utf-8") assert "TEMPO 95 " in content finally: Path(tmp_path).unlink(missing_ok=True) class TestRPPBuilderAudioTrack: """Test audio track generates SOURCE WAVE block with correct file path.""" def test_audio_track_generates_source_wave_block(self): """Audio clip produces block with FILE path.""" meta = SongMeta(bpm=95, key="Am") clip = ClipDef( position=0.0, length=16.0, name="Kick Loop", audio_path="C:/samples/kick.wav", ) track = TrackDef(name="Drums", clips=[clip]) song = SongDefinition(meta=meta, tracks=[track]) builder = RPPBuilder(song) with tempfile.NamedTemporaryFile( mode="w", suffix=".rpp", delete=False, encoding="utf-8" ) as f: tmp_path = f.name try: builder.write(tmp_path) content = Path(tmp_path).read_text(encoding="utf-8") assert "