fixed a few minor problems for bug 844 and created a first passing test case

This commit is contained in:
Axel Uhl
2012-11-16 17:33:49 +01:00
parent 0d579745be
commit 60b943bb0a
4 changed files with 50 additions and 3 deletions
@@ -35,6 +35,7 @@ import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
@@ -600,6 +601,44 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest {
assertTrue(rankedCompetitors.indexOf(c[0]) == rankedCompetitors.indexOf(c[1])-1);
}
@Test
public void testScoringConsideringNotAllRaces() throws NoWindException {
// one discard at four races
Competitor[] c = createCompetitors(4).toArray(new Competitor[0]);
// Leaderboard: Accumulated with incremental discards
// R1 R2 R3 R4 R5 R6 R1 R2 R3 R4 R5 R6
// c[0]: 2 2 3 3 (4) 4 2 4 7 7 10 14
// c[1]: 3 3 2 (4) 3 3 3 6 8 8 11 14
// c[2]: 1 1 1 (2) 2 2 1 2 3 3 5 7
// c[3]:(4) 4 4 1 1 1 4 8 12 9 10 11
Competitor[] f1 = new Competitor[] { c[2], c[0], c[1], c[3] };
Competitor[] f2 = new Competitor[] { c[2], c[0], c[1], c[3] };
Competitor[] f3 = new Competitor[] { c[2], c[1], c[0], c[3] };
Competitor[] f4 = new Competitor[] { c[3], c[2], c[0], c[1] };
Competitor[] f5 = new Competitor[] { c[3], c[2], c[1], c[0] };
Competitor[] f6 = new Competitor[] { c[3], c[2], c[1], c[0] };
Regatta regatta = createRegatta(/* qualifying */0, new String[] { "Default" }, /* final */6, new String[] { "Default" },
/* medal */ false, "testTieBreakWithTwoVersusOneSeconds",
DomainFactory.INSTANCE.getOrCreateBoatClass("49er", /* typicallyStartsUpwind */true),
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT));
Leaderboard leaderboard = createLeaderboard(regatta, /* discarding thresholds */ new int[] { 4 });
TimePoint later = createAndAttachTrackedRaces(series.get(1), "Default", f1, f2, f3, f4, f5, f6);
Map<RaceColumn, List<Competitor>> rankedCompetitorsFromBestToWorstAfterEachRaceColumn =
leaderboard.getRankedCompetitorsFromBestToWorstAfterEachRaceColumn(later);
assertEquals(Arrays.asList(c[2], c[0], c[1], c[3]),
rankedCompetitorsFromBestToWorstAfterEachRaceColumn.get(Util.get(leaderboard.getRaceColumns(), 0)));
assertEquals(Arrays.asList(c[2], c[0], c[1], c[3]),
rankedCompetitorsFromBestToWorstAfterEachRaceColumn.get(Util.get(leaderboard.getRaceColumns(), 1)));
assertEquals(Arrays.asList(c[2], c[0], c[1], c[3]),
rankedCompetitorsFromBestToWorstAfterEachRaceColumn.get(Util.get(leaderboard.getRaceColumns(), 2)));
assertEquals(Arrays.asList(c[2], c[0], c[1], c[3]),
rankedCompetitorsFromBestToWorstAfterEachRaceColumn.get(Util.get(leaderboard.getRaceColumns(), 3)));
assertEquals(Arrays.asList(c[2], c[3], c[0], c[1]), // c[3] has one win, c[0] none
rankedCompetitorsFromBestToWorstAfterEachRaceColumn.get(Util.get(leaderboard.getRaceColumns(), 4)));
assertEquals(Arrays.asList(c[2], c[3], c[0], c[1]), // c[0] has more second places than c[1] (2 vs. 1)
rankedCompetitorsFromBestToWorstAfterEachRaceColumn.get(Util.get(leaderboard.getRaceColumns(), 5)));
}
@Test
public void testTieBreakByMedalRaceScoreOnlyIfEqualTotalScore() throws NoWindException {
Competitor[] c = createCompetitors(2).toArray(new Competitor[0]);
@@ -337,5 +337,12 @@ public interface Leaderboard extends Named {
* races attached to this leaderboard
*/
Long getTotalTimeSailedInMilliseconds(Competitor competitor, TimePoint timePoint);
/**
* Same as {@link #getTotalPoints(Competitor, RaceColumn, TimePoint)}, only that for determining the discarded
* results only <code>raceColumnsToConsider</code> are considered.
*/
Double getTotalPoints(Competitor competitor, RaceColumn raceColumn, Iterable<RaceColumn> raceColumnsToConsider,
TimePoint timePoint) throws NoWindException;
}
@@ -228,10 +228,11 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
return getTotalPoints(competitor, raceColumn, getRaceColumns(), timePoint);
}
private Double getTotalPoints(Competitor competitor, RaceColumn raceColumn,
@Override
public Double getTotalPoints(Competitor competitor, RaceColumn raceColumn,
Iterable<RaceColumn> raceColumnsToConsider, TimePoint timePoint) throws NoWindException {
Double result;
if (isDiscarded(competitor, raceColumn, timePoint)) {
if (isDiscarded(competitor, raceColumn, raceColumnsToConsider, timePoint)) {
result = 0.0;
} else {
final Double netPoints = getNetPoints(competitor, raceColumn, timePoint);
@@ -82,7 +82,7 @@ public class LeaderboardTotalRankComparator implements Comparator<Competitor> {
for (Competitor competitor : leaderboard.getCompetitors()) {
for (RaceColumn raceColumn : raceColumnsToConsider) {
totalPointsCache.put(new Pair<Competitor, RaceColumn>(competitor, raceColumn),
leaderboard.getTotalPoints(competitor, raceColumn, timePoint));
leaderboard.getTotalPoints(competitor, raceColumn, raceColumnsToConsider, timePoint));
}
}
}