package edu.pdx.cs410J.grader;
import edu.pdx.cs410J.ParserException;
import org.junit.Test;
import org.w3c.dom.Document;
import javax.xml.transform.TransformerException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import static edu.pdx.cs410J.grader.GradeBook.LetterGradeRanges;
import static edu.pdx.cs410J.grader.GradeBook.LetterGradeRanges.LetterGradeRange;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
public class GradeBookXmlTest {
@Test
public void letterGradeRangesArePersistedToXml() throws IOException, TransformerException, ParserException {
GradeBook book = new GradeBook("test");
LetterGradeRanges undergradRanges = book.getLetterGradeRanges(Student.Section.UNDERGRADUATE);
morphLetterGradeRanges(undergradRanges, 1);
LetterGradeRanges gradRanges = book.getLetterGradeRanges(Student.Section.GRADUATE);
morphLetterGradeRanges(gradRanges, 2);
GradeBook book2 = writeAndReadGradeBookAsXml(book);
LetterGradeRanges undergradRanges2 = book2.getLetterGradeRanges(Student.Section.UNDERGRADUATE);
assertRangesAreEqual(undergradRanges, undergradRanges2);
LetterGradeRanges gradRanges2 = book2.getLetterGradeRanges(Student.Section.GRADUATE);
assertRangesAreEqual(gradRanges, gradRanges2);
}
private void assertRangesAreEqual(LetterGradeRanges ranges, LetterGradeRanges ranges2) {
for (LetterGrade letterGrade : LetterGrade.values()) {
LetterGradeRange range = ranges.getRange(letterGrade);
if (range == null) {
continue;
}
LetterGradeRange range2 = ranges2.getRange(letterGrade);
assertThat("Range for " + letterGrade, range2.minimum(), equalTo(range.minimum()));
}
}
private void morphLetterGradeRanges(LetterGradeRanges ranges, int morphValue) {
for (LetterGrade letterGrade : LetterGrade.values()) {
LetterGradeRange range = ranges.getRange(letterGrade);
if (range == null) {
continue;
}
range.setRange(range.minimum() + morphValue, range.maximum() + morphValue);
}
LetterGradeRange fRange = ranges.getRange(LetterGrade.F);
fRange.setRange(0, fRange.maximum());
}
private GradeBook writeAndReadGradeBookAsXml(GradeBook book) throws IOException, TransformerException, ParserException {
Document doc = XmlDumper.dumpGradeBook(book, new XmlHelper());
byte[] bytes = XmlHelper.getBytesForXmlDocument(doc);
XmlGradeBookParser parser = new XmlGradeBookParser(new ByteArrayInputStream(bytes));
return parser.parse();
}
@Test
public void dueDatesArePersistedToXml() throws TransformerException, IOException, ParserException {
GradeBook book = new GradeBook("test");
String assignmentName = "assignment";
Assignment assignment = new Assignment(assignmentName, 10.0);
book.addAssignment(assignment);
LocalDateTime dueDate = LocalDateTime.now().minusDays(3).withNano(0);
assignment.setDueDate(dueDate);
GradeBook book2 = writeAndReadGradeBookAsXml(book);
assertThat(book2.getAssignment(assignmentName).getDueDate(), equalTo(dueDate));
}
@Test
public void poaAssignmentsArePersistedToXml() throws TransformerException, IOException, ParserException {
GradeBook book = new GradeBook("test");
String assignmentName = "assignment";
Assignment assignment = new Assignment(assignmentName, 10.0);
assignment.setType(Assignment.AssignmentType.POA);
book.addAssignment(assignment);
GradeBook book2 = writeAndReadGradeBookAsXml(book);
assertThat(book2.getAssignment(assignmentName).getType(), equalTo(Assignment.AssignmentType.POA));
}
}