package com.github.liblevenshtein.transducer;
import java.net.URL;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import static org.assertj.core.api.Assertions.assertThat;
import lombok.val;
import com.github.liblevenshtein.collection.dictionary.SortedDawg;
import com.github.liblevenshtein.distance.MemoizedTransposition;
import com.github.liblevenshtein.serialization.ProtobufSerializer;
import com.github.liblevenshtein.serialization.Serializer;
import com.github.liblevenshtein.transducer.factory.TransducerBuilder;
import static com.github.liblevenshtein.assertion.CandidateAssertions.assertThat;
import static com.github.liblevenshtein.assertion.SetAssertions.assertThat;
@SuppressWarnings("unchecked")
public class TranspositionTransducerTest {
private static final int MAX_DISTANCE = 3;
private static final String QUERY_TERM = "Jvaa";
private ITransducer<Candidate> transducer;
private Set<Candidate> expectedCandidates;
@BeforeTest
public void setUp() throws Exception {
final URL dictionaryUrl =
getClass().getResource("/programming-languages.protobuf.bytes");
final Serializer serializer = new ProtobufSerializer();
final SortedDawg dictionary =
serializer.deserialize(SortedDawg.class, dictionaryUrl);
this.transducer = new TransducerBuilder()
.algorithm(Algorithm.TRANSPOSITION)
.defaultMaxDistance(MAX_DISTANCE)
.dictionary(dictionary)
.build();
this.expectedCandidates = new HashSet<>();
expectedCandidates.add(new Candidate("Java", 1));
expectedCandidates.add(new Candidate("Lava", 2));
expectedCandidates.add(new Candidate("Ada", 3));
expectedCandidates.add(new Candidate("Agda", 3));
expectedCandidates.add(new Candidate("Cola", 3));
expectedCandidates.add(new Candidate("J", 3));
expectedCandidates.add(new Candidate("J#", 3));
expectedCandidates.add(new Candidate("J++", 3));
expectedCandidates.add(new Candidate("JADE", 3));
expectedCandidates.add(new Candidate("Jako", 3));
expectedCandidates.add(new Candidate("JAL", 3));
expectedCandidates.add(new Candidate("JASS", 3));
expectedCandidates.add(new Candidate("JCL", 3));
expectedCandidates.add(new Candidate("JEAN", 3));
expectedCandidates.add(new Candidate("JOSS", 3));
expectedCandidates.add(new Candidate("Joy", 3));
expectedCandidates.add(new Candidate("Julia", 3));
expectedCandidates.add(new Candidate("Leda", 3));
expectedCandidates.add(new Candidate("Lua", 3));
expectedCandidates.add(new Candidate("Max", 3));
expectedCandidates.add(new Candidate("Maya", 3));
expectedCandidates.add(new Candidate("Mesa", 3));
expectedCandidates.add(new Candidate("Nial", 3));
expectedCandidates.add(new Candidate("Oak", 3));
expectedCandidates.add(new Candidate("Opa", 3));
expectedCandidates.add(new Candidate("Opal", 3));
expectedCandidates.add(new Candidate("Reia", 3));
expectedCandidates.add(new Candidate("Rlab", 3));
expectedCandidates.add(new Candidate("Scala", 3));
expectedCandidates.add(new Candidate("Span", 3));
expectedCandidates.add(new Candidate("Stata", 3));
expectedCandidates.add(new Candidate("Tea", 3));
expectedCandidates.add(new Candidate("Trac", 3));
expectedCandidates.add(new Candidate("Vala", 3));
expectedCandidates.add(new Candidate("Vvvv", 3));
}
@Test
public void testTransduce() {
final Iterable<Candidate> actualCandidates = transducer.transduce(QUERY_TERM);
final Iterator<Candidate> actualIter = actualCandidates.iterator();
val distance = new MemoizedTransposition();
while (actualIter.hasNext()) {
final Candidate actualCandidate = actualIter.next();
assertThat(actualCandidate).hasDistance(distance, QUERY_TERM);
assertThat(expectedCandidates).contains(actualCandidate);
expectedCandidates.remove(actualCandidate);
}
assertThat(expectedCandidates).isEmpty();
}
}