package com.github.liblevenshtein.transducer; 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; public class SubsumesFunctionTest { private final PositionFactory positionFactory = new PositionFactory(); private final SubsumesFunction standardSubsumes = new SubsumesFunction.ForStandardAlgorithm(); private final SubsumesFunction transpositionSubsumes = new SubsumesFunction.ForTransposition(); private final SubsumesFunction mergeAndSplitSubsumes = new SubsumesFunction.ForMergeAndSplit(); @DataProvider(name = "forStandardAlgorithm") public Object[][] forStandardAlgorithm() { return new Object[][] { {4, 2, 0, 0, 4, false}, {4, 2, 0, 1, 4, false}, {4, 2, 0, 2, 4, false}, {4, 2, 0, 3, 4, false}, {4, 2, 0, 4, 4, false}, {4, 2, 0, 5, 4, false}, {4, 2, 1, 0, 4, false}, {4, 2, 1, 1, 4, false}, {4, 2, 1, 2, 4, false}, {4, 2, 1, 3, 4, false}, {4, 2, 1, 4, 4, false}, {4, 2, 1, 5, 4, true}, {4, 2, 2, 0, 4, false}, {4, 2, 2, 1, 4, false}, {4, 2, 2, 2, 4, false}, {4, 2, 2, 3, 4, false}, {4, 2, 2, 4, 4, true}, {4, 2, 2, 5, 4, true}, {4, 2, 3, 0, 4, false}, {4, 2, 3, 1, 4, false}, {4, 2, 3, 2, 4, false}, {4, 2, 3, 3, 4, true}, {4, 2, 3, 4, 4, true}, {4, 2, 3, 5, 4, true}, {4, 2, 4, 0, 4, false}, {4, 2, 4, 1, 4, false}, {4, 2, 4, 2, 4, true}, {4, 2, 4, 3, 4, true}, {4, 2, 4, 4, 4, true}, {4, 2, 4, 5, 4, true}, {4, 2, 5, 0, 4, false}, {4, 2, 5, 1, 4, false}, {4, 2, 5, 2, 4, false}, {4, 2, 5, 3, 4, true}, {4, 2, 5, 4, 4, true}, {4, 2, 5, 5, 4, true}, {4, 2, 6, 0, 4, false}, {4, 2, 6, 1, 4, false}, {4, 2, 6, 2, 4, false}, {4, 2, 6, 3, 4, false}, {4, 2, 6, 4, 4, true}, {4, 2, 6, 5, 4, true}, {4, 2, 7, 0, 4, false}, {4, 2, 7, 1, 4, false}, {4, 2, 7, 2, 4, false}, {4, 2, 7, 3, 4, false}, {4, 2, 7, 4, 4, false}, {4, 2, 7, 5, 4, true}, {4, 2, 8, 0, 4, false}, {4, 2, 8, 1, 4, false}, {4, 2, 8, 2, 4, false}, {4, 2, 8, 3, 4, false}, {4, 2, 8, 4, 4, false}, {4, 2, 8, 5, 4, false}, }; } @DataProvider(name = "forTransposition") public Object[][] forTransposition() { return new Object[][] { {1, 1, false, 0, 1, false, 4, false}, {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) .subsumesAt( positionFactory.build(i, e), positionFactory.build(j, f), n, shouldSubsume); } @Test(dataProvider = "forTransposition") @SuppressWarnings("checkstyle:parameternumber") public void testForTransposition( final int i, final int e, final boolean s, final int j, final int f, final boolean t, final int n, final boolean shouldSubsume) { assertThat(transpositionSubsumes) .subsumesAt( positionFactory.build(i, e, s), positionFactory.build(j, f, t), n, shouldSubsume); } @Test(dataProvider = "forMergeAndSplit") @SuppressWarnings("checkstyle:parameternumber") public void testForMergeAndSplit( final int i, final int e, final boolean s, final int j, final int f, final boolean t, final int n, final boolean shouldSubsume) { assertThat(mergeAndSplitSubsumes) .subsumesAt( positionFactory.build(i, e, s), positionFactory.build(j, f, t), n, shouldSubsume); } }