Creates and runs a Mocha ODD test suite by extracting <egXML> elements from an ODD,
transforming their contents into full XML documents (based on templates) and
validating these documents (usually against the schemata generated from the ODD).
node, npm
npm i odd-tests
Only <egXML> elements with a @valid attribute value of 'true' or 'false' get
included in the tests. Each of the respective <egXML> elements needs to have
a @rendition attribute pointing to a <rendition> element in the ODD header.
Each <rendition> element needs to contain a descendant <ptr> element providing
the path to the template file associated with the rendition in the @target attribute.
This is an excerpt of a TEI header providing the path to a single JSX template:
<encodingDesc>
<tagsDecl>
<rendition xml:id="afterStaff" scheme="free">
<ptr target="../test/jsx/templates/AfterStaff.jsx"/>
</rendition>
</tagsDecl>
</encodingDesc>
An example of an <egXML> element referring to that <rendition>:
<egXML xmlns="http://www.tei-c.org/ns/Examples" valid="true" rendition="#afterStaff">
<slur xml:id="d020" startid="#n01" endid="#n02"/>
</egXML>
A full example of an ODD which can get processed by the ODD Tests package can be found at https://github.com/tido/mei-customization/blob/master/src/tido.xml. See http://www.tei-c.org/release/doc/tei-p5-doc/en/html/ref-egXML.html for general
information about the <egXML> element.
The ODD Tests package exposes a single function, run, which triggers the tests.
It takes an options object with three mandatory properties:
- oddPath: string - the path to the ODD file on which the tests are based
- wrapFragment(templatePath: string, fragment: string): string - a function wrapping the provided fragment using the template at templatePath
- validate(xmlString: string, schemaSpecName: string): ValidationReport - a function validating the given XML string against
the schemata associated with the given
<schemaSpec>(schemaSpecName is the value of the@identattribute of the<schemaSpec>in concern). The returned ValidationReport must be an object with a booleanisValidproperty and agetErrors()method returning an array of validation errors. The returned validation errors are required to have atoString()method returning the error message to get displayed.
See https://github.com/tido/mei-customization/blob/master/test/run.js for a sample implementation using Preact to process JSX components as templates and the tido-mei-validation package for validation.