838d04898aa029a20a2d85a172656180740c4b9b
java/com.sap.sailing.domain.test/SailingDomainTest (No Proxy).launch
| ... | ... | @@ -19,16 +19,9 @@ |
| 19 | 19 | <stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=com.sap.sailing.domain.test/src<com.sap.sailing.domain.test"/> |
| 20 | 20 | <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> |
| 21 | 21 | <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> |
| 22 | - <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/> |
|
| 22 | + <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit5"/> |
|
| 23 | 23 | <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_CLASSPATH_ONLY_JAR" value="false"/> |
| 24 | 24 | <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/> |
| 25 | - <listAttribute key="org.eclipse.jdt.launching.CLASSPATH"> |
|
| 26 | - <listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8" javaProject="com.sap.sailing.domain.test" path="1" type="4"/> "/> |
|
| 27 | - <listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.domain.test"/> </runtimeClasspathEntry> "/> |
|
| 28 | - <listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="ECLIPSE_HOME/plugins/net.bytebuddy.byte-buddy_1.12.18.v20221114-2102.jar" path="3" type="3"/> "/> |
|
| 29 | - <listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="ECLIPSE_HOME/plugins/net.bytebuddy.byte-buddy-agent_1.12.18.v20221114-2102.jar" path="3" type="3"/> "/> |
|
| 30 | - </listAttribute> |
|
| 31 | - <booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/> |
|
| 32 | 25 | <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/> |
| 33 | 26 | <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.domain.test"/> |
| 34 | 27 | <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea -DspatialWind=true"/> |
java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingForLowPointsTest.java
| ... | ... | @@ -2,6 +2,7 @@ package com.sap.sailing.domain.test; |
| 2 | 2 | |
| 3 | 3 | import static org.junit.jupiter.api.Assertions.assertEquals; |
| 4 | 4 | import static org.junit.jupiter.api.Assertions.assertSame; |
| 5 | +import static org.junit.jupiter.api.Assertions.assertTrue; |
|
| 5 | 6 | |
| 6 | 7 | import java.util.ArrayList; |
| 7 | 8 | import java.util.Arrays; |
| ... | ... | @@ -172,6 +173,94 @@ public class LeaderboardScoringAndRankingForLowPointsTest extends LeaderboardSco |
| 172 | 173 | } |
| 173 | 174 | |
| 174 | 175 | @Test |
| 176 | + public void testA8TieBreakForMulitpleMedalRacesWithCarryColumn() { |
|
| 177 | + final TimePoint now = TimePoint.now(); |
|
| 178 | + series = new ArrayList<>(); |
|
| 179 | + final List<Fleet> fleets = new ArrayList<>(); |
|
| 180 | + final Fleet defaultFleet = new FleetImpl("Default"); |
|
| 181 | + fleets.add(defaultFleet); |
|
| 182 | + final List<String> raceColumnNames = Arrays.asList("R1", "R2", "R3", "R4", "R5"); |
|
| 183 | + Series openingSeries = new SeriesImpl("Opening", /* isMedal */ false, |
|
| 184 | + /* isFleetsCanRunInParallel */ true, fleets, raceColumnNames, |
|
| 185 | + /* trackedRegattaRegistry */ null); |
|
| 186 | + series.add(openingSeries); |
|
| 187 | + final List<Fleet> medalFleet = new ArrayList<>(); |
|
| 188 | + final Fleet medalDefaultFleet = new FleetImpl("Default"); |
|
| 189 | + medalFleet.add(medalDefaultFleet); |
|
| 190 | + final List<String> medalRaceColumnNames = Arrays.asList("Carry", "F1", "F2"); |
|
| 191 | + final Series medalSeries = new SeriesImpl("Medal", /* isMedal */ true, /* isFleetsCanRunInParallel */ true, |
|
| 192 | + medalFleet, medalRaceColumnNames, /* trackedRegattaRegistry */ null); |
|
| 193 | + medalSeries.setFirstColumnIsNonDiscardableCarryForward(true); |
|
| 194 | + medalSeries.setStartsWithZeroScore(true); |
|
| 195 | + series.add(medalSeries); |
|
| 196 | + final Regatta regatta = setupRegatta(/* use first two wins */ false); // regular LowPoint |
|
| 197 | + final List<Competitor> competitors = createCompetitors(20); |
|
| 198 | + for (final RaceColumn openingSeriesRaceColumn : openingSeries.getRaceColumns()) { |
|
| 199 | + openingSeriesRaceColumn.setTrackedRace(defaultFleet, new MockedTrackedRaceWithStartTimeAndRanks(now, competitors)); |
|
| 200 | + } |
|
| 201 | + final Leaderboard leaderboard = createLeaderboard(regatta, /* discarding thresholds */ new int[0]); |
|
| 202 | + final RaceColumn carryColumn = leaderboard.getRaceColumnByName("Carry"); |
|
| 203 | + final Competitor thirdAfterOpeningSeries = Util.get(leaderboard.getCompetitorsFromBestToWorst(now), 2); |
|
| 204 | + final double scoreOfThirdAfterOpeningSeries = leaderboard.getNetPoints(thirdAfterOpeningSeries, now); |
|
| 205 | + for (int medalRaceCompetitorIndex=0; medalRaceCompetitorIndex<10; medalRaceCompetitorIndex++) { |
|
| 206 | + final double regularScore = leaderboard.getNetPoints(competitors.get(medalRaceCompetitorIndex), now); |
|
| 207 | + leaderboard.getScoreCorrection().correctScore(competitors.get(medalRaceCompetitorIndex), carryColumn, Math.min(regularScore, scoreOfThirdAfterOpeningSeries+18)); |
|
| 208 | + } |
|
| 209 | + final RaceColumn f1 = leaderboard.getRaceColumnByName("F1"); |
|
| 210 | + final RaceColumn f2 = leaderboard.getRaceColumnByName("F2"); |
|
| 211 | + carryColumn.setFactor(1.0); |
|
| 212 | + f1.setFactor(1.0); |
|
| 213 | + f2.setFactor(1.0); |
|
| 214 | + // construct a tie between C1 and C2 (index 0 and 1, respectively); the tie is expected to be broken |
|
| 215 | + // in favor of C2 because C2 must have performed better in the medal races F1/F2 due to the worse |
|
| 216 | + // carried score |
|
| 217 | + assertEquals(raceColumnNames.size(), leaderboard.getNetPoints(competitors.get(0), carryColumn, now), EPSILON); |
|
| 218 | + leaderboard.getScoreCorrection().correctScore(competitors.get(0), f1, 7.0); |
|
| 219 | + leaderboard.getScoreCorrection().correctScore(competitors.get(0), f2, 3.0); // medal series: 5 (Carry) + 7 + 3 = 15 |
|
| 220 | + assertEquals(2*raceColumnNames.size(), leaderboard.getNetPoints(competitors.get(1), carryColumn, now), EPSILON); |
|
| 221 | + leaderboard.getScoreCorrection().correctScore(competitors.get(1), f1, 1.0); |
|
| 222 | + leaderboard.getScoreCorrection().correctScore(competitors.get(1), f2, 4.0); // medal series: 10 (Carry) + 1 + 4 = 15 |
|
| 223 | + assertEquals(leaderboard.getNetPoints(competitors.get(0), now), leaderboard.getNetPoints(competitors.get(1), now), EPSILON); |
|
| 224 | + // construct a tie between C9 and C10 (index 8 and 9, respectively); the tie is expected to be broken |
|
| 225 | + // in favor of C9 because although both carried the same number of points from the open series due |
|
| 226 | + // to the "reduced points" rule, and both scores equal points in total in F1 and F2, C9 had the better |
|
| 227 | + // best score. |
|
| 228 | + assertEquals(leaderboard.getNetPoints(competitors.get(8), carryColumn, now), leaderboard.getNetPoints(competitors.get(9), carryColumn, now), EPSILON); |
|
| 229 | + leaderboard.getScoreCorrection().correctScore(competitors.get(8), f1, 7.0); |
|
| 230 | + leaderboard.getScoreCorrection().correctScore(competitors.get(8), f2, 5.0); |
|
| 231 | + leaderboard.getScoreCorrection().correctScore(competitors.get(9), f1, 6.0); |
|
| 232 | + leaderboard.getScoreCorrection().correctScore(competitors.get(9), f2, 6.0); |
|
| 233 | + assertEquals(leaderboard.getNetPoints(competitors.get(8), now), leaderboard.getNetPoints(competitors.get(9), now), EPSILON); |
|
| 234 | + // construct a tie between C7 and C8 (index 6 and 7, respectively); the tie is based on |
|
| 235 | + // equal carried points and equal medal series points throughout (both DNF in F1 and F2), |
|
| 236 | + // but C7 is expected to be ranked better because of the better rank in the opening series, |
|
| 237 | + // only it got "squashed" to the same reduced points as those of C8, but the tie break would |
|
| 238 | + // have to go by opening series rank as a last resort: |
|
| 239 | + assertEquals(leaderboard.getNetPoints(competitors.get(6), carryColumn, now), leaderboard.getNetPoints(competitors.get(7), carryColumn, now), EPSILON); |
|
| 240 | + leaderboard.getScoreCorrection().correctScore(competitors.get(6), f1, 11.0); |
|
| 241 | + leaderboard.getScoreCorrection().setMaxPointsReason(competitors.get(6), f1, MaxPointsReason.DNF); |
|
| 242 | + leaderboard.getScoreCorrection().correctScore(competitors.get(6), f2, 11.0); |
|
| 243 | + leaderboard.getScoreCorrection().setMaxPointsReason(competitors.get(6), f2, MaxPointsReason.DNF); |
|
| 244 | + leaderboard.getScoreCorrection().correctScore(competitors.get(7), f1, 11.0); |
|
| 245 | + leaderboard.getScoreCorrection().setMaxPointsReason(competitors.get(7), f1, MaxPointsReason.DNF); |
|
| 246 | + leaderboard.getScoreCorrection().correctScore(competitors.get(7), f2, 11.0); |
|
| 247 | + leaderboard.getScoreCorrection().setMaxPointsReason(competitors.get(7), f2, MaxPointsReason.DNF); |
|
| 248 | + // construct scores for the remaining competitors C3..C6 |
|
| 249 | + leaderboard.getScoreCorrection().correctScore(competitors.get(2), f1, 2.0); |
|
| 250 | + leaderboard.getScoreCorrection().correctScore(competitors.get(3), f1, 3.0); |
|
| 251 | + leaderboard.getScoreCorrection().correctScore(competitors.get(4), f1, 4.0); |
|
| 252 | + leaderboard.getScoreCorrection().correctScore(competitors.get(5), f1, 8.0); |
|
| 253 | + leaderboard.getScoreCorrection().correctScore(competitors.get(2), f2, 1.0); |
|
| 254 | + leaderboard.getScoreCorrection().correctScore(competitors.get(3), f2, 2.0); |
|
| 255 | + leaderboard.getScoreCorrection().correctScore(competitors.get(4), f2, 5.0); |
|
| 256 | + leaderboard.getScoreCorrection().correctScore(competitors.get(5), f2, 8.0); |
|
| 257 | + final Iterable<Competitor> ranking = leaderboard.getCompetitorsFromBestToWorst(now); |
|
| 258 | + assertTrue(Util.indexOf(ranking, competitors.get(6)) < Util.indexOf(ranking, competitors.get(7))); |
|
| 259 | + assertTrue(Util.indexOf(ranking, competitors.get(8)) < Util.indexOf(ranking, competitors.get(9))); |
|
| 260 | + assertTrue(Util.indexOf(ranking, competitors.get(1)) < Util.indexOf(ranking, competitors.get(0))); |
|
| 261 | + } |
|
| 262 | + |
|
| 263 | + @Test |
|
| 175 | 264 | public void testMultipleRDGsAndSCAs() { |
| 176 | 265 | final TimePoint now = TimePoint.now(); |
| 177 | 266 | final TimePoint later = now.plus(Duration.ONE_MINUTE); |
java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoringScheme.java
| ... | ... | @@ -100,7 +100,6 @@ public interface ScoringScheme extends Serializable { |
| 100 | 100 | * scores of the first competitor, in the order of race columns in the leaderboard |
| 101 | 101 | * @param competitor2Scores |
| 102 | 102 | * scores of the second competitor, in the order of race columns in the leaderboard |
| 103 | - * @param raceColumnsToConsider TODO |
|
| 104 | 103 | * @param discardedRaceColumnsPerCompetitor |
| 105 | 104 | * for each competitor holds the result of {@link Leaderboard#getResultDiscardingRule() |
| 106 | 105 | * Leaderborad.getResultDiscardingRule()}{@code .}{@link ResultDiscardingRule#getDiscardedRaceColumns(Competitor, Leaderboard, Iterable, TimePoint, ScoringScheme) |
| ... | ... | @@ -108,8 +107,11 @@ public interface ScoringScheme extends Serializable { |
| 108 | 107 | * for each competitor again. |
| 109 | 108 | */ |
| 110 | 109 | int compareByBetterScore(Competitor o1, List<Util.Pair<RaceColumn, Double>> competitor1Scores, Competitor o2, |
| 111 | - List<Util.Pair<RaceColumn, Double>> competitor2Scores, Iterable<RaceColumn> raceColumnsToConsider, boolean nullScoresAreBetter, |
|
| 112 | - TimePoint timePoint, Leaderboard leaderboard, Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor, BiFunction<Competitor, RaceColumn, Double> totalPointsSupplier, WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache); |
|
| 110 | + List<Util.Pair<RaceColumn, Double>> competitor2Scores, Iterable<RaceColumn> raceColumnsToConsider, |
|
| 111 | + boolean nullScoresAreBetter, TimePoint timePoint, Leaderboard leaderboard, |
|
| 112 | + Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor, |
|
| 113 | + BiFunction<Competitor, RaceColumn, Double> totalPointsSupplier, |
|
| 114 | + WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache); |
|
| 113 | 115 | |
| 114 | 116 | /** |
| 115 | 117 | * In case two competitors scored in different numbers of races, this scoring scheme decides whether this |
| ... | ... | @@ -349,14 +351,29 @@ public interface ScoringScheme extends Serializable { |
| 349 | 351 | } |
| 350 | 352 | |
| 351 | 353 | /** |
| 352 | - * Precondition: either both scored in medal race or both didn't. If both scored, the better score wins. |
|
| 354 | + * Precondition: either both scored in medal race or both didn't. If both scored, the better score sum wins. If both |
|
| 355 | + * scored the same sum in the medal races, apply |
|
| 356 | + * {@link #compareByScoreSum(Competitor, List, double, Competitor, List, double, boolean, boolean, Supplier)} to |
|
| 357 | + * apply the same tie breaking to the medal races as for other series. |
|
| 358 | + * <p> |
|
| 359 | + * |
|
| 353 | 360 | * This is to be applied only if the net score of both competitors are equal to each other. |
| 354 | 361 | */ |
| 355 | - default int compareByMedalRaceScore(Double o1MedalRaceScore, Double o2MedalRaceScore, boolean nullScoresAreBetter) { |
|
| 362 | + default int compareByMedalRaceScore(Competitor o1, Competitor o2, Double o1MedalRaceScore, Double o2MedalRaceScore, |
|
| 363 | + List<Pair<RaceColumn, Double>> o1ScoringMedalRaces, List<Pair<RaceColumn, Double>> o2ScoringMedalRaces, |
|
| 364 | + TimePoint timePoint, Leaderboard leaderboard, |
|
| 365 | + Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor, |
|
| 366 | + BiFunction<Competitor, RaceColumn, Double> totalPointsSupplier, boolean nullScoresAreBetter, |
|
| 367 | + WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache) { |
|
| 356 | 368 | assert o1MedalRaceScore != null || o2MedalRaceScore == null; |
| 357 | - final int result; |
|
| 369 | + int result; |
|
| 358 | 370 | if (o1MedalRaceScore != null) { |
| 359 | 371 | result = getScoreComparator(nullScoresAreBetter).compare(o1MedalRaceScore, o2MedalRaceScore); |
| 372 | + if (result == 0 && o1ScoringMedalRaces.size() > 1) { // only work calling if more than one scoring medal race |
|
| 373 | + result = compareByBetterScore(o1, o1ScoringMedalRaces, o2, o2ScoringMedalRaces, |
|
| 374 | + Util.map(o1ScoringMedalRaces, Pair::getA), nullScoresAreBetter, timePoint, leaderboard, |
|
| 375 | + discardedRaceColumnsPerCompetitor, totalPointsSupplier, cache); |
|
| 376 | + } |
|
| 360 | 377 | } else { |
| 361 | 378 | result = 0; |
| 362 | 379 | } |
| ... | ... | @@ -375,7 +392,9 @@ public interface ScoringScheme extends Serializable { |
| 375 | 392 | |
| 376 | 393 | default int compareByLastMedalRacesCriteria(Competitor o1, List<Pair<RaceColumn, Double>> o1Scores, Competitor o2, |
| 377 | 394 | List<Pair<RaceColumn, Double>> o2Scores, boolean nullScoresAreBetter, Leaderboard leaderboard, |
| 378 | - Iterable<RaceColumn> raceColumnsToConsider, BiFunction<Competitor, RaceColumn, Double> totalPointsSupplier, WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache, TimePoint timePoint, int zeroBasedIndexOfLastMedalSeriesInWhichBothScored, int numberOfMedalRacesWonO1, int numberOfMedalRacesWonO2) { |
|
| 395 | + Iterable<RaceColumn> raceColumnsToConsider, BiFunction<Competitor, RaceColumn, Double> totalPointsSupplier, |
|
| 396 | + WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache, TimePoint timePoint, int zeroBasedIndexOfLastMedalSeriesInWhichBothScored, |
|
| 397 | + int numberOfMedalRacesWonO1, int numberOfMedalRacesWonO2) { |
|
| 379 | 398 | return 0; |
| 380 | 399 | } |
| 381 | 400 |
java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardTotalRankComparator.java
| ... | ... | @@ -169,8 +169,10 @@ public class LeaderboardTotalRankComparator implements Comparator<Competitor> { |
| 169 | 169 | List<Util.Pair<RaceColumn, Double>> o2TotalPoints = new ArrayList<>(); |
| 170 | 170 | double o1ScoreSum = getLeaderboard().getCarriedPoints(o1); |
| 171 | 171 | double o2ScoreSum = getLeaderboard().getCarriedPoints(o2); |
| 172 | - Double o1MedalRaceScore = 0.0; // "blindly" adds them all up, regardless of "series starts with zero score" |
|
| 173 | - Double o2MedalRaceScore = 0.0; // "blindly" adds them all up, regardless of "series starts with zero score" |
|
| 172 | + final List<Util.Pair<RaceColumn, Double>> o1ScoringMedalRaces = new ArrayList<>(); |
|
| 173 | + final List<Util.Pair<RaceColumn, Double>> o2ScoringMedalRaces = new ArrayList<>(); |
|
| 174 | + Double o1MedalRaceScoreSum = 0.0; // "blindly" adds them all up, regardless of "series starts with zero score" |
|
| 175 | + Double o2MedalRaceScoreSum = 0.0; // "blindly" adds them all up, regardless of "series starts with zero score" |
|
| 174 | 176 | Double o1CarryForwardScoreInMedals = null; |
| 175 | 177 | Double o2CarryForwardScoreInMedals = null; |
| 176 | 178 | // When a column has isStartsWithZeroScore, the competitor's score only need to be reset to zero if from there on |
| ... | ... | @@ -240,10 +242,12 @@ public class LeaderboardTotalRankComparator implements Comparator<Competitor> { |
| 240 | 242 | // only count the score for the medal race score if it wasn't a carry-forward column |
| 241 | 243 | if (!raceColumn.isCarryForward()) { |
| 242 | 244 | if (o1Score != null) { |
| 243 | - o1MedalRaceScore += o1Score; |
|
| 245 | + o1MedalRaceScoreSum += o1Score; |
|
| 246 | + o1ScoringMedalRaces.add(new Pair<>(raceColumn, o1Score)); |
|
| 244 | 247 | } |
| 245 | 248 | if (o2Score != null) { |
| 246 | - o2MedalRaceScore += o2Score; |
|
| 249 | + o2MedalRaceScoreSum += o2Score; |
|
| 250 | + o2ScoringMedalRaces.add(new Pair<>(raceColumn, o2Score)); |
|
| 247 | 251 | } |
| 248 | 252 | } else { |
| 249 | 253 | o1CarryForwardScoreInMedals = o1Score; |
| ... | ... | @@ -316,16 +320,23 @@ public class LeaderboardTotalRankComparator implements Comparator<Competitor> { |
| 316 | 320 | if (result == 0) { |
| 317 | 321 | result = scoringScheme.compareByLastMedalRacesCriteria(o1, o1Scores, o2, o2Scores, nullScoresAreBetter, leaderboard, |
| 318 | 322 | raceColumnsToConsider, |
| 319 | - (competitor, raceColumn)->totalPointsCache.get(new Pair<>(competitor, raceColumn)), cache, timePoint, zeroBasedIndexOfLastMedalSeriesInWhichO1Scored, numberOfMedalRacesWonO1, numberOfMedalRacesWonO2); |
|
| 323 | + (competitor, raceColumn)->totalPointsCache.get(new Pair<>(competitor, raceColumn)), cache, timePoint, |
|
| 324 | + zeroBasedIndexOfLastMedalSeriesInWhichO1Scored, numberOfMedalRacesWonO1, numberOfMedalRacesWonO2); |
|
| 320 | 325 | if (result == 0) { |
| 321 | - result = scoringScheme.compareByMedalRaceScore(o1MedalRaceScore, o2MedalRaceScore, nullScoresAreBetter); |
|
| 326 | + result = scoringScheme.compareByMedalRaceScore(o1, o2, o1MedalRaceScoreSum, |
|
| 327 | + o2MedalRaceScoreSum, o1ScoringMedalRaces, o2ScoringMedalRaces, timePoint, |
|
| 328 | + leaderboard, Collections.unmodifiableMap(discardedRaceColumnsPerCompetitor), |
|
| 329 | + (competitor1, raceColumn1) -> totalPointsCache |
|
| 330 | + .get(new Pair<>(competitor1, raceColumn1)), |
|
| 331 | + nullScoresAreBetter, cache); |
|
| 322 | 332 | if (result == 0) { |
| 323 | 333 | result = scoringScheme.compareByBetterScore(o1, Collections.unmodifiableList(o1TotalPoints), |
| 324 | 334 | o2, Collections.unmodifiableList(o2TotalPoints), |
| 325 | 335 | raceColumnsToConsider, nullScoresAreBetter, timePoint, |
| 326 | 336 | leaderboard, |
| 327 | 337 | Collections.unmodifiableMap(discardedRaceColumnsPerCompetitor), |
| 328 | - (competitor1, raceColumn1) -> totalPointsCache.get(new Pair<>(competitor1, raceColumn1)), cache); |
|
| 338 | + (competitor1, raceColumn1) -> totalPointsCache.get(new Pair<>(competitor1, raceColumn1)), |
|
| 339 | + cache); |
|
| 329 | 340 | if (result == 0) { |
| 330 | 341 | // compare by last race: |
| 331 | 342 | result = scoringScheme.compareByLastRace(o1TotalPoints, o2TotalPoints, nullScoresAreBetter, o1, o2, timePoint, cache); |
java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointFirstToWinThreeRaces.java
| ... | ... | @@ -355,7 +355,7 @@ public class LowPointFirstToWinThreeRaces extends LowPoint { |
| 355 | 355 | * {@link #compareByMedalRacesWon(int, int)} instead. |
| 356 | 356 | */ |
| 357 | 357 | @Override |
| 358 | - public int compareByMedalRaceScore(Double o1MedalRaceScore, Double o2MedalRaceScore, boolean nullScoresAreBetter) { |
|
| 358 | + public int compareByMedalRaceScore(Competitor o1, Competitor o2, Double o1MedalRaceScore, Double o2MedalRaceScore, List<Pair<RaceColumn, Double>> o1ScoringMedalRaces, List<Pair<RaceColumn, Double>> o2ScoringMedalRaces, TimePoint timePoint, Leaderboard leaderboard, Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor, BiFunction<Competitor, RaceColumn, Double> totalPointSupplier, boolean nullScoresAreBetter, WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache) { |
|
| 359 | 359 | return 0; |
| 360 | 360 | } |
| 361 | 361 |
java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointWithEliminatingMedalSeriesWithPromotions.java
| ... | ... | @@ -126,7 +126,7 @@ public abstract class LowPointWithEliminatingMedalSeriesWithPromotions extends L |
| 126 | 126 | * medal series, or if already at the first medal series, the opening series will be used for tie-breaking. |
| 127 | 127 | */ |
| 128 | 128 | @Override |
| 129 | - public int compareByMedalRaceScore(Double o1MedalRaceScore, Double o2MedalRaceScore, boolean nullScoresAreBetter) { |
|
| 129 | + public int compareByMedalRaceScore(Competitor o1, Competitor o2, Double o1MedalRaceScore, Double o2MedalRaceScore, List<Pair<RaceColumn, Double>> o1ScoringMedalRaces, List<Pair<RaceColumn, Double>> o2ScoringMedalRaces, TimePoint timePoint, Leaderboard leaderboard, Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor, BiFunction<Competitor, RaceColumn, Double> totalPointSupplier, boolean nullScoresAreBetter, WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache) { |
|
| 130 | 130 | return 0; |
| 131 | 131 | } |
| 132 | 132 |
java/com.sap.sse.test/src/com/sap/sse/test/CPUTimeMeasurementTest.java
| ... | ... | @@ -1,5 +1,6 @@ |
| 1 | 1 | package com.sap.sse.test; |
| 2 | 2 | |
| 3 | +import static org.junit.jupiter.api.Assertions.assertEquals; |
|
| 3 | 4 | import static org.junit.jupiter.api.Assertions.assertFalse; |
| 4 | 5 | import static org.junit.jupiter.api.Assertions.assertTrue; |
| 5 | 6 | |
| ... | ... | @@ -13,6 +14,8 @@ import org.junit.jupiter.api.BeforeAll; |
| 13 | 14 | import org.junit.jupiter.api.Disabled; |
| 14 | 15 | import org.junit.jupiter.api.Test; |
| 15 | 16 | |
| 17 | +import com.sap.sse.metering.CPUMeter; |
|
| 18 | + |
|
| 16 | 19 | public class CPUTimeMeasurementTest { |
| 17 | 20 | private static final Logger logger = Logger.getLogger(CPUTimeMeasurementTest.class.getName()); |
| 18 | 21 | |
| ... | ... | @@ -38,6 +41,12 @@ public class CPUTimeMeasurementTest { |
| 38 | 41 | +" ("+((double) durationWithCpuTimeEnabled / (double) durationWithCpuTimeDisabled)+")"); |
| 39 | 42 | assertFalse((double) durationWithCpuTimeEnabled > 1.5*durationWithCpuTimeDisabled); |
| 40 | 43 | } |
| 44 | + |
|
| 45 | + @Test |
|
| 46 | + public void testCallableResultProperlyReturned() { |
|
| 47 | + final int result = CPUMeter.create().callWithCPUMeter(() -> { return 2; }); |
|
| 48 | + assertEquals(2, result); |
|
| 49 | + } |
|
| 41 | 50 | |
| 42 | 51 | @Test |
| 43 | 52 | public void testSingleThreadedWorkloadOffByLessThanFactorTwo() { |