diff --git a/stepmania/src/Makefile.am b/stepmania/src/Makefile.am index e974306bd1..52e6679edb 100644 --- a/stepmania/src/Makefile.am +++ b/stepmania/src/Makefile.am @@ -1,4 +1,4 @@ -bin_PROGRAMS = stepmania test_audio_readers test_file_readers +bin_PROGRAMS = stepmania test_audio_readers test_file_readers test_timing_data AM_LDFLAGS = AM_CXXFLAGS = @@ -219,42 +219,43 @@ stepmania_LDADD = \ $(srcdir)/libresample/libresample.a # XXX: Make ArchHooks not depend on Display -# A hack for now: -test_audio_readers_SOURCES = tests/test_audio_readers.cpp \ +all_test_SOURCES = \ RageDisplay.cpp RageDisplay.h \ RageMath.cpp RageMath.h \ RageUtil.cpp RageLog.cpp RageThreads.cpp RageException.cpp \ RageUtil_FileDB.cpp RageUtil_FileDB.h \ RageTimer.cpp RageTimer.h \ $(RageFile) \ - RageSoundReader_FileReader.cpp RageSoundReader_FileReader.h \ PrefsManager.cpp PrefsManager.h \ Grade.cpp Grade.h \ arch/ArchHooks/ArchHooks.cpp arch/ArchHooks/ArchHooks.h \ IniFile.cpp IniFile.h \ - $(RageSoundFileReaders) \ $(PCRE) +test_audio_readers_SOURCES = $(all_test_SOURCES) \ + tests/test_audio_readers.cpp \ + RageSoundReader_FileReader.cpp RageSoundReader_FileReader.h \ + $(RageSoundFileReaders) \ + RageSoundReader_Resample.cpp RageSoundReader_Resample.h \ + RageSoundReader_Resample_Fast.cpp RageSoundReader_Resample_Fast.h \ + RageSoundResampler.cpp RageSoundResampler.h \ + RageSoundReader_Resample_Good.cpp RageSoundReader_Resample_Good.h \ + RageSoundReader_Preload.cpp RageSoundReader_Preload.h + test_audio_readers_LDADD = \ - $(USE_SDL_LIBS) \ - $(AUDIO_LIBS) + $(USE_SDL_LIBS) \ + $(AUDIO_LIBS) \ + $(srcdir)/libresample/libresample.a -test_file_readers_SOURCES = tests/test_file_readers.cpp \ - RageDisplay.cpp RageDisplay.h \ - RageMath.cpp RageMath.h \ - RageUtil.cpp RageLog.cpp RageThreads.cpp RageException.cpp \ - RageUtil_FileDB.cpp RageUtil_FileDB.h \ - RageTimer.cpp RageTimer.h \ - $(RageFile) \ - PrefsManager.cpp PrefsManager.h \ - Grade.cpp Grade.h \ - arch/ArchHooks/ArchHooks.cpp arch/ArchHooks/ArchHooks.h \ - IniFile.cpp IniFile.h \ - $(PCRE) +test_file_readers_SOURCES = $(all_test_SOURCES) \ + tests/test_file_readers.cpp test_file_readers_LDADD = \ $(USE_SDL_LIBS) +test_timing_data_SOURCES = $(all_test_SOURCES) \ + tests/test_timing_data.cpp TimingData.cpp TimingData.h + INCLUDES = $(SDL_CFLAGS) if HAVE_GTK diff --git a/stepmania/src/tests/test_timing_data.cpp b/stepmania/src/tests/test_timing_data.cpp new file mode 100644 index 0000000000..eea794a9cf --- /dev/null +++ b/stepmania/src/tests/test_timing_data.cpp @@ -0,0 +1,144 @@ +#include "global.h" +#include "RageLog.h" +#include "RageFile.h" +#include "RageUtil.h" +#include "RageUtil_FileDB.h" +#include "PrefsManager.h" +#include "RageFileManager.h" +#include "TimingData.h" + +CString InitialWorkingDirectory = "."; +CString DirOfExecutable = "."; + +void run() +{ +#define CHECK(call, exp) \ +{ \ + float ret = call; \ + if( call != exp ) { \ + LOG->Warn( "Line %i: Got %f, expected %f", __LINE__, ret, exp); \ + return; \ + } \ +} + + TimingData test; + test.AddBPMSegment( BPMSegment(0, 60) ); + + /* First, trivial sanity checks. */ + CHECK( test.GetBeatFromElapsedTime(60), 60.0f ); + CHECK( test.GetElapsedTimeFromBeat(60), 60.0f ); + + /* The first BPM segment extends backwards in time. */ + CHECK( test.GetBeatFromElapsedTime(-60), -60.0f ); + CHECK( test.GetElapsedTimeFromBeat(-60), -60.0f ); + + CHECK( test.GetBeatFromElapsedTime(100000), 100000.0f ); + CHECK( test.GetElapsedTimeFromBeat(100000), 100000.0f ); + CHECK( test.GetBeatFromElapsedTime(-100000), -100000.0f ); + CHECK( test.GetElapsedTimeFromBeat(-100000), -100000.0f ); + + CHECK( test.GetBPMAtBeat(0), 60.0f ); + CHECK( test.GetBPMAtBeat(100000), 60.0f ); + CHECK( test.GetBPMAtBeat(-100000), 60.0f ); + + /* 120BPM at beat 10: */ + test.AddBPMSegment( BPMSegment(10, 120) ); + CHECK( test.GetBPMAtBeat(9.99), 60.0f ); + CHECK( test.GetBPMAtBeat(10), 120.0f ); + + CHECK( test.GetBeatFromElapsedTime(9), 9.0f ); + CHECK( test.GetBeatFromElapsedTime(10), 10.0f ); + CHECK( test.GetBeatFromElapsedTime(10.5), 11.0f ); + + CHECK( test.GetElapsedTimeFromBeat(9), 9.0f ); + CHECK( test.GetElapsedTimeFromBeat(10), 10.0f ); + CHECK( test.GetElapsedTimeFromBeat(11), 10.5f ); + + /* Add a 5-second stop at beat 10. */ + test.AddStopSegment( StopSegment(10, 5) ); + + /* The stop shouldn't affect GetBPMAtBeat at all. */ + CHECK( test.GetBPMAtBeat(9.99), 60.0f ); + CHECK( test.GetBPMAtBeat(10), 120.0f ); + + CHECK( test.GetBeatFromElapsedTime(9), 9.0f ); + CHECK( test.GetBeatFromElapsedTime(10), 10.0f ); + CHECK( test.GetBeatFromElapsedTime(12), 10.0f ); + CHECK( test.GetBeatFromElapsedTime(14), 10.0f ); + CHECK( test.GetBeatFromElapsedTime(15), 10.0f ); + CHECK( test.GetBeatFromElapsedTime(15.5), 11.0f ); + + CHECK( test.GetElapsedTimeFromBeat(9), 9.0f ); + CHECK( test.GetElapsedTimeFromBeat(10), 10.0f ); + CHECK( test.GetElapsedTimeFromBeat(11), 15.5f ); + + /* Add a 2-second stop at beat 5 and a 5-second stop at beat 15. */ + test.m_StopSegments.clear(); + test.AddStopSegment( StopSegment(5, 2) ); + test.AddStopSegment( StopSegment(15, 5) ); + CHECK( test.GetBPMAtBeat(9.99), 60.0f ); + CHECK( test.GetBPMAtBeat(10), 120.0f ); + + CHECK( test.GetBeatFromElapsedTime(1), 1.0f ); + CHECK( test.GetBeatFromElapsedTime(2), 2.0f ); + CHECK( test.GetBeatFromElapsedTime(5), 5.0f ); // stopped + CHECK( test.GetBeatFromElapsedTime(6), 5.0f ); // stopped + CHECK( test.GetBeatFromElapsedTime(7), 5.0f ); // stop finished + CHECK( test.GetBeatFromElapsedTime(8), 6.0f ); + CHECK( test.GetBeatFromElapsedTime(12), 10.0f ); // bpm changes to 120 + CHECK( test.GetBeatFromElapsedTime(13), 12.0f ); + CHECK( test.GetBeatFromElapsedTime(14), 14.0f ); + CHECK( test.GetBeatFromElapsedTime(14.5f), 15.0f ); // stopped + CHECK( test.GetBeatFromElapsedTime(15), 15.0f ); // stopped + CHECK( test.GetBeatFromElapsedTime(17), 15.0f ); // stopped + CHECK( test.GetBeatFromElapsedTime(19.5f), 15.0f ); // stop finished + CHECK( test.GetBeatFromElapsedTime(20), 16.0f ); + + CHECK( test.GetElapsedTimeFromBeat(1), 1.0f ); + CHECK( test.GetElapsedTimeFromBeat(2), 2.0f ); + CHECK( test.GetElapsedTimeFromBeat(5), 5.0f ); // stopped + CHECK( test.GetElapsedTimeFromBeat(6), 8.0f ); + CHECK( test.GetElapsedTimeFromBeat(10), 12.0f ); // bpm changes to 120 + CHECK( test.GetElapsedTimeFromBeat(12), 13.0f ); + CHECK( test.GetElapsedTimeFromBeat(14), 14.0f ); + CHECK( test.GetElapsedTimeFromBeat(15.0f), 14.5f ); // stopped + CHECK( test.GetElapsedTimeFromBeat(16), 20.0f ); + +RageTimer foobar; + /* We can look up the time of any given beat, then look up the beat of that + * time and get the original value. (We can't do this in reverse; the beat + * doesn't move during stop segments.) */ +int q = 0; + for( float f = -10; f < 250; f += 0.002 ) + { + ++q; +// const float t = test.GetElapsedTimeFromBeat( f ); + const float b = test.GetBeatFromElapsedTime( f ); + + /* b == f */ + +// if( fabsf(b-f) > 0.001 ) +// { +// LOG->Warn( "%f != %f", b, f ); +// return; +// } + } +LOG->Trace("... %i in %f", q, foobar.GetDeltaTime()); +} + +int main() +{ + FILEMAN = new RageFileManager; + LOG = new RageLog(); + PREFSMAN = new PrefsManager; // TimingData needs PREFSMAN; it probably shouldn't + LOG->ShowLogOutput( true ); + LOG->SetFlushing( true ); + + run(); + + delete PREFSMAN; + delete LOG; + delete FILEMAN; + + exit(0); +}