// -------------------------------------------------------------------------
 public void test_filter_byDate() {
   List<LocalDate> dates =
       dates(DATE_2010_01_01, DATE_2011_06_01, DATE_2012_01_01, DATE_2013_06_01, DATE_2014_01_01);
   LocalDateDoubleTimeSeries base =
       LocalDateDoubleTimeSeries.builder().putAll(dates, VALUES_10_14).build();
   LocalDateDoubleTimeSeries test = base.filter((ld, v) -> ld.getMonthValue() != 6);
   assertEquals(test.size(), 3);
   assertEquals(test.get(DATE_2010_01_01), OptionalDouble.of(10d));
   assertEquals(test.get(DATE_2012_01_01), OptionalDouble.of(12d));
   assertEquals(test.get(DATE_2014_01_01), OptionalDouble.of(14d));
 }
 public void test_stream_withCollector() {
   LocalDateDoubleTimeSeries base =
       LocalDateDoubleTimeSeries.builder().putAll(DATES_2010_12, VALUES_10_12).build();
   LocalDateDoubleTimeSeries test =
       base.stream()
           .map(point -> point.withValue(1.5d))
           .collect(LocalDateDoubleTimeSeries.collector());
   assertEquals(test.size(), 3);
   assertEquals(test.get(DATE_2010_01_01), OptionalDouble.of(1.5));
   assertEquals(test.get(DATE_2011_01_01), OptionalDouble.of(1.5));
   assertEquals(test.get(DATE_2012_01_01), OptionalDouble.of(1.5));
 }
 // -------------------------------------------------------------------------
 public void test_of_singleton() {
   LocalDateDoubleTimeSeries test = LocalDateDoubleTimeSeries.of(DATE_2011_01_01, 2d);
   assertEquals(test.isEmpty(), false);
   assertEquals(test.size(), 1);
   assertEquals(test.containsDate(DATE_2010_01_01), false);
   assertEquals(test.containsDate(DATE_2011_01_01), true);
   assertEquals(test.containsDate(DATE_2012_01_01), false);
   assertEquals(test.get(DATE_2010_01_01), OptionalDouble.empty());
   assertEquals(test.get(DATE_2011_01_01), OptionalDouble.of(2d));
   assertEquals(test.get(DATE_2012_01_01), OptionalDouble.empty());
   assertEquals(test.dates().toArray(), new Object[] {DATE_2011_01_01});
   assertEquals(test.values().toArray(), new double[] {2d});
 }
 // -------------------------------------------------------------------------
 public void test_emptySeries() {
   LocalDateDoubleTimeSeries test = LocalDateDoubleTimeSeries.empty();
   assertEquals(test.isEmpty(), true);
   assertEquals(test.size(), 0);
   assertEquals(test.containsDate(DATE_2010_01_01), false);
   assertEquals(test.containsDate(DATE_2011_01_01), false);
   assertEquals(test.containsDate(DATE_2012_01_01), false);
   assertEquals(test.get(DATE_2010_01_01), OptionalDouble.empty());
   assertEquals(test.get(DATE_2011_01_01), OptionalDouble.empty());
   assertEquals(test.get(DATE_2012_01_01), OptionalDouble.empty());
   assertEquals(test, LocalDateDoubleTimeSeries.builder().putAll(dates(), values()).build());
   assertEquals(test.dates().count(), 0);
   assertEquals(test.values().count(), 0);
 }
 @Test(dataProvider = "tailSeries")
 public void test_tailSeries(int count, int[] expected) {
   LocalDateDoubleTimeSeries base =
       LocalDateDoubleTimeSeries.builder().putAll(DATES_2010_14, VALUES_10_14).build();
   LocalDateDoubleTimeSeries test = base.tailSeries(count);
   assertEquals(test.size(), expected.length);
   for (int i = 0; i < DATES_2010_14.size(); i++) {
     if (Arrays.binarySearch(expected, i) >= 0) {
       assertEquals(test.get(DATES_2010_14.get(i)), OptionalDouble.of(VALUES_10_14.get(i)));
     } else {
       assertEquals(test.get(DATES_2010_14.get(i)), OptionalDouble.empty());
     }
   }
 }
  public void test_combineWith_intersectionWithSomeMatchingElements() {
    LocalDateDoubleTimeSeries series1 =
        LocalDateDoubleTimeSeries.builder().putAll(DATES_2010_14, VALUES_10_14).build();
    List<LocalDate> dates2 =
        dates(DATE_2010_01_01, DATE_2011_06_01, DATE_2012_01_01, DATE_2013_06_01, DATE_2014_01_01);
    List<Double> values2 = values(1.0, 1.1, 1.2, 1.3, 1.4);
    LocalDateDoubleTimeSeries series2 =
        LocalDateDoubleTimeSeries.builder().putAll(dates2, values2).build();

    LocalDateDoubleTimeSeries test = series1.intersection(series2, Double::sum);
    assertEquals(test.size(), 3);
    assertEquals(test.get(DATE_2010_01_01), OptionalDouble.of(11.0));
    assertEquals(test.get(DATE_2012_01_01), OptionalDouble.of(13.2));
    assertEquals(test.get(DATE_2014_01_01), OptionalDouble.of(15.4));
  }
 // -------------------------------------------------------------------------
 public void test_of_collectionCollection() {
   Collection<LocalDate> dates = dates(DATE_2011_01_01, DATE_2012_01_01);
   Collection<Double> values = values(2d, 3d);
   LocalDateDoubleTimeSeries test =
       LocalDateDoubleTimeSeries.builder().putAll(dates, values).build();
   assertEquals(test.isEmpty(), false);
   assertEquals(test.size(), 2);
   assertEquals(test.containsDate(DATE_2010_01_01), false);
   assertEquals(test.containsDate(DATE_2011_01_01), true);
   assertEquals(test.containsDate(DATE_2012_01_01), true);
   assertEquals(test.get(DATE_2010_01_01), OptionalDouble.empty());
   assertEquals(test.get(DATE_2011_01_01), OptionalDouble.of(2d));
   assertEquals(test.get(DATE_2012_01_01), OptionalDouble.of(3d));
   assertEquals(test.dates().toArray(), new Object[] {DATE_2011_01_01, DATE_2012_01_01});
   assertEquals(test.values().toArray(), new double[] {2d, 3d});
 }
 // -------------------------------------------------------------------------
 public void test_of_map() {
   Map<LocalDate, Double> map = new HashMap<>();
   map.put(DATE_2011_01_01, 2d);
   map.put(DATE_2012_01_01, 3d);
   LocalDateDoubleTimeSeries test = LocalDateDoubleTimeSeries.builder().putAll(map).build();
   assertEquals(test.isEmpty(), false);
   assertEquals(test.size(), 2);
   assertEquals(test.containsDate(DATE_2010_01_01), false);
   assertEquals(test.containsDate(DATE_2011_01_01), true);
   assertEquals(test.containsDate(DATE_2012_01_01), true);
   assertEquals(test.get(DATE_2010_01_01), OptionalDouble.empty());
   assertEquals(test.get(DATE_2011_01_01), OptionalDouble.of(2d));
   assertEquals(test.get(DATE_2012_01_01), OptionalDouble.of(3d));
   assertEquals(test.dates().toArray(), new Object[] {DATE_2011_01_01, DATE_2012_01_01});
   assertEquals(test.values().toArray(), new double[] {2d, 3d});
 }
 public void test_filter_byValue() {
   LocalDateDoubleTimeSeries base =
       LocalDateDoubleTimeSeries.builder().putAll(DATES_2010_14, VALUES_10_14).build();
   LocalDateDoubleTimeSeries test = base.filter((ld, v) -> v % 2 == 1);
   assertEquals(test.size(), 2);
   assertEquals(test.get(DATE_2011_01_01), OptionalDouble.of(11d));
   assertEquals(test.get(DATE_2013_01_01), OptionalDouble.of(13d));
 }
 // -------------------------------------------------------------------------
 public void test_of_collection() {
   Collection<LocalDateDoublePoint> points =
       Arrays.asList(
           LocalDateDoublePoint.of(DATE_2011_01_01, 2d),
           LocalDateDoublePoint.of(DATE_2012_01_01, 3d));
   LocalDateDoubleTimeSeries test =
       LocalDateDoubleTimeSeries.builder().putAll(points.stream()).build();
   assertEquals(test.isEmpty(), false);
   assertEquals(test.size(), 2);
   assertEquals(test.containsDate(DATE_2010_01_01), false);
   assertEquals(test.containsDate(DATE_2011_01_01), true);
   assertEquals(test.containsDate(DATE_2012_01_01), true);
   assertEquals(test.get(DATE_2010_01_01), OptionalDouble.empty());
   assertEquals(test.get(DATE_2011_01_01), OptionalDouble.of(2d));
   assertEquals(test.get(DATE_2012_01_01), OptionalDouble.of(3d));
   assertEquals(test.dates().toArray(), new Object[] {DATE_2011_01_01, DATE_2012_01_01});
   assertEquals(test.values().toArray(), new double[] {2d, 3d});
 }
  public void test_filter_byDateAndValue() {
    List<LocalDate> dates =
        dates(DATE_2010_01_01, DATE_2011_06_01, DATE_2012_01_01, DATE_2013_06_01, DATE_2014_01_01);
    LocalDateDoubleTimeSeries series =
        LocalDateDoubleTimeSeries.builder().putAll(dates, VALUES_10_14).build();

    LocalDateDoubleTimeSeries test = series.filter((ld, v) -> ld.getYear() >= 2012 && v % 2 == 0);
    assertEquals(test.size(), 2);
    assertEquals(test.get(DATE_2012_01_01), OptionalDouble.of(12d));
    assertEquals(test.get(DATE_2014_01_01), OptionalDouble.of(14d));
  }
  public void test_combineWith_intersectionWithAllMatchingElements() {
    List<LocalDate> dates1 = DATES_2010_14;
    List<Double> values1 = values(10, 11, 12, 13, 14);
    LocalDateDoubleTimeSeries series1 =
        LocalDateDoubleTimeSeries.builder().putAll(dates1, values1).build();
    List<LocalDate> dates2 = DATES_2010_14;
    List<Double> values2 = values(1.0, 1.1, 1.2, 1.3, 1.4);
    LocalDateDoubleTimeSeries series2 =
        LocalDateDoubleTimeSeries.builder().putAll(dates2, values2).build();

    LocalDateDoubleTimeSeries combined = series1.intersection(series2, Double::sum);
    assertEquals(combined.size(), 5);
    assertEquals(combined.getEarliestDate(), DATE_2010_01_01);
    assertEquals(combined.getLatestDate(), DATE_2014_01_01);
    assertEquals(combined.get(DATE_2010_01_01), OptionalDouble.of(11.0));
    assertEquals(combined.get(DATE_2011_01_01), OptionalDouble.of(12.1));
    assertEquals(combined.get(DATE_2012_01_01), OptionalDouble.of(13.2));
    assertEquals(combined.get(DATE_2013_01_01), OptionalDouble.of(14.3));
    assertEquals(combined.get(DATE_2014_01_01), OptionalDouble.of(15.4));
  }
  public void partitionByValue() {
    List<LocalDate> dates =
        dates(DATE_2010_01_01, DATE_2011_06_01, DATE_2012_01_01, DATE_2013_06_01, DATE_2014_01_01);
    LocalDateDoubleTimeSeries series =
        LocalDateDoubleTimeSeries.builder().putAll(dates, VALUES_10_14).build();

    Pair<LocalDateDoubleTimeSeries, LocalDateDoubleTimeSeries> partition =
        series.partitionByValue(d -> d > 10 && d < 14);

    LocalDateDoubleTimeSeries mid = partition.getFirst();
    LocalDateDoubleTimeSeries extreme = partition.getSecond();

    assertThat(mid.size()).isEqualTo(3);
    assertThat(extreme.size()).isEqualTo(2);

    assertThat(mid.get(DATE_2011_06_01)).hasValue(11);
    assertThat(mid.get(DATE_2012_01_01)).hasValue(12);
    assertThat(mid.get(DATE_2013_06_01)).hasValue(13);

    assertThat(extreme.get(DATE_2010_01_01)).hasValue(10);
    assertThat(extreme.get(DATE_2014_01_01)).hasValue(14);
  }
  public void partition() {
    List<LocalDate> dates =
        dates(DATE_2010_01_01, DATE_2011_06_01, DATE_2012_01_01, DATE_2013_06_01, DATE_2014_01_01);
    LocalDateDoubleTimeSeries series =
        LocalDateDoubleTimeSeries.builder().putAll(dates, VALUES_10_14).build();

    Pair<LocalDateDoubleTimeSeries, LocalDateDoubleTimeSeries> partition =
        series.partition((ld, d) -> ld.getYear() % 2 == 0);

    LocalDateDoubleTimeSeries even = partition.getFirst();
    LocalDateDoubleTimeSeries odd = partition.getSecond();

    assertThat(even.size()).isEqualTo(3);
    assertThat(odd.size()).isEqualTo(2);

    assertThat(even.get(DATE_2010_01_01)).hasValue(10);
    assertThat(even.get(DATE_2012_01_01)).hasValue(12);
    assertThat(even.get(DATE_2014_01_01)).hasValue(14);

    assertThat(odd.get(DATE_2011_06_01)).hasValue(11);
    assertThat(odd.get(DATE_2013_06_01)).hasValue(13);
  }