package edu.ualberta.med.biobank.test.reports; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.EnumSet; import java.util.List; import java.util.Map; import org.junit.Test; import edu.ualberta.med.biobank.common.util.DateCompare; import edu.ualberta.med.biobank.common.util.Mapper; import edu.ualberta.med.biobank.common.util.MapperUtil; import edu.ualberta.med.biobank.common.util.Predicate; import edu.ualberta.med.biobank.common.util.PredicateUtil; import edu.ualberta.med.biobank.common.wrappers.ProcessingEventWrapper; import edu.ualberta.med.biobank.common.wrappers.SpecimenWrapper; import edu.ualberta.med.biobank.common.wrappers.StudyWrapper; public class SpecimenTypePvCountTest extends AbstractReportTest { private static final Mapper<SpecimenWrapper, List<Object>, Long> GROUP_BY_PV_AND_SAMPLE_TYPE = new Mapper<SpecimenWrapper, List<Object>, Long>() { @Override public List<Object> getKey(SpecimenWrapper aliquot) { ProcessingEventWrapper pevent = aliquot.getProcessingEvent(); SpecimenWrapper parentSpc = aliquot.getParentSpecimen(); return Arrays.asList(new Object[] { pevent.getId(), parentSpc.getCollectionEvent().getPatient().getPnumber(), pevent.getCreatedAt(), parentSpc.getCreatedAt(), aliquot.getSpecimenType().getName() }); } @Override public Long getValue(SpecimenWrapper aliquot, Long count) { return count == null ? new Long(1) : new Long(count + 1); } }; private static final Comparator<List<Object>> ORDER_BY_PNUMBER_DATE_PROCESSED = new Comparator<List<Object>>() { @Override public int compare(List<Object> lhs, List<Object> rhs) { String lhsPnumber = (String) lhs.get(1); String rhsPnumber = (String) rhs.get(1); int cmp = compareStrings(lhsPnumber, rhsPnumber); if (cmp != 0) { return cmp; } Date lhsDateProcessed = (Date) lhs.get(2); Date rhsDateProcessed = (Date) rhs.get(2); return DateCompare.compare(rhsDateProcessed, lhsDateProcessed); } }; @Test public void testResults() throws Exception { for (StudyWrapper study : getStudies()) { checkResults(study.getNameShort()); } } @Test public void testEmptyStudyName() throws Exception { checkResults(""); } @Override protected Collection<Object> getExpectedResults() throws Exception { String studyNameShort = (String) getReport().getParams().get(0); Collection<SpecimenWrapper> allAliquots = getSpecimens(); @SuppressWarnings("unchecked") Collection<SpecimenWrapper> filteredAliquots = PredicateUtil.filter( allAliquots, PredicateUtil.andPredicate( ALIQUOT_NOT_IN_SENT_SAMPLE_CONTAINER, aliquotStudyNameShortLike(studyNameShort), aliquotSite(isInSite(), getSiteId()), ALIQUOT_HAS_POSITION)); Map<List<Object>, Long> groupedData = MapperUtil.map(filteredAliquots, GROUP_BY_PV_AND_SAMPLE_TYPE); List<List<Object>> keys = new ArrayList<List<Object>>( groupedData.keySet()); Collections.sort(keys, ORDER_BY_PNUMBER_DATE_PROCESSED); List<Object> expectedResults = new ArrayList<Object>(); for (List<Object> key : keys) { List<Object> params = new ArrayList<Object>(); params.add(key.get(1)); params.add(key.get(2)); params.add(key.get(3)); params.add(key.get(4)); params.add(groupedData.get(key)); expectedResults.add(params.toArray()); } return expectedResults; } private void checkResults(String studyNameShort) throws Exception { getReport().setParams(Arrays.asList((Object) studyNameShort)); checkResults(EnumSet.of(CompareResult.SIZE)); } private static Predicate<SpecimenWrapper> aliquotStudyNameShortLike( final String studyNameShort) { return new Predicate<SpecimenWrapper>() { @Override public boolean evaluate(SpecimenWrapper aliquot) { return aliquot.getCollectionEvent().getPatient().getStudy() .getNameShort().equals(studyNameShort); } }; } }