001 package com.thaiopensource.relaxng.util;
002
003 import com.thaiopensource.util.OptionParser;
004 import com.thaiopensource.util.PropertyMapBuilder;
005 import com.thaiopensource.util.Localizer;
006 import com.thaiopensource.validate.ValidateProperty;
007 import com.thaiopensource.validate.ValidationDriver;
008 import com.thaiopensource.validate.rng.RngProperty;
009 import com.thaiopensource.xml.sax.ErrorHandlerImpl;
010 import org.xml.sax.SAXException;
011 import org.relaxng.datatype.helpers.DatatypeLibraryLoader;
012
013 import java.io.BufferedWriter;
014 import java.io.File;
015 import java.io.FileOutputStream;
016 import java.io.IOException;
017 import java.io.OutputStreamWriter;
018
019 class TestDriver {
020 static public void main(String[] args) throws IOException {
021 System.exit(new TestDriver().doMain(args));
022 }
023
024 private ValidationDriver driver;
025 private ErrorHandlerImpl eh;
026 private Localizer localizer = new Localizer(TestDriver.class);
027 private int nTests = 0;
028
029 public int doMain(String[] args) throws IOException {
030 long startTime = System.currentTimeMillis();
031 eh = new ErrorHandlerImpl(System.out);
032 OptionParser op = new OptionParser("i", args);
033 PropertyMapBuilder properties = new PropertyMapBuilder();
034 // This is an optimization. It ensures that all SchemaReaders share a
035 // single DatatypeLibraryLoader.
036 RngProperty.DATATYPE_LIBRARY_FACTORY.put(properties, new DatatypeLibraryLoader());
037 try {
038 while (op.moveToNextOption()) {
039 switch (op.getOptionChar()) {
040 case 'i':
041 RngProperty.CHECK_ID_IDREF.add(properties);
042 break;
043 }
044 }
045 }
046 catch (OptionParser.InvalidOptionException e) {
047 eh.print(localizer.message("invalid_option", op.getOptionCharString()));
048 return 2;
049 }
050 catch (OptionParser.MissingArgumentException e) {
051 eh.print(localizer.message("option_missing_argument", op.getOptionCharString()));
052 return 2;
053 }
054 args = op.getRemainingArgs();
055 eh = new ErrorHandlerImpl(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(args[0]))));
056 ValidateProperty.ERROR_HANDLER.put(properties, eh);
057 driver = new ValidationDriver(properties.toPropertyMap());
058 int result = 0;
059 for (int i = 1; i < args.length; i++) {
060 int n = runTestSuite(new File(args[i]));
061 if (n > result)
062 result = n;
063 }
064 System.err.println("Number of tests: " + nTests);
065 System.err.println("Elapsed time: " + (System.currentTimeMillis() - startTime));
066 eh.close();
067 return result;
068 }
069
070 private static final String CORRECT_SCHEMA_NAME = "c.rng";
071 private static final String INCORRECT_SCHEMA_NAME = "i.rng";
072 private static final String VALID_INSTANCE_SUFFIX = ".v.xml";
073 private static final String INVALID_INSTANCE_SUFFIX = ".i.xml";
074
075 public int runTestSuite(File dir) throws IOException {
076 int result = 0;
077 String[] subdirs = dir.list();
078 for (int i = 0; i < subdirs.length; i++) {
079 File subdir = new File(dir, subdirs[i]);
080 if (subdir.isDirectory()) {
081 int n = runTestCase(subdir);
082 if (n > result)
083 result = n;
084 }
085 }
086 return result;
087 }
088
089 private int runTestCase(File dir) throws IOException {
090 File f = new File(dir, INCORRECT_SCHEMA_NAME);
091 if (f.exists()) {
092 if (loadSchema(f)) {
093 failed(f);
094 return 1;
095 }
096 return 0;
097 }
098 f = new File(dir, CORRECT_SCHEMA_NAME);
099 if (!f.exists())
100 return 0;
101 if (!loadSchema(f)) {
102 failed(f);
103 return 1;
104 }
105 String[] files = dir.list();
106 int result = 0;
107 for (int i = 0; i < files.length; i++) {
108 if (files[i].endsWith(VALID_INSTANCE_SUFFIX)) {
109 f = new File(dir, files[i]);
110 if (!validateInstance(f)) {
111 failed(f);
112 result = 1;
113 }
114 }
115 else if (files[i].endsWith(INVALID_INSTANCE_SUFFIX)) {
116 f = new File(dir, files[i]);
117 if (validateInstance(f)) {
118 failed(f);
119 result = 1;
120 }
121 }
122 }
123 return result;
124 }
125
126 private static void failed(File f) {
127 System.err.println("Failed: " + f.toString());
128 }
129
130 private boolean loadSchema(File schema) throws IOException {
131 nTests++;
132 try {
133 if (driver.loadSchema(ValidationDriver.fileInputSource(schema)))
134 return true;
135 }
136 catch (SAXException e) {
137 eh.printException(e);
138 }
139 return false;
140 }
141
142 private boolean validateInstance(File instance) throws IOException {
143 nTests++;
144 try {
145 if (driver.validate(ValidationDriver.fileInputSource(instance)))
146 return true;
147 }
148 catch (SAXException e) {
149 eh.printException(e);
150 }
151 return false;
152 }
153 }