package org.hamcrest.number;

import org.hamcrest.test.AbstractMatcherTest;
import org.hamcrest.Matcher;
import org.junit.jupiter.api.Test;

import java.math.BigDecimal;

import static org.hamcrest.test.MatcherAssertions.*;
import static org.hamcrest.number.BigDecimalCloseTo.closeTo;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class BigDecimalCloseToTest  extends AbstractMatcherTest {

  private final Matcher<BigDecimal> matcher = closeTo(new BigDecimal("1.0"), new BigDecimal("0.5"));

  @Override
  protected Matcher<?> createMatcher() {
    BigDecimal irrelevant = new BigDecimal("0.01");
    return closeTo(irrelevant, irrelevant);
  }

  @Test
  public void testEvaluatesToTrueIfArgumentIsEqualToABigDecimalWithinSomeError() {
    assertTrue(matcher.matches(new BigDecimal("1.0")));
    assertTrue(matcher.matches(new BigDecimal("0.5")));
    assertTrue(matcher.matches(new BigDecimal("1.5")));

    assertDoesNotMatch("too large", matcher, new BigDecimal("2.0"));
    assertMismatchDescription("<2.0> differed by <0.5> more than delta <0.5>", matcher, new BigDecimal("2.0"));
    assertDoesNotMatch("number too small", matcher, new BigDecimal("0.0"));
    assertMismatchDescription("<0.0> differed by <0.5> more than delta <0.5>", matcher, new BigDecimal("0.0"));
  }

  @Test
  public void testEvaluatesToTrueIfArgumentHasDifferentScale() {
    assertTrue(matcher.matches(new BigDecimal("1.000000")));
    assertTrue(matcher.matches(new BigDecimal("0.500000")));
    assertTrue(matcher.matches(new BigDecimal("1.500000")));

    assertDoesNotMatch("too large", matcher, new BigDecimal("2.000000"));
    assertMismatchDescription("<2.000000> differed by <0.5> more than delta <0.5>", matcher, new BigDecimal("2.000000"));
    assertDoesNotMatch("number too small", matcher, new BigDecimal("0.000000"));
    assertMismatchDescription("<0.000000> differed by <0.5> more than delta <0.5>", matcher, new BigDecimal("0.000000"));
  }

  @Test
  public void test_is_self_describing() {
    assertDescription("a numeric value within <0.5> of <1.0>", matcher);
  }

}
