public void testInterpolate() {
    MCoordinate mc0NaN = MCoordinate.create2d(0.0, 0.0);
    MCoordinate mc0 = MCoordinate.create2dWithMeasure(0.0, 0.0, 0.0);
    MCoordinate mc2NaN = MCoordinate.create2d(2.0, 0.0);
    MCoordinate mc5NaN = MCoordinate.create2d(5.0, 0.0);
    MCoordinate mc10NaN = MCoordinate.create2d(10.0, 0.0);
    MCoordinate mc10 = MCoordinate.create2dWithMeasure(10.0, 0.0, 10.0);

    // Internal coordinate measures are not defined, outer measures are
    // 0-10, total 2d length is 10
    MLineString line =
        mgeomFactory.createMLineString(new MCoordinate[] {mc0, mc2NaN, mc5NaN, mc10});
    MLineString lineBeginNaN =
        mgeomFactory.createMLineString(new MCoordinate[] {mc0NaN, mc2NaN, mc5NaN, mc10});
    MLineString lineEndNaN =
        mgeomFactory.createMLineString(new MCoordinate[] {mc0, mc2NaN, mc5NaN, mc10NaN});

    assertTrue(DoubleComparator.equals(line.getLength(), 10));
    assertTrue(DoubleComparator.equals(lineBeginNaN.getLength(), 10));
    assertTrue(DoubleComparator.equals(lineEndNaN.getLength(), 10));

    line.interpolate(mc0.m, mc10.m);
    lineBeginNaN.interpolate(mc0.m, mc10.m);
    lineEndNaN.interpolate(mc0.m, mc10.m);

    assertTrue(line.isMonotone(false));
    assertTrue(line.isMonotone(true));
    assertTrue(lineBeginNaN.isMonotone(false));
    assertTrue(lineBeginNaN.isMonotone(true));
    assertTrue(lineEndNaN.isMonotone(false));
    assertTrue(lineEndNaN.isMonotone(true));

    double[] expectedM = new double[] {mc0.m, 2.0, 5.0, mc10.m};
    for (int i = 0; i < expectedM.length; i++) {
      double actualMLine = line.getCoordinateSequence().getOrdinate(i, CoordinateSequence.M);
      double actualBeginNaN =
          lineBeginNaN.getCoordinateSequence().getOrdinate(i, CoordinateSequence.M);
      double actualEndNaN = lineEndNaN.getCoordinateSequence().getOrdinate(i, CoordinateSequence.M);
      assertTrue(DoubleComparator.equals(expectedM[i], actualMLine));
      assertTrue(DoubleComparator.equals(expectedM[i], actualBeginNaN));
      assertTrue(DoubleComparator.equals(expectedM[i], actualEndNaN));
    }

    // Test Continuous case by interpolating with begin and end measures
    // equal
    double continuousMeasure = 0.0D;
    line.interpolate(continuousMeasure, continuousMeasure);
    double[] measures = line.getMeasures();
    for (int i = 0; i < measures.length; i++)
      assertTrue(DoubleComparator.equals(measures[i], continuousMeasure));
  }