package com.metservice.kanban.charts.burnup; import static com.metservice.kanban.charts.burnup.BurnUpChartSeriesNames.BACKLOG; import static com.metservice.kanban.charts.burnup.BurnUpChartSeriesNames.COMPLETE; import static java.util.Arrays.asList; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import org.jfree.data.category.DefaultCategoryDataset; import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Test; import com.metservice.kanban.model.WorkItem; import com.metservice.kanban.model.WorkItemType; import com.metservice.kanban.utils.DateUtils; public class ProjectedDatasetPopulatorTest { private static final WorkItemType WORK_ITEM_TYPE = new WorkItemType("backlog", "completed"); private static final LocalDate MONDAY = DateUtils.parseIsoDate("2011-06-13"); private static final LocalDate TUESDAY = MONDAY.plusDays(1); private static final LocalDate WEDNESDAY = MONDAY.plusDays(2); private static final LocalDate THURSDAY = MONDAY.plusDays(3); private static final LocalDate FRIDAY = MONDAY.plusDays(4); private static final LocalDate SATURDAY= MONDAY.plusDays(5); private static final LocalDate SUNDAY = MONDAY.plusDays(6); private static final LocalDate NEXT_MONDAY = MONDAY.plusDays(7); private DefaultCategoryDataset dataset; @Before public void before() { dataset = new DefaultCategoryDataset(); } @Test public void projectsData() { WorkItem workItem1 = new WorkItem(1, WORK_ITEM_TYPE); workItem1.setAverageCaseEstimate(1); workItem1.advance(MONDAY); workItem1.advance(TUESDAY); WorkItem workItem2 = new WorkItem(2, WORK_ITEM_TYPE); workItem2.setAverageCaseEstimate(1); workItem2.advance(MONDAY); BurnUpDataModel model = new BurnUpDataModel(WORK_ITEM_TYPE, asList(workItem1, workItem2), TUESDAY); ProjectedDatasetPopulator populator = new ProjectedDatasetPopulator(model); populator.populateDataset(dataset); assertThat(dataset.getValue(COMPLETE, WEDNESDAY).doubleValue(), is(2.0)); assertThat(dataset.getValue(BACKLOG, WEDNESDAY).doubleValue(), is(0.0)); assertThat(dataset.getColumnIndex(THURSDAY), is(-1)); } @Test public void projectsDataOfNonUnitSize() { WorkItem workItem1 = new WorkItem(1, WORK_ITEM_TYPE); workItem1.setAverageCaseEstimate(2); workItem1.advance(MONDAY); workItem1.advance(TUESDAY); WorkItem workItem2 = new WorkItem(2, WORK_ITEM_TYPE); workItem2.setAverageCaseEstimate(2); workItem2.advance(MONDAY); BurnUpDataModel model = new BurnUpDataModel(WORK_ITEM_TYPE, asList(workItem1, workItem2), TUESDAY); ProjectedDatasetPopulator populator = new ProjectedDatasetPopulator(model); populator.populateDataset(dataset); assertThat(dataset.getValue(COMPLETE, WEDNESDAY).doubleValue(), is(4.0)); assertThat(dataset.getValue(BACKLOG, WEDNESDAY).doubleValue(), is(0.0)); assertThat(dataset.getColumnIndex(THURSDAY), is(-1)); } @Test public void projectsDataMoreThanOneDay() { WorkItem workItem1 = new WorkItem(1, WORK_ITEM_TYPE); workItem1.setAverageCaseEstimate(1); workItem1.advance(MONDAY); workItem1.advance(TUESDAY); WorkItem workItem2 = new WorkItem(2, WORK_ITEM_TYPE); workItem2.setAverageCaseEstimate(2); workItem2.advance(MONDAY); BurnUpDataModel model = new BurnUpDataModel(WORK_ITEM_TYPE, asList(workItem1, workItem2), TUESDAY); ProjectedDatasetPopulator populator = new ProjectedDatasetPopulator(model); populator.populateDataset(dataset); assertThat(dataset.getValue(COMPLETE, WEDNESDAY).intValue(), is(2)); assertThat(dataset.getValue(BACKLOG, WEDNESDAY).intValue(), is(1)); assertThat(dataset.getValue(COMPLETE, THURSDAY).intValue(), is(3)); assertThat(dataset.getValue(BACKLOG, THURSDAY).intValue(), is(0)); assertThat(dataset.getColumnIndex(FRIDAY), is(-1)); } @Test public void skipsWeekendsInProjection() { WorkItem workItem1 = new WorkItem(1, WORK_ITEM_TYPE); workItem1.setAverageCaseEstimate(1); workItem1.advance(THURSDAY); workItem1.advance(FRIDAY); WorkItem workItem2 = new WorkItem(2, WORK_ITEM_TYPE); workItem2.setAverageCaseEstimate(1); workItem2.advance(THURSDAY); BurnUpDataModel model = new BurnUpDataModel(WORK_ITEM_TYPE, asList(workItem1, workItem2), FRIDAY); ProjectedDatasetPopulator populator = new ProjectedDatasetPopulator(model); populator.populateDataset(dataset); assertThat(dataset.getColumnIndex(SATURDAY), is(-1)); assertThat(dataset.getColumnIndex(SUNDAY), is(-1)); assertThat(dataset.getValue(COMPLETE, NEXT_MONDAY).doubleValue(), is(2.0)); assertThat(dataset.getValue(BACKLOG, NEXT_MONDAY).doubleValue(), is(0.0)); } @Test public void doesNotProjectIfRateIsZero() { WorkItem workItem = new WorkItem(1, WORK_ITEM_TYPE); workItem.advance(MONDAY); BurnUpDataModel model = new BurnUpDataModel(WORK_ITEM_TYPE, asList(workItem), TUESDAY); ProjectedDatasetPopulator populator = new ProjectedDatasetPopulator(model); populator.populateDataset(dataset); assertThat(dataset.getColumnIndex(WEDNESDAY), is(-1)); } }