/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.gatein.api.navigation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.gatein.api.AbstractApiTest;
import org.gatein.api.EntityAlreadyExistsException;
import org.gatein.api.common.Attributes;
import org.gatein.api.navigation.Visibility.Status;
import org.gatein.api.page.PageId;
import org.junit.Before;
import org.junit.Test;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class ApiNodeTest extends AbstractApiTest {
private Navigation navigation;
private Node root;
@Test
public void addChild() {
root.addChild("child");
}
@Test
public void addChild_ChildToNewChild() {
root.addChild("child").addChild("child");
}
@Test(expected = EntityAlreadyExistsException.class)
public void addChild_Existing() {
root.addChild("child");
root.addChild("child");
}
@Test(expected = IndexOutOfBoundsException.class)
public void addChild_IndexOutOfBoundsException() {
root.addChild(1, "0");
}
@Test(expected = IllegalStateException.class)
public void addChild_NotLoaded() {
getRoot(false).addChild("child");
}
@Test(expected = IllegalArgumentException.class)
public void addChild_NullName() {
root.addChild(null);
}
@Before
public void before() throws Exception {
super.before();
createSite(defaultSiteId);
navigation = portal.getNavigation(defaultSiteId);
root = getRoot(true);
}
@Test(expected = IllegalStateException.class)
public void getChild_NotLoaded() {
getRoot(false).getChild("0");
}
@Test(expected = IllegalArgumentException.class)
public void getChild_NullName() {
root.getChild(null);
}
@Test(expected = IllegalStateException.class)
public void getChildCount_NotLoaded() {
getRoot(false).getChildCount();
}
@Test
public void getDescendant() {
root.addChild("child0").addChild("child0-0");
root.addChild("child1");
assertTrue(root.getNode(NodePath.root()).isRoot());
assertEquals("child0", root.getNode(NodePath.path("child0")).getName());
assertEquals("child0-0", root.getNode(NodePath.path("child0", "child0-0")).getName());
assertNull(root.getNode(NodePath.path("child1", "child0-0")));
}
@Test(expected = IllegalStateException.class)
public void getNode_NotLoaded() {
getRoot(false).getNode(NodePath.path("0"));
}
@Test
public void getNodePath() {
root.addChild("child0").addChild("child0-0");
assertEquals("/child0", root.getChild("child0").getNodePath().toString());
assertEquals("/child0/child0-0", root.getChild("child0").getChild("child0-0").getNodePath().toString());
}
@Test
public void getURI() {
root.addChild("child0").addChild("child0-0");
assertEquals("/portal/classic", root.getURI());
assertEquals("/portal/classic/child0", root.getChild("child0").getURI());
assertEquals("/portal/classic/child0/child0-0", root.getChild("child0").getChild("child0-0").getURI());
}
@Test(expected = IllegalStateException.class)
public void hasChild_NotLoaded() {
getRoot(false).hasChild("0");
}
@Test
public void iconName() {
Node c = root.addChild("child");
assertNull(c.getIconName());
c.setIconName("iconName");
assertEquals("iconName", c.getIconName());
}
@Test(expected = IllegalStateException.class)
public void indexOf_NotLoaded() {
getRoot(false).indexOf("0");
}
@Test
public void isRoot() {
assertTrue(root.isRoot());
assertFalse(root.addChild("child").isRoot());
}
@Test
public void iterator() {
root.addChild("child0");
root.addChild("child1");
root.addChild("child2");
assertIterator(root.iterator(), "child0", "child1", "child2");
}
@Test(expected = NoSuchElementException.class)
public void iterator_NoSuchElement() {
root.iterator().next();
}
@Test
public void iterator_Remove() {
root.addChild("child0");
root.addChild("child1");
root.addChild("child2");
Iterator<Node> itr = root.iterator();
itr.next();
itr.next();
itr.remove();
assertIterator(root.iterator(), "child0", "child2");
}
@Test(expected = IllegalStateException.class)
public void iterator_RemoveIllegalState() {
root.iterator().remove();
}
@Test
public void moveTo() {
root.addChild("0");
root.addChild("1");
root.addChild("2");
root.getChild(0).moveTo(2);
assertIterator(root.iterator(), "1", "2", "0");
root.getChild(2).moveTo(0);
assertIterator(root.iterator(), "0", "1", "2");
root.getChild(0).moveTo(1);
assertIterator(root.iterator(), "1", "0", "2");
root.getChild(1).moveTo(0);
assertIterator(root.iterator(), "0", "1", "2");
root.getChild(1).moveTo(2);
assertIterator(root.iterator(), "0", "2", "1");
root.getChild(1).moveTo(0);
assertIterator(root.iterator(), "2", "0", "1");
}
@Test(expected = IllegalArgumentException.class)
public void moveTo_Child() {
Node parent0 = root.addChild("parent0");
Node child = parent0.addChild("0");
Node child2 = child.addChild("0-0");
child.moveTo(child2);
}
@Test(expected = IllegalArgumentException.class)
public void moveTo_DifferentBranch() {
Node parent0 = root.addChild("parent0");
Node child = parent0.addChild("0");
child.moveTo(getRoot(true));
}
@Test
public void moveTo_Parent() {
Node parent0 = root.addChild("parent0");
Node child = parent0.addChild("0");
Node parent1 = root.addChild("parent1");
child.moveTo(parent1);
assertEquals(0, parent0.getChildCount());
assertEquals(1, parent1.getChildCount());
}
@Test
public void moveTo_ParentAtIndex() {
Node parent0 = root.addChild("parent0");
Node child = parent0.addChild("1");
Node parent1 = root.addChild("parent1");
parent1.addChild("0");
parent1.addChild("2");
child.moveTo(1, parent1);
assertEquals(0, parent0.getChildCount());
assertEquals(3, parent1.getChildCount());
assertEquals("1", parent1.getChild(1).getName());
}
@Test
public void name() {
Node c = root.addChild("child");
assertEquals("child", c.getName());
}
@Test
public void pageId() {
Node c = root.addChild("child");
assertNull(c.getPageId());
c.setPageId(new PageId("classic", "page"));
assertEquals(new PageId("classic", "page"), c.getPageId());
}
@Test(expected = IllegalStateException.class)
public void removeChild_NotLoaded() {
getRoot(false).removeChild("0");
}
@Test
public void root_getName() {
assertNull(root.getName());
}
@Test
public void root_getNodePath() {
assertEquals("/", root.getNodePath().toString());
}
@Test
public void root_getParent() {
assertNull(root.getParent());
}
@Test
public void root_isRoot() {
assertTrue(root.isRoot());
}
@Test(expected = UnsupportedOperationException.class)
public void root_moveTo() {
root.moveTo(0);
}
@Test(expected = UnsupportedOperationException.class)
public void root_moveToParent() {
root.moveTo(getRoot(true));
}
@Test(expected = UnsupportedOperationException.class)
public void root_moveToParentIndex() {
root.moveTo(0, getRoot(true));
}
@Test(expected = UnsupportedOperationException.class)
public void root_setDisplayName() {
root.setDisplayName("label");
}
@Test(expected = UnsupportedOperationException.class)
public void root_setIconName() {
root.setIconName("iconName");
}
@Test(expected = UnsupportedOperationException.class)
public void root_setPageId() {
root.setPageId(new PageId("siteName", "pageName"));
}
@Test(expected = UnsupportedOperationException.class)
public void root_setVisibility() {
root.setVisibility(true);
}
@Test(expected = UnsupportedOperationException.class)
public void root_setVisibilityPublicationDate() {
root.setVisibility(PublicationDate.startingOn(new Date()));
}
@Test(expected = UnsupportedOperationException.class)
public void root_setVisibilityVisibility() {
root.setVisibility(new Visibility());
}
@Test
public void setIconName_NullIconName() {
root.addChild("0").setIconName(null);
}
@Test
public void setIconName_NullPageId() {
root.addChild("0").setPageId(null);
}
@Test(expected = IllegalArgumentException.class)
public void setName_NullName() {
root.addChild("0").setName(null);
}
@Test(expected = IllegalArgumentException.class)
public void setVisibility_NullPublicationDate() {
root.addChild("0").setVisibility((Visibility) null);
}
@Test(expected = IllegalArgumentException.class)
public void setVisibility_NullVisibility() {
root.addChild("0").setVisibility((Visibility) null);
}
@Test
public void sort() {
root.addChild("2");
root.addChild("1");
root.addChild("0");
root.sort(new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
return o1.getName().compareTo(o2.getName());
}
});
assertEquals(3, root.getChildCount());
assertEquals("0", root.getChild(0).getName());
assertEquals("1", root.getChild(1).getName());
assertEquals("2", root.getChild(2).getName());
}
@Test(expected = IllegalArgumentException.class)
public void sort_NullComparator() {
root.sort(null);
}
@Test
public void visibility() {
Node c = root.addChild("child");
assertVisibility(true, Status.VISIBLE, null, c);
c.setVisibility(false);
assertVisibility(false, Status.HIDDEN, null, c);
PublicationDate d = PublicationDate.between(new Date(), new Date(System.currentTimeMillis() + 60000));
c.setVisibility(d);
assertVisibility(true, Status.PUBLICATION, d, c);
c.setVisibility(new Visibility(Status.SYSTEM));
assertVisibility(false, Status.SYSTEM, null, c);
}
@Test
public void attributesNotNull() {
Node c = root.addChild("child");
assertNotNull(c.getAttributes());
assertEquals(0, c.getAttributes().size());
}
public Node getRoot(boolean expanded) {
return navigation.getRootNode(expanded ? Nodes.visitChildren() : Nodes.visitNone());
}
public static void assertIterator(Iterator<Node> itr, String... expected) {
for (String e : expected) {
assertTrue(itr.hasNext());
assertEquals(e, itr.next().getName());
}
assertFalse(itr.hasNext());
}
public static void assertVisibility(boolean expectedVisible, Status expectedFlag, PublicationDate expectedDate,
Node actualNode) {
assertEquals(expectedVisible, actualNode.isVisible());
assertEquals(expectedFlag, actualNode.getVisibility().getStatus());
assertEquals(expectedDate, actualNode.getVisibility().getPublicationDate());
}
}