package edu.pdx.cs410J.grader.poa;
import com.google.common.eventbus.Subscribe;
import edu.pdx.cs410J.grader.Assignment;
import edu.pdx.cs410J.grader.GradeBook;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import java.time.LocalDateTime;
import java.util.Arrays;
import static edu.pdx.cs410J.grader.poa.POAAssignmentsView.AssignmentSelectedHandler;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.*;
public class POAAssignmentsPresenterTest extends POASubmissionTestCase {
private POAAssignmentsView view;
private GradeBook book;
private Assignment assignment0;
private Assignment assignment1;
private Assignment assignment2;
@Override
public void setUp() {
super.setUp();
this.view = mock(POAAssignmentsView.class);
new POAAssignmentsPresenter(this.bus, this.view);
book = new GradeBook("Test Grade Book");
assignment0 = new Assignment("POA 0", 1.0).setType(Assignment.AssignmentType.POA);
book.addAssignment(assignment0);
assignment1 = new Assignment("POA 1", 1.0).setType(Assignment.AssignmentType.POA);
book.addAssignment(assignment1);
assignment2 = new Assignment("POA 2", 1.0).setType(Assignment.AssignmentType.POA);
book.addAssignment(assignment2);
book.addAssignment(new Assignment("Quiz 0", 3.0).setType(Assignment.AssignmentType.QUIZ));
}
@Test
public void assignmentListPopulatedInViewWhenGradeBookLoaded() {
this.bus.post(new GradeBookLoaded(book));
verify(this.view).setAssignments(Arrays.asList("POA 0", "POA 1", "POA 2"));
verify(this.view).setSelectedAssignment(0);
}
@Test
public void assignmentSelectedFireWhenAssignmentSelectedInView() {
ArgumentCaptor<AssignmentSelectedHandler> viewHandler = ArgumentCaptor.forClass(AssignmentSelectedHandler.class);
verify(this.view).addAssignmentSelectedHandler(viewHandler.capture());
AssignmentSelectedEventHandler eventHandler = mock(AssignmentSelectedEventHandler.class);
this.bus.register(eventHandler);
this.bus.post(new GradeBookLoaded(book));
viewHandler.getValue().assignmentSelected(1);
ArgumentCaptor<AssignmentSelectedEvent> event = ArgumentCaptor.forClass(AssignmentSelectedEvent.class);
verify(eventHandler).handle(event.capture());
assertThat(event.getValue().getAssignment(), equalTo(assignment1));
}
private interface AssignmentSelectedEventHandler {
@Subscribe
void handle(AssignmentSelectedEvent event);
}
@Test
public void initiallySelectAssignmentWhoseDueDateHasMostRecentlyPassed() {
assignment0.setDueDate(LocalDateTime.now().minusDays(3));
assignment1.setDueDate(LocalDateTime.now().minusDays(2));
assignment2.setDueDate(LocalDateTime.now().plusDays(2));
this.bus.post(new GradeBookLoaded(book));
verify(this.view).setSelectedAssignment(1);
}
@Test
public void selectAssignmentWhenPOASubmittedWithAssignmentNumberInSubject() {
AssignmentSelectedEventHandler eventHandler = mock(AssignmentSelectedEventHandler.class);
this.bus.register(eventHandler);
this.bus.post(new GradeBookLoaded(book));
POASubmission submission = createPOASubmission("POA for Project 2", "me", LocalDateTime.now());
this.bus.post(new POASubmissionSelected(submission));
verify(this.view).setSelectedAssignment(2);
ArgumentCaptor<AssignmentSelectedEvent> event = ArgumentCaptor.forClass(AssignmentSelectedEvent.class);
verify(eventHandler).handle(event.capture());
assertThat(event.getValue().getAssignment(), equalTo(assignment2));
}
@Test
public void testFindNumbersInString() {
assertThat(POAAssignmentsPresenter.findNumbersInString("POA for Project 1"), hasItem("1"));
assertThat(POAAssignmentsPresenter.findNumbersInString("Project 5 POA"), hasItem("5"));
assertThat(POAAssignmentsPresenter.findNumbersInString("POA for Project 42"), hasItem("42"));
assertThat(POAAssignmentsPresenter.findNumbersInString("3 for Project 42"), hasItems("3", "42"));
}
@Test
public void populateDueDateInViewWhenGradeBookLoaded() {
assignment0.setDueDate(LocalDateTime.now().minusDays(3));
assignment1.setDueDate(LocalDateTime.now().minusDays(2));
assignment2.setDueDate(LocalDateTime.now().plusDays(2));
this.bus.post(new GradeBookLoaded(book));
verify(this.view).setSelectedAssignmentDueDate(POAAssignmentsPresenter.formatDueDate(assignment1));
}
@Test
public void populateDueDateInViewWhenAssignmentSelected() {
assignment0.setDueDate(LocalDateTime.now().minusDays(2));
assignment1.setDueDate(LocalDateTime.now().minusDays(3));
ArgumentCaptor<AssignmentSelectedHandler> viewHandler = ArgumentCaptor.forClass(AssignmentSelectedHandler.class);
verify(this.view).addAssignmentSelectedHandler(viewHandler.capture());
AssignmentSelectedEventHandler eventHandler = mock(AssignmentSelectedEventHandler.class);
this.bus.register(eventHandler);
this.bus.post(new GradeBookLoaded(book));
verify(this.view).setSelectedAssignmentDueDate(POAAssignmentsPresenter.formatDueDate(assignment0));
viewHandler.getValue().assignmentSelected(1);
verify(this.view).setSelectedAssignmentDueDate(POAAssignmentsPresenter.formatDueDate(assignment1));
}
@Test
public void clearDueDateInViewWhenAssignmentHasNoDueDate() {
assignment0.setDueDate(LocalDateTime.now().minusDays(2));
assignment1.setDueDate(null);
ArgumentCaptor<AssignmentSelectedHandler> viewHandler = ArgumentCaptor.forClass(AssignmentSelectedHandler.class);
verify(this.view).addAssignmentSelectedHandler(viewHandler.capture());
AssignmentSelectedEventHandler eventHandler = mock(AssignmentSelectedEventHandler.class);
this.bus.register(eventHandler);
this.bus.post(new GradeBookLoaded(book));
verify(this.view).setSelectedAssignmentDueDate(POAAssignmentsPresenter.formatDueDate(assignment0));
viewHandler.getValue().assignmentSelected(1);
verify(this.view).setSelectedAssignmentDueDate("");
}
@Test
public void noAssignmentSelectedWhenGradeBookHasNoPOAAssignments() {
this.bus.post(new GradeBookLoaded(new GradeBook("No POA assignments")));
verify(this.view, never()).setAssignments(anyList());
verify(this.view, never()).setSelectedAssignment(anyInt());
verify(this.view, never()).setSelectedAssignmentDueDate(any(String.class));
}
}