// 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.wiki;
import java.util.HashSet;
import java.util.Set;
import java.util.List;
import fitnesse.components.TraversalListener;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class PageCrawlerTest implements TraversalListener<WikiPage> {
private WikiPage root;
private WikiPage page1;
private WikiPage page2;
private WikiPage child1;
private WikiPage child2;
private WikiPage grandChild1;
private PageCrawlerImpl crawler;
private WikiPagePath page1Path;
private WikiPagePath child1FullPath;
private WikiPagePath page2Path;
private WikiPagePath grandChild1FullPath;
@Before
public void setUp() throws Exception {
root = InMemoryPage.makeRoot("RooT");
crawler = new PageCrawlerImpl();
page1Path = PathParser.parse("PageOne");
page2Path = PathParser.parse("PageTwo");
child1FullPath = PathParser.parse("PageOne.ChildOne");
grandChild1FullPath = PathParser.parse("PageOne.ChildOne.GrandChildOne");
page1 = crawler.addPage(root, page1Path);
page2 = crawler.addPage(root, page2Path);
child1 = crawler.addPage(page1, PathParser.parse("ChildOne"));
child2 = crawler.addPage(page1, PathParser.parse("ChildTwo"));
grandChild1 = crawler.addPage(child1, PathParser.parse("GrandChildOne"));
}
@Test
public void testPageExists() throws Exception {
assertTrue(crawler.pageExists(page1, PathParser.parse("ChildOne")));
assertFalse(crawler.pageExists(page1, PathParser.parse("BlahBlah")));
}
@Test
public void testPageExistsUsingPath() throws Exception {
assertTrue(crawler.pageExists(page1, PathParser.parse("ChildOne")));
assertTrue(crawler.pageExists(root, child1FullPath));
assertTrue(crawler.pageExists(root, grandChild1FullPath));
assertTrue(crawler.pageExists(root, PathParser.parse(".PageOne")));
assertTrue(crawler.pageExists(root, PathParser.parse(".PageOne.ChildOne.GrandChildOne")));
assertFalse(crawler.pageExists(page1, PathParser.parse("BlahBlah")));
assertFalse(crawler.pageExists(page1, PathParser.parse("PageOne.BlahBlah")));
}
@Test
public void testGetPage() throws Exception {
assertEquals(null, crawler.getPage(page1, page1Path));
assertEquals(page1, crawler.getPage(root, page1Path));
assertEquals(page2, crawler.getPage(root, page2Path));
assertEquals(page1, crawler.getPage(page1, PathParser.parse(".PageOne")));
assertEquals(page1, crawler.getPage(grandChild1, PathParser.parse(".PageOne")));
assertEquals(grandChild1, crawler.getPage(page1, PathParser.parse("ChildOne.GrandChildOne")));
assertEquals(root, crawler.getPage(root, PathParser.parse("root")));
assertEquals(root, crawler.getPage(root, PathParser.parse(".")));
assertEquals(root, crawler.getPage(root, PathParser.parse("")));
}
@Test
public void testGetSiblingPage() throws Exception {
assertEquals(page2, crawler.getSiblingPage(page1, page2Path));
assertEquals(child1, crawler.getSiblingPage(page1, PathParser.parse(">ChildOne")));
assertEquals(child2, crawler.getSiblingPage(grandChild1, PathParser.parse("<PageOne.ChildTwo")));
}
@Test
public void testGetFullPath() throws Exception {
assertEquals(page1Path, crawler.getFullPath(page1));
assertEquals(page2Path, crawler.getFullPath(page2));
assertEquals(child1FullPath, crawler.getFullPath(child1));
assertEquals(grandChild1FullPath, crawler.getFullPath(grandChild1));
assertEquals(PathParser.parse(""), crawler.getFullPath(root));
}
@Test
public void testGetAbsolutePathForChild() throws Exception {
WikiPagePath somePagePath = PathParser.parse("SomePage");
WikiPagePath somePageFullPath = crawler.getFullPathOfChild(root, somePagePath);
assertEquals("SomePage", PathParser.render(somePageFullPath));
WikiPagePath pageOnePath = page1Path;
WikiPagePath pageOneFullPath = crawler.getFullPathOfChild(root, pageOnePath);
assertEquals("PageOne", PathParser.render(pageOneFullPath));
WikiPagePath SomePageChildFullPath = crawler.getFullPathOfChild(child1, somePagePath);
assertEquals("PageOne.ChildOne.SomePage", PathParser.render(SomePageChildFullPath));
WikiPagePath otherPagePath = PathParser.parse("SomePage.OtherPage");
WikiPagePath otherPageFullPath = crawler.getFullPathOfChild(root, otherPagePath);
assertEquals("SomePage.OtherPage", PathParser.render(otherPageFullPath));
WikiPagePath somePageAbsolutePath = PathParser.parse(".SomePage");
WikiPagePath somePageAbsoluteFullPath = crawler.getFullPathOfChild(child1, somePageAbsolutePath);
assertEquals("SomePage", PathParser.render(somePageAbsoluteFullPath));
}
@Test
public void testAddPage() throws Exception {
WikiPage page = crawler.addPage(page1, PathParser.parse("SomePage"));
assertEquals(PathParser.parse("PageOne.SomePage"), crawler.getFullPath(page));
assertEquals(page1, page.getParent());
}
@Test
public void testRecursiveAddbyName() throws Exception {
crawler.addPage(root, PathParser.parse("AaAa"), "its content");
assertTrue(root.hasChildPage("AaAa"));
crawler.addPage(root, PathParser.parse("AaAa.BbBb"), "floop");
assertTrue(crawler.pageExists(root, PathParser.parse("AaAa.BbBb")));
assertEquals("floop", crawler.getPage(root, PathParser.parse("AaAa.BbBb")).getData().getContent());
}
@Test
public void testAddChildPageWithMissingParent() throws Exception {
WikiPage page = crawler.addPage(root, PathParser.parse("WikiMail.BadSubject0123"), "");
assertNotNull(page);
assertEquals("BadSubject0123", page.getName());
assertEquals(PathParser.parse("WikiMail.BadSubject0123"), crawler.getFullPath(page));
}
@Test
public void testGetRelativePageName() throws Exception {
assertEquals("PageOne", crawler.getRelativeName(root, page1));
assertEquals("PageOne.ChildOne", crawler.getRelativeName(root, child1));
assertEquals("ChildOne", crawler.getRelativeName(page1, child1));
assertEquals("GrandChildOne", crawler.getRelativeName(child1, grandChild1));
assertEquals("ChildOne.GrandChildOne", crawler.getRelativeName(page1, grandChild1));
}
@Test
public void testIsRoot() throws Exception {
assertTrue(crawler.isRoot(root));
WikiPage page = crawler.addPage(root, page1Path);
assertFalse(crawler.isRoot(page));
}
Set<String> traversedPages = new HashSet<String>();
@Test
public void testTraversal() throws Exception {
crawler.traverse(root, this);
assertEquals(6, traversedPages.size());
assertTrue(traversedPages.contains("PageOne"));
assertTrue(traversedPages.contains("ChildOne"));
}
public void process(WikiPage page) {
traversedPages.add(page.getName());
}
@Test
public void testdoesntTraverseSymbolicPages() throws Exception {
PageData data = page1.getData();
data.getProperties().set(SymbolicPage.PROPERTY_NAME).set("SymLink", "PageTwo");
page1.commit(data);
crawler.traverse(root, this);
assertEquals(6, traversedPages.size());
assertFalse(traversedPages.contains("SymLink"));
}
@Test
public void canFindAllUncles() throws Exception {
WikiPage grandUnclePage = crawler.addPage(root, PathParser.parse("UnclePage"));
WikiPage unclePage = crawler.addPage(root, PathParser.parse("PageOne.UnclePage"));
WikiPage brotherPage = crawler.addPage(root, PathParser.parse("PageOne.ChildOne.UnclePage"));
List<WikiPage> uncles = PageCrawlerImpl.getAllUncles("UnclePage",grandChild1);
assertTrue(uncles.contains(grandUnclePage));
assertTrue(uncles.contains(unclePage));
assertTrue(uncles.contains(brotherPage));
}
}