package com.evsuite.abrp; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Test; public class MusicPulseTest { private static final float STEP = 0.04f; @Test public void noReadingAndSilenceLightNothing() { MusicPulse p = new MusicPulse(); assertEquals(0f, p.update(null, STEP), 0f); assertEquals(0f, p.update(Float.NaN, STEP), 0f); assertEquals(0f, p.update(0f, STEP), 0f); } @Test public void aBeatLightsAndFadesSlowerThanItRises() { MusicPulse p = new MusicPulse(); for (int i = 0; i < 50; i++) p.update(0.05f, STEP); float beat = p.update(0.5f, STEP); assertTrue("a beat lights it, got " + beat, beat > 0.8f); float after = p.update(0.05f, STEP); assertTrue("it fades, got " + after, after < beat); assertTrue("slowly, got " + after, after > beat * 0.7f); } @Test public void aSteadyHumSettlesAtNothing() { MusicPulse p = new MusicPulse(); float last = 1f; for (int i = 0; i < 400; i++) last = p.update(0.3f, STEP); assertEquals(0f, last, 0f); } @Test public void aHeldBassNoteLightsOnlyItsStart() { MusicPulse p = new MusicPulse(); for (int i = 0; i < 50; i++) p.update(0.05f, STEP); assertTrue(p.update(0.4f, STEP) > 0.8f); float last = 1f; for (int i = 0; i < 25; i++) last = p.update(0.4f, STEP); assertEquals(0f, last, 0f); } @Test public void aWobblingBassLineStaysDark() { MusicPulse p = new MusicPulse(); for (int i = 0; i < 50; i++) p.update(0.3f, STEP); float top = 0f; for (int i = 0; i < 200; i++) top = Math.max(top, p.update(i % 3 == 0 ? 0.33f : 0.3f, STEP)); assertEquals(0f, top, 0f); } @Test public void aSwellingNoteStaysDark() { MusicPulse p = new MusicPulse(); for (int i = 0; i < 50; i++) p.update(0.1f, STEP); float top = 0f; for (int i = 0; i < 100; i++) top = Math.max(top, p.update(0.1f + i * 0.004f, STEP)); assertEquals(0f, top, 0f); } @Test public void aKickOverABassLineLights() { MusicPulse p = new MusicPulse(); float top = 0f; for (int i = 0; i < 300; i++) { float v = p.update(i % 12 == 0 ? 0.6f : (i % 3 == 0 ? 0.33f : 0.3f), STEP); if (i > 100) top = Math.max(top, v); } assertTrue("a kick lights it, got " + top, top > 0.8f); } @Test public void quietAndLoudSongsPulseAlike() { assertEquals(beatOf(0.5f), beatOf(0.05f), 0.02f); } private static float beatOf(float scale) { MusicPulse p = new MusicPulse(); float top = 0f; for (int i = 0; i < 500; i++) { top = Math.max(top * 0.99f, p.update(i % 12 == 0 ? scale : scale * 0.2f, STEP)); } return top; } @Test public void whenTheMusicStopsItGoesOut() { MusicPulse p = new MusicPulse(); for (int i = 0; i < 100; i++) p.update(i % 12 == 0 ? 0.5f : 0.1f, STEP); float last = 1f; for (int i = 0; i < 100; i++) last = p.update(null, STEP); assertEquals(0f, last, 0f); } @Test public void itStaysBetweenZeroAndOne() { MusicPulse p = new MusicPulse(); for (int i = 0; i < 2000; i++) { Float bass = i % 11 == 0 ? null : Float.valueOf(i % 7 == 0 ? 1f : 0.1f); float v = p.update(bass, i % 5 == 0 ? 2f : STEP); assertTrue(v >= 0f && v <= 1f); } } }