//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.annotators.templates; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.fit.util.JCasUtil; import org.apache.uima.resource.ResourceInitializationException; import org.junit.Before; import org.junit.Test; import uk.gov.dstl.baleen.types.templates.TemplateRecord; import uk.gov.dstl.baleen.types.templates.TemplateField; public class TemplateValidatorTest extends AbstractRecordAnnotatorTest { public TemplateValidatorTest() { super(TemplateValidator.class); } @Override @Before public void setup() throws IOException { super.setup(); TemplateRecord otherRecord = new TemplateRecord(jCas); otherRecord.setBegin(53); otherRecord.setEnd(105); otherRecord.setName("otherRecord"); otherRecord.setSource("other"); otherRecord.addToIndexes(); TemplateField otherField = new TemplateField(jCas); otherField.setBegin(53); otherField.setEnd(68); otherField.setName("otherField"); otherField.setSource("other"); otherField.setValue("default"); otherField.addToIndexes(); } @Test public void testRecordWithAllFieldsRemains() throws AnalysisEngineProcessException, ResourceInitializationException, IOException { Path definitionFile = createRecordDefinitionWithRequiredField(); String source = definitionFile.toFile().getName(); addRecord(source); addOptionalField(source); addRequiredField(source); try { processJCas(TemplateAnnotator.PARAM_RECORD_DEFINITIONS_DIRECTORY, tempDirectory.toString()); Collection<TemplateRecord> records = removeOtherRecord(JCasUtil.select(jCas, TemplateRecord.class)); assertEquals(1, records.size()); Collection<TemplateField> fields = removeOtherField(JCasUtil.select(jCas, TemplateField.class)); assertEquals(2, fields.size()); } finally { Files.delete(definitionFile); } } @Test public void testRecordWithOnlyRequiredFiledRemains() throws AnalysisEngineProcessException, ResourceInitializationException, IOException { Path definitionFile = createRecordDefinitionWithRequiredField(); String source = definitionFile.toFile().getName(); addRecord(source); addRequiredField(source); try { processJCas(TemplateAnnotator.PARAM_RECORD_DEFINITIONS_DIRECTORY, tempDirectory.toString()); Collection<TemplateRecord> records = removeOtherRecord(JCasUtil.select(jCas, TemplateRecord.class)); assertEquals(1, records.size()); Collection<TemplateField> fields = removeOtherField(JCasUtil.select(jCas, TemplateField.class)); assertEquals(1, fields.size()); } finally { Files.delete(definitionFile); } } @Test public void testRecordWithMissingRequiredFieldIsRemoved() throws AnalysisEngineProcessException, ResourceInitializationException, IOException { Path definitionFile = createRecordDefinitionWithRequiredField(); String source = definitionFile.toFile().getName(); addRecord(source); try { processJCas(TemplateAnnotator.PARAM_RECORD_DEFINITIONS_DIRECTORY, tempDirectory.toString()); Collection<TemplateRecord> records = removeOtherRecord(JCasUtil.select(jCas, TemplateRecord.class)); assertEquals(0, records.size()); Collection<TemplateField> fields = removeOtherField(JCasUtil.select(jCas, TemplateField.class)); assertEquals(0, fields.size()); } finally { Files.delete(definitionFile); } } @Test public void testRecordWithMissingRequiredFieldIsRemovedWhenSourceSpecified() throws AnalysisEngineProcessException, ResourceInitializationException, IOException { Path definitionFile = createRecordDefinitionWithRequiredField(); String source = definitionFile.toFile().getName(); addRecord(source); try { processJCas(TemplateAnnotator.PARAM_RECORD_DEFINITIONS_DIRECTORY, tempDirectory.toString(), TemplateValidator.PARAM_SOURCE, source); Collection<TemplateRecord> records = removeOtherRecord(JCasUtil.select(jCas, TemplateRecord.class)); assertEquals(0, records.size()); Collection<TemplateField> fields = removeOtherField(JCasUtil.select(jCas, TemplateField.class)); assertEquals(0, fields.size()); } finally { Files.delete(definitionFile); } } @Test public void testRecordWithMissingRequiredFieldIsRemovedWhenRecordSpecified() throws AnalysisEngineProcessException, ResourceInitializationException, IOException { Path definitionFile = createRecordDefinitionWithRequiredField(); String source = definitionFile.toFile().getName(); addRecord(source); try { processJCas(TemplateAnnotator.PARAM_RECORD_DEFINITIONS_DIRECTORY, tempDirectory.toString(), TemplateValidator.PARAM_RECORDS, new String[] { "record" }); Collection<TemplateRecord> records = removeOtherRecord(JCasUtil.select(jCas, TemplateRecord.class)); assertEquals(0, records.size()); Collection<TemplateField> fields = removeOtherField(JCasUtil.select(jCas, TemplateField.class)); assertEquals(0, fields.size()); } finally { Files.delete(definitionFile); } } @Test public void testRecordWithMissingRequiredFieldIsRemovedWhenSourceAndRecordSpecified() throws AnalysisEngineProcessException, ResourceInitializationException, IOException { Path definitionFile = createRecordDefinitionWithRequiredField(); String source = definitionFile.toFile().getName(); addRecord(source); try { processJCas(TemplateAnnotator.PARAM_RECORD_DEFINITIONS_DIRECTORY, tempDirectory.toString(), TemplateValidator.PARAM_SOURCE, source, TemplateValidator.PARAM_RECORDS, new String[] { "record" }); Collection<TemplateRecord> records = removeOtherRecord(JCasUtil.select(jCas, TemplateRecord.class)); assertEquals(0, records.size()); Collection<TemplateField> fields = removeOtherField(JCasUtil.select(jCas, TemplateField.class)); assertEquals(0, fields.size()); } finally { Files.delete(definitionFile); } } @Test public void testRecordWithMissingRequiredFieldIsNotRemovedWhenOtherSourceSpecified() throws AnalysisEngineProcessException, ResourceInitializationException, IOException { Path definitionFile = createRecordDefinitionWithRequiredField(); String source = definitionFile.toFile().getName(); addRecord(source); addOptionalField(source); try { processJCas(TemplateAnnotator.PARAM_RECORD_DEFINITIONS_DIRECTORY, tempDirectory.toString(), TemplateValidator.PARAM_SOURCE, "other", TemplateValidator.PARAM_RECORDS, new String[] { "record" }); Collection<TemplateRecord> records = removeOtherRecord(JCasUtil.select(jCas, TemplateRecord.class)); assertEquals(1, records.size()); Collection<TemplateField> fields = removeOtherField(JCasUtil.select(jCas, TemplateField.class)); assertEquals(1, fields.size()); } finally { Files.delete(definitionFile); } } @Test public void testRecordWithMissingRequiredFieldIsNotRemovedWhenOtherRecordSpecified() throws AnalysisEngineProcessException, ResourceInitializationException, IOException { Path definitionFile = createRecordDefinitionWithRequiredField(); String source = definitionFile.toFile().getName(); addRecord(source); addOptionalField(source); try { processJCas(TemplateAnnotator.PARAM_RECORD_DEFINITIONS_DIRECTORY, tempDirectory.toString(), TemplateValidator.PARAM_SOURCE, source, TemplateValidator.PARAM_RECORDS, new String[] { "other" }); Collection<TemplateRecord> records = removeOtherRecord(JCasUtil.select(jCas, TemplateRecord.class)); assertEquals(1, records.size()); Collection<TemplateField> fields = removeOtherField(JCasUtil.select(jCas, TemplateField.class)); assertEquals(1, fields.size()); } finally { Files.delete(definitionFile); } } @Test public void testOptionalFieldsFromRecordWithMissingRequiredFiledAreRemoved() throws AnalysisEngineProcessException, ResourceInitializationException, IOException { Path definitionFile = createRecordDefinitionWithRequiredField(); String source = definitionFile.toFile().getName(); addRecord(source); addOptionalField(source); try { processJCas(TemplateAnnotator.PARAM_RECORD_DEFINITIONS_DIRECTORY, tempDirectory.toString()); Collection<TemplateRecord> records = removeOtherRecord(JCasUtil.select(jCas, TemplateRecord.class)); assertEquals(0, records.size()); Collection<TemplateField> fields = removeOtherField(JCasUtil.select(jCas, TemplateField.class)); assertEquals(0, fields.size()); } finally { Files.delete(definitionFile); } } private Collection<TemplateRecord> removeOtherRecord(Collection<TemplateRecord> selected) { Collection<TemplateRecord> remaining = new ArrayList<>(); for (TemplateRecord r : selected) { if (!"otherRecord".equals(r.getName())) { remaining.add(r); } } assertTrue(remaining.size() < selected.size()); return remaining; } private Collection<TemplateField> removeOtherField(Collection<TemplateField> selected) { Collection<TemplateField> remaining = new ArrayList<>(); for (TemplateField r : selected) { if (!"otherField".equals(r.getName())) { remaining.add(r); } } assertTrue(remaining.size() < selected.size()); return remaining; } private Path createRecordDefinitionWithRequiredField() throws IOException { TemplateFieldConfiguration notRequiredField = new TemplateFieldConfiguration("optional", "Paragraph:nth-of-type(3)"); TemplateFieldConfiguration requiredField = new TemplateFieldConfiguration("required", "Paragraph:nth-of-type(2)"); requiredField.setRequired(true); return createRecord("record", notRequiredField, requiredField); } private void addRecord(String source) { TemplateRecord record1 = new TemplateRecord(jCas); record1.setBegin(52); record1.setEnd(212); record1.setName("record"); record1.setSource(source); record1.addToIndexes(); } private void addRequiredField(String source) { TemplateField field = new TemplateField(jCas); field.setBegin(53); field.setEnd(105); field.setName("required"); field.setSource(source); field.setValue(PARA2); field.addToIndexes(); } private void addOptionalField(String source) { TemplateField field = new TemplateField(jCas); field.setBegin(122); field.setEnd(125); field.setName("optional"); field.setSource(source); field.setValue("rat"); field.addToIndexes(); } }