package org.semanticweb.HermiT.reasoner;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import org.semanticweb.HermiT.Prefixes;
import org.semanticweb.HermiT.datatypes.DatatypeRegistry;
import org.semanticweb.HermiT.datatypes.MalformedLiteralException;
import org.semanticweb.HermiT.datatypes.ValueSpaceSubset;
import org.semanticweb.HermiT.model.Constant;
import org.semanticweb.HermiT.model.DatatypeRestriction;
public class AnyURITest extends AbstractReasonerTest {
protected static final String XSD_ANY_URI=Prefixes.s_semanticWebPrefixes.get("xsd:")+"anyURI";
public AnyURITest(String name) {
super(name);
}
public void testInvalidAnyURILiterals() throws Exception {
assertEquals(URI.create("http://bla.com/test"),DatatypeRegistry.parseLiteral("http://bla.com/test",XSD_ANY_URI));
try {
DatatypeRegistry.parseLiteral("abc 123",XSD_ANY_URI);
fail();
}
catch (MalformedLiteralException expected) {
}
}
public void testLength_1() throws Exception {
assertDRSatisfiable(true,
DR("xsd:anyURI","xsd:length",INT("2")),
OO(AURI("ab"))
);
}
public void testLength_2() throws Exception {
assertDRSatisfiable(false,
DR("xsd:anyURI","xsd:length",INT("3")),
OO(AURI("ab"))
);
}
public void testLength_3() throws Exception {
assertDRSatisfiable(true,
DR("xsd:anyURI","xsd:minLength",INT("2"),"xsd:maxLength",INT("6")),
NOT(DR("xsd:anyURI","xsd:minLength",INT("3"),"xsd:maxLength",INT("5"))),
OO(AURI("ab"))
);
}
public void testLength_4() throws Exception {
assertDRSatisfiable(true,
DR("xsd:anyURI","xsd:minLength",INT("2"),"xsd:maxLength",INT("6")),
NOT(DR("xsd:anyURI","xsd:minLength",INT("3"),"xsd:maxLength",INT("5"))),
OO(AURI("abcdef"))
);
}
public void testLength_5() throws Exception {
assertDRSatisfiable(false,
DR("xsd:anyURI","xsd:minLength",INT("2"),"xsd:maxLength",INT("6")),
NOT(DR("xsd:anyURI","xsd:minLength",INT("3"),"xsd:maxLength",INT("5"))),
OO(AURI("abcde"))
);
}
public void testSize_1() throws Exception {
assertDRSatisfiable(true,
DR("xsd:anyURI","xsd:length",INT("0"))
);
}
public void testSize_2() throws Exception {
assertDRSatisfiable(false,2,
DR("xsd:anyURI","xsd:length",INT("0"))
);
}
public void testSize_3() throws Exception {
assertDRSatisfiable(false,
DR("xsd:anyURI","xsd:length",INT("0")),
NOT(OO(AURI("")))
);
}
public void testIntersection() throws Exception {
assertDRSatisfiable(false,
DR("xsd:anyURI","xsd:minLength",INT("0")),
NOT(DR("xsd:anyURI","xsd:minLength",INT("1")))
);
}
public void testPattern1_1() throws Exception {
assertDRSatisfiable(true,
DR("xsd:anyURI","xsd:pattern",STR("ab(c+)")),
OO(AURI("abc"),AURI("abbb"))
);
}
public void testPattern1_2() throws Exception {
assertDRSatisfiable(false,2,
DR("xsd:anyURI","xsd:pattern",STR("ab(c+)")),
OO(AURI("abc"),AURI("abbb"))
);
}
public void testPattern2_1() throws Exception {
assertDRSatisfiable(true,3,
DR("xsd:anyURI","xsd:pattern",STR("ab(c|d|e)"))
);
}
public void testPattern2_2() throws Exception {
assertDRSatisfiable(false,4,
DR("xsd:anyURI","xsd:pattern",STR("ab(c|d|e)"))
);
}
public void testPattern3() throws Exception {
assertDRSatisfiable(false,
DR("xsd:anyURI","xsd:pattern",STR("ab(c|d|e)")),
NOT(OO(AURI("abc"),AURI("abd"),AURI("abe")))
);
}
public void testPatternAndLength1_1() throws Exception {
assertDRSatisfiable(true,
DR("xsd:anyURI","xsd:pattern",STR("ab(c+)"),"xsd:length",INT("5"))
);
}
public void testPatternAndLength1_2() throws Exception {
assertDRSatisfiable(false,
DR("xsd:anyURI","xsd:pattern",STR("ab(c+)"),"xsd:minLength",INT("4"),"xsd:maxLength",INT("5")),
NOT(OO(AURI("abcc"),AURI("abccc")))
);
}
public void testPatternAndLength1_3() throws Exception {
assertDRSatisfiable(true,
DR("xsd:anyURI","xsd:pattern",STR("ab(c+)"),"xsd:minLength",INT("4")),
NOT(OO(AURI("abcc"),AURI("abccc")))
);
}
public void testPatternAndLength2() throws Exception {
ValueSpaceSubset subset=subset("xsd:pattern",STR_C("ab(c+)"),"xsd:minLength",INT_C("5"));
assertTrue(subset.hasCardinalityAtLeast(5000));
try {
subset.enumerateDataValues(new ArrayList<Object>());
fail();
}
catch (Exception expected) {
}
assertFalse(subset.containsDataValue(URI.create("ab")));
assertTrue(subset.containsDataValue(URI.create("abccccccccccc")));
}
public void testPatternAndLength3() throws Exception {
ValueSpaceSubset subset=subset("xsd:pattern",STR_C("ab(c+)"),"xsd:minLength",INT_C("5"),"xsd:maxLength",INT_C("10"));
assertTrue(subset.hasCardinalityAtLeast(6));
assertFalse(subset.hasCardinalityAtLeast(7));
Set<Object> values=new HashSet<Object>();
subset.enumerateDataValues(values);
assertContainsAll(values,
URI.create("abccc"),
URI.create("abcccc"),
URI.create("abccccc"),
URI.create("abcccccc"),
URI.create("abccccccc"),
URI.create("abcccccccc")
);
}
public void testPatternComplement1_1() throws Exception {
assertDRSatisfiable(true,3,
DR("xsd:anyURI","xsd:pattern",STR("ab(c*)")),
NOT(DR("xsd:anyURI","xsd:minLength",INT("5")))
);
}
public void testPatternComplement1_2() throws Exception {
assertDRSatisfiable(false,4,
DR("xsd:anyURI","xsd:pattern",STR("ab(c*)")),
NOT(DR("xsd:anyURI","xsd:minLength",INT("5")))
);
}
public void testPatternComplement1_3() throws Exception {
assertDRSatisfiable(false,
DR("xsd:anyURI","xsd:pattern",STR("ab(c*)")),
NOT(DR("xsd:anyURI","xsd:minLength",INT("5"))),
NOT(OO(AURI("ab"),AURI("abc"),AURI("abcc")))
);
}
public void testComplement2() throws Exception {
ValueSpaceSubset main=subset("xsd:pattern",STR_C("ab(c*)"));
DatatypeRestriction restriction=restriction("xsd:minLength",INT_C("5"));
ValueSpaceSubset intersection=DatatypeRegistry.conjoinWithDRNegation(main,restriction);
assertTrue(intersection.hasCardinalityAtLeast(3));
assertFalse(intersection.hasCardinalityAtLeast(4));
Set<Object> values=new HashSet<Object>();
intersection.enumerateDataValues(values);
assertContainsAll(values,URI.create("ab"),URI.create("abc"),URI.create("abcc"));
}
public void testComplement3() throws Exception {
ValueSpaceSubset main=subset();
DatatypeRestriction restriction=restriction("xsd:minLength",INT_C("5"));
ValueSpaceSubset intersection=DatatypeRegistry.conjoinWithDRNegation(main,restriction);
assertFalse(intersection.containsDataValue(URI.create("abcde")));
assertTrue(intersection.containsDataValue(URI.create("abcd")));
}
public void testComplement4() throws Exception {
ValueSpaceSubset main=subset("xsd:pattern",STR_C("a+"));
DatatypeRestriction restriction=restriction("xsd:minLength",INT_C("5"));
ValueSpaceSubset intersection=DatatypeRegistry.conjoinWithDRNegation(main,restriction);
assertFalse(intersection.containsDataValue(URI.create("aaaaa")));
assertTrue(intersection.containsDataValue(URI.create("aaaa")));
}
protected static DatatypeRestriction restriction(Object... arguments) {
String[] facetURIs=new String[arguments.length/2];
Constant[] facetValues=new Constant[arguments.length/2];
for (int index=0;index<arguments.length;index+=2) {
facetURIs[index/2]=Prefixes.STANDARD_PREFIXES.expandAbbreviatedIRI((String)arguments[index]);
facetValues[index/2]=(Constant)arguments[index+1];
}
return DatatypeRestriction.create(XSD_ANY_URI,facetURIs,facetValues);
}
protected static ValueSpaceSubset subset(Object... arguments) {
DatatypeRestriction restriction=restriction(arguments);
return DatatypeRegistry.createValueSpaceSubset(restriction);
}
}