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