diff --git a/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/mining/test/PolarFixFilterCriteriaTest.java b/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/mining/test/PolarFixFilterCriteriaTest.java new file mode 100644 index 00000000000..13db7a4b533 --- /dev/null +++ b/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/mining/test/PolarFixFilterCriteriaTest.java @@ -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 markPassings = new ArrayList<>(); + List 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 mockedCompetitorsMarkPassings = (NavigableSet) 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 markPassings = new ArrayList<>(); + List 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)); + } + } + +} diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarFixFilterCriteria.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarFixFilterCriteria.java index 8c8e2a9a78c..0721d7d8536 100644 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarFixFilterCriteria.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarFixFilterCriteria.java @@ -30,7 +30,8 @@ public class PolarFixFilterCriteria implements FilterCriterion + * 0 if only first competitor should be included.
+ * 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 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 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;