source: metadata/trunk/toolkit/src/test/java/eu/clarin/cmd/toolkit/TestCMDToolkit.java @ 6854

Last change on this file since 6854 was 6854, checked in by Menzo Windhouwer, 9 years ago

M toolkit/src/main/resources/toolkit/xsd/cmd-component.xsd

  • cleanup of enumeration_type, it now allows an optional appinfo followed by a sequence of items
  • made cardinality/occurence indicators explicit

M toolkit/src/main/resources/toolkit/xslt/comp2schema.xsl

  • removed some debug statements

A|M toolkit/src/test*

  • added test for required attributes
  • added test for invalid component
File size: 12.2 KB
Line 
1/*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5package eu.clarin.cmd.toolkit;
6
7import java.io.File;
8import java.io.IOException;
9import java.nio.file.Paths;
10import java.util.HashMap;
11import java.util.List;
12import java.util.Map;
13import javax.xml.XMLConstants;
14import javax.xml.parsers.DocumentBuilder;
15import javax.xml.parsers.DocumentBuilderFactory;
16import javax.xml.transform.Source;
17import javax.xml.transform.dom.DOMSource;
18import javax.xml.transform.stream.StreamSource;
19import javax.xml.validation.Schema;
20import javax.xml.validation.SchemaFactory;
21import javax.xml.validation.Validator;
22import net.sf.saxon.s9api.DOMDestination;
23import net.sf.saxon.s9api.QName;
24import net.sf.saxon.s9api.XPathCompiler;
25import net.sf.saxon.s9api.XPathExecutable;
26import net.sf.saxon.s9api.XPathSelector;
27import net.sf.saxon.s9api.XdmAtomicValue;
28import net.sf.saxon.s9api.XdmDestination;
29import net.sf.saxon.s9api.XdmNode;
30import net.sf.saxon.s9api.XdmValue;
31import net.sf.saxon.s9api.XsltTransformer;
32import nl.mpi.tla.schemanon.Message;
33import nl.mpi.tla.schemanon.SaxonUtils;
34import nl.mpi.tla.schemanon.SchemAnon;
35import org.junit.*;
36
37import static org.junit.Assert.*;
38import org.w3c.dom.Document;
39
40/**
41 *
42 * @author menwin
43 */
44public class TestCMDToolkit {
45
46    XsltTransformer upgradeCMDSpec = null;
47    XsltTransformer upgradeCMDRec = null;
48    XsltTransformer transformCMDSpecInXSD = null;
49    SchemAnon validateCMDSpec = null; 
50    SchemAnon validateCMDEnvelop = null; 
51
52    @Before
53    public void setUp() {
54        try {
55            upgradeCMDSpec = SaxonUtils.buildTransformer(CMDToolkit.class.getResource("/toolkit/upgrade/cmd-component-1_1-to-1_2.xsl")).load();
56            upgradeCMDRec = SaxonUtils.buildTransformer(CMDToolkit.class.getResource("/toolkit/upgrade/cmd-record-1_1-to-1_2.xsl")).load();
57            transformCMDSpecInXSD = SaxonUtils.buildTransformer(CMDToolkit.class.getResource("/toolkit/xslt/comp2schema.xsl")).load();
58            validateCMDSpec = new SchemAnon(CMDToolkit.class.getResource("/toolkit/xsd/cmd-component.xsd").toURI().toURL()); 
59            validateCMDEnvelop = new SchemAnon(CMDToolkit.class.getResource("/toolkit/xsd/cmd-envelop.xsd").toURI().toURL()); 
60        } catch(Exception e) {
61            System.err.println("!ERR: couldn't setup the testing environment!");
62            System.err.println(""+e);
63            e.printStackTrace(System.err);
64        }
65    }
66
67    @After
68    public void tearDown() {
69    }
70   
71    protected Document transform(XsltTransformer trans,Source src) throws Exception {
72        try {
73            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
74            DocumentBuilder builder = factory.newDocumentBuilder();
75            Document doc = builder.newDocument();
76            DOMDestination dest = new DOMDestination(doc);
77            trans.setSource(src);
78            trans.setDestination(dest);
79            // always set cmd-toolkit to the current working directory, which is expected to be where pom.xml lives
80            trans.setParameter(new QName("cmd-toolkit"),new XdmAtomicValue(Paths.get("").toAbsolutePath().toString()+"/src/main/resources/toolkit"));
81            trans.transform();
82            return doc;
83        } catch (Exception e) {
84            System.out.println("!ERR: failed transform: "+e);
85            e.printStackTrace(System.out);
86            throw e;
87        }
88    }
89   
90    protected boolean xpath(Document doc,String xpath) throws Exception {
91        XPathCompiler xpc   = SaxonUtils.getProcessor().newXPathCompiler();
92        xpc.declareNamespace("cmd","http://www.clarin.eu/cmd/1");
93        XPathExecutable xpe = xpc.compile(xpath);
94        XPathSelector xps   = xpe.load();
95        xps.setContextItem(SaxonUtils.getProcessor().newDocumentBuilder().wrap(doc));
96        return xps.effectiveBooleanValue();
97    }
98   
99    protected void printMessages(SchemAnon anon) throws Exception {
100        for (Message msg : anon.getMessages()) {
101            System.out.println("" + (msg.isError() ? "ERROR" : "WARNING") + (msg.getLocation() != null ? " at " + msg.getLocation() : ""));
102            System.out.println("  " + msg.getText());
103        }
104    }
105   
106    protected int countErrors(SchemAnon anon) throws Exception {
107        int cnt = 0;
108        for (Message msg : anon.getMessages())
109            cnt += (msg.isError()?1:0);
110        return cnt;
111    }
112   
113    protected Document upgradeCMDSpec(String spec) throws Exception {
114        System.out.println("Upgrade CMD spec["+spec+"]");
115        return transform(upgradeCMDSpec,new javax.xml.transform.stream.StreamSource(new java.io.File(TestCMDToolkit.class.getResource(spec).toURI())));
116    }
117
118    protected Document upgradeCMDRecord(String rec) throws Exception {
119        System.out.println("Upgrade CMD spec["+rec+"]");
120        return transform(upgradeCMDRec,new javax.xml.transform.stream.StreamSource(new java.io.File(TestCMDToolkit.class.getResource(rec).toURI())));
121    }
122   
123    protected Document transformCMDSpecInXSD(String spec,Source src) throws Exception { 
124        System.out.println("Transform CMD spec["+spec+"] into XSD");
125        return transform(transformCMDSpecInXSD,src);
126    }
127   
128    protected Document transformCMDSpecInXSD(String spec) throws Exception {
129        return transformCMDSpecInXSD(spec,new javax.xml.transform.stream.StreamSource(new java.io.File(TestCMDToolkit.class.getResource(spec).toURI())));
130    }
131   
132    protected boolean validateCMDSpec(String spec,Source src) throws Exception {
133        System.out.println("Validate CMD spec["+spec+"]");
134        boolean res = validateCMDSpec.validate(src);
135        System.out.println("CMD spec["+spec+"]: "+(res?"VALID":"INVALID"));
136        printMessages(validateCMDSpec);
137        return res;
138    }
139   
140    protected boolean validateCMDSpec(String spec) throws Exception {
141        return validateCMDSpec(spec,new StreamSource(new java.io.File(TestCMDToolkit.class.getResource(spec).toURI())));
142    }
143   
144    protected boolean validateCMDRecord(String spec,SchemAnon anon,String rec,Source src) throws Exception {
145        System.out.println("Validate CMD record["+rec+"] against spec["+spec+"]");
146        boolean res = anon.validate(src);
147        System.out.println("CMD record["+rec+"]: "+(res?"VALID":"INVALID"));
148        printMessages(anon);
149        return res;
150    }
151   
152    protected boolean validateCMDEnvelop(String rec,Source src) throws Exception {
153        System.out.println("Validate envelop CMD rec["+rec+"]");
154        boolean res = validateCMDEnvelop.validate(src);
155        System.out.println("CMD rec["+rec+"] evelop: "+(res?"VALID":"INVALID"));
156        printMessages(validateCMDEnvelop);
157        return res;
158    }
159   
160    protected boolean validateCMDEnvelop(String rec) throws Exception {
161        return validateCMDEnvelop(rec,new StreamSource(new java.io.File(TestCMDToolkit.class.getResource(rec).toURI())));
162    }
163   
164    @Test
165    public void testAdelheid() throws Exception {
166        String profile = "/toolkit/Adelheid/profiles/clarin.eu:cr1:p_1311927752306.xml";
167        String record  = "/toolkit/Adelheid/records/Adelheid.cmdi";
168       
169        // upgrade the profile from 1.1 to 1.2
170        Document upgradedProfile = upgradeCMDSpec(profile);
171       
172        // validate the 1.2 profile
173        boolean validProfile = validateCMDSpec(profile+" (upgraded)",new DOMSource(upgradedProfile));
174       
175        // assertions
176        // the upgraded profile should be a valid CMDI 1.2 profile
177        assertTrue(validProfile);
178        // so there should be no errors
179        assertEquals(0, countErrors(validateCMDSpec));
180       
181        // transform the 1.2 profile into a XSD
182        Document profileSchema = transformCMDSpecInXSD(profile+" (upgraded)",new DOMSource(upgradedProfile));
183        SchemAnon profileAnon = new SchemAnon(new DOMSource(profileSchema));
184       
185        // upgrade the record from 1.1 to 1.2
186        Document upgradedRecord = upgradeCMDRecord(record);
187       
188        // validate the 1.2 record
189        boolean validRecord = validateCMDRecord(profile+" (upgraded)",profileAnon,record+" (upgraded)",new DOMSource(upgradedRecord));
190       
191        // assertions
192        // the upgraded record should be a valid CMDI 1.2 record
193        assertTrue(validRecord);
194        // so there should be no errors
195        assertEquals(0, countErrors(profileAnon));
196    }
197
198    @Test
199    public void testAdelheid2() throws Exception {
200        String profile = "/toolkit/Adelheid/profiles/clarin.eu:cr1:p_1311927752306_1_2.xml";
201        String record  = "/toolkit/Adelheid/records/Adelheid_1_2-invalid.cmdi";
202       
203        // validate the 1.2 profile
204        boolean validProfile = validateCMDSpec(profile,new javax.xml.transform.stream.StreamSource(new java.io.File(TestCMDToolkit.class.getResource(profile).toURI())));
205       
206        // assertions
207        // the upgraded profile should be a valid CMDI 1.2 profile
208        assertTrue(validProfile);
209        // so there should be no errors
210        assertEquals(0, countErrors(validateCMDSpec));
211       
212        Document profileSchema = transformCMDSpecInXSD(profile,new javax.xml.transform.stream.StreamSource(new java.io.File(TestCMDToolkit.class.getResource(profile).toURI())));
213        SchemAnon profileAnon = new SchemAnon(new DOMSource(profileSchema));
214       
215        // validate the 1.2 record
216        boolean validRecord = validateCMDRecord(profile,profileAnon,record,new javax.xml.transform.stream.StreamSource(new java.io.File(TestCMDToolkit.class.getResource(record).toURI())));
217       
218        // assertions
219        // the record should be a invalid as it misses a the required CoreVersion attribute
220        assertFalse(validRecord);
221    }
222
223    @Test
224    public void testTEI() throws Exception {
225        String record  = "/toolkit/TEI/records/sundhed_dsn.teiHeader.ref.xml";
226
227        // upgrade the record from 1.1 to 1.2
228        Document upgradedRecord = upgradeCMDRecord(record);
229       
230        // assertions
231        // the @ref attributes on the elements should stay as they are
232        assertTrue(xpath(upgradedRecord,"//*:author/*:name/@ref"));
233    }
234
235    @Test
236    public void testSuccessor() throws Exception {
237        String validRecord  = "/toolkit/successor/profiles/successor-valid.xml";
238        String invalidRecord  = "/toolkit/successor/profiles/successor-invalid.xml";
239
240        // assertions
241        assertTrue(validateCMDSpec(validRecord));
242        assertFalse(validateCMDSpec(invalidRecord));
243    }
244
245    @Test
246    public void testOLAC() throws Exception {
247        String profile = "/toolkit/OLAC/profiles/OLAC-DcmiTerms.xml";
248        String record  = "/toolkit/OLAC/records/org_rosettaproject-record.xml";
249       
250        // upgrade the profile from 1.1 to 1.2
251        Document upgradedProfile = upgradeCMDSpec(profile);
252       
253        // validate the 1.2 profile
254        boolean validProfile = validateCMDSpec(profile+" (upgraded)",new DOMSource(upgradedProfile));
255       
256        // assertions
257        // the upgraded profile should be a valid CMDI 1.2 profile
258        assertTrue(validProfile);
259        // so there should be no errors
260        assertEquals(0, countErrors(validateCMDSpec));
261       
262        // transform the 1.2 profile into a XSD
263        Document profileSchema = transformCMDSpecInXSD(profile+" (upgraded)",new DOMSource(upgradedProfile));
264        SchemAnon profileAnon = new SchemAnon(new DOMSource(profileSchema));
265       
266        // upgrade the record from 1.1 to 1.2
267        Document upgradedRecord = upgradeCMDRecord(record);
268       
269        // validate the 1.2 record
270        boolean validRecord = validateCMDRecord(profile+" (upgraded)",profileAnon,record+" (upgraded)",new DOMSource(upgradedRecord));
271
272        // assertions
273        assertFalse(validRecord);
274    }
275
276    @Test
277    public void testCMD() throws Exception {
278        String profile = "/toolkit/CMD/profiles/components.xml";
279
280        // validate the 1.2 profile
281        boolean validProfile = validateCMDSpec(profile,new javax.xml.transform.stream.StreamSource(new java.io.File(TestCMDToolkit.class.getResource(profile).toURI())));
282
283        // assertions
284        assertFalse(validProfile);
285    }
286}
Note: See TracBrowser for help on using the repository browser.