@Test
  public void testPagesForTestSystemAreSurroundedBySuiteSetupAndTeardown() throws Exception {
    WikiPage slimPage = addTestPage(suite, "AaSlimTest", simpleSlimDecisionTable);
    WikiPage setUp = crawler.addPage(root, PathParser.parse("SuiteSetUp"), "suite set up");
    WikiPage tearDown = crawler.addPage(root, PathParser.parse("SuiteTearDown"), "suite tear down");

    testPages = new LinkedList<WikiPage>();
    testPages.add(setUp);
    testPages.add(slimPage);
    testPages.add(testPage);
    testPages.add(tearDown);

    MultipleTestsRunner runner = new MultipleTestsRunner(testPages, context, suite, null);
    Map<TestSystem.Descriptor, LinkedList<TestPage>> map = runner.makeMapOfPagesByTestSystem();
    TestSystem.Descriptor fitDescriptor =
        TestSystem.getDescriptor(testPage.getData(), context.pageFactory, false);
    TestSystem.Descriptor slimDescriptor =
        TestSystem.getDescriptor(slimPage.getData(), context.pageFactory, false);

    List<TestPage> fitList = map.get(fitDescriptor);
    List<TestPage> slimList = map.get(slimDescriptor);

    assertEquals(3, fitList.size());
    assertEquals(3, slimList.size());

    assertEquals(setUp, fitList.get(0).getSourcePage());
    assertEquals(testPage, fitList.get(1).getSourcePage());
    assertEquals(tearDown, fitList.get(2).getSourcePage());

    assertEquals(setUp, slimList.get(0).getSourcePage());
    assertEquals(slimPage, slimList.get(1).getSourcePage());
    assertEquals(tearDown, slimList.get(2).getSourcePage());
  }
  @Test
  public void testBuildClassPath() throws Exception {
    MultipleTestsRunner runner = new MultipleTestsRunner(testPages, context, suite, null);

    String classpath = runner.buildClassPath();
    assertSubString("classes", classpath);
    assertSubString("dummy.jar", classpath);
  }
  @Test
  public void announceTotalTestsToRunShouldStartTotalTimeMeasurement() throws Exception {
    List<WikiPage> testPagesToRun = mock(List.class);
    WikiPage page = mock(WikiPage.class);
    FitNesseContext fitNesseContext = mock(FitNesseContext.class);
    ResultsListener resultsListener = mock(ResultsListener.class);
    MultipleTestsRunner runner =
        new MultipleTestsRunner(testPagesToRun, fitNesseContext, page, resultsListener);

    runner.announceTotalTestsToRun(new PagesByTestSystem());
    verify(resultsListener).announceNumberTestsToRun(0);
    assertThat(runner.totalTestTime, isAStartedTimeMeasurement());
  }
  @Test
  public void startingNewTestShouldStartTimeMeasurementAndNotifyListener() throws Exception {
    List<WikiPage> testPagesToRun = mock(List.class);
    TestPage page = new TestPage(mock(WikiPage.class));
    FitNesseContext fitNesseContext = mock(FitNesseContext.class);
    ResultsListener resultsListener = mock(ResultsListener.class);

    MultipleTestsRunner runner =
        new MultipleTestsRunner(
            testPagesToRun, fitNesseContext, page.getSourcePage(), resultsListener);

    runner.startingNewTest(page);
    verify(resultsListener).newTestStarted(same(page), same(runner.currentTestTime));
    assertThat(runner.currentTestTime, isAStartedTimeMeasurement());
  }
  private void handleSuitePage(Socket socket, WikiPage page, WikiPage root)
      throws IOException, InterruptedException, ParserException {
    FitClient client = startClient(socket);
    SuiteFilter filter = new SuiteFilter(suiteFilter, null, null);
    SuiteContentsFinder suiteTestFinder = new SuiteContentsFinder(page, filter, root);
    List<WikiPage> testPages = suiteTestFinder.makePageList();

    if (shouldIncludePaths) {
      MultipleTestsRunner runner = new MultipleTestsRunner(testPages, context, page, null);
      String classpath = runner.buildClassPath();
      client.send(classpath);
    }

    for (WikiPage testPage : testPages) {
      PageData testPageData = testPage.getData();
      sendPage(testPageData, client, false);
    }
    closeClient(client);
  }
  @Test
  public void testGenerateSuiteMapWithMultipleTestSystems() throws Exception {
    WikiPage slimPage = addTestPage(suite, "SlimTest", simpleSlimDecisionTable);

    MultipleTestsRunner runner = new MultipleTestsRunner(testPages, context, suite, null);
    Map<TestSystem.Descriptor, LinkedList<TestPage>> map = runner.makeMapOfPagesByTestSystem();

    TestSystem.Descriptor fitDescriptor =
        TestSystem.getDescriptor(testPage.getData(), context.pageFactory, false);
    TestSystem.Descriptor slimDescriptor =
        TestSystem.getDescriptor(slimPage.getData(), context.pageFactory, false);
    List<TestPage> fitList = map.get(fitDescriptor);
    List<TestPage> slimList = map.get(slimDescriptor);

    assertEquals(1, fitList.size());
    assertEquals(1, slimList.size());
    assertEquals(testPage, fitList.get(0).getSourcePage());
    assertEquals(slimPage, slimList.get(0).getSourcePage());
  }
  @Test
  public void testCompleteShouldRemoveHeadOfQueueAndNotifyListener() throws Exception {
    List<WikiPage> testPagesToRun = mock(List.class);
    TestPage page = new TestPage(mock(WikiPage.class));
    FitNesseContext fitNesseContext = mock(FitNesseContext.class);
    ResultsListener resultsListener = mock(ResultsListener.class);

    MultipleTestsRunner runner =
        new MultipleTestsRunner(
            testPagesToRun, fitNesseContext, page.getSourcePage(), resultsListener);
    runner.addToProcessingQueue(page);

    TestSummary testSummary = mock(TestSummary.class);

    runner.startingNewTest(page);
    runner.testComplete(testSummary);
    verify(resultsListener)
        .testComplete(same(page), same(testSummary), same(runner.currentTestTime));
    assertThat(runner.currentTestTime, isAStoppedTimeMeasurement());
  }