// Copyright © 2011-2014, Esko Luontola <www.orfjackal.net> // This software is released under the Apache License 2.0. // The license text is at http://www.apache.org/licenses/LICENSE-2.0 package fi.jumi.core.runs; import fi.jumi.api.drivers.TestId; import fi.jumi.core.api.*; import org.junit.*; import org.junit.rules.ExpectedException; import java.lang.reflect.Method; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.mockito.Mockito.*; public class RunEventNormalizerTest { private final SuiteListenerSpy spy = new SuiteListenerSpy(); private final SuiteListener target = spy(spy); private static final String INFORMATION_ABOUT_THE_CURRENT_CONTEXT = "Incorrect notifier API usage in com.example.DummyTest: "; private final TestFile testFile = TestFile.fromClassName("com.example.DummyTest"); private final RunEventNormalizer normalizer = new RunEventNormalizer(target, testFile); @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void forwards_all_events() { normalizer.onTestFound(TestId.ROOT, "test name"); normalizer.onPrintedOut(new RunId(7), "stdout"); normalizer.onPrintedErr(new RunId(8), "stderr"); normalizer.onFailure(new RunId(9), TestId.of(1), new Exception("dummy exception")); normalizer.onTestStarted(new RunId(10), TestId.ROOT); normalizer.onTestFinished(new RunId(11), TestId.of(3)); normalizer.onRunStarted(new RunId(20)); normalizer.onRunFinished(new RunId(21)); normalizer.onInternalError("the message", new Exception("dummy exception")); verify(target).onTestFound(testFile, TestId.ROOT, "test name"); verify(target).onPrintedOut(new RunId(7), "stdout"); verify(target).onPrintedErr(new RunId(8), "stderr"); verify(target).onFailure(eq(new RunId(9)), notNull(StackTrace.class)); verify(target).onTestStarted(new RunId(10), TestId.ROOT); verify(target).onTestFinished(new RunId(11)); verify(target).onRunStarted(new RunId(20), testFile); verify(target).onRunFinished(new RunId(21)); verify(target).onInternalError(eq("the message"), notNull(StackTrace.class)); verifyNoMoreInteractions(target); for (Method sourceMethod : RunListener.class.getMethods()) { Method targetMethod = getMethod(sourceMethod.getName(), SuiteListener.class); assertThat("this test failed to check all event types", spy.methodInvocations.keySet(), hasItem(targetMethod)); } } @Test public void forwards_unique_onTestFound_events() { normalizer.onTestFound(TestId.ROOT, "root"); normalizer.onTestFound(TestId.of(1), "testOne"); verify(target).onTestFound(testFile, TestId.ROOT, "root"); verify(target).onTestFound(testFile, TestId.of(1), "testOne"); verifyNoMoreInteractions(target); } @Test public void removes_duplicate_onTestFound_events() { normalizer.onTestFound(TestId.ROOT, "root"); normalizer.onTestFound(TestId.ROOT, "root"); verify(target, times(1)).onTestFound(testFile, TestId.ROOT, "root"); verifyNoMoreInteractions(target); } @Test public void tests_must_be_found_always_with_the_same_name() { normalizer.onTestFound(TestId.ROOT, "first name"); thrown.expect(IllegalArgumentException.class); thrown.expectMessage(INFORMATION_ABOUT_THE_CURRENT_CONTEXT); thrown.expectMessage("test TestId() was already found with another name: first name"); normalizer.onTestFound(TestId.ROOT, "second name"); } @Test public void parents_must_be_found_before_their_children() { thrown.expect(IllegalStateException.class); thrown.expectMessage(INFORMATION_ABOUT_THE_CURRENT_CONTEXT); thrown.expectMessage("parent of TestId(0) must be found first"); normalizer.onTestFound(TestId.of(0), "child"); } @Test public void onTestFound_must_be_called_before_onTestStarted() { thrown.expect(IllegalStateException.class); thrown.expectMessage(INFORMATION_ABOUT_THE_CURRENT_CONTEXT); thrown.expectMessage("the test TestId() must be found first"); normalizer.onTestStarted(new RunId(1), TestId.ROOT); } // helpers private static Method getMethod(String name, Class<SuiteListener> type) { for (Method m : type.getMethods()) { if (m.getName().equals(name)) { return m; } } throw new IllegalArgumentException("No method named " + name + " in " + type); } }