2025-03-17 17:15:14 +00:00

728 lines
32 KiB
XML

<project name="xrechnung-validation-configuration" default="compile" basedir=".">
<description>Build the XRechnung validation configuration for ITPLR-KoSIT
validator</description>
<!-- set global default properties for this build -->
<!-- main build directories -->
<property name="src.dir" location="${basedir}/src" />
<property name="lib.dir" location="${basedir}/lib" />
<property name="build.dir" location="${basedir}/build" />
<property name="download.dir" location="${build.dir}/download" />
<property name="dist.dir" location="${basedir}/dist" />
<property name="test.src.dir" location="${src.dir}/test" />
<property name="test.build.dir" location="${build.dir}/test" />
<property name="test.docs.custom.dir" location="${test.src.dir}/custom"></property>
<property name="test.docs.dir" location="${test.build.dir}" />
<property name="test.docs.cen.unit.unexpected.dir" location="${test.docs.dir}/unexpected" />
<property name="test.docs.cen.unit.dir" location="${test.docs.dir}/cen-unit-test" />
<property name="test.docs.integration.dir" location="${test.docs.dir}/integration" />
<property name="testsuite.instances.dir" location="${test.build.dir}/testsuite" />
<!-- Naming -->
<property name="xrechnung.version.major.minor" value="3.0" />
<property name="xrechnung.version.patch" value="2" />
<property name="xrechnung.version"
value="${xrechnung.version.major.minor}.${xrechnung.version.patch}" />
<property name="cen.spec.id" value="urn:cen.eu:en16931:2017" />
<property name="xrechnung.spec.id"
value="${cen.spec.id}#compliant#urn:xeinkauf.de:kosit:xrechnung_${xrechnung.version.major.minor}" />
<property name="xrechnung.extension.id"
value="${xrechnung.spec.id}#conformant#urn:xeinkauf.de:kosit:extension:xrechnung_${xrechnung.version.major.minor}" />
<property name="validator.configuration.version.full" value="2025-01-31-SNAPSHOT" />
<property name="dist.name"
value="validator-configuration-xrechnung_${xrechnung.version}_${validator.configuration.version.full}.zip" />
<!-- 3rd party resources -->
<!-- KoSIT XML Validator -->
<property name="validator.version" value="1.5.0" />
<property name="validator.download.url.prefix"
value="https://github.com/itplr-kosit/validator/releases/download" />
<property name="validator.zip" value="validator-${validator.version}-distribution.zip" />
<!-- Pick by default the standalone distribution -->
<property name="validator.jar" value="validationtool-${validator.version}-standalone.jar" />
<!-- Part of the download path -->
<property name="saxon.url.version" value="9.9" />
<!-- Part of the download path -->
<property name="saxon.file.version" value="9-9-1-8J" />
<!-- the name of the JAR file in the downloaded ZIP file -->
<property name="saxon.jar" value="saxon9he.jar" />
<property name="cii.version" value="D16B" />
<property name="cii.schema.artifact.id" value="D16B_SCRDM__Subset__CII" />
<property name="cii.schema.zip" value="${cii.schema.artifact.id}-${cii.version}.zip" />
<property name="cii.schema.uncoupled.zip" value="d16b-cii-uncoupled.zip" />
<property name="cii.download.url"
value="https://projekte.kosit.org/api/v4/projects/356/packages/maven/de/xeinkauf/${cii.schema.artifact.id}/${cii.version}/${cii.schema.zip}" />
<property name="ubl.version" value="2.1" />
<property name="ubl.download.url.prefix"
value="http://docs.oasis-open.org/ubl/os-UBL-${ubl.version}" />
<property name="ubl.schema.zip" value="UBL-${ubl.version}.zip" />
<property name="ubl.download.url"
value="${ubl.download.url.prefix}/${ubl.schema.zip}" />
<!-- set to "master" if you want latest code -->
<property name="cen.rules.version" value="1.3.13" />
<property name="cen.rules.version.download" value="${cen.rules.version}" />
<property name="cen.download.url.owner" value="ConnectingEurope" />
<property name="cen.download.url.prefix"
value="https://github.com/${cen.download.url.owner}/eInvoicing-EN16931/releases/download/validation-${cen.rules.version}" />
<property name="cen.download.url.ubl"
value="${cen.download.url.prefix}/en16931-ubl-${cen.rules.version.download}.zip" />
<property name="cen.download.url.cii"
value="${cen.download.url.prefix}/en16931-cii-${cen.rules.version.download}.zip" />
<property name="cen.download.url.master.prefix" value="https://github.com/${cen.download.url.owner}/eInvoicing-EN16931/"/>
<!-- XRechnung Schematron Rules section -->
<property name="xr.schematron.version.major.minor" value="2.2" />
<property name="xr.schematron.version.patch" value="0" />
<property name="xr.schematron.version.full"
value="${xr.schematron.version.major.minor}.${xr.schematron.version.patch}" />
<property name="xr.schematron.download.url.prefix"
value="https://github.com/itplr-kosit/xrechnung-schematron/releases/download/release-${xr.schematron.version.full}" />
<property name="xr.schematron.zip"
value="xrechnung-${xrechnung.version}-schematron-${xr.schematron.version.full}.zip" />
<property name="xr.schematron.download.url" value="${xr.schematron.download.url.prefix}/${xr.schematron.zip}" />
<property name="xr.testsuite.version" value="2024-10-31" />
<property name="xr.testsuite.download.url.prefix"
value="https://github.com/itplr-kosit/xrechnung-testsuite/releases/download" />
<!-- root/work directory where KoSIT validationtool expects Schema(s)-and trons -->
<property name="repository.dir" location="${build.dir}" />
<property name="resource.dir" location="${repository.dir}/resources" />
<property name="resource.xr.dir" location="${resource.dir}/xrechnung/${xrechnung.version}/xsl" />
<property name="resource.xsl.cen.ubl"
location="${resource.dir}/ubl/2.1/xsl/EN16931-UBL-validation.xsl" />
<property name="resource.xsl.cen.cii"
location="${resource.dir}/cii/16b/xsl/EN16931-CII-validation.xsl" />
<property name="resource.xsl.xr.ubl"
location="${resource.xr.dir}/XRechnung-UBL-validation.xsl" />
<property name="resource.xsl.xr.cii" location="${resource.xr.dir}/XRechnung-CII-validation.xsl" />
<!-- Resource directories -->
<property name="reports.schema.dir" location="${resource.dir}/xsd" />
<property name="reports.dir" location="${build.dir}/reports" />
<macrodef name="xslt-saxon">
<sequential>
<fail message="Not implemented yet" />
</sequential>
</macrodef>
<macrodef name="schematron-compile" description="Compiles Schematron to XSLT using Saxon">
<attribute name="schematron" description="Schematron file to compile." />
<attribute name="workdir"
description="Base directory in which to download Schematron Skeleton and keep intermediaries." />
<attribute name="outdir" />
<attribute name="insuffix" default="sch" />
<attribute name="saxon.jar" default="${lib.dir}/${saxon.jar}"
description="Location of Saxon jar." />
<attribute name="deleteonexit" default="true"
description="Whether to delete intermediate XSLT files on exit. Note if not deleting, then subsequent runs of macro produce wrong results!" />
<attribute name="schematronbinding" default="xslt2"
description="Which XSLT version to build for." />
<sequential>
<local name="schematron.basename" />
<basename file="@{schematron}" suffix="@{insuffix}" property="schematron.basename" />
<echo message="Compiling '@{schematron}' Schematron with basename='${schematron.basename}'" />
<mkdir dir="@{workdir}" />
<tempfile property="expanded.sch" prefix="expanded" suffix=".sch" destdir="@{workdir}"
deleteonexit="@{deleteonexit}" />
<tempfile property="unabstract.sch" prefix="unabstract" suffix=".sch" destdir="@{workdir}"
deleteonexit="@{deleteonexit}" />
<tempfile property="schematron.xsl" prefix="schematron" suffix=".xsl" destdir="@{workdir}"
deleteonexit="@{deleteonexit}" />
<tempfile property="check-schematron.xsl" prefix="check-schematron" suffix=".xsl"
destdir="@{workdir}" deleteonexit="@{deleteonexit}" />
<!-- Download schematron skeletons -->
<property name="schematron.skeleton.url"
value="https://raw.githubusercontent.com/Schematron/schematron/master/trunk/schematron/code" />
<get src="${schematron.skeleton.url}/iso_dsdl_include.xsl" dest="@{workdir}" verbose="true"
skipexisting="true" usetimestamp="true" httpusecaches="true" />
<get src="${schematron.skeleton.url}/iso_abstract_expand.xsl" dest="@{workdir}" verbose="true"
skipexisting="true" usetimestamp="true" httpusecaches="true" />
<get src="${schematron.skeleton.url}/iso_svrl_for_@{schematronbinding}.xsl" dest="@{workdir}"
verbose="true" skipexisting="true" usetimestamp="true" httpusecaches="true" />
<get src="${schematron.skeleton.url}/iso_schematron_skeleton_for_saxon.xsl" dest="@{workdir}"
verbose="true" skipexisting="true" usetimestamp="true" httpusecaches="true" />
<!-- expand inclusions -->
<xslt style="@{workdir}/iso_dsdl_include.xsl" in="@{schematron}"
out="@{workdir}/${schematron.basename}-expanded.sch" classpath="@{saxon.jar}">
<factory name="net.sf.saxon.TransformerFactoryImpl" />
</xslt>
<!-- expand abstract patterns -->
<xslt style="@{workdir}/iso_abstract_expand.xsl"
in="@{workdir}/${schematron.basename}-expanded.sch"
out="@{workdir}/${schematron.basename}-unabstract.sch" classpath="@{saxon.jar}">
<factory name="net.sf.saxon.TransformerFactoryImpl" />
</xslt>
<!-- svrl it -->
<xslt style="@{workdir}/iso_svrl_for_@{schematronbinding}.xsl"
in="@{workdir}/${schematron.basename}-unabstract.sch"
out="@{outdir}/${schematron.basename}.xslt" classpath="@{saxon.jar}">
<factory name="net.sf.saxon.TransformerFactoryImpl" />
<param name="generate-fired-rule" expression="false" />
<param name="full-path-notation" expression="3" />
</xslt>
<echo message="finished schematron compile output to @{outdir}/${schematron.basename}.xslt" />
</sequential>
</macrodef>
<target name="init" description="Initializes build directory structure and ISO timestamp">
<!-- sets the property cen.master.target if version is set to master and the only downloads from master instaead of release. -->
<condition property="cen.master.target">
<equals arg1="${cen.rules.version}" arg2="master" />
</condition>
<!-- Create timestamps -->
<tstamp>
<format property="build.date" pattern="yyyy-MM-dd" />
</tstamp>
<echo>Build date: ${build.date}</echo>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build.dir}" />
<mkdir dir="${download.dir}" />
<mkdir dir="${lib.dir}" />
<mkdir dir="${dist.dir}" />
</target>
<target name="prepare-saxon" depends="init"
description="Download Saxon-HE and add jar to library directory">
<get
src="https://sourceforge.net/projects/saxon/files/Saxon-HE/${saxon.url.version}/SaxonHE${saxon.file.version}.zip/download"
dest="${download.dir}/SaxonHE${saxon.file.version}.zip" verbose="true" skipexisting="true"
usetimestamp="true" />
<unzip src="${download.dir}/SaxonHE${saxon.file.version}.zip" dest="${lib.dir}">
<patternset>
<include name="**/${saxon.jar}" />
</patternset>
<flattenmapper />
</unzip>
</target>
<target name="delete-saxon" depends="init" description="Remove downloaded Saxon-HE stuff">
<delete file="${download.dir}/SaxonHE${saxon.file.version}.zip" />
<delete file="${lib.dir}/${saxon.jar}" />
</target>
<target name="retrieve-validator-from-local-build" depends="init" if="develop.local.validator">
<get src="${validator.download.url.prefix}/target/${validator.zip}" dest="${download.dir}/"
verbose="true" skipexisting="true" usetimestamp="true" />
</target>
<target name="retrieve-validator-from-github-release" depends="init"
unless="develop.local.validator">
<property name="download.url.full"
value="${validator.download.url.prefix}/v${validator.version}/${validator.zip}" />
<echo message="Retrieving validator version=${validator.version} from ${download.url.full}" />
<get src="${download.url.full}" dest="${download.dir}" verbose="true" skipexisting="true"
usetimestamp="true" />
</target>
<target name="retrieve-validator"
depends="init, retrieve-validator-from-local-build, retrieve-validator-from-github-release">
<!-- add check something was downloaded -->
</target>
<target name="provide-validator" depends="init, retrieve-validator"
description="Download KoSIT validation tool and add jar to library directory">
<echo message="Unpacking Validator resources" />
<unzip src="${download.dir}/${validator.zip}" dest="${lib.dir}">
<patternset>
<include name="**/${validator.jar}" />
</patternset>
<flattenmapper />
</unzip>
<unzip src="${lib.dir}/${validator.jar}" dest="${resource.dir}">
<patternset>
<include name="xsd/scenarios.xsd" />
</patternset>
</unzip>
</target>
<property name="xr.testsuite.zip"
value="xrechnung-${xrechnung.version}-testsuite-${xr.testsuite.version}.zip" />
<target name="retrieve-xr-testsuite-from-local-build" depends="init"
if="develop.local.xr.testsuite">
<get src="${xr.testsuite.download.url.prefix}/${xr.testsuite.zip}" dest="${download.dir}"
verbose="true" skipexisting="false" usetimestamp="false" httpusecaches="false" />
</target>
<target name="retrieve-xr-testsuite-from-github-release" depends="init-test"
unless="develop.local.xr.testsuite">
<get
src="${xr.testsuite.download.url.prefix}/release-${xr.testsuite.version}/${xr.testsuite.zip}"
dest="${download.dir}" verbose="true" skipexisting="true" usetimestamp="true" />
</target>
<target name="retrieve-xr-testsuite"
depends="init-test, retrieve-xr-testsuite-from-local-build, retrieve-xr-testsuite-from-github-release">
<!-- add check something was downloaded -->
</target>
<target name="provide-testsuite" depends="init-test, retrieve-xr-testsuite"
description="Download and prepare KoSIT xrechnung-testsuite for testing">
<unzip src="${download.dir}/${xr.testsuite.zip}" dest="${testsuite.instances.dir}">
<patternset>
<include name="**/*.xml" />
</patternset>
<flattenmapper />
</unzip>
</target>
<target name="retrieve-cen-rules"
depends="retrieve-cen-rules-from-master,retrieve-cen-rules-from-release,init" >
<fail message="No cen rule zip files available :(!">
<condition>
<not>
<or>
<resourceexists>
<file file="${download.dir}/master.zip" />
</resourceexists>
<and>
<resourceexists>
<file file="${download.dir}/en16931-cii-${cen.rules.version.download}.zip" />
</resourceexists>
<resourceexists>
<file file="${download.dir}/en16931-ubl-${cen.rules.version.download}.zip" />
</resourceexists>
</and>
</or>
</not>
</condition>
</fail>
<unzip dest="${download.dir}" failonemptyarchive="true">
<!-- If master.zip or the other gets finally extracted depends on download targets -->
<fileset dir="${download.dir}">
<include name="en16931-*-${cen.rules.version.download}.zip" />
<include name="master.zip" />
</fileset>
<regexpmapper from=".*/(schematron/.*\.sch$$)" to="\1" />
</unzip>
<!-- Testing if important files were unzipped -->
<path id="schematron-path">
<fileset dir="${download.dir}" includes="**schematron/**.sch" />
</path>
<fail
message="Could not extract CEN schematron rules file EN16931-UBL-validation.sch does not exist in ${download.dir}">
<condition>
<not>
<available file="EN16931-UBL-validation.sch">
<filepath refid="schematron-path" />
</available>
</not>
</condition>
</fail>
<fail message="Could not extract file EN16931-CII-validation.sch">
<condition>
<not>
<available file="EN16931-CII-validation.sch">
<filepath refid="schematron-path" />
</available>
</not>
</condition>
</fail>
</target>
<target name="retrieve-cen-rules-from-master" depends="init" if="${cen.master.target}"
description="Download CEN business rules (schematron) from master branch to download directory">
<get src="${cen.download.url.master.prefix}/archive/master.zip"
dest="${download.dir}" verbose="true" skipexisting="true"
usetimestamp="true" />
</target>
<target name="retrieve-cen-rules-from-release" depends="init"
unless="${cen.master.target}"
description="Download CEN business rules (schematron) version ${cen.rules.version.download} to download directory">
<!-- download UBL specific rules -->
<get src="${cen.download.url.ubl}" dest="${download.dir}" verbose="true" skipexisting="true"
usetimestamp="true" />
<!-- download CII specific rules -->
<get src="${cen.download.url.cii}" dest="${download.dir}" verbose="true" skipexisting="true"
usetimestamp="true" />
</target>
<target name="retrieve-xrechnung-schematron-from-local-build" depends="init"
if="develop.local.xr.schematron">
<echo message="Loading from file ${xr.schematron.download.url}" />
<get src="${xr.schematron.download.url}" dest="${download.dir}"
verbose="true" skipexisting="false" usetimestamp="false" httpusecaches="false" />
</target>
<target name="retrieve-xrechnung-schematron-from-github-release" depends="init"
unless="develop.local.xr.schematron">
<echo message="Loading from GitHub ${xr.schematron.download.url}" />
<get src="${xr.schematron.download.url}" dest="${download.dir}"
verbose="true" skipexisting="true" usetimestamp="true" />
</target>
<target name="provide-xrechnung-schematron"
depends="init, retrieve-xrechnung-schematron-from-local-build, retrieve-xrechnung-schematron-from-github-release"
description="Retrieve and prepare XRechnung Schemtaron">
<!-- Prepare XRechnung Schematron -->
<unzip src="${download.dir}/${xr.schematron.zip}"
dest="${resource.dir}/xrechnung/${xrechnung.version}/xsl">
<patternset>
<include name="**/XRechnung*.xsl" />
</patternset>
<flattenmapper />
</unzip>
</target>
<target name="retrieve-ubl-schema" depends="init"
description="Download UBL schemas to download directory">
<get src="${ubl.download.url}" dest="${download.dir}" verbose="true" skipexisting="true"
usetimestamp="true" />
</target>
<target name="retrieve-cii-schema" depends="init"
description="Download UN/CEFACT CII schemas to download directory">
<get src="${cii.download.url}" dest="${download.dir}" verbose="true" skipexisting="true"
usetimestamp="true" />
<unzip src="${download.dir}/${cii.schema.zip}" dest="${download.dir}">
<patternset>
<include name="**/D16B*uncoupled.zip" />
</patternset>
<mergemapper to="${cii.schema.uncoupled.zip}" />
</unzip>
</target>
<target name="retrieve-all-schema-rules"
depends="retrieve-ubl-schema,retrieve-cen-rules,provide-xrechnung-schematron,retrieve-cii-schema"
description="Retrieve and prepare all 3rd party XSDs and XSLTs" />
<target name="compile-cen-rules-only" description="Works for zip from master and release zips">
<schematron-compile schematron="${download.dir}/schematron/EN16931-UBL-validation.sch"
insuffix="sch" workdir="${build.dir}/schematron" outdir="${build.dir}" />
<schematron-compile schematron="${download.dir}/schematron/EN16931-CII-validation.sch"
insuffix="sch" workdir="${build.dir}/schematron" outdir="${build.dir}" />
<!-- Creating schematron now using Saxon 9he-->
<!-- according to https://www.saxonica.com/html/documentation/using-xsl/xsltfromant.html-->
<!-- customize CEN schematron rules for UBL -->
<xslt in="${build.dir}/EN16931-UBL-validation.xslt" out="${resource.xsl.cen.ubl}"
style="${src.dir}/remove-dead-apply-templates.xsl">
<classpath location="${lib.dir}/${saxon.jar}" />
<factory name="net.sf.saxon.TransformerFactoryImpl" />
</xslt>
<!-- customize CEN schematron rules for CII -->
<xslt in="${build.dir}/EN16931-CII-validation.xslt" out="${resource.xsl.cen.cii}"
style="${src.dir}/remove-dead-apply-templates.xsl">
<classpath location="${lib.dir}/${saxon.jar}" />
<factory name="net.sf.saxon.TransformerFactoryImpl" />
</xslt>
</target>
<target name="compile-cen-rules" depends="retrieve-cen-rules,prepare-saxon,compile-cen-rules-only"
description="Works for zip from master and release zips"/>
<target name="compile-scenario" depends="init">
<filter token="build.date" value="${build.date}" />
<filter token="cen.spec.id" value="${cen.spec.id}" />
<filter token="cen.rules.version" value="${cen.rules.version}" />
<filter token="cen.download.url.ubl" value="${cen.download.url.ubl}" />
<filter token="cen.download.url.cii" value="${cen.download.url.cii}" />
<!-- This is actually the schematron part of it -->
<filter token="xrechnung.download.url" value="${xr.schematron.download.url}" />
<filter token="xrechnung.rules.version.full" value="${xr.schematron.version.full}" />
<filter token="xrechnung.rules.version.major.minor" value="${xr.schematron.version.major.minor}" />
<!-- This is actually the specification part of it -->
<filter token="xrechnung.version" value="${xrechnung.version}" />
<filter token="xrechnung.spec.id" value="${xrechnung.spec.id}" />
<filter token="xrechnung.extension.id" value="${xrechnung.extension.id}" />
<filter token="ubl.version" value="${ubl.version}" />
<filter token="ubl.download.url" value="${ubl.download.url}" />
<filter token="cii.version" value="${cii.version}" />
<filter token="cii.download.url" value="${cii.download.url}" />
<copy file="scenarios.xml" todir="${repository.dir}" failonerror="true" filtering="true" />
</target>
<target name="compile"
depends="compile-scenario,retrieve-all-schema-rules,compile-cen-rules,prepare-saxon"
description="Compile XSDs and XSLTs into validation configuration conformat repository directory">
<echo>Compiling Schemas and XSLTs ...</echo>
<copy file="${src.dir}/default-report.xsl" todir="${resource.dir}" />
<copy file="${src.dir}/xrechnung-report.xsl" todir="${resource.dir}" />
<copy file="${src.dir}/report.xsd" todir="${resource.dir}/xsd" />
<unzip src="${download.dir}/${ubl.schema.zip}" dest="${resource.dir}/ubl/2.1/xsd">
<patternset>
<include name="xsdrt/**/*.xsd" />
</patternset>
<cutdirsmapper dirs="1" />
</unzip>
<unzip src="${download.dir}/${cii.schema.uncoupled.zip}" dest="${resource.dir}/cii/16b/xsd">
<patternset>
<include name="**/CrossIndustryInvoice*.xsd" />
</patternset>
<flattenmapper />
</unzip>
</target>
<target name="compile-test-sources">
<filter token="xrechnung.spec.id" value="${xrechnung.spec.id}" />
<copy todir="${test.build.dir}" failonerror="true" filtering="true">
<fileset dir="${test.src.dir}" casesensitive="false">
<include name="**/*.xml" />
</fileset>
</copy>
</target>
<target name="init-test" depends="init, compile, compile-scenario, compile-test-sources"
description="Initializes test directory structure">
<mkdir dir="${test.build.dir}" />
<!-- XSDs for validating e.g. scenario.xml and the output report -->
<mkdir dir="${resource.dir}/xsd" />
<mkdir dir="${testsuite.instances.dir}" />
<!-- customize scenarios.xml for testing purpose -->
<xslt in="${repository.dir}/scenarios.xml" out="${test.build.dir}/scenarios.xml"
style="${src.dir}/create-test-scenario.xsl">
<classpath location="${lib.dir}/${saxon.jar}" />
<factory name="net.sf.saxon.TransformerFactoryImpl" />
</xslt>
</target>
<target name="test-validator-assertions"
depends="init-test,provide-validator,test-validator-assertions-only,test-validator-report-with-schema-only"
description="Test XRechnung Configuration">
<echo message="Testing with full build chain." />
</target>
<target name="test-validator-report-with-schema-only">
<echo>Schema validating reports against ${reports.schema.dir}/report.xsd ...</echo>
<schemavalidate fullchecking="yes" failonerror="yes">
<schema namespace="http://www.xoev.de/de/validator/varl/1"
file="${reports.schema.dir}/report.xsd" />
<schema namespace="http://www.xoev.de/de/validator/framework/1/scenarios"
file="${reports.schema.dir}/scenarios.xsd" />
<fileset dir="${reports.dir}" includes="*-report.xml" />
</schemavalidate>
<echo>Schematron validating reports ...</echo>
<xslt style="${src.dir}/report.sch.xsl" includes="${reports.dir}/*.xml" destdir="${reports.dir}">
<classpath location="${lib.dir}/${saxon.jar}" />
<factory name="net.sf.saxon.TransformerFactoryImpl" />
</xslt>
</target>
<target name="test-validator-assertions-only" description="Only test XRechnung Configuration"
unless="test.skip">
<echo>Creating validation reports with ${lib.dir}/${validator.jar}.</echo>
<java jar="${lib.dir}/${validator.jar}" failonerror="yes" fork="yes" dir="${build.dir}">
<arg value="-s" />
<arg value="${test.build.dir}/scenarios.xml" />
<arg value="-r" />
<arg value="${build.dir}" />
<arg value="--html" />
<arg value="-l" />
<arg value="INFO" />
<arg value="--check-assertions" />
<arg value="${test.src.dir}/assertions.xml" />
<arg value="-o" />
<arg value="${reports.dir}" />
<arg value="${test.docs.dir}/instances" />
</java>
</target>
<!-- TODO name could be improved -->
<target name="create-validator-reports-from-testsuite"
depends="init-test, provide-validator, provide-testsuite"
description="Only test XRechnung Configuration" unless="test.skip">
<fail unless="testsuite.instances.dir"
message="Property testsuite.instances.dir must exist for this target to work" />
<echo>Creating validation reports with ${lib.dir}/${validator.jar} for ${testsuite.instances.dir}.</echo>
<java jar="${lib.dir}/${validator.jar}" failonerror="true" fork="true" dir="${build.dir}">
<arg value="-s" />
<arg value="scenarios.xml" />
<arg value="-r" />
<arg value="${build.dir}" />
<arg value="--html" />
<arg value="-o" />
<arg value="${reports.dir}/testsuite" />
<arg value="${testsuite.instances.dir}" />
</java>
</target>
<target name="check-custom-tests-folder-is-empty">
<fileset dir="${test.docs.custom.dir}" id="custom"/>
<pathconvert refid="custom" property="fileset.nonempty" setonempty="false"/>
</target>
<target name="create-validator-reports-from-custom-tests" depends="init-test, provide-validator, check-custom-tests-folder-is-empty"
description="Validate custom test" unless="test.skip" if="fileset.nonempty">
<fail unless="test.docs.custom.dir"
message="Property test.docs.custom.dir must exist for this target to work"/>
<echo>Creating validation reports with ${lib.dir}/${validator.jar} for
${test.docs.custom.dir}.</echo>
<java jar="${lib.dir}/${validator.jar}" failonerror="true" fork="true" dir="${build.dir}">
<arg value="-s"/>
<arg value="scenarios.xml"/>
<arg value="-r"/>
<arg value="${build.dir}"/>
<arg value="--html"/>
<arg value="-o"/>
<arg value="${reports.dir}/custom-tests"/>
<arg value="${test.docs.custom.dir}"/>
</java>
</target>
<target name="retrieve-xmute" depends="init">
<fail unless="xmute.download.url.prefix"
message="Property xmute.download.url.prefix must exist for this target to work" />
<property name="xmute.version.full" value="0.5" />
<property name="xmute.jar" value="xml-mutate.jar" />
<get src="${xmute.download.url.prefix}/target/xml-mutate-${xmute.version.full}.jar"
dest="${lib.dir}/${xmute.jar}" verbose="true" skipexisting="false" usetimestamp="true" />
</target>
<target name="test-cen-expected-behaviour" depends="compile, init-test, retrieve-xmute"
description="Test Schematron Rules with XML-Mutate" if="xmute.download.url.prefix">
<echo>Generate and test instances with expected behaviour ...</echo>
<java jar="${lib.dir}/${xmute.jar}" failonerror="true" fork="true" dir="${basedir}">
<arg value="--schematron" />
<arg value="xrubl=${resource.xsl.xr.ubl}" />
<arg value="--schematron" />
<arg value="cenubl=${resource.xsl.cen.ubl}" />
<arg value="--schematron" />
<arg value="cencii=${resource.xsl.cen.cii}" />
<arg value="--target ${test.docs.dir}/generated" />
<arg value="${test.docs.cen.unit.dir}" />
</java>
</target>
<target name="test-integration" depends="init-test, provide-validator, provide-testsuite, test-cen-expected-behaviour, test-integration-only"
description="Integration testing result of XRechnung Configuration"></target>
<target name="test-cen-unexpected-behaviour" depends="compile, init-test, retrieve-xmute"
description="Test for unexpected behaviour in CEN Schematron Rules">
<echo>Generate and test instances with unexpected behaviour ...</echo>
<java jar="${lib.dir}/${xmute.jar}" failonerror="true" fork="true" dir="${basedir}">
<arg value="--schematron" />
<arg value="xrubl=${resource.xsl.xr.ubl}" />
<arg value="--schematron" />
<arg value="cenubl=${resource.xsl.cen.ubl}" />
<arg value="--schematron" />
<arg value="cencii=${resource.xsl.cen.cii}" />
<arg value="--target ${test.docs.dir}/generated" />
<arg value="${test.docs.cen.unit.unexpected.dir}" />
</java>
</target>
<target name="test-integration-only" description="Nothing but integration testing">
<echo message="Compiling instances for integration tests"/>
<!-- Requires output of XML Mutate -->
<copy todir="${test.docs.integration.dir}" verbose="true">
<fileset dir="${test.docs.cen.unit.dir}">
<include name="cii-br-s-08-rounding-rule.xml"/>
<include name="ubl-br-dex-2-false-negative.xml"/>
<include name="cii-bt-20-cardinality-check.xml"/>
<include name="cii-bt-20-cardinality-check-2.xml"/>
<include name="cii-cii-sr-454-negative-test.xml"/>
<!-- Local files - not in repository -->
<include name="XRechnung-CEFACT*.xml"/>
</fileset>
<fileset dir="${test.src.dir}/integration"></fileset>
</copy>
<echo>Creating validation reports with ${lib.dir}/${validator.jar} for ${test.docs.integration.dir}</echo>
<java jar="${lib.dir}/${validator.jar}" failonerror="true" fork="true" dir="${build.dir}">
<arg value="-l" />
<arg value="DEBUG" />
<arg value="-s" />
<arg value="scenarios.xml" />
<arg value="-r" />
<arg value="${build.dir}" />
<arg value="--check-assertions" />
<arg value="${test.docs.dir}/assertions-integration-testing.xml" />
<arg value="--html" />
<arg value="-o" />
<arg value="${reports.dir}/integration" />
<arg value="${test.docs.integration.dir}" />
</java>
</target>
<target name="test"
depends="init-test, test-validator-assertions,create-validator-reports-from-testsuite, test-cen-expected-behaviour, test-integration, create-validator-reports-from-custom-tests">
<echo message="Testing all" />
</target>
<target name="dist-only" description="Generate the distribution without testing">
<mkdir dir="${build.dir}/docs" />
<copy todir="${build.dir}">
<fileset dir="${basedir}">
<include name="README.md" />
<include name="CHANGELOG.md" />
</fileset>
</copy>
<copy file="docs/usage.md" todir="${build.dir}/docs" failonerror="true" filtering="true" />
<zip destfile="${dist.dir}/${dist.name}" basedir="${build.dir}"
excludes="download/**,test/**,schematron/**,reports/**" />
</target>
<target name="dist" depends="compile,test, dist-only" description="Generate the distribution"> </target>
<target name="clean" description="clean up">
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build.dir}" verbose="true" includeEmptyDirs="true" />
<delete dir="${dist.dir}" />
<delete dir="${lib.dir}" />
<delete dir="${reports.dir}" />
</target>
</project>