package com.vistatec.ocelot.tm.okapi;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.List;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import com.vistatec.ocelot.config.OcelotConfigService;
import com.vistatec.ocelot.config.ConfigTransferService;
import com.vistatec.ocelot.config.xml.OcelotRootConfig;
import com.vistatec.ocelot.segment.model.SegmentAtom;
import com.vistatec.ocelot.segment.model.SimpleSegmentVariant;
import com.vistatec.ocelot.tm.TmMatch;
import com.vistatec.ocelot.tm.TmPenalizer;
import com.vistatec.ocelot.tm.TmTmxWriter;
public class TestOkapiTmService {
private final Mockery mockery = new Mockery();
private final ConfigTransferService cfgXService = mockery.mock(ConfigTransferService.class);
private OkapiTmService tmService;
private File testTm;
@Before
public void before() throws URISyntaxException, IOException, ConfigTransferService.TransferException {
File testTmIndices = OkapiTmTestHelpers.getTestOkapiTmDir();
OkapiTmTestHelpers.deleteDirectory(testTmIndices);
testTmIndices.mkdirs();
this.testTm = new File(TestOkapiTmService.class.getResource("simple_tm.tmx").toURI());
}
@Test
public void testFuzzy() throws ConfigTransferService.TransferException, URISyntaxException, IOException {
final OcelotRootConfig config = new TmConfigBuilder(OkapiTmTestHelpers.getTestOkapiTmDir())
.tmName("simple_tm")
.testTmFileResource(testTm)
.fuzzyThreshold(1)
.maxResults(5)
.build();
this.tmService = new OkapiTmServiceBuilder(config).build();
List<SegmentAtom> appleOrange = new SimpleSegmentVariant("apple orange").getAtoms();
List<TmMatch> appleOrangeResults = tmService.getFuzzyTermMatches(appleOrange);
assertEquals(2, appleOrangeResults.size());
assertEquals("apple orange pear", appleOrangeResults.get(0).getSource().getDisplayText());
assertEquals("simple_tm", appleOrangeResults.get(0).getTmOrigin());
assertEquals("orange apple pear", appleOrangeResults.get(1).getSource().getDisplayText());
assertEquals("simple_tm", appleOrangeResults.get(1).getTmOrigin());
List<SegmentAtom> orangeApple = new SimpleSegmentVariant("orange apple").getAtoms();
List<TmMatch> orangeAppleResults = tmService.getFuzzyTermMatches(orangeApple);
assertEquals(2, appleOrangeResults.size());
assertEquals("orange apple pear", orangeAppleResults.get(0).getSource().getDisplayText());
assertEquals("simple_tm", orangeAppleResults.get(0).getTmOrigin());
assertEquals("apple orange pear", orangeAppleResults.get(1).getSource().getDisplayText());
assertEquals("simple_tm", orangeAppleResults.get(1).getTmOrigin());
List<SegmentAtom> watermelon = new SimpleSegmentVariant("watermelon").getAtoms();
List<TmMatch> watermelonResults = tmService.getFuzzyTermMatches(watermelon);
assertEquals(1, watermelonResults.size());
assertEquals("watermelon pineapple", watermelonResults.get(0).getSource().getDisplayText());
assertEquals("simple_tm", watermelonResults.get(0).getTmOrigin());
}
@Test
public void testConcordance() throws ConfigTransferService.TransferException, URISyntaxException, IOException {
final OcelotRootConfig config = new TmConfigBuilder(OkapiTmTestHelpers.getTestOkapiTmDir())
.tmName("simple_tm")
.testTmFileResource(testTm)
.fuzzyThreshold(1)
.maxResults(5)
.build();
this.tmService = new OkapiTmServiceBuilder(config).build();
List<SegmentAtom> apple = new SimpleSegmentVariant("apple").getAtoms();
List<TmMatch> results = tmService.getConcordanceMatches(apple);
assertEquals(4, results.size());
}
@Test
public void testSearchOnlyEnabled() throws ConfigTransferService.TransferException, URISyntaxException, IOException {
final OcelotRootConfig config = new TmConfigBuilder(OkapiTmTestHelpers.getTestOkapiTmDir())
.tmName("simple_tm")
.testTmFileResource(testTm)
.fuzzyThreshold(1)
.maxResults(5)
.build();
this.tmService = new OkapiTmServiceBuilder(config).build();
List<SegmentAtom> apple = new SimpleSegmentVariant("apple").getAtoms();
List<TmMatch> results = tmService.getConcordanceMatches(apple);
assertEquals(4, results.size());
config.getTmManagement().getTms().get(0).setEnabled(false);
results = tmService.getConcordanceMatches(apple);
assertEquals(0, results.size());
}
@AfterClass
public static void cleanup() throws URISyntaxException {
OkapiTmTestHelpers.deleteDirectory(OkapiTmTestHelpers.getTestOkapiTmDir());
}
private class OkapiTmServiceBuilder {
private final OcelotRootConfig config;
public OkapiTmServiceBuilder(OcelotRootConfig config) {
this.config = config;
}
public OkapiTmService build() throws ConfigTransferService.TransferException, URISyntaxException, IOException {
TmTmxWriter tmxWriter = mockery.mock(TmTmxWriter.class);
final TmPenalizer penalizer = mockery.mock(TmPenalizer.class);
mockery.checking(new Expectations() {
{
allowing(cfgXService).parse();
will(returnValue(config));
allowing(cfgXService).save(with(any(OcelotRootConfig.class)));
allowing(penalizer).applyPenalties(with(any(List.class)));
will(new OkapiTmTestHelpers.ReturnFirstArgument());
}
});
OcelotConfigService cfgService = new OcelotConfigService(cfgXService);
OkapiTmManager tmManager = new OkapiTmManager(OkapiTmTestHelpers.getTestOkapiTmDir(), cfgService, tmxWriter);
return new OkapiTmService(tmManager, penalizer, cfgService);
}
}
}