//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.annotators.regex; import static org.junit.Assert.assertEquals; import org.apache.uima.fit.util.JCasUtil; import org.junit.Test; import uk.gov.dstl.baleen.annotators.regex.Distance; import uk.gov.dstl.baleen.annotators.testing.AbstractAnnotatorTest; import uk.gov.dstl.baleen.annotators.testing.TestEntity; import uk.gov.dstl.baleen.types.common.Quantity; /** Test {@link Distance}. * */ public class DistanceTest extends AbstractAnnotatorTest { public DistanceTest() { super(Distance.class); } /* * Ensures basic unit detections. These just test that the regex is identifying the correct unit */ // Kilometres @Test public void testDetectKilometers() throws Exception{ jCas.setDocumentText("It was 300 km, 300 kilometers, 300 kilometres, 1click North of London."); processJCas(); assertAnnotations(4, Quantity.class, new TestEntity<>(0, "300 km", "300 km"), new TestEntity<>(1, "300 kilometers", "300 kilometers"), new TestEntity<>(2, "300 kilometres", "300 kilometres"), new TestEntity<>(3, "1click", "1click")); } // Metres @Test public void testDetectMetres() throws Exception{ jCas.setDocumentText("It was 300 m, 300 metres, 300meters, 1m long."); processJCas(); assertAnnotations(4, Quantity.class, new TestEntity<>(0, "300 m", "300 m"), new TestEntity<>(1, "300 metres", "300 metres"), new TestEntity<>(2, "300meters", "300meters"), new TestEntity<>(3, "1m", "1m")); } // Centimetres @Test public void testDetectCentimetres() throws Exception{ jCas.setDocumentText("It was 50cm, 50 centimeters, 50 centimetres long."); processJCas(); assertAnnotations(3, Quantity.class, new TestEntity<>(0, "50cm", "50cm"), new TestEntity<>(1, "50 centimeters", "50 centimeters"), new TestEntity<>(2, "50 centimetres", "50 centimetres")); } // Millimetres @Test public void testDetectMilimetres() throws Exception{ jCas.setDocumentText("It was 1mm, 1 millimetre, 1 millimeter, thick"); processJCas(); assertAnnotations(3, Quantity.class, new TestEntity<>(0, "1mm", "1mm"), new TestEntity<>(1, "1 millimetre", "1 millimetre"), new TestEntity<>(2, "1 millimeter", "1 millimeter")); } // Miles @Test public void testDetectMiles() throws Exception{ jCas.setDocumentText("It was 5 miles, 10miles, 1mile away"); processJCas(); assertAnnotations(3, Quantity.class, new TestEntity<>(0, "5 miles", "5 miles"), new TestEntity<>(1, "10miles", "10miles"), new TestEntity<>(2, "1mile", "1mile")); } // Yards @Test public void testDetectYards() throws Exception{ jCas.setDocumentText("It was 20 yards, 10yds, 1yd away"); processJCas(); assertAnnotations(3, Quantity.class, new TestEntity<>(0, "20 yards", "20 yards"), new TestEntity<>(1, "10yds", "10yds"), new TestEntity<>(2, "1yd", "1yd")); } // Feet @Test public void testDetectFeet() throws Exception{ jCas.setDocumentText("It was 20 feet, 10feet, 1 foot, 1ft away"); processJCas(); assertAnnotations(4, Quantity.class, new TestEntity<>(0, "20 feet", "20 feet"), new TestEntity<>(1, "10feet", "10feet"), new TestEntity<>(2, "1 foot", "1 foot"), new TestEntity<>(3, "1ft", "1ft")); } // Inches @Test public void testDetectInches() throws Exception{ jCas.setDocumentText("It was 20 inches, 1inch away"); processJCas(); assertAnnotations(2, Quantity.class, new TestEntity<>(0, "20 inches", "20 inches"), new TestEntity<>(1, "1inch", "1inch")); } // Nautical Miles @Test public void testDetectNauticalMiles() throws Exception{ jCas.setDocumentText("It was 20 nautical miles, 1nm, 5 nmi, 1 nautical mile away"); processJCas(); assertAnnotations(4, Quantity.class, new TestEntity<>(0, "20 nautical miles", "20 nautical miles"), new TestEntity<>(1, "1nm", "1nm"), new TestEntity<>(2, "5 nmi", "5 nmi"), new TestEntity<>(3, "1 nautical mile", "1 nautical mile") ); } /* * The following tests (and the utility function below) check that the properties get set correctly * and that conversion is done correctly. */ // Utility function to minimise duplication public static void checkQuantityProperties(Quantity q, int begin, int end, String value, Double quantity, Double normQuantity, String unit, String normUnit){ // String positions/content assertEquals(begin, q.getBegin()); assertEquals(end, q.getEnd()); assertEquals(value, q.getValue()); // Quantities assertEquals(quantity, Double.valueOf(q.getQuantity())); assertEquals(normQuantity, Double.valueOf(q.getNormalizedQuantity())); // units assertEquals(unit, q.getUnit()); assertEquals(normUnit, q.getNormalizedUnit()); } // Kilometres @Test public void testKm() throws Exception{ jCas.setDocumentText("It was 400 km North of London."); processJCas(); Quantity q = JCasUtil.selectByIndex(jCas, Quantity.class, 0); checkQuantityProperties(q, 7, 13, "400 km", 400d, 400000d, "km", "m"); } // Metres @Test public void testMetres() throws Exception{ jCas.setDocumentText("It was 800m North of London."); processJCas(); Quantity q = JCasUtil.selectByIndex(jCas, Quantity.class, 0); checkQuantityProperties(q, 7, 11, "800m",800d, 800d, "m", "m"); } // Centimetres @Test public void testCentimetres() throws Exception{ jCas.setDocumentText("It was 50cm wide."); processJCas(); Quantity q = JCasUtil.selectByIndex(jCas, Quantity.class, 0); checkQuantityProperties(q, 7, 11, "50cm", 50d, 0.5d, "cm", "m"); } // Millimetres @Test public void testMillimetres() throws Exception{ jCas.setDocumentText("It was 1mm thick wide."); processJCas(); Quantity q = JCasUtil.selectByIndex(jCas, Quantity.class, 0); checkQuantityProperties(q, 7, 10, "1mm", 1d, 0.001d, "mm", "m"); } // Miles @Test public void testMiles() throws Exception{ jCas.setDocumentText("It was 1 mile wide."); processJCas(); Quantity q = JCasUtil.selectByIndex(jCas, Quantity.class, 0); checkQuantityProperties(q, 7, 13, "1 mile", 1d, 1609.344, "mi", "m"); } // Yards @Test public void testYards() throws Exception{ jCas.setDocumentText("It was 200 yards long."); processJCas(); Quantity q = JCasUtil.selectByIndex(jCas, Quantity.class, 0); checkQuantityProperties(q, 7, 16, "200 yards", 200d, 182.88, "yd", "m"); } // Inches @Test public void testInches() throws Exception{ jCas.setDocumentText("It was 60 inch deep."); processJCas(); Quantity q = JCasUtil.selectByIndex(jCas, Quantity.class, 0); checkQuantityProperties(q, 7, 14, "60 inch", 60d, 1.524, "in", "m"); } // Inches @Test public void testNauticalMiles() throws Exception{ jCas.setDocumentText("It was 4 nautical miles wide."); processJCas(); Quantity q = JCasUtil.selectByIndex(jCas, Quantity.class, 0); checkQuantityProperties(q, 7, 23, "4 nautical miles", 4d, 7408d, "nmi", "m"); } }