package fitnesse.wiki.search;
import fitnesse.components.TraversalListener;
import fitnesse.wiki.*;
import fitnesse.wiki.fs.InMemoryPage;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.junit.Before;
import org.junit.Test;
import org.hamcrest.TypeSafeMatcher;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
public class RegularExpressionWikiPageFinderTest implements TraversalListener<WikiPage> {
private WikiPage root;
private WikiPage pageOne;
private WikiPage childPage;
private WikiPage virtualPage;
List<WikiPage> foundPages = new ArrayList<>();
private WikiPageFinder pageFinder;
@Override
public void process(WikiPage page) {
foundPages.add(page);
}
@Before
public void setUp() throws Exception {
root = InMemoryPage.makeRoot("RooT");
pageOne = WikiPageUtil.addPage(root, PathParser.parse("PageOne"), "has PageOne content");
childPage = WikiPageUtil.addPage(root, PathParser.parse("PageOne.PageOneChild"),
"PageChild is a child of PageOne");
virtualPage = WikiPageUtil.addPage(root, PathParser.parse("PageTwo"),
"PageTwo has a bit of content too\n^PageOneChild");
PageData data = virtualPage.getData();
virtualPage.commit(data);
foundPages.clear();
}
@Test
public void searcher() throws Exception {
pageFinder = pageFinder("has");
pageFinder.search(root);
assertThat(foundPages, found(pageOne, virtualPage));
}
@Test
public void searcherAgain() throws Exception {
pageFinder = pageFinder("a");
pageFinder.search(root);
assertThat(foundPages, found(pageOne, childPage, virtualPage));
}
@Test
public void dontSearchProxyPages() throws Exception {
pageFinder = pageFinder("a");
pageFinder.search(virtualPage);
assertEquals(1, foundPages.size());
}
@Test
public void observing() throws Exception {
pageFinder = pageFinder("has");
pageFinder.search(root);
assertEquals(2, foundPages.size());
}
@Test
public void pagesNotMatching() throws Exception {
pageFinder = pageFinder(notMatchingSearchText());
pageFinder.search(root);
assertThat(foundPages, isEmpty());
}
@Test
public void singlePageMatches() throws Exception {
pageFinder = pageFinder(matchTextForPageOne());
pageFinder.search(root);
assertThat(foundPages, found(pageOne));
}
@Test
public void multiplePageMatch() throws Exception {
pageFinder = pageFinder(matchAll());
pageFinder.search(root);
assertThat(foundPages, found(root, pageOne, childPage, virtualPage));
}
@Test
public void matchesSublevels() throws Exception {
pageFinder = pageFinder(matchAll());
pageFinder.search(pageOne);
assertThat(foundPages, found(pageOne, childPage));
}
private String matchAll() {
return ".*";
}
private String matchTextForPageOne() {
return "PageOne content";
}
private String notMatchingSearchText() {
return "this search text does not match any page";
}
private WikiPageFinder pageFinder(String searchText) {
return new RegularExpressionWikiPageFinder(searchText, this);
}
private Matcher<List<WikiPage>> found(final WikiPage... pages) {
return new TypeSafeMatcher<List<WikiPage>>() {
@Override
public boolean matchesSafely(List<WikiPage> foundPages) {
if (foundPages.size() != pages.length) return false;
for (WikiPage expectedPage: pages) {
if (!foundPages.contains(expectedPage)) return false;
}
return true;
}
@Override
public void describeTo(Description description) {
description.appendText("a list containing ").appendValue(pages);
}
};
}
private Matcher<List<WikiPage>> isEmpty() {
return new EmptyListMatcher();
}
private static class EmptyListMatcher extends TypeSafeMatcher<List<WikiPage>> {
@Override
public boolean matchesSafely(List<WikiPage> pages) {
return pages.isEmpty();
}
@Override
public void describeTo(Description description) {
description.appendText("an empty list");
}
}
}