/**
   * Test method for {@link DivisionExpression#evaluate(EvaluableVariableAssignment)}. Asserts that:
   *
   * <ul>
   *   <li>The method passes the assignment to the inner expressions
   *   <li>It returns the quotients of its inner expressions.
   *   <li>{@code NaN} and infinity values are handled like specified in IEEE 754.
   *   <li>Passing {@code null} throws an exception.
   * </ul>
   */
  @Test
  public void evaluate() {
    final EvaluableExpression dividend = mock(EvaluableExpression.class);
    final EvaluableExpression divisor = mock(EvaluableExpression.class);
    final EvaluableVariableAssignment assignment = new EvaluableVariableAssignment();
    final DivisionExpression testedExpression = new DivisionExpression(dividend, divisor);

    assertThat(() -> testedExpression.evaluate(null), throwsException(NullPointerException.class));

    given(dividend.evaluate(same(assignment))).willReturn(15d);
    given(divisor.evaluate(same(assignment))).willReturn(3d);
    assertThat(testedExpression.evaluate(assignment), is(5d));

    given(dividend.evaluate(same(assignment))).willReturn(15d);
    given(divisor.evaluate(same(assignment))).willReturn(0d);
    assertThat(testedExpression.evaluate(assignment), is(Double.POSITIVE_INFINITY));

    given(dividend.evaluate(same(assignment))).willReturn(-15d);
    given(divisor.evaluate(same(assignment))).willReturn(0d);
    assertThat(testedExpression.evaluate(assignment), is(Double.NEGATIVE_INFINITY));

    given(dividend.evaluate(same(assignment))).willReturn(Double.POSITIVE_INFINITY);
    given(divisor.evaluate(same(assignment))).willReturn(Double.POSITIVE_INFINITY);
    assertThat(testedExpression.evaluate(assignment), is(Double.NaN));

    given(dividend.evaluate(same(assignment))).willReturn(0d);
    given(divisor.evaluate(same(assignment))).willReturn(0d);
    assertThat(testedExpression.evaluate(assignment), is(Double.NaN));
  }