// Path: src/main/java/com/github/liblevenshtein/transducer/factory/PositionFactory.java
// @NoArgsConstructor
// public class PositionFactory implements Serializable {
// 
//   private static final long serialVersionUID = 1L;
// 
//   /**
//    * Builds a dummy position.
//    * @return Dummy position.
//    */
//   public Position build() {
//     return new Position(-1, -1);
//   }
// 
//   /**
//    * Builds a position vector for the standard, Levenshtein algorihtm.
//    * @param termIndex Current index of the spelling candidate.
//    * @param numErrors Number of accumulated errors at index {@code termIndex}.
//    * @return New position vector having index {@code termIndex} and error
//    *   {@code numErrors}.
//    */
//   public Position build(final int termIndex, final int numErrors) {
//     return new Position(termIndex, numErrors);
//   }
// 
//   /**
//    * Builds a position vector for the transposition and merge-and-split,
//    * Levenshtein algorihtms.
//    * @param termIndex Current index of the spelling candidate.
//    * @param numErrors Number of accumulated errors at index {@code termIndex}.
//    * @param isSpecial Either {@code 1} or {@code 0}, depending on whether the
//    *   position is a special case (numErrors.g. a transposition position).
//    * @return New position vector having index {@code termIndex}, error
//    *   {@code numErrors}, and special marker {@code isSpecial}.
//    */
//   public Position build(final int termIndex, final int numErrors, final boolean isSpecial) {
//     if (isSpecial) {
//       return new SpecialPosition(termIndex, numErrors);
//     }
// 
//     return new Position(termIndex, numErrors);
//   }
// }
// 
// Path: src/test/java/com/github/liblevenshtein/assertion/SubsumesFunctionAssertions.java
// public static SubsumesFunctionAssertions assertThat(
//     final SubsumesFunction actual) {
//   return new SubsumesFunctionAssertions(actual);
// }


import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.github.liblevenshtein.transducer.factory.PositionFactory;
import static com.github.liblevenshtein.assertion.SubsumesFunctionAssertions.assertThat;
      {1, 1, false, 1, 2, false, 4, true},
      {3, 1, false, 0, 2, true, 4, false},
      {1, 1, false, 0, 2, true, 4, true},
      {3, 3, true, 3, 3, false, 4, false},
      {4, 4, true, 4, 4, false, 4, true},
      {1, 1, true, 2, 1, true, 4, false},
      {1, 1, true, 1, 1, true, 4, true},
    };
  }

  @DataProvider(name = "forMergeAndSplit")
  public Object[][] forMergeAndSplit() {
    return new Object[][] {
      {1, 1, false, 1, 0, false, 4, false},
      {1, 1, false, 1, 1, false, 4, true},
      {1, 1, false, 1, 0, true, 4, false},
      {1, 1, false, 1, 1, true, 4, true},
      {1, 1, true, 1, 0, false, 4, false},
      {1, 1, true, 1, 1, false, 4, false},
      {1, 1, true, 1, 0, true, 4, false},
      {1, 1, true, 1, 1, true, 4, true},
    };
  }

  @Test(dataProvider = "forStandardAlgorithm")
  public void testForStandardAlgorithm(
      final int i, final int e,
      final int j, final int f,
      final int n,
      final boolean shouldSubsume) {
// Path: src/main/java/com/github/liblevenshtein/transducer/factory/PositionFactory.java
// @NoArgsConstructor
// public class PositionFactory implements Serializable {
// 
//   private static final long serialVersionUID = 1L;
// 
//   /**
//    * Builds a dummy position.
//    * @return Dummy position.
//    */
//   public Position build() {
//     return new Position(-1, -1);
//   }
// 
//   /**
//    * Builds a position vector for the standard, Levenshtein algorihtm.
//    * @param termIndex Current index of the spelling candidate.
//    * @param numErrors Number of accumulated errors at index {@code termIndex}.
//    * @return New position vector having index {@code termIndex} and error
//    *   {@code numErrors}.
//    */
//   public Position build(final int termIndex, final int numErrors) {
//     return new Position(termIndex, numErrors);
//   }
// 
//   /**
//    * Builds a position vector for the transposition and merge-and-split,
//    * Levenshtein algorihtms.
//    * @param termIndex Current index of the spelling candidate.
//    * @param numErrors Number of accumulated errors at index {@code termIndex}.
//    * @param isSpecial Either {@code 1} or {@code 0}, depending on whether the
//    *   position is a special case (numErrors.g. a transposition position).
//    * @return New position vector having index {@code termIndex}, error
//    *   {@code numErrors}, and special marker {@code isSpecial}.
//    */
//   public Position build(final int termIndex, final int numErrors, final boolean isSpecial) {
//     if (isSpecial) {
//       return new SpecialPosition(termIndex, numErrors);
//     }
// 
//     return new Position(termIndex, numErrors);
//   }
// }
// 
// Path: src/test/java/com/github/liblevenshtein/assertion/SubsumesFunctionAssertions.java
// public static SubsumesFunctionAssertions assertThat(
//     final SubsumesFunction actual) {
//   return new SubsumesFunctionAssertions(actual);
// }


// Path: src/test/java/com/github/liblevenshtein/transducer/SubsumesFunctionTest.java
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.github.liblevenshtein.transducer.factory.PositionFactory;
import static com.github.liblevenshtein.assertion.SubsumesFunctionAssertions.assertThat;

      {1, 1, false, 1, 2, false, 4, true},
      {3, 1, false, 0, 2, true, 4, false},
      {1, 1, false, 0, 2, true, 4, true},
      {3, 3, true, 3, 3, false, 4, false},
      {4, 4, true, 4, 4, false, 4, true},
      {1, 1, true, 2, 1, true, 4, false},
      {1, 1, true, 1, 1, true, 4, true},
    };
  }

  @DataProvider(name = "forMergeAndSplit")
  public Object[][] forMergeAndSplit() {
    return new Object[][] {
      {1, 1, false, 1, 0, false, 4, false},
      {1, 1, false, 1, 1, false, 4, true},
      {1, 1, false, 1, 0, true, 4, false},
      {1, 1, false, 1, 1, true, 4, true},
      {1, 1, true, 1, 0, false, 4, false},
      {1, 1, true, 1, 1, false, 4, false},
      {1, 1, true, 1, 0, true, 4, false},
      {1, 1, true, 1, 1, true, 4, true},
    };
  }

  @Test(dataProvider = "forStandardAlgorithm")
  public void testForStandardAlgorithm(
      final int i, final int e,
      final int j, final int f,
      final int n,
      final boolean shouldSubsume) {
    assertThat(standardSubsumes)