// 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/main/java/com/github/liblevenshtein/transducer/factory/StateFactory.java
// public class StateFactory implements Serializable {
// 
//   private static final long serialVersionUID = 1L;
// 
//   /**
//    * Builds a new, Levenshtein state with the given position vectors.
//    * @param positions Array of position vectors to link into the state.
//    * @return New state having the position vectors.
//    */
//   public State build(final Position... positions) {
//     final State state = new State();
// 
//     Position prev = null;
//     for (final Position curr : positions) {
//       state.insertAfter(prev, curr);
//       prev = curr;
//     }
// 
//     return state;
//   }
// }
// 
// Path: src/test/java/com/github/liblevenshtein/assertion/DistanceFunctionAssertions.java
// public static DistanceFunctionAssertions assertThat(final DistanceFunction actual) {
//   return new DistanceFunctionAssertions(actual);
// }


import org.testng.annotations.Test;
import lombok.val;
import com.github.liblevenshtein.transducer.factory.PositionFactory;
import com.github.liblevenshtein.transducer.factory.StateFactory;
import static com.github.liblevenshtein.assertion.DistanceFunctionAssertions.assertThat;
package com.github.liblevenshtein.transducer;





public class SpecialPositionDistanceFunctionTest {

  @Test
  public void testAt() {
    val stateFactory = new StateFactory();
    val positionFactory = new PositionFactory();

    final State state = stateFactory.build(
        positionFactory.build(2, 3, false),
        positionFactory.build(1, 1, false),
        positionFactory.build(4, 2, true));

    final DistanceFunction distance = new DistanceFunction.ForSpecialPositions();
// 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/main/java/com/github/liblevenshtein/transducer/factory/StateFactory.java
// public class StateFactory implements Serializable {
// 
//   private static final long serialVersionUID = 1L;
// 
//   /**
//    * Builds a new, Levenshtein state with the given position vectors.
//    * @param positions Array of position vectors to link into the state.
//    * @return New state having the position vectors.
//    */
//   public State build(final Position... positions) {
//     final State state = new State();
// 
//     Position prev = null;
//     for (final Position curr : positions) {
//       state.insertAfter(prev, curr);
//       prev = curr;
//     }
// 
//     return state;
//   }
// }
// 
// Path: src/test/java/com/github/liblevenshtein/assertion/DistanceFunctionAssertions.java
// public static DistanceFunctionAssertions assertThat(final DistanceFunction actual) {
//   return new DistanceFunctionAssertions(actual);
// }


// Path: src/test/java/com/github/liblevenshtein/transducer/SpecialPositionDistanceFunctionTest.java
import org.testng.annotations.Test;
import lombok.val;
import com.github.liblevenshtein.transducer.factory.PositionFactory;
import com.github.liblevenshtein.transducer.factory.StateFactory;
import static com.github.liblevenshtein.assertion.DistanceFunctionAssertions.assertThat;

package com.github.liblevenshtein.transducer;





public class SpecialPositionDistanceFunctionTest {

  @Test
  public void testAt() {
    val stateFactory = new StateFactory();
    val positionFactory = new PositionFactory();

    final State state = stateFactory.build(
        positionFactory.build(2, 3, false),
        positionFactory.build(1, 1, false),
        positionFactory.build(4, 2, true));

    final DistanceFunction distance = new DistanceFunction.ForSpecialPositions();
    assertThat(distance).hasDistance(state, 4, 4);