diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConfidenceTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConfidenceTest.java index 3b76d8f6f4b..0b3af4fddf5 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConfidenceTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConfidenceTest.java @@ -1,9 +1,14 @@ package com.sap.sailing.domain.test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import org.junit.Test; +import com.sap.sailing.domain.base.Bearing; +import com.sap.sailing.domain.base.impl.DegreeBearingImpl; +import com.sap.sailing.domain.base.impl.RadianBearingImpl; +import com.sap.sailing.domain.common.Util.Pair; import com.sap.sailing.domain.confidence.HasConfidence; import com.sap.sailing.domain.confidence.ScalableValue; import com.sap.sailing.domain.confidence.impl.ConfidenceBasedAveragerImpl; @@ -56,12 +61,110 @@ public class ConfidenceTest { } } + private static class ScalableBearing implements ScalableValue, Bearing> { + private final double sin; + private final double cos; + + public ScalableBearing(Bearing bearing) { + this.sin = Math.sin(bearing.getRadians()); + this.cos = Math.cos(bearing.getRadians()); + } + + private ScalableBearing(double sin, double cos) { + this.sin = sin; + this.cos = cos; + } + + @Override + public ScalableValue, Bearing> multiply(double factor) { + Pair pair = getValue(); + return new ScalableBearing(factor*pair.getA(), factor*pair.getB()); + } + + @Override + public ScalableValue, Bearing> add(ScalableValue, Bearing> t) { + Pair value = getValue(); + Pair tValue = t.getValue(); + return new ScalableBearing(value.getA()+tValue.getA(), value.getB()+tValue.getB()); + } + + @Override + public Bearing divide(double divisor) { + double angle; + if (cos == 0) { + angle = sin >= 0 ? Math.PI / 2 : -Math.PI / 2; + } else { + angle = Math.atan2(sin, cos); + } + Bearing result = new RadianBearingImpl(angle < 0 ? angle + 2 * Math.PI : angle); + return result; + } + + @Override + public Pair getValue() { + return new Pair(sin, cos); + } + } + + private static class ScalableBearingWithConfidence extends ScalableBearing implements HasConfidence, Bearing> { + private final double confidence; + + public ScalableBearingWithConfidence(Bearing bearing, double confidence) { + super(bearing); + this.confidence = confidence; + } + + @Override + public double getConfidence() { + return confidence; + } + + @Override + public ScalableValue, Bearing> getScalableValue() { + return this; + } + + } + @Test - public void testAveragingSimpleDoubles() { + public void testAveragingWithEmptyListYieldsNull() { + @SuppressWarnings("unchecked") + Double average = new ConfidenceBasedAveragerImpl().getAverage(); + assertNull(average); + } + + @Test + public void testAveragingWithNullArrayYieldsNull() { + Double average = new ConfidenceBasedAveragerImpl().getAverage((HasConfidence[]) null); + assertNull(average); + } + + @Test + public void testAveragingWithTwoDoubles() { ScalableDoubleWithConfidence d1 = new ScalableDoubleWithConfidence(1., 0.5); ScalableDoubleWithConfidence d2 = new ScalableDoubleWithConfidence(2., 0.5); @SuppressWarnings("unchecked") Double average = new ConfidenceBasedAveragerImpl().getAverage(d1, d2); assertEquals(1.5, average, 0.00000001); } + + @Test + public void testAveragingWithThreeDoubles() { + ScalableDoubleWithConfidence d1 = new ScalableDoubleWithConfidence(1., 1.); + ScalableDoubleWithConfidence d2 = new ScalableDoubleWithConfidence(2., 1.); + ScalableDoubleWithConfidence d3 = new ScalableDoubleWithConfidence(3., 2.); + @SuppressWarnings("unchecked") + Double average = new ConfidenceBasedAveragerImpl().getAverage(d1, d2, d3); + assertEquals(2.25, average, 0.00000001); + } + + @Test + public void testAveragingWithTwoBearings() { + ScalableBearingWithConfidence d1 = new ScalableBearingWithConfidence(new DegreeBearingImpl(350.), 1.); + ScalableBearingWithConfidence d2 = new ScalableBearingWithConfidence(new DegreeBearingImpl(10.), 1.); + @SuppressWarnings("unchecked") + Bearing average = new ConfidenceBasedAveragerImpl, Bearing>().getAverage(d1, d2); + assertEquals(0, average.getDegrees(), 0.00000001); + } + }