package edu.gatech.cs2340.trydent.test; import static org.junit.Assert.assertTrue; import java.util.LinkedList; import java.util.List; import org.junit.Test; import edu.gatech.cs2340.trydent.ContinuousEvent; import edu.gatech.cs2340.trydent.Time; import edu.gatech.cs2340.trydent.TrydentEngine; import edu.gatech.cs2340.trydent.internal.TrydentInternalException; /** * Tests for continuous event timings and engine start/stop behavior. * */ public class LifecycleTest { @Test public void testStartUpdateStop() { final List<String> messages = new LinkedList<String>(); ContinuousEvent event = new ContinuousEvent() { @Override public void onStart() { messages.add("onStart"); } @Override public void onUpdate() { messages.add("onUpdate"); stop(); } @Override public void onStop() { messages.add("onStop"); TrydentEngine.quit(); } }; TrydentEngine.start(); try { TrydentEngine.waitUntilEngineStops(); } catch (Exception ex) { ex.printStackTrace(); } String text = messages.toString(); String expected = "[onStart, onUpdate, onStop]"; assertTrue("Expected \"" + expected + "\", got \"" + text + "\"", text.equals(expected)); } @Test public void startUpdateQuit() { final List<String> messages = new LinkedList<String>(); ContinuousEvent event = new ContinuousEvent() { @Override public void onStart() { messages.add("onStart"); } @Override public void onUpdate() { messages.add("onUpdate"); TrydentEngine.quit(); } @Override public void onStop() { messages.add("onStop"); } }; TrydentEngine.start(); try { TrydentEngine.waitUntilEngineStops(); } catch (Exception ex) { ex.printStackTrace(); } String text = messages.toString(); String expected = "[onStart, onUpdate, onStop]"; assertTrue("Expected \"" + expected + "\", got \"" + text + "\"", text.equals(expected)); } @Test public void testStartUpdate3Stop() { final List<String> messages = new LinkedList<String>(); ContinuousEvent event = new ContinuousEvent() { int counter = -100; @Override public void onStart() { messages.add("onStart"); counter = 0; } @Override public void onUpdate() { messages.add("onUpdate"); counter++; if (counter >= 3) stop(); } @Override public void onStop() { messages.add("onStop"); TrydentEngine.quit(); } }; TrydentEngine.start(); try { TrydentEngine.waitUntilEngineStops(); } catch (Exception ex) { ex.printStackTrace(); } String text = messages.toString(); String expected = "[onStart, onUpdate, onUpdate, onUpdate, onStop]"; assertTrue("Expected \"" + expected + "\", got \"" + text + "\"", text.equals(expected)); } @Test public void testBasicTiming() { final List<String> messages = new LinkedList<String>(); ContinuousEvent event = new ContinuousEvent() { @Override public void onStart() { // This is event is added before the engine starts, so this // should run at the dawn of time, t=0, dt=0. messages.add("onStart"); messages.add("t0=" + Time.getTime()); messages.add("delta t0=" + Time.getTimePassed()); } @Override public void onUpdate() { // Run until time is non-zero. if (Time.getRealTimeSinceStartup() >= 0.1) stop(); } @Override public void onStop() { messages.add("onStop"); messages.add("t1=" + Time.getTime()); TrydentEngine.quit(); } }; TrydentEngine.start(); try { TrydentEngine.waitUntilEngineStops(); } catch (Exception ex) { ex.printStackTrace(); } String[] expected = { "onStart", "t0=0[.]0", "delta t0=0[.]0", "onStop", "t1=(([1-9].*)|(0[.][0]*[1-9]+[0-9]*))" }; assertTrue("expected # messages = " + expected.length + " got " + messages.size(), expected.length == messages.size()); for (int i = 0; i < expected.length; i++) { assertTrue("Message #" + i + ": \"" + messages.get(i) + "\" should match \"" + expected[i] + "\"", messages .get(i).matches(expected[i])); } } @Test public void testRunOnce() { final List<String> messages = new LinkedList<String>(); new ContinuousEvent() { int frame = 0; @Override public void onStart() { frame++; } @Override public void onUpdate() { frame++; if (frame == 5) { TrydentEngine.runOnce(() -> { messages.add("runOnce"); } ); } else if (frame > 10) { TrydentEngine.quit(); } } @Override public void onStop() { } }; TrydentEngine.start(); try { TrydentEngine.waitUntilEngineStops(); } catch (Exception ex) { ex.printStackTrace(); } String text = messages.toString(); String expected = "[runOnce]"; assertTrue("Expected \"" + expected + "\", got \"" + text + "\"", text.equals(expected)); } @Test public void testRunContinuously() { final List<String> messages = new LinkedList<String>(); new ContinuousEvent() { int frame = 0; Runnable runner; boolean[] keepRunning = new boolean[1]; @Override public void onStart() { keepRunning[0] = true; runner = new Runnable() { int runCount = 0; @Override public void run() { runCount++; if (runCount >= 1 && runCount <= 3) { messages.add("run" + runCount); } keepRunning[0] = true; } }; } @Override public void onUpdate() { frame++; if (frame == 5) { TrydentEngine.runContinuously(runner); } else if (frame == 10) { keepRunning[0] = false; if (!TrydentEngine.stopRunnable(runner)) { throw new TrydentInternalException("Not able to stop the runner!"); } } else if (frame > 10) { if (!keepRunning[0]) { TrydentEngine.quit(); } keepRunning[0] = false; } } @Override public void onStop() { } }; TrydentEngine.start(); try { TrydentEngine.waitUntilEngineStops(); } catch (Exception ex) { ex.printStackTrace(); } String text = messages.toString(); String expected = "[run1, run2, run3]"; assertTrue("Expected \"" + expected + "\", got \"" + text + "\"", text.equals(expected)); } }