package com.metservice.kanban.charts.cumulativeflow; import static junit.framework.Assert.fail; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import org.joda.time.LocalDate; import org.junit.Test; import com.metservice.kanban.model.WorkItem; import com.metservice.kanban.model.WorkItemType; public class CumulativeFlowChartMatrixTest { private static LocalDateFormatter formatter = new LocalDateFormatter(); private static class LocalDateFormatter { public LocalDate parse(String pattern) throws ParseException { return LocalDate.fromDateFields(new SimpleDateFormat("dd/MM/yyyy").parse(pattern)); } } // TODO boil these tests down to their bare minimum (too many asserts) @Test public void testMatrixFirstCase() throws ParseException { WorkItemType type = new WorkItemType("phase1", "phase2", "phase3", "phase4"); List<String> phases = type.getPhases(); CumulativeFlowChartMatrix matrix = new CumulativeFlowChartMatrix(phases, null, new LocalDate(2011, 2, 24)); List<WorkItem> workItems = buildListFirstCase(type); for (WorkItem workItem : workItems) { matrix.registerWorkItem(workItem); } verifyDate(phases, matrix, "08/02/2011", new int[] {1, 0, 0, 0}); verifyDate(phases, matrix, "09/02/2011", new int[] {2, 0, 0, 0}); verifyDate(phases, matrix, "10/02/2011", new int[] {3, 0, 0, 0}); verifyDate(phases, matrix, "11/02/2011", new int[] {2, 1, 0, 0}); verifyDate(phases, matrix, "14/02/2011", new int[] {1, 2, 0, 0}); verifyDate(phases, matrix, "15/02/2011", new int[] {1, 1, 1, 0}); verifyDate(phases, matrix, "16/02/2011", new int[] {1, 1, 1, 0}); verifyDate(phases, matrix, "17/02/2011", new int[] {1, 0, 2, 0}); verifyDate(phases, matrix, "18/02/2011", new int[] {1, 0, 2, 0}); verifyDate(phases, matrix, "21/02/2011", new int[] {1, 0, 1, 1}); verifyDate(phases, matrix, "22/02/2011", new int[] {1, 0, 1, 1}); verifyDate(phases, matrix, "23/02/2011", new int[] {1, 0, 1, 1}); verifyDate(phases, matrix, "24/02/2011", new int[] {0, 1, 1, 1}); List<LocalDate> dates = matrix.getOrderedListOfDates(); assertThat(dates.size(), is(13)); assertThat(dates.get(0), is(new LocalDate(2011, 2, 8))); assertThat(dates.get(dates.size() - 1), is(new LocalDate(2011, 2, 24))); verifyExistenceOfDates(dates, new String[] { "08/02/2011", "09/02/2011", "10/02/2011", "11/02/2011", "14/02/2011", "15/02/2011", "16/02/2011", "17/02/2011", "18/02/2011", "21/02/2011", "22/02/2011", "23/02/2011", "24/02/2011", }); verifyNonExistenceOfDates(dates, new String[] { "12/02/2011", "13/02/2011", "19/02/2011", "20/02/2011", }); } @Test public void testMatrixExcludeItemFromReport() throws ParseException { WorkItemType type = new WorkItemType("phase1", "phase2", "phase3", "phase4"); List<String> phases = type.getPhases(); CumulativeFlowChartMatrix matrix = new CumulativeFlowChartMatrix(phases, null, new LocalDate(2011, 2, 24)); List<WorkItem> workItems = buildListFirstCase(type); for (WorkItem workItem : workItems) { if (workItem.getId() == 2) { workItem.setExcluded(true); } matrix.registerWorkItem(workItem); } verifyDate(phases, matrix, "09/02/2011", new int[] {1, 0, 0, 0}); verifyDate(phases, matrix, "10/02/2011", new int[] {2, 0, 0, 0}); verifyDate(phases, matrix, "11/02/2011", new int[] {2, 0, 0, 0}); verifyDate(phases, matrix, "14/02/2011", new int[] {1, 1, 0, 0}); verifyDate(phases, matrix, "15/02/2011", new int[] {1, 0, 1, 0}); verifyDate(phases, matrix, "16/02/2011", new int[] {1, 0, 1, 0}); verifyDate(phases, matrix, "17/02/2011", new int[] {1, 0, 1, 0}); verifyDate(phases, matrix, "18/02/2011", new int[] {1, 0, 1, 0}); verifyDate(phases, matrix, "21/02/2011", new int[] {1, 0, 0, 1}); verifyDate(phases, matrix, "22/02/2011", new int[] {1, 0, 0, 1}); verifyDate(phases, matrix, "23/02/2011", new int[] {1, 0, 0, 1}); verifyDate(phases, matrix, "24/02/2011", new int[] {0, 1, 0, 1}); List<LocalDate> dates = matrix.getOrderedListOfDates(); assertThat(dates.size(), is(12)); assertThat(dates.get(0), is(new LocalDate(2011, 2, 9))); assertThat(dates.get(dates.size() - 1), is(new LocalDate(2011, 2, 24))); verifyExistenceOfDates(dates, new String[] { "09/02/2011", "10/02/2011", "11/02/2011", "14/02/2011", "15/02/2011", "16/02/2011", "17/02/2011", "18/02/2011", "21/02/2011", "22/02/2011", "23/02/2011", "24/02/2011", }); verifyNonExistenceOfDates(dates, new String[] { "12/02/2011", "13/02/2011", "19/02/2011", "20/02/2011", }); } @Test public void testMatrixSecondCase() throws ParseException { WorkItemType type = new WorkItemType("phase1", "phase2", "phase3", "phase4", "phase5"); List<String> phases = type.getPhases(); CumulativeFlowChartMatrix matrix = new CumulativeFlowChartMatrix(phases, null, new LocalDate(2011, 1, 17)); List<WorkItem> workItems = buildListSecondCase(type); for (WorkItem workItem : workItems) { matrix.registerWorkItem(workItem); } verifyDate(phases, matrix, "05/01/2011", new int[] {1, 0, 0, 0, 0}); verifyDate(phases, matrix, "06/01/2011", new int[] {1, 1, 0, 0, 0}); verifyDate(phases, matrix, "07/01/2011", new int[] {1, 1, 0, 0, 0}); verifyDate(phases, matrix, "10/01/2011", new int[] {0, 2, 1, 0, 0}); verifyDate(phases, matrix, "11/01/2011", new int[] {0, 1, 2, 0, 0}); verifyDate(phases, matrix, "12/01/2011", new int[] {0, 0, 3, 0, 0}); verifyDate(phases, matrix, "13/01/2011", new int[] {0, 0, 3, 0, 0}); verifyDate(phases, matrix, "14/01/2011", new int[] {0, 0, 3, 0, 0}); List<LocalDate> dates = matrix.getOrderedListOfDates(); assertThat(dates.size(), is(9)); assertThat(dates.get(0), is(new LocalDate(2011, 1, 5))); assertThat(dates.get(dates.size() - 1), is(new LocalDate(2011, 1, 17))); verifyExistenceOfDates(dates, new String[] {"05/01/2011", "06/01/2011", "07/01/2011", "10/01/2011", "11/01/2011", "13/01/2011", "14/01/2011", "17/01/2011"}); verifyNonExistenceOfDates(dates, new String[] {"02/01/2011", "03/01/2011", "04/01/2011", "08/01/2011", "09/01/2011", "15/01/2011", "16/01/2011"}); } @Test public void testMatrixThirdCase() throws ParseException { WorkItemType type = new WorkItemType("phase1", "phase2", "phase3", "phase4", "phase5"); List<String> phases = type.getPhases(); CumulativeFlowChartMatrix matrix = new CumulativeFlowChartMatrix(phases, null, new LocalDate(2011, 4, 9)); List<WorkItem> workItems = buildListThirdCase(type); for (WorkItem workItem : workItems) { matrix.registerWorkItem(workItem); } verifyDate(phases, matrix, "29/03/2011", new int[] {1, 0, 0, 0, 0}); verifyDate(phases, matrix, "30/03/2011", new int[] {1, 1, 0, 0, 0}); verifyDate(phases, matrix, "31/03/2011", new int[] {2, 1, 0, 0, 0}); verifyDate(phases, matrix, "01/04/2011", new int[] {2, 0, 1, 0, 0}); verifyDate(phases, matrix, "04/04/2011", new int[] {0, 1, 2, 0, 0}); verifyDate(phases, matrix, "05/04/2011", new int[] {0, 0, 3, 0, 0}); verifyDate(phases, matrix, "06/04/2011", new int[] {0, 0, 3, 0, 0}); verifyDate(phases, matrix, "07/04/2011", new int[] {0, 0, 3, 0, 0}); verifyDate(phases, matrix, "08/04/2011", new int[] {0, 0, 2, 1, 0}); List<LocalDate> dates = matrix.getOrderedListOfDates(); assertThat(dates.size(), is(9)); assertThat(dates.get(0), is(new LocalDate(2011, 3, 29))); assertThat(dates.get(dates.size() - 1), is(new LocalDate(2011, 4, 8))); verifyExistenceOfDates(dates, new String[] { "29/03/2011", "30/03/2011", "31/03/2011", "01/04/2011", "04/04/2011", "05/04/2011", "06/04/2011", "07/04/2011", "08/04/2011"}); verifyNonExistenceOfDates(dates, new String[] {"02/04/2011", "03/04/2011"}); } private void verifyExistenceOfDates(List<LocalDate> dates, String[] datesAsString) throws ParseException { for (String d : datesAsString) { LocalDate date = formatter.parse(d); assertThat("date " + date + " should not belong to the given list", dates.contains(date), is(true)); } } private void verifyNonExistenceOfDates(List<LocalDate> dates, String[] datesAsString) throws ParseException { for (String d : datesAsString) { LocalDate date = formatter.parse(d); assertThat(dates.contains(date), is(false)); } } private Integer getNumberOfWorkItems(List<String> phases, CumulativeFlowChartMatrix matrix, LocalDate localDate, String phase) throws ParseException { return matrix.getQuantityOfItemsOnDateAndPhase(localDate, phase); } public static List<WorkItem> buildListFirstCase(WorkItemType type) throws ParseException { List<WorkItem> workItems = new ArrayList<WorkItem>(); WorkItem workItem1 = new WorkItem(1, type); WorkItem workItem2 = new WorkItem(2, type); WorkItem workItem3 = new WorkItem(3, type); workItem1.setDate("phase1", formatter.parse("10/02/2011")); workItem1.setDate("phase2", formatter.parse("14/02/2011")); workItem1.setDate("phase3", formatter.parse("15/02/2011")); workItem1.setDate("phase4", formatter.parse("21/02/2011")); workItem2.setDate("phase1", formatter.parse("08/02/2011")); workItem2.setDate("phase2", formatter.parse("11/02/2011")); workItem2.setDate("phase3", formatter.parse("17/02/2011")); workItem3.setDate("phase1", formatter.parse("09/02/2011")); workItem3.setDate("phase2", formatter.parse("24/02/2011")); workItems.add(workItem1); workItems.add(workItem2); workItems.add(workItem3); return workItems; } public static List<WorkItem> buildListSecondCase(WorkItemType type) throws ParseException { List<WorkItem> workItems = new ArrayList<WorkItem>(); WorkItem workItem1 = new WorkItem(1, type); WorkItem workItem2 = new WorkItem(2, type); WorkItem workItem3 = new WorkItem(3, type); workItem1.setDate("phase1", formatter.parse("02/01/2011")); workItem1.setDate("phase2", formatter.parse("06/01/2011")); workItem1.setDate("phase3", formatter.parse("09/01/2011")); workItem2.setDate("phase1", formatter.parse("06/01/2011")); workItem2.setDate("phase2", formatter.parse("08/01/2011")); workItem2.setDate("phase3", formatter.parse("11/01/2011")); workItem3.setDate("phase1", formatter.parse("08/01/2011")); workItem3.setDate("phase2", formatter.parse("09/01/2011")); workItem3.setDate("phase3", formatter.parse("12/01/2011")); workItem3.setDate("phase4", formatter.parse("15/01/2011")); workItems.add(workItem1); workItems.add(workItem2); workItems.add(workItem3); return workItems; } public static List<WorkItem> buildListThirdCase(WorkItemType type) throws ParseException { List<WorkItem> workItems = new ArrayList<WorkItem>(); WorkItem workItem1 = new WorkItem(1, type); WorkItem workItem2 = new WorkItem(2, type); WorkItem workItem3 = new WorkItem(3, type); workItem1.setDate("phase1", formatter.parse("29/03/2011")); workItem1.setDate("phase2", formatter.parse("30/03/2011")); workItem1.setDate("phase3", formatter.parse("01/04/2011")); workItem2.setDate("phase1", formatter.parse("30/03/2011")); workItem2.setDate("phase2", formatter.parse("02/04/2011")); workItem2.setDate("phase3", formatter.parse("04/04/2011")); workItem3.setDate("phase1", formatter.parse("31/03/2011")); workItem3.setDate("phase2", formatter.parse("02/04/2011")); workItem3.setDate("phase3", formatter.parse("05/04/2011")); workItem3.setDate("phase4", formatter.parse("08/04/2011")); workItems.add(workItem1); workItems.add(workItem2); workItems.add(workItem3); return workItems; } private void verifyDate(List<String> phases, CumulativeFlowChartMatrix matrix, String dateAsString, int[] pattern) throws ParseException { double[][] data = matrix.getData(); List<LocalDate> dates = matrix.getOrderedListOfDates(); int index = findIndex(dates, dateAsString); int phaseIndex = 0; for (String phase : phases) { assertThat(getNumberOfWorkItems(phases, matrix, stringToLocalDate(dateAsString), phase), is(pattern[phaseIndex])); assertThat(data[phases.size() - 1 - phaseIndex][index], is(new Double(pattern[phaseIndex]))); phaseIndex++; } } private LocalDate stringToLocalDate(String dateAsString) throws ParseException { return formatter.parse(dateAsString); } private int findIndex(List<LocalDate> dates, String dateAsString) throws ParseException { int index = 0; for (LocalDate date : dates) { if (date.equals(formatter.parse(dateAsString))) { return index; } index++; } System.out.println("\n\n\nCan't parse " + dateAsString); fail(); return -1; } }