// Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.annotators.regex;

import org.junit.Test;

import uk.gov.dstl.baleen.annotators.testing.AbstractAnnotatorTest;
import uk.gov.dstl.baleen.annotators.testing.types.TestQuantity;
import uk.gov.dstl.baleen.types.common.Quantity;

/** */
public class AreaTest extends AbstractAnnotatorTest {

  public AreaTest() {
    super(Area.class);
  }

  @Test
  public void testM2() throws Exception {

    jCas.setDocumentText("The field measured 400 square metres (400m^2).");
    processJCas();

    assertAnnotations(
        2,
        Quantity.class,
        new TestQuantity(0, "400 square metres", 400, "m^2", 400, "m^2", "area"),
        new TestQuantity(1, "400m^2", 400, "m^2", 400, "m^2", "area"));
  }

  @Test
  public void testCM2() throws Exception {

    jCas.setDocumentText("The table measured 400 square centimetres (400cm^2).");
    processJCas();

    assertAnnotations(
        2,
        Quantity.class,
        new TestQuantity(
            0, "400 square centimetres", 400, "cm^2", 400 * Area.CM2_TO_M2, "m^2", "area"),
        new TestQuantity(1, "400cm^2", 400, "cm^2", 400 * Area.CM2_TO_M2, "m^2", "area"));
  }

  @Test
  public void testMM2() throws Exception {
    jCas.setDocumentText("The chip measured 400 square millimetres (400mm^2).");
    processJCas();

    assertAnnotations(
        2,
        Quantity.class,
        new TestQuantity(
            0, "400 square millimetres", 400, "mm^2", 400 * Area.MM2_TO_M2, "m^2", "area"),
        new TestQuantity(1, "400mm^2", 400, "mm^2", 400 * Area.MM2_TO_M2, "m^2", "area"));
  }

  @Test
  public void testKM2() throws Exception {

    jCas.setDocumentText("The region measured 400 square kilometres (400km^2).");
    processJCas();

    assertAnnotations(
        2,
        Quantity.class,
        new TestQuantity(
            0, "400 square kilometres", 400, "km^2", 400 * Area.KM2_TO_M2, "m^2", "area"),
        new TestQuantity(1, "400km^2", 400, "km^2", 400 * Area.KM2_TO_M2, "m^2", "area"));
  }

  @Test
  public void testMi2() throws Exception {

    jCas.setDocumentText("The region measured 400 square miles (400mi^2).");
    processJCas();

    assertAnnotations(
        2,
        Quantity.class,
        new TestQuantity(0, "400 square miles", 400, "mi^2", 400 * Area.MI2_TO_M2, "m^2", "area"),
        new TestQuantity(1, "400mi^2", 400, "mi^2", 400 * Area.MI2_TO_M2, "m^2", "area"));
  }

  @Test
  public void testYd2() throws Exception {

    jCas.setDocumentText("The field measured 400 square yards (400yd^2).");
    processJCas();

    assertAnnotations(
        2,
        Quantity.class,
        new TestQuantity(0, "400 square yards", 400, "yd^2", 400 * Area.YD2_TO_M2, "m^2", "area"),
        new TestQuantity(1, "400yd^2", 400, "yd^2", 400 * Area.YD2_TO_M2, "m^2", "area"));
  }

  @Test
  public void testFT2() throws Exception {

    jCas.setDocumentText("The field measured 400 square feet (400ft^2).");
    processJCas();

    assertAnnotations(
        2,
        Quantity.class,
        new TestQuantity(0, "400 square feet", 400, "ft^2", 400 * Area.FT2_TO_M2, "m^2", "area"),
        new TestQuantity(1, "400ft^2", 400, "ft^2", 400 * Area.FT2_TO_M2, "m^2", "area"));
  }

  @Test
  public void testIn2() throws Exception {

    jCas.setDocumentText("The table measured 400 square inches (400in^2).");
    processJCas();

    assertAnnotations(
        2,
        Quantity.class,
        new TestQuantity(0, "400 square inches", 400, "in^2", 400 * Area.IN2_TO_M2, "m^2", "area"),
        new TestQuantity(1, "400in^2", 400, "in^2", 400 * Area.IN2_TO_M2, "m^2", "area"));
  }

  @Test
  public void testAcre() throws Exception {

    jCas.setDocumentText("The field measured 400 acres.");
    processJCas();

    assertAnnotations(
        1,
        Quantity.class,
        new TestQuantity(0, "400 acres", 400, "acre", 400 * Area.ACRE_TO_M2, "m^2", "area"));
  }

  @Test
  public void testHectare() throws Exception {

    jCas.setDocumentText("The field measured 400 hectares.");
    processJCas();

    assertAnnotations(
        1,
        Quantity.class,
        new TestQuantity(0, "400 hectares", 400, "ha", 400 * Area.HECTARE_TO_M2, "m^2", "area"));
  }

  @Test
  public void testMultiplier() throws Exception {

    jCas.setDocumentText("The country had an area of 9.8 million square kms.");
    processJCas();

    assertAnnotations(
        1,
        Quantity.class,
        new TestQuantity(0, "9.8 million square kms", 9800000, "km^2", 9.8E12, "m^2", "area"));
  }

  @Test
  public void testPunctuation() throws Exception {

    jCas.setDocumentText("The room had a floorspace of 6.2 square metres.");
    processJCas();

    assertAnnotations(
        1,
        Quantity.class,
        new TestQuantity(0, "6.2 square metres", 6.2, "m^2", 6.2, "m^2", "area"));
  }
}
