Source code: com/hp/hpl/jena/reasoner/rulesys/test/OWLUnitTest.java
1 /******************************************************************
2 * File: OWLUnitTest.java
3 * Created by: Dave Reynolds
4 * Created on: 19-Mar-2004
5 *
6 * (c) Copyright 2004, 2005 Hewlett-Packard Development Company, LP, all rights reserved.
7 * [See end of file]
8 * $Id: OWLUnitTest.java,v 1.10 2005/04/11 11:27:04 der Exp $
9 *****************************************************************/
10 package com.hp.hpl.jena.reasoner.rulesys.test;
11
12 import com.hp.hpl.jena.rdf.model.ResourceFactory;
13 import com.hp.hpl.jena.reasoner.*;
14 import com.hp.hpl.jena.reasoner.rulesys.*;
15 import com.hp.hpl.jena.reasoner.rulesys.test.OWLWGTester;
16
17 import junit.framework.TestCase;
18 import junit.framework.TestSuite;
19
20 import java.io.IOException;
21
22 /**
23 * Version of the OWL unit tests used during development of the mini ruleset.
24 *
25 * @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
26 * @version $Revision: 1.10 $ on $Date: 2005/04/11 11:27:04 $
27 */
28 public class OWLUnitTest extends TestCase {
29
30 // -------------- statics defining the whole test suite ---------------------
31
32 /** The set of reasoner(factories) to test */
33 public static ReasonerFactory[] reasonerFactories = {
34 OWLFBRuleReasonerFactory.theInstance(),
35 OWLMicroReasonerFactory.theInstance(),
36 OWLMiniReasonerFactory.theInstance()
37 };
38
39 /** The names of the reasoner(factories) to report in the test suite */
40 public static final String[] reasonerNames = { "full", "Micro", "Mini" };
41
42 /** bit flag to indicate the test should be passed by the default reasoner */
43 public static final int FB = 1;
44
45 /** bit flag to indicate the test should be passed by the mini reasoner */
46 public static final int MINI = 2;
47
48 /** bit flag to indicate the test should be passed by the micro reasoner */
49 public static final int MICRO = 4;
50
51 // Flags from OWLConsistencyTest, copied here for brevity
52 public static final int INCONSISTENT = OWLConsistencyTest.INCONSISTENT;
53 public static final int WARNINGS = OWLConsistencyTest.WARNINGS;
54 public static final int CLEAN = OWLConsistencyTest.CLEAN;
55
56 /** The set of test cases to be used */
57 public static TestDef[] testDefs = {
58 // /*
59 // subClass
60 new TestDef("localtests/ManifestSubclass001.rdf", FB | MICRO | MINI),
61
62 // equivalentClass
63 new TestDef("equivalentClass/Manifest001.rdf", FB | MICRO | MINI),
64 new TestDef("equivalentClass/Manifest002.rdf", FB | MICRO | MINI),
65 new TestDef("equivalentClass/Manifest003.rdf", FB | MICRO | MINI),
66 new TestDef("equivalentClass/Manifest004.rdf", FB | MINI), // Requires prototypes
67 new TestDef("equivalentClass/Manifest005.rdf", FB | MICRO | MINI),
68 new TestDef("localtests/ManifestRestriction001.rdf", FB | MICRO | MINI),
69
70 // intersectionOf
71 new TestDef("intersectionOf/Manifest001.rdf", FB | MICRO | MINI),
72 new TestDef("localtests/Manifest001.rdf", FB | MICRO | MINI),
73 new TestDef("localtests/Manifest002.rdf", FB | MICRO | MINI),
74
75 // unionOf
76 new TestDef("unionOf/Manifest001.rdf", FB | MICRO | MINI ),
77
78 // This could be supported but isn't at the moment
79 // new TestDef("unionOf/Manifest002.rdf", FB | MICRO | MINI),
80
81 // Property axioms
82 new TestDef("SymmetricProperty/Manifest001.rdf", FB | MICRO | MINI),
83 new TestDef("SymmetricProperty/Manifest001.rdf", FB | MICRO | MINI),
84 new TestDef("inverseOf/Manifest001.rdf", FB | MICRO | MINI),
85 new TestDef("TransitiveProperty/Manifest001.rdf", FB | MICRO | MINI),
86 new TestDef("localtests/Manifest005.rdf", FB | MICRO | MINI),
87
88 // Equality related
89 new TestDef("FunctionalProperty/Manifest001.rdf", FB | MINI),
90 new TestDef("FunctionalProperty/Manifest002.rdf", FB | MINI),
91 new TestDef("FunctionalProperty/Manifest003.rdf", FB | MICRO | MINI),
92 new TestDef("InverseFunctionalProperty/Manifest001.rdf", FB | MINI),
93 new TestDef("InverseFunctionalProperty/Manifest002.rdf", FB | MINI),
94 new TestDef("InverseFunctionalProperty/Manifest003.rdf", FB | MICRO | MINI),
95 new TestDef("I5.1/Manifest001.rdf", FB | MINI),
96
97 new TestDef("rdf-charmod-uris/Manifest.rdf", FB | MICRO | MINI),
98 new TestDef("I4.6/Manifest003.rdf", FB | MICRO | MINI),
99 new TestDef("I5.5/Manifest001.rdf", FB | MICRO | MINI),
100 new TestDef("I5.5/Manifest002.rdf", FB | MICRO | MINI),
101 new TestDef("I5.5/Manifest003.rdf", FB | MICRO | MINI),
102 new TestDef("I5.5/Manifest004.rdf", FB | MICRO | MINI),
103 new TestDef("inverseOf/Manifest001.rdf", FB | MICRO | MINI),
104 new TestDef("TransitiveProperty/Manifest001.rdf", FB | MICRO | MINI),
105 new TestDef("equivalentProperty/Manifest001.rdf", FB | MICRO | MINI),
106 new TestDef("equivalentProperty/Manifest002.rdf", FB | MICRO | MINI),
107 new TestDef("equivalentProperty/Manifest003.rdf", FB | MICRO | MINI),
108 new TestDef("I5.24/Manifest001.rdf", FB | MICRO | MINI),
109 new TestDef("I5.24/Manifest002-mod.rdf", FB | MICRO | MINI),
110 new TestDef("equivalentProperty/Manifest006.rdf", FB | MICRO | MINI),
111
112 // owl:Nothing
113 new TestDef("I5.2/Manifest002.rdf", FB | MINI),
114
115 // Disjointness tests
116 new TestDef("differentFrom/Manifest001.rdf", FB | MICRO | MINI),
117 new TestDef("disjointWith/Manifest001.rdf", FB | MICRO | MINI),
118 new TestDef("disjointWith/Manifest002.rdf", FB | MICRO | MINI),
119 new TestDef("AllDifferent/Manifest001.rdf", FB | MICRO | MINI),
120
121 // Restriction tests
122 new TestDef("allValuesFrom/Manifest001.rdf", FB | MINI), // Want to move this into MICRO
123 new TestDef("allValuesFrom/Manifest002.rdf", FB | MICRO | MINI),
124 new TestDef("someValuesFrom/Manifest002.rdf", FB | MICRO | MINI),
125 new TestDef("maxCardinality/Manifest001.rdf", FB | MICRO | MINI),
126 new TestDef("maxCardinality/Manifest002.rdf", FB | MICRO | MINI),
127 new TestDef("FunctionalProperty/Manifest005-mod.rdf", FB | MICRO | MINI),
128 new TestDef("I5.24/Manifest004-mod.rdf", FB | MINI),
129 new TestDef("cardinality/Manifest001-mod.rdf", FB | MINI),
130 new TestDef("cardinality/Manifest002-mod.rdf", FB | MINI),
131 new TestDef("cardinality/Manifest003-mod.rdf", FB | MINI),
132 new TestDef("cardinality/Manifest004-mod.rdf", FB | MINI),
133 new TestDef("I5.24/Manifest003-mod.rdf", FB | MICRO | MINI),
134 new TestDef("cardinality/Manifest005-mod.rdf", FB | MINI),
135 new TestDef("cardinality/Manifest006-mod.rdf", FB | MINI),
136
137 // Needs bNode creation rule
138 new TestDef("someValuesFrom/Manifest001.rdf", FB ),
139
140 // New local tests
141 new TestDef("localtests/Manifest003.rdf", FB | MICRO | MINI),
142 new TestDef("localtests/Manifest004.rdf", FB | MINI), // Requires equality
143 new TestDef("localtests/Manifest006.rdf", FB ), // a oneOF case
144
145 // Inheritance of domain/range by subProperties
146 new TestDef("localtests/Manifest007.rdf", FB | MICRO | MINI),
147
148 // Consistency tests
149 // clean case
150 new TestDef(new OWLConsistencyTest("tbox.owl", "consistentData.rdf", CLEAN, null), FB | MICRO | MINI),
151 // Instance of disjoint classes
152 new TestDef(new OWLConsistencyTest("tbox.owl", "inconsistent1.rdf", INCONSISTENT,
153 ResourceFactory.createResource("http://jena.hpl.hp.com/testing/reasoners/owl#ia")), FB | MICRO | MINI),
154 // Type violation
155 new TestDef(new OWLConsistencyTest("tbox.owl", "inconsistent2.rdf", INCONSISTENT, null), FB | MICRO | MINI),
156 // Count violation
157 new TestDef(new OWLConsistencyTest("tbox.owl", "inconsistent3.rdf", INCONSISTENT, null), FB | MINI),
158 // Distinct values for functional property
159 new TestDef(new OWLConsistencyTest("tbox.owl", "inconsistent4.rdf", INCONSISTENT, null), FB | MINI),
160 // Distinct literal values for functional property
161 new TestDef(new OWLConsistencyTest("tbox.owl", "inconsistent6.rdf", INCONSISTENT, null), FB | MINI),
162 // Type clash - allValuesFrom rdfs:Literal
163 new TestDef(new OWLConsistencyTest("tbox.owl", "inconsistent5.rdf", INCONSISTENT, null), FB | MICRO | MINI),
164 // Intersection of disjoint classes
165 new TestDef(new OWLConsistencyTest("tbox.owl", "emptyClass1.rdf", WARNINGS, null), FB | MICRO | MINI),
166 // Equivalent to Nothing
167 new TestDef(new OWLConsistencyTest("tbox.owl", "emptyClass2.rdf", WARNINGS, null), FB | MICRO | MINI),
168 // disjoint with Thing
169 new TestDef(new OWLConsistencyTest("tbox.owl", "emptyClass3.rdf", WARNINGS, null), FB | MICRO | MINI),
170 };
171
172 // -------------- instance variables for a single test ----------------------
173
174 /** The name of the manifest file to test */
175 protected String manifest;
176
177 /** The reasoner factory under test */
178 protected ReasonerFactory reasonerFactory;
179
180 /**
181 * Boilerplate for junit
182 */
183 public OWLUnitTest( String manifest, String rName, ReasonerFactory rf) {
184 super( rName + ":" + manifest );
185 this.manifest = manifest;
186 this.reasonerFactory = rf;
187 }
188
189 /**
190 * Boilerplate for junit.
191 * This is its own test suite
192 */
193 public static TestSuite suite() {
194 TestSuite suite = new TestSuite();
195 for (int i = 0; i < reasonerFactories.length; i++) {
196 String rName = reasonerNames[i];
197 ReasonerFactory rf = reasonerFactories[i];
198 for (int j = 0; j < testDefs.length; j++) {
199 TestDef test = testDefs[j];
200 if (test.applicableTo(rf)) {
201 if (test.spec instanceof String) {
202 suite.addTest(new OWLUnitTest((String)test.spec, rName, rf));
203 } else if (test.spec instanceof OWLConsistencyTest) {
204 OWLConsistencyTest oct = (OWLConsistencyTest)test.spec;
205 suite.addTest(new OWLConsistencyTest(oct, rName, rf));
206 }
207 }
208 }
209 }
210 return suite;
211 }
212
213 /**
214 * The test runner
215 */
216 protected void runTest() throws IOException {
217 // System.out.println(" - " + manifest + " using " + reasonerFactory.getURI());
218 OWLWGTester tester = new OWLWGTester(reasonerFactory, this, null);
219 tester.runTests(manifest, false, false);
220 }
221
222 /**
223 * Inner class - use to represent a single test case and which reasoners
224 * it is relevant to.
225 */
226 static class TestDef {
227 /** Test spec, could be a the relative URI for a manifest, or a consistecy test object */
228 public Object spec;
229
230 /** Bitmap of the reasoners this test is relevant to */
231 public int validFor;
232
233 /** Constructor */
234 public TestDef(Object spec, int validFor) {
235 this.spec = spec;
236 this.validFor = validFor;
237 }
238
239 /** Return the bitflag corresponding to the given reasoner factory */
240 public int flagFor(ReasonerFactory rf) {
241 if (rf.equals(OWLFBRuleReasonerFactory.theInstance())) {
242 return FB;
243 } else if (rf.equals(OWLMiniReasonerFactory.theInstance())) {
244 return MINI;
245 } else if (rf.equals(OWLMicroReasonerFactory.theInstance())) {
246 return MICRO;
247 } else {
248 throw new ReasonerException("Unrecognized OWL reasoner config in unit test");
249 }
250 }
251
252 /** Return true if the test is relevant to this reasoner factory */
253 public boolean applicableTo(ReasonerFactory rf) {
254 return (validFor & flagFor(rf)) != 0;
255 }
256 }
257
258 }
259
260
261 /*
262 (c) Copyright 2004, 2005 Hewlett-Packard Development Company, LP
263 All rights reserved.
264
265 Redistribution and use in source and binary forms, with or without
266 modification, are permitted provided that the following conditions
267 are met:
268
269 1. Redistributions of source code must retain the above copyright
270 notice, this list of conditions and the following disclaimer.
271
272 2. Redistributions in binary form must reproduce the above copyright
273 notice, this list of conditions and the following disclaimer in the
274 documentation and/or other materials provided with the distribution.
275
276 3. The name of the author may not be used to endorse or promote products
277 derived from this software without specific prior written permission.
278
279 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
280 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
281 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
282 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
283 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
284 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
285 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
286 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
287 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
288 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
289 */