public void testStatsCalculation() { PerformanceTracker tracker = new PerformanceTracker(emptyScript, TracerMode.ALL, null); CodeChangeHandler handler = tracker.getCodeChangeHandler(); // It's sufficient for this test to assume that a single run of any pass // takes some fixed amount of time, say 5ms. int passRuntime = 5; tracker.recordPassStart("noloopA", true); handler.reportChange(); tracker.recordPassStop("noloopA", passRuntime); tracker.recordPassStart("noloopB", true); handler.reportChange(); tracker.recordPassStop("noloopB", passRuntime); tracker.recordPassStart("loopA", false); handler.reportChange(); tracker.recordPassStop("loopA", passRuntime); tracker.recordPassStart("loopA", false); tracker.recordPassStop("loopA", passRuntime); tracker.recordPassStart("noloopB", true); handler.reportChange(); tracker.recordPassStop("noloopB", passRuntime); tracker.recordPassStart("loopB", false); tracker.recordPassStop("loopB", passRuntime); tracker.recordPassStart("noloopB", true); tracker.recordPassStop("noloopB", passRuntime); int numRuns = tracker.getRuns(); assertEquals(numRuns, 7); assertEquals(tracker.getRuntime(), numRuns * passRuntime); assertEquals(tracker.getLoopRuns(), 3); assertEquals(tracker.getChanges(), 4); /* reportChange was called 4 times */ assertEquals(tracker.getLoopChanges(), 1); ImmutableMap<String, Stats> stats = tracker.getStats(); Stats st = stats.get("noloopA"); assertEquals(st.runs, 1); assertEquals(st.runtime, passRuntime); assertEquals(st.changes, 1); st = stats.get("noloopB"); assertEquals(st.runs, 3); assertEquals(st.runtime, 3 * passRuntime); assertEquals(st.changes, 2); st = stats.get("loopA"); assertEquals(st.runs, 2); assertEquals(st.runtime, 2 * passRuntime); assertEquals(st.changes, 1); st = stats.get("loopB"); assertEquals(st.runs, 1); assertEquals(st.runtime, passRuntime); assertEquals(st.changes, 0); }