//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.geo.osgb; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.util.List; import java.util.Optional; import org.junit.Test; import uk.gov.dstl.common.geo.osgb.NationalGrid; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; public class NationalGridTest { private static final String NG_COMPACT = "NW1623434223"; private static final String NG_EXPANDED = "NW 16234 34223"; // Invalid as different lengths of thing private static final String NG_INVALID = "NW134534223"; private static final double E = 116234; private static final double N = 534223; private static final Splitter WHITESPACE_SPLITTER = Splitter.on(CharMatcher.whitespace()).omitEmptyStrings().trimResults(); @Test public void testFrom() { double[] ne = NationalGrid.fromNationalGrid(NG_COMPACT); assertEquals(E, ne[0], 0.001); assertEquals(N, ne[1], 0.001); double[] neExpanded = NationalGrid.fromNationalGrid(NG_EXPANDED); assertEquals(E, neExpanded[0], 0.001); assertEquals(N, neExpanded[1], 0.001); } @Test(expected=IllegalArgumentException.class) public void testFromInvalid() { NationalGrid.fromNationalGrid(NG_INVALID); } @Test public void testTo() { Optional<String> ng = NationalGrid.toNationalGrid(new double[] { E , N }); assertEquals(NG_EXPANDED, ng.get()); } @Test public void testExample() { assertConversion("TG 51409 13177", 651409.0, 313177.0); assertConversion("NN 166 712", 216600.0, 771200.0); assertConversion("NN 126 729", 212600.0, 772900.0); assertConversion("SU 21940 45374", 421940.0, 145374.0); assertConversion("SU 02194 45374", 402194.0, 145374.0); } private void assertConversion(String example, double exE, double exN) { double[] out = NationalGrid.fromNationalGrid(example); assertEquals(exE, out[0], 0.001); assertEquals(exN, out[1], 0.001); Optional<String> ng = NationalGrid.toNationalGrid(new double[] { exE , exN }); assertCoordinateEquals(example, ng.get()); } private void assertCoordinateEquals(String expected, String actual){ String coordExpected = expected.substring(2); String coordActual = actual.substring(2); List<String> listExpected = WHITESPACE_SPLITTER.splitToList(coordExpected.substring(2)); List<String> listActual = WHITESPACE_SPLITTER.splitToList(coordActual.substring(2)); String normalizedExpected = null; String normalizedActual = null; if(listActual.size() >= 2){ normalizedExpected = expected.substring(0, 2) + addZeroes(listExpected.get(0)) + addZeroes(listExpected.get(1)); normalizedActual = expected.substring(0, 2) + addZeroes(listActual.get(0)) + addZeroes(listActual.get(1)); }else if(listActual.size() == 1){ int index = listExpected.get(0).length() / 2; normalizedExpected = expected.substring(0, 2) + addZeroes(listExpected.get(0).substring(0, index)) + addZeroes(listExpected.get(0).substring(index)); index = listActual.get(0).length() / 2; normalizedActual = actual.substring(0, 2) + addZeroes(listActual.get(0).substring(0, index)) + addZeroes(listActual.get(0).substring(index)); }else{ fail("Unable to parse coordinate"); } assertEquals(normalizedExpected.toUpperCase(), normalizedActual.toUpperCase()); } private String addZeroes(String s){ String t = s; while(t.length() < 5){ t += "0"; } return t; } }