package com.metservice.kanban.model; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.nullValue; import static org.junit.Assert.assertThat; import java.util.Iterator; import org.junit.Test; public class KanbanBoardBuilderTest { @Test public void concatenatesItemsOfTheSameType() { WorkItemType type = new WorkItemType("phase"); WorkItem workItem1 = new WorkItem(1, type, "phase"); WorkItem workItem2 = new WorkItem(2, type, "phase"); WorkItemTypeCollection workItemTypes = new WorkItemTypeCollection(TreeNode.create(WorkItemType.class, type)); DefaultWorkItemTree tree = new DefaultWorkItemTree(); tree.addWorkItems(workItem1, workItem2); KanbanBoardBuilder builder = new KanbanBoardBuilder( new KanbanBoardColumnList(new KanbanBoardColumn(type, "phase")), workItemTypes, tree); KanbanBoard board = builder.build(null, null); assertThat(board.getCell(0, 0).getWorkItem(), is(workItem1)); assertThat(board.getCell(1, 0).getWorkItem(), is(workItem2)); } @Test public void mergesItemsOfDifferentTypes() { WorkItemType parentType = new WorkItemType("parent type phase"); WorkItemType alphaType = new WorkItemType("alpha type phase"); WorkItemType betaType = new WorkItemType("beta type phase"); WorkItemTypeCollection workItemTypes = new WorkItemTypeCollection( TreeNode.create(WorkItemType.class, parentType, TreeNode.create(WorkItemType.class, alphaType), TreeNode.create(WorkItemType.class, betaType))); WorkItem workItem1 = new WorkItem(1, parentType, "parent type phase"); WorkItem workItem2 = new WorkItem(2, 1, alphaType, "alpha type phase"); WorkItem workItem3 = new WorkItem(3, 1, betaType, "beta type phase"); DefaultWorkItemTree tree = new DefaultWorkItemTree(); tree.addWorkItems(workItem1, workItem2, workItem3); KanbanBoardBuilder builder = new KanbanBoardBuilder( new KanbanBoardColumnList( new KanbanBoardColumn(parentType, "parent type phase"), new KanbanBoardColumn(alphaType, "alpha type phase"), new KanbanBoardColumn(betaType, "beta type phase")), workItemTypes, tree); KanbanBoard board = builder.build(null, null); assertThat(board.getCell(0, 0).getWorkItem(), is(workItem1)); assertThat(board.getCell(0, 1).getWorkItem(), is(workItem2)); assertThat(board.getCell(0, 2).getWorkItem(), is(workItem3)); } @Test public void packsBottomLevelOfWorkItems() { WorkItemType featureType = new WorkItemType("feature phase"); WorkItemType storyType = new WorkItemType("phase 1", "phase 2"); WorkItemTypeCollection workItemTypes = new WorkItemTypeCollection( TreeNode.create(WorkItemType.class, featureType, TreeNode.create(WorkItemType.class, storyType))); WorkItem feature = new WorkItem(1, featureType, "feature phase"); WorkItem story1 = new WorkItem(2, 1, storyType, "phase 1"); WorkItem story2 = new WorkItem(3, 1, storyType, "phase 2"); DefaultWorkItemTree tree = new DefaultWorkItemTree(); tree.addWorkItems(feature, story1, story2); KanbanBoardBuilder builder = new KanbanBoardBuilder( new KanbanBoardColumnList( new KanbanBoardColumn(featureType, "feature phase"), new KanbanBoardColumn(storyType, "phase 1"), new KanbanBoardColumn(storyType, "phase 2")), workItemTypes, tree); KanbanBoard board = builder.build(null, null); assertThat(board.getCell(0, 0).getWorkItem(), is(feature)); assertThat(board.getCell(0, 1).getWorkItem(), is(story1)); assertThat(board.getCell(0, 2).getWorkItem(), is(story2)); } @Test public void excludesPackedWorkItemsOutsideTheBoard() { WorkItemType featureType = new WorkItemType("feature phase"); WorkItemType storyType = new WorkItemType("off-board story phase"); WorkItemTypeCollection workItemTypes = new WorkItemTypeCollection( TreeNode.create(WorkItemType.class, featureType, TreeNode.create(WorkItemType.class, storyType))); WorkItem feature = new WorkItem(1, featureType, "feature phase"); WorkItem story = new WorkItem(2, 1, storyType, "off-board story phase"); DefaultWorkItemTree tree = new DefaultWorkItemTree(); tree.addWorkItems(feature, story); KanbanBoardBuilder builder = new KanbanBoardBuilder( new KanbanBoardColumnList( new KanbanBoardColumn(featureType, "feature phase")), workItemTypes, tree); KanbanBoard board = builder.build(null, null); Iterator<KanbanBoardRow> rowIterator = board.iterator(); KanbanBoardRow topRow = rowIterator.next(); Iterator<KanbanCell> topRowCellIterator = topRow.iterator(); KanbanCell firstCell = topRowCellIterator.next(); assertThat(firstCell.getWorkItem(), is(feature)); assertThat(rowIterator.hasNext(), is(false)); assertThat(topRowCellIterator.hasNext(), is(false)); } @Test public void excludesStackedWorkItemsOutsideTheBoard() { WorkItemType featureType = new WorkItemType("on-board", "off-board"); WorkItem feature1 = new WorkItem(1, featureType, "on-board"); WorkItem feature2 = new WorkItem(2, featureType, "off-board"); DefaultWorkItemTree tree = new DefaultWorkItemTree(); tree.addWorkItems(feature1, feature2); KanbanBoardBuilder builder = new KanbanBoardBuilder( new KanbanBoardColumnList( new KanbanBoardColumn(featureType, "on-board")), new WorkItemTypeCollection(TreeNode.create(WorkItemType.class, featureType)), tree); KanbanBoard board = builder.build(null, null); Iterator<KanbanBoardRow> rowIterator = board.iterator(); KanbanBoardRow topRow = rowIterator.next(); Iterator<KanbanCell> topRowCellIterator = topRow.iterator(); KanbanCell firstCell = topRowCellIterator.next(); assertThat(firstCell.getWorkItem(), is(feature1)); assertThat(rowIterator.hasNext(), is(false)); assertThat(topRowCellIterator.hasNext(), is(false)); } @Test public void setsWorkItemsAboveAndBelow() { WorkItemType featureType = new WorkItemType("phase"); WorkItem feature1 = new WorkItem(1, featureType, "phase"); WorkItem feature2 = new WorkItem(2, featureType, "phase"); WorkItem feature3 = new WorkItem(3, featureType, "phase"); DefaultWorkItemTree tree = new DefaultWorkItemTree(); tree.addWorkItems(feature1, feature2, feature3); KanbanBoardBuilder builder = new KanbanBoardBuilder( new KanbanBoardColumnList( new KanbanBoardColumn(featureType, "phase")), new WorkItemTypeCollection(TreeNode.create(WorkItemType.class, featureType)), tree); KanbanBoard board = builder.build(null, null); assertThat(board.getCell(0, 0).getWorkItemAbove(), nullValue()); assertThat(board.getCell(0, 0).getWorkItemBelow(), is(feature2)); assertThat(board.getCell(1, 0).getWorkItemAbove(), is(feature1)); assertThat(board.getCell(1, 0).getWorkItemBelow(), is(feature3)); assertThat(board.getCell(2, 0).getWorkItemAbove(), is(feature2)); assertThat(board.getCell(2, 0).getWorkItemBelow(), nullValue()); } @Test public void packedWorkItemsInDifferentPhasesAreNotAdjacent() { WorkItemType featureType = new WorkItemType("feature phase"); WorkItemType storyType = new WorkItemType("phase 1", "phase 2"); WorkItem feature = new WorkItem(1, featureType, "feature phase"); WorkItem story1 = new WorkItem(2, 1, storyType, "phase 1"); WorkItem story2 = new WorkItem(3, 1, storyType, "phase 1"); WorkItem story3 = new WorkItem(4, 1, storyType, "phase 2"); DefaultWorkItemTree tree = new DefaultWorkItemTree(); tree.addWorkItems(feature, story1, story2, story3); WorkItemTypeCollection workItemTypes = new WorkItemTypeCollection( TreeNode.create(WorkItemType.class, featureType, TreeNode.create(WorkItemType.class, storyType))); KanbanBoardBuilder builder = new KanbanBoardBuilder( new KanbanBoardColumnList( new KanbanBoardColumn(featureType, "feature phase"), new KanbanBoardColumn(storyType, "phase 1"), new KanbanBoardColumn(storyType, "phase 2")), workItemTypes, tree); KanbanBoard board = builder.build(null, null); assertThat(board.getCell(0, 1).getWorkItemAbove(), nullValue()); assertThat(board.getCell(0, 1).getWorkItemBelow(), is(story2)); assertThat(board.getCell(1, 1).getWorkItemAbove(), is(story1)); assertThat(board.getCell(1, 1).getWorkItemBelow(), nullValue()); assertThat(board.getCell(0, 2).getWorkItemAbove(), nullValue()); assertThat(board.getCell(0, 2).getWorkItemBelow(), nullValue()); } @Test public void stackedWorkItemsInDifferentPhasesAreAdjacent() { WorkItemType featureType = new WorkItemType("phase 1", "phase 2"); WorkItemType storyType = new WorkItemType(); WorkItemTypeCollection workItemTypes = new WorkItemTypeCollection(TreeNode.create(WorkItemType.class, featureType, TreeNode.create(WorkItemType.class, storyType))); WorkItem feature1 = new WorkItem(1, featureType, "phase 1"); WorkItem feature2 = new WorkItem(2, featureType, "phase 1"); WorkItem feature3 = new WorkItem(2, featureType, "phase 2"); DefaultWorkItemTree tree = new DefaultWorkItemTree(); tree.addWorkItems(feature1, feature2, feature3); KanbanBoardBuilder builder = new KanbanBoardBuilder( new KanbanBoardColumnList( new KanbanBoardColumn(featureType, "phase 1"), new KanbanBoardColumn(featureType, "phase 2")), workItemTypes, tree); KanbanBoard board = builder.build(null, null); assertThat(board.getCell(0, 0).getWorkItemAbove(), nullValue()); assertThat(board.getCell(0, 0).getWorkItemBelow(), is(feature2)); assertThat(board.getCell(1, 0).getWorkItemAbove(), is(feature1)); assertThat(board.getCell(1, 0).getWorkItemBelow(), is(feature3)); assertThat(board.getCell(2, 1).getWorkItemAbove(), is(feature2)); assertThat(board.getCell(2, 1).getWorkItemBelow(), nullValue()); } @Test public void onlyWorkItemsOnTheBoardCanBeBeforeOrAfter() { WorkItemType type = new WorkItemType("on-board", "off-board"); WorkItem workItem1 = new WorkItem(1, type, "on-board"); WorkItem workItem2 = new WorkItem(2, type, "off-board"); WorkItem workItem3 = new WorkItem(3, type, "on-board"); DefaultWorkItemTree tree = new DefaultWorkItemTree(); tree.addWorkItems(workItem1, workItem2, workItem3); KanbanBoardBuilder builder = new KanbanBoardBuilder( new KanbanBoardColumnList( new KanbanBoardColumn(type, "on-board")), new WorkItemTypeCollection(TreeNode.create(WorkItemType.class, type)), tree); KanbanBoard board = builder.build(null, null); assertThat(board.getCell(0, 0).getWorkItemBelow(), is(workItem3)); assertThat(board.getCell(1, 0).getWorkItemAbove(), is(workItem1)); } @Test public void kanbanBacklogSeemsRight() { WorkItemType featureType = new WorkItemType("backlog", "dev"); WorkItemType storyType = new WorkItemType("story backlog"); WorkItem feature1 = new WorkItem(1, featureType, "backlog"); WorkItem feature2 = new WorkItem(2, featureType, "dev"); WorkItem feature3 = new WorkItem(3, featureType, "backlog"); WorkItem story = new WorkItem(4, 3, storyType, "story backlog"); DefaultWorkItemTree tree = new DefaultWorkItemTree(); tree.addWorkItems(feature1, feature2, feature3, story); KanbanBoardBuilder builder = new KanbanBoardBuilder( new KanbanBoardColumnList( new KanbanBoardColumn(featureType, "backlog")), new WorkItemTypeCollection(TreeNode.create(WorkItemType.class, featureType)), tree); KanbanBacklog backlog = builder.buildKanbanBacklog(null); assertThat(backlog.size(), is(2)); assertThat(backlog.get(0).getWorkItemBelow(), is(feature3)); assertThat(backlog.get(1).getWorkItemAbove(), is(feature1)); } }