private void verifyTargetOperations(
      String[] source, String[] target, int[] expectedOps, int expectedDistance) {

    Token[] sourceTokens = makeTokens(source);
    Token[] targetTokens = makeTokens(target);

    assertEquals("test error", target.length, expectedOps.length);
    LevenshteinDistance distance = new LevenshteinDistance(sourceTokens, targetTokens);

    assertEquals(expectedDistance, distance.calculate());
    EditOperation[] ops = distance.getTargetOperations();
    assertEquals(expectedOps.length, ops.length);
    for (int i = 0; i < ops.length; ++i) {
      assertEquals(
          "Token " + i + " '" + target[i] + "' has wrong operation",
          expectedOps[i],
          ops[i].getType());
      if (expectedOps[i] == UNCHANGED) {
        assertEquals(source[ops[i].getPosition()], target[i]);
      } else if (expectedOps[i] == REPLACE) {
        assertFalse(source[ops[i].getPosition()].equals(target[i]));
      }
    }
  }