001: /*
002: * Copyright (C) 1999-2004 <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</a>
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018: package test.org.mandarax.xkb;
019:
020: import java.io.FileWriter;
021: import java.util.Iterator;
022: import java.util.List;
023:
024: import org.jdom.Document;
025: import org.jdom.input.DOMBuilder;
026: import org.mandarax.kernel.Clause;
027: import org.mandarax.kernel.ClauseSetException;
028: import org.mandarax.kernel.Fact;
029: import org.mandarax.kernel.KnowledgeBase;
030: import org.mandarax.kernel.Rule;
031: import org.mandarax.util.LogicFactorySupport;
032: import org.mandarax.util.logging.LogCategories;
033: import org.mandarax.xkb.XKBDriver;
034: import org.mandarax.xkb.XKBManager;
035: import org.mandarax.xkb.framework.XKBDriver_1_0;
036: import org.mandarax.xkb.framework.XKBDriver_1_1;
037:
038: import test.org.mandarax.testsupport.TestUtils;
039:
040: /**
041: * Abstract test case for XKB drivers.
042: * @author <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</A>
043: * @version 3.4 <7 March 05>
044: * @since 1.6
045: */
046: public abstract class XKBTestCase extends junit.framework.TestCase
047: implements LogCategories {
048:
049: protected XKBManager xkbMgr = new XKBManager();
050: protected XKBDriver driver = null;
051: protected DOMBuilder domBuilder = new DOMBuilder();
052: protected String description = null;
053:
054: // the file name used to output the xml
055: protected String xml = null;
056:
057: /**
058: * Construct a test case with the name for an XKB driver.
059: * @param aDriver the driver to be tested
060: */
061: public XKBTestCase(XKBDriver aDriver) {
062: super ("test");
063: xkbMgr.setDriver(aDriver);
064: driver = aDriver;
065: }
066:
067: /**
068: * Construct a test case with the name for an XKB driver.
069: * @param aDriver the driver to be tested
070: */
071: public XKBTestCase(XKBDriver aDriver, String xmlFileName) {
072: super ("test");
073: xml = xmlFileName;
074: xkbMgr.setDriver(aDriver);
075: driver = aDriver;
076: }
077:
078: /**
079: * Get the knowledge base used as test data.
080: * @return a knowledge base
081: */
082: public abstract KnowledgeBase getKB();
083:
084: /**
085: * Compare knowledge bases.
086: * @return a boolean
087: * @param kb1 the first kb
088: * @param kb2 the second kb
089: */
090: public boolean compare(KnowledgeBase kb1, KnowledgeBase kb2) {
091: boolean result = true;
092: try {
093: // compare clauses
094: Iterator iter1 = kb1.clauses();
095: Iterator iter2 = kb2.clauses();
096: while (result && iter1.hasNext() && iter2.hasNext()) {
097: result = result
098: && compare((Clause) iter1.next(),
099: (Clause) iter2.next());
100: }
101: // compare queries
102: iter1 = kb1.queries();
103: iter2 = kb2.queries();
104: while (result && iter1.hasNext() && iter2.hasNext()) {
105: result = result && (iter1.next().equals(iter2.next()));
106: }
107:
108: return result;
109: } catch (ClauseSetException x) {
110: x.printStackTrace();
111: }
112: return false;
113: }
114:
115: /**
116: * Compare clauses.
117: * @return a boolean
118: * @param c1 the first clause
119: * @param c2 the second clause
120: */
121: public boolean compare(Clause c1, Clause c2) {
122: if (c1 instanceof Rule && c2 instanceof Rule)
123: return compare((Rule) c1, (Rule) c2);
124: else
125: return c1.equals(c2);
126: }
127:
128: /**
129: * Compare rules. Special handling for old drivers: the prerequisite interface has only been introduced
130: * in version 2.0 !!
131: * @return a boolean
132: * @param r1 the first rule
133: * @param r2 the second rule
134: */
135: public boolean compare(Rule r1, Rule r2) {
136: if (driver instanceof XKBDriver_1_0
137: || driver instanceof XKBDriver_1_1) {
138: boolean result = true;
139: result = result && r1.getHead().equals(r2.getHead());
140: List body1 = r1.getBody();
141: List body2 = r2.getBody();
142: result = result && body1.size() == body2.size();
143: LogicFactorySupport lfs = new LogicFactorySupport();
144: if (result) {
145: int i = 0;
146: while ((i < body1.size()) && result) {
147: Fact pr11 = (Fact) body1.get(i);
148: Fact pr21 = (Fact) body2.get(i);
149: Fact pr12 = lfs.fact(pr11.getPredicate(), pr11
150: .getTerms());
151: Fact pr22 = lfs.fact(pr21.getPredicate(), pr21
152: .getTerms());
153: result = result && pr12.equals(pr22);
154: i = i + 1;
155: }
156: }
157: return result;
158: } else
159: return r1.equals(r2);
160: }
161:
162: /**
163: * Run the test.
164: */
165: public void test() throws Exception {
166: KnowledgeBase original = getKB();
167: Document doc = driver.exportKnowledgeBase(original);
168: KnowledgeBase imported = driver.importKnowledgeBase(doc);
169: if (xml != null) {
170: // write the xml file
171: FileWriter out = new FileWriter(TestUtils.getFile(xml));
172: xkbMgr.exportKnowledgeBase(out, original);
173: out.close();
174: }
175: assertTrue(compare(original, imported));
176: }
177:
178: /**
179: * Convert the object to a string.
180: * @return a string
181: */
182: public String toString() {
183: String name = description == null ? super .toString()
184: : description;
185: name = name + " (tested driver: " + driver.getClass() + ")";
186: return name;
187: }
188: }
|