package de.dhbw.humbuch.viewmodel;
import static de.dhbw.humbuch.test.TestUtils.borrowedMaterialReceivedInPast;
import static de.dhbw.humbuch.test.TestUtils.studentInGrade;
import static de.dhbw.humbuch.test.TestUtils.teachingMaterialInFirstTermOfGrade;
import static de.dhbw.humbuch.test.TestUtils.teachingMaterialInSecondTermOfGrade;
import static de.dhbw.humbuch.test.TestUtils.todayPlusDays;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.EntityManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
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.SchoolYear;
import de.dhbw.humbuch.model.entity.TestPersistenceInitialiser;
@RunWith(GuiceJUnitRunner.class)
@GuiceModules({ TestModuleWithoutSingletons.class })
public class ReturnViewModelTest extends BaseTest {
private ReturnViewModel vm;
private DAO<SchoolYear> daoSchoolYear;
private DAO<BorrowedMaterial> daoBorrowedMaterial;
@Inject
public void setInjected(TestPersistenceInitialiser persistenceInitialiser,
Provider<EntityManager> emProvider,
ReturnViewModel returnViewModel, DAO<SchoolYear> daoSchoolYear,
DAO<BorrowedMaterial> daoBorrowedMaterial) {
this.daoSchoolYear = daoSchoolYear;
this.daoBorrowedMaterial = daoBorrowedMaterial;
super.setInjected(persistenceInitialiser, emProvider);
this.vm = returnViewModel;
}
private void persistSchoolYear(int fromDays, int endFirstTermDays,
int beginSecondTermDays, int toDays) {
SchoolYear schoolYear = new SchoolYear.Builder("now",
todayPlusDays(fromDays), todayPlusDays(toDays))
.endFirstTerm(todayPlusDays(endFirstTermDays))
.beginSecondTerm(todayPlusDays(beginSecondTermDays)).build();
daoSchoolYear.insert(schoolYear);
}
private void persistSchoolYearFirstTermBegun() {
persistSchoolYear(-1, 1, 1, 2);
}
private void persistSchoolYearFirstTermEnded() {
persistSchoolYear(-2, -1, 1, 2);
}
private void persistSchoolYearSecondTermBegun() {
persistSchoolYear(-3, -2, -1, 1);
}
private void persistSchoolYearSecondTermEnded() {
persistSchoolYear(-9, -8, -7, -6);
}
/**
* Persist a {@link BorrowedMaterial} which is due after the first term end
*/
private BorrowedMaterial persistBorrowedMaterialDueAfterFirstTermOfThisGrade() {
BorrowedMaterial borrowedMaterial = borrowedMaterialReceivedInPast(
studentInGrade(6), teachingMaterialInFirstTermOfGrade(6));
return daoBorrowedMaterial.insert(borrowedMaterial);
}
/**
* Persist a {@link BorrowedMaterial} which is due after the second term end
*/
private BorrowedMaterial persistBorrowedMaterialDueAfterSecondTermOfThisGrade() {
BorrowedMaterial borrowedMaterial = borrowedMaterialReceivedInPast(
studentInGrade(6), teachingMaterialInSecondTermOfGrade(6));
return daoBorrowedMaterial.insert(borrowedMaterial);
}
/**
* Persist a {@link BorrowedMaterial} which is due after the second term end
* of last grade
*/
private BorrowedMaterial persistBorrowedMaterialDueAfterSecondTermOfLastGrade() {
BorrowedMaterial borrowedMaterial = borrowedMaterialReceivedInPast(
studentInGrade(6), teachingMaterialInSecondTermOfGrade(5));
return daoBorrowedMaterial.insert(borrowedMaterial);
}
/**
* Persist a {@link BorrowedMaterial} which is due after the first term end
* of last grade
*/
private BorrowedMaterial persistBorrowedMaterialDueAfterFirstTermOfLastGrade() {
BorrowedMaterial borrowedMaterial = borrowedMaterialReceivedInPast(
studentInGrade(6), teachingMaterialInFirstTermOfGrade(5));
return daoBorrowedMaterial.insert(borrowedMaterial);
}
@Before
public void refreshViewModel() {
vm.refresh();
}
@Test
public void testStateInitialisation() {
assertNotNull(vm.returnListStudent.get());
}
@Test
public void testNoBorrowedMaterials() {
assertEquals(0, vm.returnListStudent.get().size());
}
@Test
public void testZeroToReturnWhenInFirstTermBorrowedUntilSecondTerm() {
persistSchoolYearFirstTermBegun();
persistBorrowedMaterialDueAfterSecondTermOfThisGrade();
vm.refresh();
assertEquals(0, vm.returnListStudent.get().size());
}
@Test
public void testOneToReturnWhenAfterFirstTermBorrowedUntilFirstTerm() {
persistSchoolYearFirstTermEnded();
persistBorrowedMaterialDueAfterFirstTermOfThisGrade();
vm.refresh();
assertEquals(1, vm.returnListStudent.get().size());
}
@Test
public void testOneToReturnWhenInSecondTermBorrowedUntilFirstTerm() {
persistSchoolYearSecondTermBegun();
persistBorrowedMaterialDueAfterFirstTermOfThisGrade();
vm.refresh();
assertEquals(1, vm.returnListStudent.get().size());
}
@Test
public void testOneToReturnWhenAfterSecondTermBorrowedUntilFirstTerm() {
persistSchoolYearSecondTermEnded();
persistBorrowedMaterialDueAfterFirstTermOfThisGrade();
vm.refresh();
assertEquals(1, vm.returnListStudent.get().size());
}
@Test
public void testOneToReturnWhenAfterSecondTermBorrowedUntilSecondTerm() {
persistSchoolYearSecondTermEnded();
persistBorrowedMaterialDueAfterSecondTermOfThisGrade();
vm.refresh();
assertEquals(1, vm.returnListStudent.get().size());
}
@Test
public void testOneToReturnWhenInFirstTermBorrowedUntilSecondTermOfLastGrade() {
persistSchoolYearSecondTermEnded();
persistSchoolYearFirstTermBegun();
persistBorrowedMaterialDueAfterSecondTermOfLastGrade();
vm.refresh();
assertEquals(1, vm.returnListStudent.get().size());
}
@Test
public void testOneToReturnWhenInSecondTermBorrowedUntilSecondTermOfLastGrade() {
persistSchoolYearSecondTermEnded();
persistSchoolYearSecondTermBegun();
persistBorrowedMaterialDueAfterSecondTermOfLastGrade();
vm.refresh();
assertEquals(1, vm.returnListStudent.get().size());
}
@Test
public void testOneToReturnWhenInSecondTermBorrowedUntilFirstTermOfLastGrade() {
persistSchoolYearSecondTermEnded();
persistSchoolYearSecondTermBegun();
persistBorrowedMaterialDueAfterFirstTermOfLastGrade();
vm.refresh();
assertEquals(1, vm.returnListStudent.get().size());
}
@Test
public void testOneToReturnWhenInFirstTermBorrowedUntilFirstTermOfLastGrade() {
persistSchoolYearSecondTermEnded();
persistSchoolYearFirstTermBegun();
persistBorrowedMaterialDueAfterFirstTermOfLastGrade();
vm.refresh();
assertEquals(1, vm.returnListStudent.get().size());
}
@Test
public void testZeroToReturnAfterReturningOneToReturn() {
persistSchoolYearFirstTermEnded();
BorrowedMaterial borrowedMaterial = persistBorrowedMaterialDueAfterFirstTermOfThisGrade();
vm.refresh();
assertEquals(1, vm.returnListStudent.get().size());
Collection<BorrowedMaterial> borrowedMaterials = new ArrayList<>();
borrowedMaterials.add(borrowedMaterial);
vm.setBorrowedMaterialsReturned(borrowedMaterials);
vm.refresh();
assertEquals(0, vm.returnListStudent.get().size());
}
}