// Copyright © 2011-2013, 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.results;
import fi.jumi.api.drivers.TestId;
import fi.jumi.core.api.*;
import org.junit.Test;
import static fi.jumi.core.results.SuiteProgressMeter.Status.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class SuiteProgressMeterTest {
private final SuiteProgressMeter progressMeter = new SuiteProgressMeter();
@Test
public void is_undetermined_until_all_test_files_have_been_found() {
progressMeter.onSuiteStarted();
assertThat("after suite started", progressMeter.getStatus(), is(INDETERMINATE));
assertThat("after suite started", progressMeter.getProgress(), is(0.0));
progressMeter.onAllTestFilesFound();
assertThat("after all files found", progressMeter.getStatus(), is(IN_PROGRESS));
}
@Test
public void is_finished_after_the_suite_finishes() {
progressMeter.onSuiteStarted();
progressMeter.onAllTestFilesFound();
assertThat("after all files found", progressMeter.getStatus(), is(IN_PROGRESS));
progressMeter.onSuiteFinished();
assertThat("after suite finished", progressMeter.getStatus(), is(COMPLETE));
}
@Test
public void empty_suite() {
progressMeter.onSuiteStarted();
progressMeter.onAllTestFilesFound();
assertThat("after all files found", progressMeter.getProgress(), is(1.0));
}
@Test
public void suite_with_one_test_file() {
progressMeter.onSuiteStarted();
progressMeter.onTestFileFound(testFile(1));
progressMeter.onAllTestFilesFound();
assertThat("after all files found", progressMeter.getProgress(), is(0.0));
progressMeter.onTestFileFinished(testFile(1));
assertThat("after file finished", progressMeter.getProgress(), is(1.0));
}
@Test
public void suite_with_many_test_files() {
progressMeter.onSuiteStarted();
progressMeter.onTestFileFound(testFile(1));
progressMeter.onTestFileFound(testFile(2));
progressMeter.onAllTestFilesFound();
assertThat("after all files found", progressMeter.getProgress(), is(0.0));
progressMeter.onTestFileFinished(testFile(1));
assertThat("after 1/2 files finished", progressMeter.getProgress(), is(0.5));
progressMeter.onTestFileFinished(testFile(2));
assertThat("after 2/2 files finished", progressMeter.getProgress(), is(1.0));
}
@Test
public void test_file_with_many_tests() {
TestFile file = testFile(1);
RunId runId = new RunId(1);
progressMeter.onSuiteStarted();
progressMeter.onTestFileFound(file);
progressMeter.onAllTestFilesFound();
progressMeter.onTestFound(file, TestId.ROOT, "foo");
progressMeter.onTestFound(file, TestId.of(0), "bar");
progressMeter.onRunStarted(runId, file);
progressMeter.onTestStarted(runId, TestId.ROOT);
assertThat("before any tests finished", progressMeter.getProgress(), is(0.0));
progressMeter.onTestStarted(runId, TestId.of(0));
progressMeter.onTestFinished(runId);
assertThat("after 1/2 tests finished", progressMeter.getProgress(), is(0.5));
progressMeter.onTestFinished(runId);
assertThat("after 2/2 tests finished", progressMeter.getProgress(), is(1.0));
}
@Test
public void test_which_is_run_multiple_times() {
TestFile file = testFile(1);
progressMeter.onSuiteStarted();
progressMeter.onTestFileFound(file);
progressMeter.onAllTestFilesFound();
progressMeter.onTestFound(file, TestId.ROOT, "foo");
runTest(file, TestId.ROOT);
assertThat("after first run", progressMeter.getProgress(), is(1.0));
runTest(file, TestId.ROOT);
assertThat("after repeat run", progressMeter.getProgress(), is(1.0));
}
@Test
public void multiple_tests_are_found_but_only_some_are_run() {
TestFile file = testFile(1);
progressMeter.onSuiteStarted();
progressMeter.onTestFileFound(file);
progressMeter.onAllTestFilesFound();
progressMeter.onTestFound(file, TestId.ROOT, "foo");
progressMeter.onTestFound(file, TestId.of(0), "bar");
runTest(file, TestId.ROOT);
assertThat("after 1/2 tests finished", progressMeter.getProgress(), is(0.5));
progressMeter.onTestFileFinished(file);
assertThat("after test file finished (but only 1/2 tests finished)", progressMeter.getProgress(), is(1.0));
}
@Test
public void multiple_test_files_with_multiple_tests() {
TestFile file1 = testFile(1);
TestFile file2 = testFile(2);
progressMeter.onSuiteStarted();
progressMeter.onTestFileFound(file1);
progressMeter.onTestFileFound(file2);
progressMeter.onAllTestFilesFound();
progressMeter.onTestFound(file1, TestId.ROOT, "test 1.1");
progressMeter.onTestFound(file1, TestId.of(0), "test 1.2");
progressMeter.onTestFound(file2, TestId.ROOT, "test 2.1");
progressMeter.onTestFound(file2, TestId.of(0), "test 2.2");
progressMeter.onTestFound(file2, TestId.of(1), "test 2.3");
assertThat("before any tests finished", progressMeter.getProgress(), is(0.0));
runTest(file1, TestId.ROOT);
assertThat("after 1/2 + 0/3 tests finished", progressMeter.getProgress(), is(0.25));
runTest(file2, TestId.ROOT);
assertThat("after 1/2 + 1/3 tests finished", progressMeter.getProgress(), is(closeTo(0.416, 0.001)));
runTest(file2, TestId.of(0));
assertThat("after 1/2 + 2/3 tests finished", progressMeter.getProgress(), is(closeTo(0.583, 0.001)));
runTest(file2, TestId.of(1));
assertThat("after 1/2 + 3/3 tests finished", progressMeter.getProgress(), is(0.75));
runTest(file1, TestId.of(0));
assertThat("after 2/2 + 3/3 tests finished", progressMeter.getProgress(), is(1.0));
}
/**
* This can happen for example if the JVM crashes during a test run or there is some other severe problem.
*/
@Test
public void may_finish_before_reaching_100_percent() {
progressMeter.onSuiteStarted();
progressMeter.onTestFileFound(testFile(1));
progressMeter.onTestFileFound(testFile(2));
progressMeter.onAllTestFilesFound();
progressMeter.onTestFileFinished(testFile(1));
progressMeter.onSuiteFinished();
assertThat("progress", progressMeter.getProgress(), is(0.5));
assertThat("status", progressMeter.getStatus(), is(COMPLETE));
}
// helpers
private int nextRunId = 1;
private void runTest(TestFile testFile, TestId testId) {
RunId runId = uniqueRunId();
progressMeter.onRunStarted(runId, testFile);
progressMeter.onTestStarted(runId, testId);
progressMeter.onTestFinished(runId);
progressMeter.onRunFinished(runId);
}
private RunId uniqueRunId() {
return new RunId(nextRunId++);
}
private static TestFile testFile(int id) {
return TestFile.fromClassName("TestFile" + id);
}
}