package au.gov.amsa.geo.distance;
import static au.gov.amsa.geo.Util.toPos;
import static java.util.Arrays.asList;
import static java.util.concurrent.TimeUnit.HOURS;
import static org.junit.Assert.assertEquals;
import static rx.Observable.from;
import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Test;
import au.gov.amsa.geo.model.Bounds;
import au.gov.amsa.geo.model.Options;
import au.gov.amsa.geo.model.Position;
import au.gov.amsa.risky.format.AisClass;
import au.gov.amsa.risky.format.Fix;
import au.gov.amsa.risky.format.FixImpl;
import au.gov.amsa.util.navigation.Position.LongitudePair;
import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Subscriber;
import rx.functions.Action1;
import rx.observables.ConnectableObservable;
public class DistanceTravelledCalculatorTest {
private static final Fix f1 = new FixImpl(1, -35.0f, 142.0f, 0, AisClass.A);
private static final Fix f3 = new FixImpl(3, -35.12f, 142.12f, HOURS.toMillis(2), AisClass.A);
private static final Fix f4 = new FixImpl(4, -36.12f, 143.12f, HOURS.toMillis(2), AisClass.A);
@Test
public void testPairs() {
System.out.println(from(asList(1, 2, 3)).buffer(2, 1).toList().toBlocking().single());
}
@Test
public void testWithFiles() {
long t = System.currentTimeMillis();
Observable<File> files = from(
new File("src/test/resources/fixes").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().startsWith("503.*track");
}
}));
final AtomicInteger count = new AtomicInteger();
DistanceCalculationMetrics metrics = new DistanceCalculationMetrics();
new DistanceTravelledCalculator(Options.builder().originLat(0).originLon(0)
.cellSizeDegrees(0.1).bounds(new Bounds(0, 120, -60, 175)).build(), metrics)
.calculateDistanceByCellFromFiles(files).toBlocking()
.forEach(new Action1<CellAndDistance>() {
@Override
public void call(CellAndDistance cell) {
System.out.println(cell);
count.incrementAndGet();
}
});
System.out.println(
count.get() + " cells returned in " + (System.currentTimeMillis() - t) + "ms");
}
@Test
public void testGetCellDistances() {
Options options = Options.builder().originLat(0).originLon(0).cellSizeDegrees(0.1)
.bounds(new Bounds(0, 100, -60, 175)).build();
Observable<CellAndDistance> list = DistanceTravelledCalculator.getCellDistances(f1, f3,
options);
System.out.println(list.toList().toBlocking().single());
}
@Test
public void testGetCellDistancesEqualSingleLegGreatCircleDistanceAlmost() {
Options options = Options.builder()
// setup origin
.originLat(0).originLon(0)
// set cell size
.cellSizeDegrees(1)
// set bounds
.bounds(new Bounds(0, 100, -60, 175))
// build options
.build();
Observable<CellAndDistance> list = DistanceTravelledCalculator.getCellDistances(f1, f4,
options);
System.out.println("totalBearing=" + toPos(f1).getBearingDegrees(toPos(f4)));
double totalNm = 0;
for (CellAndDistance value : list.toList().toBlocking().single()) {
System.out.println(value);
totalNm += value.getDistanceNm();
}
assertEquals(toPos(f1).getDistanceToKm(toPos(f4)) / 1.852, totalNm, 0.00001);
}
@Test
public void manualTestCase() {
Position a = new Position(-30.8, 140.2);
Position b = new Position(-31.7, 142.6);
System.out.println(toPos(a).getBearingDegrees(toPos(b)));
Options options = Options.builder()
// setup origin
.originLat(0).originLon(0)
// set cell size
.cellSizeDegrees(1.0)
// set bounds
.bounds(new Bounds(0, 100, -60, 175))
// build options
.build();
Observable<CellAndDistance> list = DistanceTravelledCalculator.getCellDistances(a, b,
options);
System.out.println("totalBearing=" + toPos(a).getBearingDegrees(toPos(b)));
LongitudePair gcIntercept = toPos(a).getLongitudeOnGreatCircle(toPos(b), -31.0);
System.out.println("gc long=" + gcIntercept);
au.gov.amsa.util.navigation.Position nextPos = au.gov.amsa.util.navigation.Position
.create(-31.0, gcIntercept.getLon2());
System.out.println("bearingToFinal=" + nextPos.getBearingDegrees(toPos(b)));
System.out.println("nextLat = " + nextPos.getLatitudeOnGreatCircle(toPos(b), 141.0));
double totalNm = 0;
for (CellAndDistance value : list.toList().toBlocking().single()) {
System.out.println(value);
totalNm += value.getDistanceNm();
}
assertEquals(toPos(a).getDistanceToKm(toPos(b)) / 1.852, totalNm, 0.2);
}
@Test
public void testReplay() {
ConnectableObservable<Integer> o = Observable.create(new OnSubscribe<Integer>() {
volatile boolean firstTime = true;
@Override
public void call(Subscriber<? super Integer> sub) {
if (firstTime) {
firstTime = false;
sub.onNext(1);
}
sub.onCompleted();
}
}).replay();
o.connect();
assertEquals(1, (int) o.count().toBlocking().single());
assertEquals(1, (int) o.count().toBlocking().single());
}
@Test
public void testConstantDifference() {
List<Double> list = DistanceTravelledCalculator
.makeConstantDifference(Arrays.asList(1.0, 2.0, 3.1, 4.2));
assertEquals(4, list.size());
double precision = 0.000001;
assertEquals(1.0, list.get(0), precision);
assertEquals(2.0, list.get(1), precision);
assertEquals(3.0, list.get(2), precision);
assertEquals(4.0, list.get(3), precision);
}
}