001package edu.pdx.cs.joy.grader.poa;
002
003import com.google.common.eventbus.Subscribe;
004import edu.pdx.cs.joy.grader.gradebook.Assignment;
005import edu.pdx.cs.joy.grader.gradebook.Grade;
006import edu.pdx.cs.joy.grader.gradebook.GradeBook;
007import edu.pdx.cs.joy.grader.gradebook.Student;
008import org.junit.jupiter.api.BeforeEach;
009import org.junit.jupiter.api.Test;
010import org.junit.jupiter.api.io.TempDir;
011import org.mockito.ArgumentCaptor;
012
013import java.io.File;
014import java.io.IOException;
015
016import static org.hamcrest.MatcherAssert.assertThat;
017import static org.hamcrest.Matchers.*;
018import static org.mockito.Mockito.mock;
019import static org.mockito.Mockito.verify;
020
021public class GradeBookPresenterTest extends EventBusTestCase {
022
023  private GradeBookView view;
024
025  @Override
026  @BeforeEach
027  public void setUp() {
028    super.setUp();
029
030    view = mock(GradeBookView.class);
031    new GradeBookPresenter(this.bus, this.view);
032  }
033
034  @Test
035  public void gradeBookNameDisplayedWhenLoaded() {
036    String className = "Test Class";
037    GradeBook book = new GradeBook(className);
038    bus.post(new GradeBookLoaded(book));
039
040    verify(view).setGradeBookName(className);
041  }
042
043  @Test
044  public void loadGradeBookEventPublishedWhenFileProvidedByView(@TempDir File tempDir) throws IOException {
045    LoadGradeBookHandler handler = mock(LoadGradeBookHandler.class);
046    bus.register(handler);
047
048    ArgumentCaptor<GradeBookView.FileSelectedListener> listener = ArgumentCaptor.forClass(GradeBookView.FileSelectedListener.class);
049    verify(view).addGradeBookFileListener(listener.capture());
050
051    File file = new File(tempDir, "testGradeBook.xml");
052    listener.getValue().fileSelected(file);
053
054    ArgumentCaptor<LoadGradeBook> event = ArgumentCaptor.forClass(LoadGradeBook.class);
055    verify(handler).handle(event.capture());
056
057    assertThat(event.getValue().getFile(), equalTo(file));
058  }
059
060  private interface LoadGradeBookHandler {
061    @Subscribe
062    public void handle(LoadGradeBook loadGradeBook);
063  }
064
065  @Test
066  public void gradeBookIsUpdatedOnRecordGradeEventForLateSubmission() {
067    GradeBook book = new GradeBook("Test");
068    Student student = new Student("studentId");
069    book.addStudent(student);
070    Assignment poa = new Assignment("poa", 1.0);
071    book.addAssignment(poa);
072    bus.post(new GradeBookLoaded(book));
073
074    boolean isLate = true;
075    double score = 0.5;
076    this.bus.post(new RecordGradeEvent(score, student, poa, isLate));
077
078    Grade grade = student.getGrade(poa.getName());
079    assertThat(grade, notNullValue());
080    assertThat(grade.getScore(), equalTo(score));
081    assertThat(student.getLate(), contains(poa.getName()));
082
083  }
084
085  @Test
086  public void gradeBookIsUpdatedOnRecordGradeEventForOnTimeSubmission() {
087    GradeBook book = new GradeBook("Test");
088    Student student = new Student("studentId");
089    book.addStudent(student);
090    Assignment poa = new Assignment("poa", 1.0);
091    book.addAssignment(poa);
092    bus.post(new GradeBookLoaded(book));
093
094    boolean isLate = false;
095    double score = 0.6;
096    this.bus.post(new RecordGradeEvent(score, student, poa, isLate));
097
098    Grade grade = student.getGrade(poa.getName());
099    assertThat(grade, notNullValue());
100    assertThat(grade.getScore(), equalTo(score));
101    assertThat(student.getLate(), not(contains(poa.getName())));
102  }
103
104  @Test
105  public void gradeBookIsUpdatedOnRecordGradeEventForExistingGrade() {
106    GradeBook book = new GradeBook("Test");
107    Student student = new Student("studentId");
108    book.addStudent(student);
109    Assignment poa = new Assignment("poa", 1.0);
110    book.addAssignment(poa);
111    student.setGrade(poa, 0.9);
112    bus.post(new GradeBookLoaded(book));
113
114    boolean isLate = false;
115    double newScore = 0.6;
116    this.bus.post(new RecordGradeEvent(newScore, student, poa, isLate));
117
118    Grade grade = student.getGrade(poa.getName());
119    assertThat(grade, notNullValue());
120    assertThat(grade.getScore(), equalTo(newScore));
121    assertThat(student.getLate(), not(contains(poa.getName())));
122  }
123
124  @Test
125  public void recordingGradeEnablesSaveGradeBookInView() {
126    GradeBook book = new GradeBook("Test");
127    Student student = new Student("studentId");
128    book.addStudent(student);
129    Assignment poa = new Assignment("poa", 1.0);
130    book.addAssignment(poa);
131    student.setGrade(poa, 0.9);
132    bus.post(new GradeBookLoaded(book));
133
134    verify(view).canSaveGradeBook(false);
135
136    boolean isLate = false;
137    double newScore = 0.6;
138    this.bus.post(new RecordGradeEvent(newScore, student, poa, isLate));
139
140    verify(view).canSaveGradeBook(true);
141  }
142
143  @Test
144  public void savingGradeBookInViewPublishesSaveGradeBookEvent() throws IOException {
145    ArgumentCaptor<GradeBookView.SaveGradeBookListener> listener = ArgumentCaptor.forClass(GradeBookView.SaveGradeBookListener.class);
146    verify(this.view).addSaveGradeBookListener(listener.capture());
147
148    GradeBook book = new GradeBook("Test");
149    Student student = new Student("studentId");
150    book.addStudent(student);
151    Assignment poa = new Assignment("poa", 1.0);
152    book.addAssignment(poa);
153    student.setGrade(poa, 0.9);
154    bus.post(new GradeBookLoaded(book));
155
156    SaveGradeBookEventHandler eventHandler = mock(SaveGradeBookEventHandler.class);
157    bus.register(eventHandler);
158
159    listener.getValue().saveGradeBook();
160
161    ArgumentCaptor<SaveGradeBook> event = ArgumentCaptor.forClass(SaveGradeBook.class);
162    verify(eventHandler).saveGradeBook(event.capture());
163
164    assertThat(event.getValue().getGradeBook(), equalTo(book));
165  }
166
167  public interface SaveGradeBookEventHandler {
168    @Subscribe
169    public void saveGradeBook(SaveGradeBook event);
170  }
171}