package com.metservice.kanban.model; import static com.metservice.kanban.model.TreeNode.create; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsCollectionContaining.hasItem; import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class TreeNodeTest { @Test public void providesAccessToItsDataValue() { TreeNode<Integer> node = create(Integer.class, 17); assertThat(node.getValue(), is(17)); } @Test public void providesIndexedAccessToChildren() { TreeNode<String> child0 = create(String.class, "child 0"); TreeNode<String> child1 = create(String.class, "child 1"); TreeNode<String> parent = create(String.class, "parent", child0, child1); assertThat(parent.getChild(0), is(child0)); assertThat(parent.getChild(1), is(child1)); } @Test public void cannotModifyChildrenThroughArrayArgumentToConstructor() { TreeNode<String> originalChild = create(String.class, "child 0"); @SuppressWarnings("unchecked") TreeNode<String>[] children = new TreeNode[] {originalChild}; TreeNode<String> parent = create(String.class, "parent", children); children[0] = create(String.class, "new child"); assertThat(parent.getChild(0), is(originalChild)); } @Test(expected = ClassCastException.class) public void throwsExceptionIfChildrenAreWrongType() { TreeNode<Integer> integerChild = create(Integer.class, 1); create(String.class, "text", integerChild); } @Test public void knowsTheNumberOfChildren() { TreeNode<String> child0 = create(String.class, "child 0"); TreeNode<String> child1 = create(String.class, "child 1"); assertThat(create(String.class, "parent with no children").getNumberOfChildren(), is(0)); assertThat(create(String.class, "parent with one child", child0).getNumberOfChildren(), is(1)); assertThat(create(String.class, "parent with two children", child0, child1).getNumberOfChildren(), is(2)); } @Test public void useSameStringRepresentationAsItsValue() { assertThat(create(Integer.class, 17).toString(), is("17")); assertThat(create(Double.class, 11.0).toString(), is("11.0")); } @Test(expected = IllegalArgumentException.class) public void throwsExceptionIfValueIsNull() { create(Object.class, null); } @Test public void canBeConstructedWithACollection() { TreeNode<String> child0 = create(String.class, "child 0"); TreeNode<String> child1 = create(String.class, "child 1"); List<TreeNode<String>> children = new ArrayList<TreeNode<String>>(); children.add(child0); children.add(child1); TreeNode<String> parent = create(String.class, "parent", children); assertThat(parent.getChild(0), is(child0)); assertThat(parent.getChild(1), is(child1)); assertThat(parent.getNumberOfChildren(), is(2)); } @Test public void knowsWhetherItHasChildren() { TreeNode<String> child = create(String.class, "child"); TreeNode<String> parent = create(String.class, "parent", child); assertThat(parent.hasChildren(), is(true)); assertThat(child.hasChildren(), is(false)); } @Test public void canProduceAListOfItsChildren() { TreeNode<String> child = create(String.class, "child"); TreeNode<String> parent = create(String.class, "parent", child); assertThat(parent.getChildren(), hasItem(child)); } }