4.18. XFA-Daten vergleichen

XFA-Daten von zwei PDF-Dokumenten miteinander komplett zu vergleichen, ist insofern nicht sinnvoll, weil sie meistens ein Erstellungs- und Änderungsdatum enthalten. Deshalb bietet PDFUnit den Vergleich von XFA-Daten auf der Basis von XPath-Ausdrücken an.

Übersicht

Folgendes Tag steht für Tests zur Verfügung:

<!-- Tag to compare XFA data: -->

<haveSameXFAData />

Beispiel - Resulttype Node

Das Ergebnis der XPath-Auswertung muss für beide PDF-Dokumente identisch sein:

<testcase name="haveSameXFAData_ResulttypeNode">
  <assertThat testDocument="test/test.pdf"
              masterDocument="master/master.pdf"
  >
    <haveSameXFAData>
      <matchingXPath expr="//default:pageSet" 
                     withResultType="NODE" 
                     defaultNamespace="http://www.xfa.org/schema/xfa-template/2.6/" 
      />
    </haveSameXFAData>
  </assertThat>
</testcase>

Wie das Beispiel zeigt, muss der erwartete Ergebnistyp angegeben werden. Die verfügbaren Ergebnistypen sind als Konstanten für das Attribut withResultType definiert. Es sind:

<!-- Result types for XPath-processing:  -->

withResultType="BOOLEAN"
withResultType="NUMBER"
withResultType="NODE"
withResultType="NODESET"
withResultType="STRING"

Whitespaces bleiben beim Vergleich unberücksichtigt.

Werden zwei Dokumente verglichen, die beide keine XFA-Daten enthalten, wirft PDFUnit eine Exception. Es macht keinen Sinn, etwas zu vergleichen, das es nicht gibt.

Beispiel - Resulttype Boolean

Die XPath-Ausdrücke dürfen auch XPath-Funktionen enthalten:

<testcase name="haveSameXFAData_ResulttypeBoolean">
  <assertThat testDocument="test/test.pdf"
              masterDocument="master/master.pdf"
  >
    <haveSameXFAData>
      <matchingXPath expr="count(//default:field) = 3" 
                     withResultType="BOOLEAN" 
                     defaultNamespace="http://www.xfa.org/schema/xfa-template/2.6/" 
      />
    </haveSameXFAData>
  </assertThat>
</testcase>

Test mit boolean als erwartetem Ergebnistyp (BOOLEAN) sind insofern kritisch, weil in XPath nicht zwischen nicht gefunden und false unterschieden werden kann.

Eine ausführliche Beschreibung für das Arbeiten mit XPath in PDFUnit steht in Kapitel 8: „XPath-Einsatz“.

Beispiel - Default-Namensraum

Beachten Sie den Umgang mit dem Default-Namensraum. Er muss mit dem Attribut defaultNamespace=".." deklariert werden, denn eine automatische Erkennung ist nicht möglich, weil ein XML-Dokument prinzipiell mehrere Default-Namensräume haben kann.

Sie können mehrere XPath-Vergleiche in einem Test ausführen, sogar mit wechselndem Default-Namensraum. Überlegen Sie sich aber, ob Sie den folgenden Test nicht lieber in einzelne Tests aufteilen:

<!-- 
  Test with multiple XPath expressions.
  
  It is not recommended to create tests in this way.
  But PDFUnit has to ensure that it works.
-->
<testcase name="haveSameXFAData_MultipleDefaultNamespaces">
  <assertThat testDocument="test/test.pdf"
              masterDocument="master/master.pdf"
  >
    <haveSameXFAData>
      <matchingXPath expr="//default:agent/@name[.='designer']" 
                     withResultType="BOOLEAN"
                     defaultNamespace="http://www.xfa.org/schema/xci/2.6/" 
      />
      <matchingXPath expr="//default:subform/@name[.='movie']" 
                     withResultType="BOOLEAN"
                     defaultNamespace="http://www.xfa.org/schema/xfa-template/2.6/" 
      />
      <matchingXPath expr="//default:locale/@name[.='nl_BE']" 
                     withResultType="BOOLEAN"
                     defaultNamespace="http://www.xfa.org/schema/xfa-locale-set/2.7/" 
      />
    </haveSameXFAData>
  </assertThat>
</testcase>