From aeeb3cedbedd6881d023a63e9fb76304308a9bdd Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 14 Oct 2016 12:55:04 +0200 Subject: [PATCH] fix for bug 3955: apply scores from RaceLog only if explicit or no MaxPointsReason is set; adjusted test; formerly failing test passes now Change-Id: Idf2085e122eb0b30c86be0c254f360407c1819f9 --- .../test/ApplyScoresFromRaceLogTest.java | 22 +++++++++---------- .../server/impl/RaceLogScoringReplicator.java | 14 +++++++++--- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/ApplyScoresFromRaceLogTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/ApplyScoresFromRaceLogTest.java index a5c20e7e880..907301a3d26 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/ApplyScoresFromRaceLogTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/ApplyScoresFromRaceLogTest.java @@ -97,12 +97,12 @@ public class ApplyScoresFromRaceLogTest extends LeaderboardScoringAndRankingTest assertEquals(competitors, rankedCompetitorsBeforeApplying); // no effects of preliminary results list yet f1RaceState.setFinishPositioningConfirmed(now); for (final Competitor c : competitors) { - assertEquals(scores.get(c)==null?competitors.indexOf(c)+1:scores.get(c), leaderboard.getTotalPoints(c, f1Column, now), 0.00000001); + assertEquals(scores.get(c)==null?(mprs.get(c) == null || mprs.get(c) == MaxPointsReason.NONE ? competitors.indexOf(c)+1 : competitors.size()+1):scores.get(c), leaderboard.getTotalPoints(c, f1Column, now), 0.00000001); } final List expectedNewOrder = new ArrayList<>(competitors); expectedNewOrder.sort((c1, c2)-> - new Double(scores.get(c1)==null?competitors.indexOf(c1)+1:scores.get(c1)).compareTo( - new Double(scores.get(c2)==null?competitors.indexOf(c2)+1:scores.get(c2)))); + new Double(scores.get(c1)==null?(mprs.get(c1) == null || mprs.get(c1) == MaxPointsReason.NONE ? competitors.indexOf(c1)+1 : competitors.size()+1):scores.get(c1)).compareTo( + new Double(scores.get(c2)==null?(mprs.get(c2) == null || mprs.get(c2) == MaxPointsReason.NONE ? competitors.indexOf(c2)+1 : competitors.size()+1):scores.get(c2)))); final List rankedCompetitorsAfterApplying = leaderboard.getCompetitorsFromBestToWorst(later); assertEquals(expectedNewOrder, rankedCompetitorsAfterApplying); } @@ -162,14 +162,14 @@ public class ApplyScoresFromRaceLogTest extends LeaderboardScoringAndRankingTest assertEquals(competitors, rankedCompetitorsBeforeApplying); // no effects of preliminary results list yet f1RaceState.setFinishPositioningConfirmed(now); - assertScoreCorrections(leaderboard, f1Column, competitors.get(0), MaxPointsReason.DNF, 0, /* score is corrected */ false, later); - assertScoreCorrections(leaderboard, f1Column, competitors.get(1), MaxPointsReason.OCS, 0, /* score is corrected */ false, later); - assertScoreCorrections(leaderboard, f1Column, competitors.get(2), MaxPointsReason.DNF, 0.1, /* score is corrected */ true, later); - assertScoreCorrections(leaderboard, f1Column, competitors.get(3), MaxPointsReason.OCS, 0.2, /* score is corrected */ true, later); - assertScoreCorrections(leaderboard, f1Column, competitors.get(4), null, 6, /* score is corrected */ false, later); - assertScoreCorrections(leaderboard, f1Column, competitors.get(5), null, 2.4, /* score is corrected */ true, later); - assertScoreCorrections(leaderboard, f1Column, competitors.get(6), MaxPointsReason.NONE, 4, /* score is corrected */ false, later); - assertScoreCorrections(leaderboard, f1Column, competitors.get(7), MaxPointsReason.NONE, 3.3, /* score is corrected */ true, later); + assertScoreCorrections(leaderboard, f1Column, competitors.get(0), MaxPointsReason.DNF, 0, /* score is corrected */ false, later); + assertScoreCorrections(leaderboard, f1Column, competitors.get(1), MaxPointsReason.OCS, 0, /* score is corrected */ false, later); + assertScoreCorrections(leaderboard, f1Column, competitors.get(2), MaxPointsReason.DNF, 0.1, /* score is corrected */ true, later); + assertScoreCorrections(leaderboard, f1Column, competitors.get(3), MaxPointsReason.OCS, 0.2, /* score is corrected */ true, later); + assertScoreCorrections(leaderboard, f1Column, competitors.get(4), MaxPointsReason.NONE, 6, /* score is corrected */ true, later); // score corrected based on rank because no MaxPointsReason set + assertScoreCorrections(leaderboard, f1Column, competitors.get(5), MaxPointsReason.NONE, 2.4, /* score is corrected */ true, later); // score corrected based on explicit score + assertScoreCorrections(leaderboard, f1Column, competitors.get(6), MaxPointsReason.NONE, 4, /* score is corrected */ true, later); // score corrected based on rank because MaxPointsReason.NONE set + assertScoreCorrections(leaderboard, f1Column, competitors.get(7), MaxPointsReason.NONE, 3.3, /* score is corrected */ true, later); // score corrected based on explicit score } private void assertScoreCorrections(Leaderboard leaderboard, RaceColumn raceColumn, Competitor competitor, diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java index dc88222e500..cd71012d9e0 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java @@ -143,9 +143,17 @@ public class RaceLogScoringReplicator implements RaceColumnListener { if (positioningList != null) { for (CompetitorResult positionedCompetitor : positioningList) { Competitor competitor = service.getBaseDomainFactory().getExistingCompetitorById(positionedCompetitor.getCompetitorId()); - int rankByRaceCommittee = getRankInPositioningListByRaceCommittee(positionedCompetitor); - correctScoreInLeaderboard(leaderboard, raceColumn, timePoint, numberOfCompetitorsInRace, - competitor, rankByRaceCommittee, positionedCompetitor.getScore()); + // The score is updated when explicitly provided or when no penalty was set; + // in turn, this means that when a penalty is set and no score is explicitly provided, + // it is up to the scoring scheme to infer a penalty score for the MaxPointsReason. + // See also bug 3955. + if (positionedCompetitor.getScore() != null + || positionedCompetitor.getMaxPointsReason() == null + || positionedCompetitor.getMaxPointsReason().equals(MaxPointsReason.NONE)) { + int rankByRaceCommittee = getRankInPositioningListByRaceCommittee(positionedCompetitor); + correctScoreInLeaderboard(leaderboard, raceColumn, timePoint, numberOfCompetitorsInRace, competitor, + rankByRaceCommittee, positionedCompetitor.getScore()); + } setMaxPointsReasonInLeaderboardIfNecessary(leaderboard, raceColumn, timePoint, positionedCompetitor.getMaxPointsReason(), competitor); } // Since the metadata update is used by the Sailing suite to determine the final state of a race, it has to