package com.miguelfonseca.completely.text.match;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@SuppressWarnings("checkstyle:multiplestringliterals")
public class EditDistanceAutomatonTest extends AbstractAutomatonTest<EditDistanceAutomaton>
{
@Test
public void testCreateNegativeThreshold()
{
exceptionRule.expect(IllegalArgumentException.class);
new EditDistanceAutomaton("", -1D);
}
@Test
public void testCreateNullPattern()
{
exceptionRule.expect(NullPointerException.class);
new EditDistanceAutomaton(null, 0D);
}
@Test
public void testCreateEmptyPattern()
{
automaton = new EqualityAutomaton("");
assertTrue(automaton.isWordAccepted());
assertFalse(automaton.isWordRejected());
}
@Test
public void testGetScoreEmptyPattern()
{
automaton = new EditDistanceAutomaton("", 0D);
assertEquals(1, automaton.getScore(), 0D);
automaton = automaton.step('a');
assertEquals(0, automaton.getScore(), 0D);
}
@Test
public void testGetScore()
{
automaton = new EditDistanceAutomaton("abcd", 0D);
assertEquals(0, automaton.getScore(), 0);
automaton = automaton.step('a');
assertEquals(0.25, automaton.getScore(), 0D);
automaton = automaton.step('b');
assertEquals(0.5, automaton.getScore(), 0D);
automaton = automaton.step('c');
assertEquals(0.75, automaton.getScore(), 0D);
automaton = automaton.step('d');
assertEquals(1, automaton.getScore(), 0D);
automaton = automaton.step('e');
assertEquals(0.8, automaton.getScore(), 0D);
}
@Test
public void testExactMatchSingleCharacterStep()
{
automaton = new EditDistanceAutomaton("a", 0D);
assertFalse(automaton.isWordAccepted());
assertFalse(automaton.isWordRejected());
automaton = automaton.step('a');
assertTrue(automaton.isWordAccepted());
assertFalse(automaton.isWordRejected());
automaton = automaton.step('b');
assertFalse(automaton.isWordAccepted());
assertTrue(automaton.isWordRejected());
}
@Test
public void testFuzzyMatchMultiCharacterStep()
{
automaton = new EditDistanceAutomaton("abcd", 1D);
assertFalse(automaton.isWordAccepted());
assertFalse(automaton.isWordRejected());
automaton = automaton.step("bc");
assertFalse(automaton.isWordAccepted());
assertFalse(automaton.isWordRejected());
automaton = automaton.stepUntilWordAccepted("de");
assertTrue(automaton.isWordAccepted());
assertFalse(automaton.isWordRejected());
}
@Test
public void testFuzzyMatchSingleCharacterStep()
{
automaton = new EditDistanceAutomaton("a", 1D);
assertTrue(automaton.isWordAccepted());
assertFalse(automaton.isWordRejected());
automaton = automaton.step('a');
assertTrue(automaton.isWordAccepted());
assertFalse(automaton.isWordRejected());
automaton = automaton.step('b');
assertTrue(automaton.isWordAccepted());
assertFalse(automaton.isWordRejected());
automaton = automaton.step('c');
assertFalse(automaton.isWordAccepted());
assertTrue(automaton.isWordRejected());
}
}