package au.gov.amsa.risky.format;
import static com.google.common.base.Optional.of;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import org.junit.Test;
import ucar.ma2.Array;
import ucar.ma2.InvalidRangeException;
import ucar.nc2.Attribute;
import ucar.nc2.NetcdfFile;
public class NetcdfFixesWriterTest {
private static final float PRECISION = 0.001f;
@Test
public void testWriting() {
Fix f1 = createFix(TimeUnit.DAYS.toMillis(1), -10.5f, 135f);
FixImpl f2 = createFix(TimeUnit.DAYS.toMillis(2), -10.8f, 136f);
List<HasFix> fixes = Arrays.asList((HasFix) f1, f2);
NetcdfFixesWriter.writeFixes(fixes, new File("target/test.nc"));
}
@Test
public void testNetcdfConverter() throws IOException, InvalidRangeException {
TestingUtil.writeTwoBinaryFixes("target/987654321.track", BinaryFixesFormat.WITHOUT_MMSI);
int count = NetcdfFixesWriter.convertToNetcdf(new File("target"), new File("target/nc"),
Pattern.compile("987654321.track")).count().toBlocking().single();
assertEquals(1, count);
// test output
File ncFile = new File("target/nc/987654321.nc");
assertTrue(ncFile.exists());
assertTrue(ncFile.length() > 0);
NetcdfFile nc = NetcdfFile.open(ncFile.getCanonicalPath());
List<Attribute> attributes = nc.findGroup(null).getAttributes();
System.out.println(attributes);
assertFalse(attributes.isEmpty());
System.out.println(nc.getDimensions());
{
Array array = nc.readSection("latitude");
assertEquals(-10f, array.getFloat(0), PRECISION);
assertEquals(-10.1f, array.getFloat(1), PRECISION);
assertEquals(2, array.getSize());
}
{
Array array = nc.readSection("longitude");
assertEquals(135f, array.getFloat(0), PRECISION);
assertEquals(135.2f, array.getFloat(1), PRECISION);
assertEquals(2, array.getSize());
}
{
Array array = nc.readSection("source");
assertEquals((short) 1, array.getShort(0));
assertEquals((short) 2, array.getShort(1));
assertEquals(2, array.getSize());
}
{
Array array = nc.readSection("latency");
assertEquals(12, array.getInt(0));
assertEquals(13, array.getInt(1));
assertEquals(2, array.getSize());
}
{
Array array = nc.readSection("navigational_status");
assertEquals(NavigationalStatus.ENGAGED_IN_FISHING.ordinal(), array.getByte(0));
assertEquals(NavigationalStatus.AT_ANCHOR.ordinal(), array.getByte(1));
assertEquals(2, array.getSize());
}
{
Array array = nc.readSection("rate_of_turn");
assertEquals(-128, array.getByte(0));
assertEquals(-128, array.getByte(1));
assertEquals(2, array.getSize());
}
{
Array array = nc.readSection("speed_over_ground");
assertEquals(75, array.getInt(0));
assertEquals(45, array.getInt(1));
assertEquals(2, array.getSize());
}
{
Array array = nc.readSection("course_over_ground");
assertEquals(450, array.getShort(0));
assertEquals(200, array.getShort(1));
assertEquals(2, array.getSize());
}
{
Array array = nc.readSection("heading");
assertEquals(46, array.getShort(0));
assertEquals(30, array.getShort(1));
assertEquals(2, array.getSize());
}
{
Array array = nc.readSection("ais_class");
assertEquals(1, array.getInt(0));
assertEquals(1, array.getInt(1));
assertEquals(2, array.getSize());
}
}
private static FixImpl createFix(long time, float lat, float lon) {
return new FixImpl(213456789, lat, lon, time, of(12), of((short) 1),
of(NavigationalStatus.ENGAGED_IN_FISHING), of(7.5f), of(45f), of(46f), AisClass.B);
}
}