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&lt;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="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8&quot; javaProject=&quot;com.sap.sailing.domain.test&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
27
- <listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10; &lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.domain.test&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
28
- <listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;ECLIPSE_HOME/plugins/net.bytebuddy.byte-buddy_1.12.18.v20221114-2102.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#10;"/>
29
- <listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;ECLIPSE_HOME/plugins/net.bytebuddy.byte-buddy-agent_1.12.18.v20221114-2102.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#10;"/>
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() {