content: package com.annimon.stream.doublestreamtests;
  
  import com.annimon.stream.DoubleStream;
  import com.annimon.stream.function.DoubleBinaryOperator;
  import org.junit.Test;
  import static com.annimon.stream.test.hamcrest.OptionalDoubleMatcher.hasValueThat;
  import static com.annimon.stream.test.hamcrest.OptionalDoubleMatcher.isEmpty;
  import static org.hamcrest.MatcherAssert.assertThat;
  import static org.hamcrest.Matchers.closeTo;
  
  public final class ReduceTest {
  
      @Test
      public void testReduceWithIdentity() {
          double result = DoubleStream.of(0.012, -3.772, 3.039, 19.84, 100d)
                  .reduce(0d, new DoubleBinaryOperator() {
              @Override
              public double applyAsDouble(double left, double right) {
                  return left + right;
              }
          });
          assertThat(result, closeTo(119.119, 0.0001));
      }
  
      @Test
      public void testReduceWithIdentityOnEmptyStream() {
          double result = DoubleStream.empty().reduce(Math.PI, new DoubleBinaryOperator() {
              @Override
              public double applyAsDouble(double left, double right) {
                  return left + right;
              }
          });
          assertThat(result, closeTo(Math.PI, 0.00001));
      }
  
      @Test
      public void testReduce() {
          assertThat(DoubleStream.of(0.012, -3.772, 3.039, 19.84, 100d)
                  .reduce(new DoubleBinaryOperator() {
              @Override
              public double applyAsDouble(double left, double right) {
                  return left + right;
              }
          }), hasValueThat(closeTo(119.119, 0.0001)));
      }
  
      @Test
      public void testReduceOnEmptyStream() {
          assertThat(DoubleStream.empty().reduce(new DoubleBinaryOperator() {
              @Override
              public double applyAsDouble(double left, double right) {
                  return left + right;
              }
          }), isEmpty());
      }
  }
  