mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-27 22:37:15 +00:00
added a failing test case for bug 3364: cause multiple cache entries, force CME, then assert that cache result needed to be recomputed (which currently it isn't)
This commit is contained in:
1 parent
f3e0a276b6
commit
d6e25bb867
1 file changed
+29
+29
@@ -28,6 +28,7 @@ import com.sap.sailing.domain.common.PassingInstruction;
|
||||
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
|
||||
import com.sap.sailing.domain.common.impl.DegreePosition;
|
||||
import com.sap.sailing.domain.common.impl.KnotSpeedImpl;
|
||||
import com.sap.sailing.domain.common.impl.NauticalMileDistance;
|
||||
import com.sap.sailing.domain.common.tracking.impl.GPSFixImpl;
|
||||
import com.sap.sailing.domain.markpassingcalculation.impl.WaypointPositionAndDistanceCache;
|
||||
import com.sap.sailing.domain.racelog.tracking.EmptyGPSFixStore;
|
||||
@@ -127,6 +128,34 @@ public class WaypointPositionAndDistanceCacheTest {
|
||||
assertEquals(5, recalculations); // one for each waypoint, one for the distance; second request recalculates except start/finish position
|
||||
}
|
||||
|
||||
/**
|
||||
* A white-box text for bug 3364: when multiple cache entries exist in the map, invalidating a cache entry can cause a
|
||||
* ConcurrentModificationException.
|
||||
*/
|
||||
@Test
|
||||
public void testInvalidateByNewMarkPositionWithMultipleMarkPositionsInCache() {
|
||||
assertEquals(60, cache.getApproximateDistance(start, windwardWaypoint, now).getNauticalMiles(), 0.01);
|
||||
trackedRace.getOrCreateTrack(windward).add(new GPSFixImpl(new DegreePosition(1, 0).translateGreatCircle(
|
||||
new DegreeBearingImpl(0), new KnotSpeedImpl(20).travel(now, now.plus(timeRangeResolution.divide(10)))),
|
||||
now.plus(timeRangeResolution.divide(10)))); // does not affect the cache interval
|
||||
trackedRace.getOrCreateTrack(windward).add(new GPSFixImpl(new DegreePosition(1, 0).translateGreatCircle(
|
||||
new DegreeBearingImpl(0), new KnotSpeedImpl(20).travel(now, now.plus(timeRangeResolution.times(2)))),
|
||||
now.plus(timeRangeResolution.times(2))));
|
||||
trackedRace.getOrCreateTrack(windward).add(new GPSFixImpl(new DegreePosition(1, 0).translateGreatCircle(
|
||||
new DegreeBearingImpl(0), new KnotSpeedImpl(20).travel(now, now.plus(timeRangeResolution.times(3)))),
|
||||
now.plus(timeRangeResolution.times(3))));
|
||||
assertEquals(60, cache.getApproximateDistance(start, windwardWaypoint, now).getNauticalMiles(), 0.01);
|
||||
assertEquals(60+new NauticalMileDistance(20).scale(timeRangeResolution.divide(Duration.ONE_HOUR)).getNauticalMiles(), cache.getApproximateDistance(start, windwardWaypoint, now.plus(timeRangeResolution)).getNauticalMiles(), 0.01);
|
||||
assertEquals(60+new NauticalMileDistance(20).scale(timeRangeResolution.times(2).divide(Duration.ONE_HOUR)).getNauticalMiles(), cache.getApproximateDistance(start, windwardWaypoint, now.plus(timeRangeResolution.times(2))).getNauticalMiles(), 0.01);
|
||||
trackedRace.getOrCreateTrack(windward).add(new GPSFixImpl(new DegreePosition(1, 0).translateGreatCircle(
|
||||
new DegreeBearingImpl(0), new KnotSpeedImpl(20).travel(now, now.plus(timeRangeResolution.divide(5)))),
|
||||
now.plus(timeRangeResolution.divide(5)))); // cause cache invalidation with several entries in the map
|
||||
recalculations = 0;
|
||||
assertEquals(60+new NauticalMileDistance(20).scale(timeRangeResolution.times(2).divide(Duration.ONE_HOUR)).getNauticalMiles(), cache.getApproximateDistance(start, windwardWaypoint, now.plus(timeRangeResolution.times(2))).getNauticalMiles(), 0.01);
|
||||
assertEquals(1, recalculations);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNewMarkPositionAffectingEntryOppositeOrder() {
|
||||
assertEquals(60, cache.getApproximateDistance(start, windwardWaypoint, now).getNauticalMiles(), 0.01);
|
||||
|
||||
Reference in new issue
Block a user