mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-08 21:30:57 +00:00
fixed bug 2981 and added test case; null wind caching was faulty
This commit is contained in:
1 parent
a7e3ba15a6
commit
7472abbd1b
2 files changed
+45
-2
No files matched your search
+33
@@ -0,0 +1,33 @@
|
||||
package com.sap.sailing.domain.test;
|
||||
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.impl.DegreePosition;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.leaderboard.caching.LeaderboardDTOCalculationReuseCache;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
|
||||
public class LeaderboardDTOCalculationReuseCacheTest {
|
||||
@Test
|
||||
public void testNullWindCaching() {
|
||||
final MillisecondsTimePoint now = MillisecondsTimePoint.now();
|
||||
final LeaderboardDTOCalculationReuseCache cache = new LeaderboardDTOCalculationReuseCache(now);
|
||||
final Competitor competitor = mock(Competitor.class);
|
||||
@SuppressWarnings("unchecked")
|
||||
final GPSFixTrack<Competitor, GPSFixMoving> track = mock(GPSFixTrack.class);
|
||||
final Position p = new DegreePosition(123, 12);
|
||||
when(track.getEstimatedPosition(now, false)).thenReturn(p);
|
||||
final TrackedRace trackedRace = mock(TrackedRace.class);
|
||||
when(trackedRace.getTrack(competitor)).thenReturn(track);
|
||||
when(trackedRace.getWind(p, now)).thenReturn(null);
|
||||
assertNull(cache.getWind(trackedRace, competitor, now));
|
||||
}
|
||||
}
|
||||
+12
-2
@@ -8,6 +8,10 @@ import com.sap.sailing.domain.common.Bearing;
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
|
||||
import com.sap.sailing.domain.common.impl.DegreePosition;
|
||||
import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
|
||||
import com.sap.sailing.domain.common.impl.WindImpl;
|
||||
import com.sap.sailing.domain.leaderboard.impl.AbstractSimpleLeaderboardImpl;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
@@ -16,6 +20,7 @@ import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingCache;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.Util.Triple;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
|
||||
/**
|
||||
* A cache structure that is used for a single call to
|
||||
@@ -47,10 +52,13 @@ public class LeaderboardDTOCalculationReuseCache implements WindLegTypeAndLegBea
|
||||
|
||||
|
||||
/**
|
||||
* the wind at competitor's position at timePoint
|
||||
* the wind at competitor's position at timePoint; <code>null</code> values are represented by {@link #NULL_WIND}.
|
||||
*/
|
||||
final ConcurrentHashMap<Triple<TrackedRace, Competitor, TimePoint>, Wind> windCache;
|
||||
|
||||
private static final Wind NULL_WIND = new WindImpl(/* position */ new DegreePosition(0, 0),
|
||||
/* time point */ MillisecondsTimePoint.now(), /* windSpeedWithBearing */ new KnotSpeedWithBearingImpl(0, new DegreeBearingImpl(0)));
|
||||
|
||||
/**
|
||||
* the leg's bearing at timePoint
|
||||
*/
|
||||
@@ -100,7 +108,9 @@ public class LeaderboardDTOCalculationReuseCache implements WindLegTypeAndLegBea
|
||||
Wind result = windCache.get(cacheKey);
|
||||
if (result == null) {
|
||||
result = trackedRace.getWind(trackedRace.getTrack(competitor).getEstimatedPosition(timePoint, false), timePoint);
|
||||
windCache.put(cacheKey, result);
|
||||
windCache.put(cacheKey, result == null ? NULL_WIND : result);
|
||||
} else if (result == NULL_WIND) {
|
||||
result = null;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user