package fitnesse.testrunner; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import fitnesse.testsystems.TestPage; import fitnesse.wiki.WikiPage; /** * Organize pages by test system in an appropriate order. */ public class PagesByTestSystem { private final WikiPage root; private final Map<WikiPageIdentity, List<TestPage>> pagesByTestSystem; public PagesByTestSystem(List<WikiPage> pages, WikiPage root) { this.root = root; this.pagesByTestSystem = addSuiteSetUpAndTearDownToAllTestSystems(mapWithAllPagesButSuiteSetUpAndTearDown(pages)); } private Map<WikiPageIdentity, List<WikiPage>> mapWithAllPagesButSuiteSetUpAndTearDown(List<WikiPage> pages) { Map<WikiPageIdentity, List<WikiPage>> pagesByTestSystem = new HashMap<>(2); for (WikiPage wikiPage : pages) { if (!WikiTestPage.isSuiteSetupOrTearDown(wikiPage)) { WikiPageIdentity identity = new WikiPageIdentity(wikiPage); getOrMakeListWithinMap(pagesByTestSystem, identity).add(wikiPage); } } return pagesByTestSystem; } private List<WikiPage> getOrMakeListWithinMap(Map<WikiPageIdentity, List<WikiPage>> pagesByTestSystem, WikiPageIdentity descriptor) { List<WikiPage> pagesForTestSystem; if (!pagesByTestSystem.containsKey(descriptor)) { pagesForTestSystem = new LinkedList<>(); pagesByTestSystem.put(descriptor, pagesForTestSystem); } else { pagesForTestSystem = pagesByTestSystem.get(descriptor); } return pagesForTestSystem; } private Map<WikiPageIdentity, List<TestPage>> addSuiteSetUpAndTearDownToAllTestSystems(Map<WikiPageIdentity, List<WikiPage>> pagesByTestSystem) { Map<WikiPageIdentity, List<TestPage>> orderedPagesByTestSystem = new HashMap<>(pagesByTestSystem.size()); if (!pagesByTestSystem.isEmpty()) { PageListSetUpTearDownSurrounder surrounder = new PageListSetUpTearDownSurrounder(root); for (Map.Entry<WikiPageIdentity, List<WikiPage>> pages : pagesByTestSystem.entrySet()) orderedPagesByTestSystem.put(pages.getKey(), asTestPages(surrounder.surroundGroupsOfTestPagesWithRespectiveSetUpAndTearDowns(pages.getValue()))); } return orderedPagesByTestSystem; } private List<TestPage> asTestPages(List<WikiPage> wikiPages) { List<TestPage> testPages = new ArrayList<>(wikiPages.size()); for (WikiPage page : wikiPages) { // TODO: find the appropriate type of test page for this test system testPages.add(new WikiTestPage(page)); } return testPages; } public int totalTestsToRun() { int tests = 0; for (List<TestPage> listOfPagesToRun : pagesByTestSystem.values()) { tests += listOfPagesToRun.size(); } return tests; } public Collection<WikiPageIdentity> identities() { return pagesByTestSystem.keySet(); } public List<TestPage> testPagesForIdentity(WikiPageIdentity identity) { return Collections.unmodifiableList(pagesByTestSystem.get(identity)); } }