Added test for leading competitor filter in polar mining

This commit is contained in:
Frederik Petersen committed 2015-03-18 10:10:00 +01:00
1 parent 0e1966dd23
commit f400435ccc
2 files changed
+142 -7

No files matched your search

@@ -0,0 +1,134 @@
package com.sap.sailing.polars.mining.test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import java.util.NavigableSet;
import org.junit.Test;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.polars.mining.PolarFixFilterCriteria;
import com.sap.sse.common.TimePoint;
public class PolarFixFilterCriteriaTest {
@Test
public void testLeadingCompetitorsFilterForReplayRaces() {
TrackedRace mockedTrackedRace = mock(TrackedRace.class);
when(mockedTrackedRace.isLive(any(TimePoint.class))).thenReturn(false);
RaceDefinition mockedRaceDefinition = mock(RaceDefinition.class);
when(mockedTrackedRace.getRace()).thenReturn(mockedRaceDefinition);
Course mockedCourse = mock(Course.class);
when(mockedRaceDefinition.getCourse()).thenReturn(mockedCourse);
Waypoint mockedFinish = mock(Waypoint.class);
when(mockedCourse.getLastWaypoint()).thenReturn(mockedFinish);
List<MarkPassing> markPassings = new ArrayList<>();
List<Competitor> competitors = new ArrayList<>();
for(int i = 0; i < 31; i++) {
Competitor mockedCompetitor = mock(Competitor.class);
competitors.add(mockedCompetitor);
MarkPassing mockedMarkPassing = mock(MarkPassing.class);
when(mockedMarkPassing.getCompetitor()).thenReturn(mockedCompetitor);
markPassings.add(mockedMarkPassing);
}
when(mockedTrackedRace.getMarkPassingsInOrder(mockedFinish)).thenReturn(markPassings);
when(mockedRaceDefinition.getCompetitors()).thenReturn(competitors);
//If pct is 0, only winner should be included
assertTrue(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(0), 0));
for(int i = 1; i < 31; i++) {
assertFalse(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 0));
}
//If pct is 0.1, only 3 should be included (floor)
for (int i = 0; i < 3; i++) {
assertTrue(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 0.1));
}
for(int i = 3; i < 31; i++) {
assertFalse(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 0.1));
}
//If pct is 0.15, only 5 should be included (ceil)
for (int i = 0; i < 5; i++) {
assertTrue(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 0.15));
}
for(int i = 5; i < 31; i++) {
assertFalse(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 0.15));
}
//If pct is 1, all 31 should be included
for (int i = 0; i < 31; i++) {
assertTrue(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 1));
}
}
@SuppressWarnings("unchecked")
@Test
public void testLeadingCompetitorsFilterForLiveRaces() {
TrackedRace mockedTrackedRace = mock(TrackedRace.class);
when(mockedTrackedRace.isLive(any(TimePoint.class))).thenReturn(true);
RaceDefinition mockedRaceDefinition = mock(RaceDefinition.class);
when(mockedTrackedRace.getRace()).thenReturn(mockedRaceDefinition);
MarkPassing mockedLastMarkPassing = mock(MarkPassing.class);
NavigableSet<MarkPassing> mockedCompetitorsMarkPassings = (NavigableSet<MarkPassing>) mock(NavigableSet.class);
when(mockedCompetitorsMarkPassings.last()).thenReturn(mockedLastMarkPassing);
when(mockedTrackedRace.getMarkPassings(any(Competitor.class))).thenReturn(mockedCompetitorsMarkPassings);
Waypoint mockedLastWayPoint = mock(Waypoint.class);
when(mockedLastMarkPassing.getWaypoint()).thenReturn(mockedLastWayPoint);
List<MarkPassing> markPassings = new ArrayList<>();
List<Competitor> competitors = new ArrayList<>();
for(int i = 0; i < 31; i++) {
Competitor mockedCompetitor = mock(Competitor.class);
competitors.add(mockedCompetitor);
MarkPassing mockedMarkPassing = mock(MarkPassing.class);
when(mockedMarkPassing.getCompetitor()).thenReturn(mockedCompetitor);
markPassings.add(mockedMarkPassing);
}
when(mockedTrackedRace.getMarkPassingsInOrder(mockedLastWayPoint)).thenReturn(markPassings);
when(mockedRaceDefinition.getCompetitors()).thenReturn(competitors);
//If pct is 0, only winner should be included
assertTrue(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(0), 0));
for(int i = 1; i < 31; i++) {
assertFalse(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 0));
}
//If pct is 0.1, only 3 should be included (floor)
for (int i = 0; i < 3; i++) {
assertTrue(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 0.1));
}
for(int i = 3; i < 31; i++) {
assertFalse(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 0.1));
}
//If pct is 0.15, only 5 should be included (ceil)
for (int i = 0; i < 5; i++) {
assertTrue(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 0.15));
}
for(int i = 5; i < 31; i++) {
assertFalse(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 0.15));
}
//If pct is 1, all 31 should be included
for (int i = 0; i < 31; i++) {
assertTrue(PolarFixFilterCriteria.isInLeadingCompetitors(mockedTrackedRace, competitors.get(i), 1));
}
}
}
@@ -30,7 +30,8 @@ public class PolarFixFilterCriteria implements FilterCriterion<GPSFixMovingWithP
/**
*
* @param pctOfLeadingCompetitorsToInclude
* 0 if no competitor should be included.<br \>
* 0 if only first competitor should be included.<br \>
* 0.1 if the best 10% should be included
* 1 if every competitor should be included
*/
public PolarFixFilterCriteria(double pctOfLeadingCompetitorsToInclude) {
@@ -90,9 +91,9 @@ public class PolarFixFilterCriteria implements FilterCriterion<GPSFixMovingWithP
Waypoint wayPoint = trackedRace.getMarkPassings(competitor).last().getWaypoint();
if (wayPoint != null) {
Iterator<MarkPassing> markPassingsAtCompetitorsLastWayPoint = trackedRace.getMarkPassingsInOrder(
trackedRace.getRace().getCourse().getLastWaypoint()).iterator();
for (int i = 0; i < ((int) Math.max(pctOfLeadingCompetitorsToInclude
* getNumberOfCompetitors(trackedRace), 1)); i++) {
wayPoint).iterator();
for (int i = 0; i < ((int) Math.max(Math.round(pctOfLeadingCompetitorsToInclude
* getNumberOfCompetitors(trackedRace)), 1)); i++) {
if (markPassingsAtCompetitorsLastWayPoint.hasNext()) {
if (markPassingsAtCompetitorsLastWayPoint.next().getCompetitor().equals(competitor)) {
result = true;
@@ -125,12 +126,12 @@ public class PolarFixFilterCriteria implements FilterCriterion<GPSFixMovingWithP
return result;
}
public static boolean isInLeadingCompetitorsForReplayRace(TrackedRace trackedRace, Competitor competitor, double pctOfLeadingCompetitorsToInclude) {
private static boolean isInLeadingCompetitorsForReplayRace(TrackedRace trackedRace, Competitor competitor, double pctOfLeadingCompetitorsToInclude) {
boolean result = false;
Iterator<MarkPassing> finishPassings = trackedRace
.getMarkPassingsInOrder(trackedRace.getRace().getCourse().getLastWaypoint()).iterator();
for (int i = 0; i < ((int) Math.max(pctOfLeadingCompetitorsToInclude
* getNumberOfCompetitors(trackedRace), 1)); i++) {
for (int i = 0; i < ((int) Math.max(Math.round(pctOfLeadingCompetitorsToInclude
* getNumberOfCompetitors(trackedRace)), 1)); i++) {
if (finishPassings.hasNext()) {
if (finishPassings.next().getCompetitor().equals(competitor)) {
result = true;