package de.dhbw.humbuch.viewmodel;
import static de.dhbw.humbuch.test.TestUtils.grade;
import static de.dhbw.humbuch.test.TestUtils.schoolYearFirstTermStarted;
import static de.dhbw.humbuch.test.TestUtils.schoolYearSecondTermEnded;
import static de.dhbw.humbuch.test.TestUtils.schoolYearSecondTermStarted;
import static de.dhbw.humbuch.test.TestUtils.studentInGrade;
import static de.dhbw.humbuch.test.TestUtils.teachingMaterialInBothTermsOfGrade;
import static de.dhbw.humbuch.test.TestUtils.teachingMaterialInFirstTermOfGrade;
import static de.dhbw.humbuch.test.TestUtils.teachingMaterialInSecondTermOfGrade;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.EntityManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.google.inject.Provider;
import de.dhbw.humbuch.guice.GuiceJUnitRunner;
import de.dhbw.humbuch.guice.GuiceJUnitRunner.GuiceModules;
import de.dhbw.humbuch.guice.TestModuleWithoutSingletons;
import de.dhbw.humbuch.model.DAO;
import de.dhbw.humbuch.model.entity.BorrowedMaterial;
import de.dhbw.humbuch.model.entity.Grade;
import de.dhbw.humbuch.model.entity.SchoolYear;
import de.dhbw.humbuch.model.entity.Student;
import de.dhbw.humbuch.model.entity.TeachingMaterial;
import de.dhbw.humbuch.model.entity.TestPersistenceInitialiser;
@RunWith(GuiceJUnitRunner.class)
@GuiceModules({ TestModuleWithoutSingletons.class })
public class LendingViewModelTest extends BaseTest {
private final static Logger LOG = LoggerFactory
.getLogger(LendingViewModelTest.class);
private LendingViewModel vm;
private DAO<Grade> daoGrade;
private DAO<Student> daoStudent;
private DAO<SchoolYear> daoSchoolYear;
private DAO<TeachingMaterial> daoTeachingMaterial;
@Inject
public void setInjected(TestPersistenceInitialiser persistenceInitialiser,
Provider<EntityManager> emProvider,
LendingViewModel lendingViewModel, DAO<Grade> daoGrade,
DAO<Student> daoStudent, DAO<SchoolYear> daoSchoolYear,
DAO<TeachingMaterial> daoTeachingMaterial) {
this.daoGrade = daoGrade;
this.daoStudent = daoStudent;
this.daoSchoolYear = daoSchoolYear;
this.daoTeachingMaterial = daoTeachingMaterial;
super.setInjected(persistenceInitialiser, emProvider);
this.vm = lendingViewModel;
}
private int amountOfTeachingMaterialsInMaterialListGrades() {
LOG.info("amountOfTeachingMaterialsInMaterialListGrades");
int amount = 0;
Map<Grade, Map<TeachingMaterial, Integer>> gradeList = vm.materialListGrades
.get();
LOG.info("gradeList: " + gradeList);
for (Grade grade : gradeList.keySet()) {
LOG.info("grade: " + grade);
Map<TeachingMaterial, Integer> materialList = gradeList.get(grade);
LOG.info("materialList: " + materialList);
LOG.info("materialListKeys: " + materialList.keySet());
for (int amountInGrade : materialList.values()) {
LOG.info("amountInGrade: " + amountInGrade);
amount += amountInGrade;
}
}
return amount;
}
@Before
public void refreshViewModel() {
vm.refresh();
}
@Test
public void testStateInitialisation() {
assertNotNull(vm.studentsWithUnreceivedBorrowedMaterials.get());
assertNotNull(vm.teachingMaterials.get());
}
@Test
public void testStateMaterialListGrades() {
Set<Grade> grades = new HashSet<>();
Grade grade = daoGrade.insert(grade(6));
vm.refresh();
grades.add(grade);
vm.generateMaterialListGrades(grades);
assertNotNull(vm.materialListGrades.get());
}
@Test
public void testOneToLendWhenInFirstTermBorrowedInBothTerms() {
daoSchoolYear.insert(schoolYearFirstTermStarted());
daoTeachingMaterial.insert(teachingMaterialInBothTermsOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
assertEquals(1, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
}
@Test
public void testOneToLendWhenInSecondTermBorrowedInBothTerms() {
daoSchoolYear.insert(schoolYearSecondTermStarted());
daoTeachingMaterial.insert(teachingMaterialInBothTermsOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
assertEquals(1, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
}
@Test
public void testOneToLendWhenInFirstTermBorrowedInFirstTerm() {
daoSchoolYear.insert(schoolYearFirstTermStarted());
daoTeachingMaterial.insert(teachingMaterialInFirstTermOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
assertEquals(1, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
}
@Test
public void testOneToLendWhenInSecondTermBorrowedInSecondTerm() {
daoSchoolYear.insert(schoolYearSecondTermStarted());
daoTeachingMaterial.insert(teachingMaterialInSecondTermOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
assertEquals(1, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
}
@Test
public void testZeroToLendWhenInSecondTermBorrowedInFirstTerm() {
daoSchoolYear.insert(schoolYearSecondTermStarted());
daoTeachingMaterial.insert(teachingMaterialInFirstTermOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
assertEquals(0, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
}
@Test
public void testZeroToLendWhenInFirstTermBorrowedInSecondTerm() {
daoSchoolYear.insert(schoolYearFirstTermStarted());
daoTeachingMaterial.insert(teachingMaterialInSecondTermOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
assertEquals(0, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
}
@Test
public void testZeroToLendWhenAfterSecondTermBorrowedInSecondTerm() {
daoSchoolYear.insert(schoolYearSecondTermEnded());
daoTeachingMaterial.insert(teachingMaterialInSecondTermOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
assertEquals(0, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
}
@Test
public void testZeroToLendWhenAfterSecondTermBorrowedInFirstTerm() {
daoSchoolYear.insert(schoolYearSecondTermEnded());
daoTeachingMaterial.insert(teachingMaterialInFirstTermOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
assertEquals(0, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
}
@Test
public void testZeroToLendWhenAfterSecondTermBorrowedInBothTerms() {
daoSchoolYear.insert(schoolYearSecondTermEnded());
daoTeachingMaterial.insert(teachingMaterialInBothTermsOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
assertEquals(0, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
}
@Test
public void testMarkUnreceivedBorrowedMaterialAsReceived() {
daoSchoolYear.insert(schoolYearFirstTermStarted());
daoTeachingMaterial.insert(teachingMaterialInBothTermsOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
assertEquals(1, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
Map<Grade, Map<Student, List<BorrowedMaterial>>> map = vm.studentsWithUnreceivedBorrowedMaterials
.get();
BorrowedMaterial borrowedMaterial = map.values().iterator().next()
.values().iterator().next().iterator().next();
Set<BorrowedMaterial> borrowedMaterials = new HashSet<>();
borrowedMaterials.add(borrowedMaterial);
vm.setBorrowedMaterialsReceived(borrowedMaterials);
vm.refresh();
assertEquals(0, vm.studentsWithUnreceivedBorrowedMaterials.get().size());
}
@Test
public void testGenerateMaterialListOneGradeOneStudentOneBook() {
daoSchoolYear.insert(schoolYearFirstTermStarted());
daoTeachingMaterial.insert(teachingMaterialInBothTermsOfGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
vm.generateMaterialListGrades(new HashSet<>(daoGrade.findAll()));
assertEquals(1, (int) vm.materialListGrades.get().values().iterator()
.next().values().iterator().next());
}
@Test
public void testGenerateMaterialListOneGradeTwoStudentsTwoBooks() {
daoSchoolYear.insert(schoolYearFirstTermStarted());
daoTeachingMaterial.insert(teachingMaterialInBothTermsOfGrade(6));
daoStudent.insert(studentInGrade(6));
daoStudent.insert(studentInGrade(6));
vm.refresh();
vm.generateMaterialListGrades(new HashSet<>(daoGrade.findAll()));
assertEquals(2, amountOfTeachingMaterialsInMaterialListGrades());
}
@Test
public void testGenerateMaterialListTwoGradesThreeStudentsThreeBooks() {
daoSchoolYear.insert(schoolYearFirstTermStarted());
daoTeachingMaterial.insert(teachingMaterialInBothTermsOfGrade(6));
daoStudent.insert(studentInGrade(6));
daoStudent.insert(studentInGrade(6));
daoTeachingMaterial.insert(teachingMaterialInBothTermsOfGrade(7));
daoStudent.insert(studentInGrade(7));
vm.refresh();
vm.generateMaterialListGrades(new HashSet<>(daoGrade.findAll()));
assertEquals(3, amountOfTeachingMaterialsInMaterialListGrades());
}
@Test
public void testGenerateMaterialListThreeGradesFourStudentsThreeBooks() {
daoSchoolYear.insert(schoolYearFirstTermStarted());
daoTeachingMaterial.insert(teachingMaterialInBothTermsOfGrade(6));
daoStudent.insert(studentInGrade(6));
daoStudent.insert(studentInGrade(6));
daoTeachingMaterial.insert(teachingMaterialInBothTermsOfGrade(7));
daoStudent.insert(studentInGrade(7));
daoStudent.insert(studentInGrade(8));
vm.refresh();
vm.generateMaterialListGrades(new HashSet<>(daoGrade.findAll()));
assertEquals(3, amountOfTeachingMaterialsInMaterialListGrades());
}
}