package fitnesse.testrunner;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import fitnesse.wiki.PageData;
import fitnesse.wiki.PathParser;
import fitnesse.wiki.WikiPage;
import static java.util.Arrays.asList;
public class PageListSetUpTearDownSurrounder {
private final WikiPage root;
public PageListSetUpTearDownSurrounder(WikiPage root) {
this.root = root;
}
public List<WikiPage> surroundGroupsOfTestPagesWithRespectiveSetUpAndTearDowns(List<WikiPage> pageList) {
Map<String, List<WikiPage>> pageSetUpTearDownGroups = createPageSetUpTearDownGroups(pageList);
return reinsertPagesViaSetUpTearDownGroups(pageSetUpTearDownGroups);
}
private Map<String, List<WikiPage>> createPageSetUpTearDownGroups(List<WikiPage> pageList) {
Map<String, List<WikiPage>> pageSetUpTearDownGroups = new HashMap<>();
for (WikiPage page : pageList) {
makeSetUpTearDownPageGroupForPage(page, pageSetUpTearDownGroups);
}
return pageSetUpTearDownGroups;
}
private void makeSetUpTearDownPageGroupForPage(WikiPage page, Map<String, List<WikiPage>> pageSetUpTearDownGroups) {
String group = getSetUpTearDownGroup(page);
List<WikiPage> pageGroup;
if (pageSetUpTearDownGroups.get(group) != null) {
pageGroup = pageSetUpTearDownGroups.get(group);
pageGroup.add(page);
} else {
pageGroup = new LinkedList<>();
pageGroup.add(page);
pageSetUpTearDownGroups.put(group, pageGroup);
}
}
private String getSetUpTearDownGroup(WikiPage page) {
String setUpPath = getPathForSetUpTearDown(page, PageData.SUITE_SETUP_NAME);
String tearDownPath = getPathForSetUpTearDown(page, PageData.SUITE_TEARDOWN_NAME);
return setUpPath + "," + tearDownPath;
}
private String getPathForSetUpTearDown(WikiPage page, String setUpTearDownName) {
String path = null;
WikiPage suiteSetUpTearDown = page.getPageCrawler().getClosestInheritedPage(setUpTearDownName);
if (suiteSetUpTearDown != null)
path = suiteSetUpTearDown.getPageCrawler().getFullPath().toString();
return path;
}
private List<WikiPage> reinsertPagesViaSetUpTearDownGroups(Map<String, List<WikiPage>> pageSetUpTearDownGroups) {
List<WikiPage> pageList = new LinkedList<>();
for (Map.Entry<String, List<WikiPage>> entry : pageSetUpTearDownGroups.entrySet()) {
pageList.addAll(insertSetUpTearDownPageGroup(entry.getKey(), entry.getValue()));
}
return pageList;
}
private List<WikiPage> insertSetUpTearDownPageGroup(String setUpAndTearDownGroupKey, List<WikiPage> pageGroup) {
List<WikiPage> pageList = new LinkedList<>();
pageList.addAll(setUpForThisGroup(setUpAndTearDownGroupKey));
pageList.addAll(pageGroup);
pageList.addAll(tearDownForThisGroup(setUpAndTearDownGroupKey));
return pageList;
}
private List<WikiPage> setUpForThisGroup(String setUpAndTearDown) {
String setUpPath = setUpAndTearDown.split(",")[0];
WikiPage setUpPage = root.getPageCrawler().getPage(PathParser.parse(setUpPath));
return setUpPage != null ? asList(setUpPage) : Collections.<WikiPage>emptyList();
}
private List<WikiPage> tearDownForThisGroup(String setUpAndTearDownGroupKey) {
String tearDownPath = setUpAndTearDownGroupKey.split(",")[1];
WikiPage tearDownPage = root.getPageCrawler().getPage(PathParser.parse(tearDownPath));
return tearDownPage != null ? asList(tearDownPage) : Collections.<WikiPage>emptyList();
}
}