Zurück |  | Weiter

## 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>

Zurück | Nach oben | Weiter
4.17. Text vergleichen | Zum Anfang | 4.19. XMP-Daten vergleichen