// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.testrunner;
import java.io.Closeable;
import java.io.IOException;
import fitnesse.FitNesseContext;
import fitnesse.testsystems.*;
import fitnesse.testutil.FitNesseUtil;
import fitnesse.wiki.PageData;
import fitnesse.wiki.PathParser;
import fitnesse.wiki.WikiPage;
import fitnesse.wiki.WikiPageUtil;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentMatcher;
import static java.util.Arrays.asList;
import static org.mockito.Mockito.*;
public class MultipleTestsRunnerTest {
private WikiPage suite;
private FitNesseContext context;
private TestSystemFactory testSystemFactory;
@Before
public void setUp() throws Exception {
testSystemFactory = mock(TestSystemFactory.class);
TestSystem testSystem = mock(TestSystem.class);
when(testSystemFactory.create(any(Descriptor.class))).thenReturn(testSystem);
context = FitNesseUtil.makeTestContext();
suite = WikiPageUtil.addPage(context.getRootPage(), PathParser.parse("SuitePage"), "This is the test suite\n");
}
@Test
public void shouldExecuteTestPagesGroupedByTestSystem() throws TestExecutionException, IOException {
WikiPage testPage1 = addTestPage(suite, "TestPage1", "!define TEST_SYSTEM {A}");
WikiPage testPage2 = addTestPage(suite, "TestPage2", "!define TEST_SYSTEM {B}");
PagesByTestSystem pagesByTestSystem = new PagesByTestSystem(asList(testPage1, testPage2), context.getRootPage());
MultipleTestsRunner runner = new MultipleTestsRunner(pagesByTestSystem, testSystemFactory);
runner.executeTestPages();
verify(testSystemFactory).create(forTestSystem("B"));
verify(testSystemFactory).create(forTestSystem("A"));
}
@Test
public void shouldCallCloseOnClosableTestSystemListener() throws TestExecutionException, IOException {
WikiPage testPage = addTestPage(suite, "TestPage1", "!define TEST_SYSTEM {A}");
ClosableTestSystemListener listener = mock(ClosableTestSystemListener.class);
PagesByTestSystem pagesByTestSystem = new PagesByTestSystem(asList(testPage), context.getRootPage());
MultipleTestsRunner runner = new MultipleTestsRunner(pagesByTestSystem, testSystemFactory);
runner.addTestSystemListener(listener);
runner.executeTestPages();
verify(listener).close();
}
private WikiPage addTestPage(WikiPage page, String name, String content) {
WikiPage testPage = WikiPageUtil.addPage(page, PathParser.parse(name), content);
PageData data = testPage.getData();
data.setAttribute("Test");
testPage.commit(data);
return testPage;
}
private Descriptor forTestSystem(String type) {
return argThat(new ForTestSystem(type));
}
class ForTestSystem extends ArgumentMatcher<Descriptor> {
private final String testSystemType;
public ForTestSystem(String testSystemType) {
this.testSystemType = testSystemType;
}
@Override
public boolean matches(Object descriptor) {
return testSystemType.equals(((Descriptor) descriptor).getTestSystemType());
}
}
static interface ClosableTestSystemListener extends TestSystemListener, Closeable {
}
}