package com.metservice.kanban.charts.burnup;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.joda.time.LocalDate;
import org.junit.*;
import com.google.gson.internal.Pair;
import com.metservice.kanban.model.EstimatesProject;
import com.metservice.kanban.model.WorkItem;
import com.metservice.kanban.model.WorkItemType;
public class EstimatesBurnDownDataModelTest {
private EstimatesBurnDownDataModel model;
private EstimatesProject estimatesProject;
private List<WorkItem> workItems;
private Map<LocalDate, Integer> dayCosts;
@Before
public void setUp() {
workItems = new ArrayList<WorkItem>();
WorkItemType type = new WorkItemType("Backlog", "Dev", "Complete");
WorkItem item1 = new WorkItem(0, type);
item1.setAverageCaseEstimate(5);
workItems.add(item1);
WorkItem item2 = new WorkItem(0, type);
item2.setAverageCaseEstimate(3);
workItems.add(item2);
dayCosts = new TreeMap<LocalDate, Integer>();
dayCosts.put(LocalDate.parse("2012-01-02"), 7);
dayCosts.put(LocalDate.parse("2012-01-04"), 8);
dayCosts.put(LocalDate.parse("2012-01-06"), 8);
estimatesProject = mock(EstimatesProject.class);
when(estimatesProject.getDayCosts()).thenReturn(dayCosts);
}
@Test
public void returnsValidBudget() {
model = new EstimatesBurnDownDataModel(workItems, estimatesProject);
when(estimatesProject.getBudget()).thenReturn(10);
assertEquals(10, model.getBudget());
}
@Test
public void computesValidAllFeaturesPoints() {
model = new EstimatesBurnDownDataModel(workItems, estimatesProject);
assertEquals(8, model.computeAllFeaturePoints());
}
@Test
public void computesValidBudgetEntries() {
model = new EstimatesBurnDownDataModel(workItems, estimatesProject);
List<Pair<Integer, LocalDate>> budgetEntries = model.computeBudgetEntries();
assertEquals(3, budgetEntries.size());
assertEquals(new Pair<Integer, LocalDate>(7, LocalDate.parse("2012-01-02")), budgetEntries.get(0));
assertEquals(new Pair<Integer, LocalDate>(15, LocalDate.parse("2012-01-04")), budgetEntries.get(1));
assertEquals(new Pair<Integer, LocalDate>(23, LocalDate.parse("2012-01-06")), budgetEntries.get(2));
}
@Test
public void getRemainingFeaturePointForBudgetWhenNoFeaturesCompleted() {
model = new EstimatesBurnDownDataModel(workItems, estimatesProject);
assertEquals(8,
model.getRemainingFeaturePointForBudget(new Pair<Integer, LocalDate>(7, LocalDate.parse("2012-01-02"))));
assertEquals(8,
model.getRemainingFeaturePointForBudget(new Pair<Integer, LocalDate>(15, LocalDate.parse("2012-01-04"))));
assertEquals(8,
model.getRemainingFeaturePointForBudget(new Pair<Integer, LocalDate>(24, LocalDate.parse("2012-01-06"))));
}
@Test
public void getRemainingFeaturePointForBudgetWhenFeaturesCompleted() {
workItems.get(0).advance(LocalDate.parse("2012-01-01"));
workItems.get(0).advance(LocalDate.parse("2012-01-02"));
workItems.get(0).advance(LocalDate.parse("2012-01-03"));
workItems.get(1).advance(LocalDate.parse("2012-01-02"));
workItems.get(1).advance(LocalDate.parse("2012-01-04"));
workItems.get(1).advance(LocalDate.parse("2012-01-06"));
model = new EstimatesBurnDownDataModel(workItems, estimatesProject);
assertEquals(8,
model.getRemainingFeaturePointForBudget(new Pair<Integer, LocalDate>(7, LocalDate.parse("2012-01-02"))));
assertEquals(3,
model.getRemainingFeaturePointForBudget(new Pair<Integer, LocalDate>(15, LocalDate.parse("2012-01-04"))));
assertEquals(0,
model.getRemainingFeaturePointForBudget(new Pair<Integer, LocalDate>(24, LocalDate.parse("2012-01-06"))));
}
@Test
public void getLastBudgetEntry() {
model = new EstimatesBurnDownDataModel(workItems, estimatesProject);
Pair<Integer, LocalDate> lastBudgedEntry = model.getLastBudgedEntry();
assertEquals(new Pair<Integer, LocalDate>(23, LocalDate.parse("2012-01-06")), lastBudgedEntry);
}
@Test
public void getLastBudgetEntryReturnsNullForEmptyList() {
when(estimatesProject.getDayCosts()).thenReturn(new TreeMap<LocalDate, Integer>());
model = new EstimatesBurnDownDataModel(workItems, estimatesProject);
Pair<Integer, LocalDate> lastBudgedEntry = model.getLastBudgedEntry();
assertEquals(null, lastBudgedEntry);
}
@Test
public void computeProjectedBudgedConsumed() {
workItems.get(0).advance(LocalDate.parse("2012-01-01"));
workItems.get(0).advance(LocalDate.parse("2012-01-02"));
workItems.get(0).advance(LocalDate.parse("2012-01-03"));
model = new EstimatesBurnDownDataModel(workItems, estimatesProject);
int computeProjectedBudgedConsumed = model.computeProjectedBudgedConsumed();
assertEquals(36, computeProjectedBudgedConsumed);
}
@Test
public void computeProjectedBudgedConsumedWhenNoWorkItemsCompleted() {
model = new EstimatesBurnDownDataModel(workItems, estimatesProject);
when(estimatesProject.getBudget()).thenReturn(100);
int computeProjectedBudgedConsumed = model.computeProjectedBudgedConsumed();
assertEquals(500, computeProjectedBudgedConsumed);
}
}