3.13. JavaScript

Überblick

Wenn JavaScript in Ihren PDF-Dokumenten überhaupt existiert, wird es wohl wichtig sein. Nicht selten übernimmt JavaScript eine aktive Rolle innerhalb eines Dokumenten-Workflows.

Zwar ersetzt PDFUnit kein separates JavaScript-Unittest-Werkzeug wie beispielsweise Google JS Test , aber besser wenig getestet, als überhaupt nicht.

Das folgende Tag können Sie nutzen:

<!-- Tag to verify JavaScript: -->

<hasJavaScript>
  <containing       /> (optional)
  <equals           /> (optional)
  <matchingComplete /> (optional)
</hasJavaScript>

Existenz von JavaScript

Das folgende Beispiel zeigt, wie geprüft wird, ob das Dokument überhaupt JavaScript enthält:

<testcase name="hasJavaScript">
  <assertThat testDocument="javascript/javaScriptClock.pdf">
    <hasJavaScript />
  </assertThat>
</testcase>

Vergleich gegen eine Vorlage

Das erwartete JavaScript kann aus einer Datei eingelesen und mit dem des PDF-Dokumentes verglichen werden. Das Hilfsprogramm ExtractJavaScript kann dazu benutzt werden, den JavaScript-Code eines PDF-Dokumentes in eine Textdatei extrahiert:

<testcase name="hasJavaScript_ScriptFromFile">
  <assertThat testDocument="javascript/javaScriptClock.pdf">
    <hasJavaScript>
      <equals toFile="javascript/javascriptClock.js" />
    </hasJavaScript>
  </assertThat>
</testcase>

Das JavaScript, das mit dem JavaScript des PDF-Dokumentes verglichen wird, muss aber nicht aus einer Datei gelesen werden. Es kann auch direkt als String übergeben werden:

<testcase name="hasJavaScript_ComparedToString">
  <assertThat testDocument="javascript/javaScriptClock.pdf">
    <hasJavaScript>
      <matchingComplete>
        <![CDATA[
        // Constants used by the time calculations
        var oneSec = 1000;
        var oneMin = 60 * oneSec;
        var oneHour = 60 * oneMin;
        
        
        var strokeNormal = this.getField(\"SWStart\").strokeColor;
        var strokeLight = [\"RGB\",.35,.35,1];
        var fillNormal = this.getField(\"SWStart\").fillColor;
        var fillLight = [\"RGB\",.35,.35,0.7];
        
        function SetFldEnable(oFld, bEnable)
        {
           if(oFld)
           {
             oFld.strokeColor = bEnable?strokeNormal:strokeLight;
             oFld.fillColor = bEnable?fillNormal:fillLight;
             oFld.readonly = !bEnable;
             oFld.textColor = bEnable?color.white:[\"G\",.7];
           }
        }
        
        ... (code shortened for presentation)
        
        ]]>
      </matchingComplete>
    </hasJavaScript>
  </assertThat>
</testcase>

Teilstrings vergleichen

In den bisherigen Tests wurde das JavaScript eines PDF-Dokumentes immer gegen eine komplette Datei verglichen. Es kann aber auch auf Teil-Strings getestet werden, wie die folgenden Beispiele zeigen:

<testcase name="hasJavaScript_ContainingText">
  <assertThat testDocument="javascript/javaScriptClock.pdf">
    <hasJavaScript>
      <containing>
        function DoTimers()
        {
           var nCurTime = (new Date()).getTime();
           ClockProc(nCurTime);
           StopWatchProc(nCurTime);
           CountDownProc(nCurTime);
           this.dirty = false;
        }
      </containing>
    </hasJavaScript>
  </assertThat>
</testcase>
<testcase name="hasJavaScript_ContainingFunction_MultipleFunctionnames">
  <assertThat testDocument="javascript/javaScriptClock.pdf">
    <hasJavaScript>
      <containing>StopWatchProc</containing>
      <containing>SetFldEnable</containing>
      <containing>DoTimers</containing>
      <containing>ClockProc</containing>
      <containing>CountDownProc</containing>
      <containing>CDEnables</containing>
      <containing>SWSetEnables</containing>
    </hasJavaScript>
  </assertThat>
</testcase>

Whitespaces spielen bei allen Vergleichen keine Rolle, weder bei dem JavaScript aus dem PDF-Dokument, noch beim dem aus Dateien oder Tag-Inhalten.

Da es sich bei dem extrahierten JavaScript um eine Textdatei handelt und nicht um XML, gibt es keine XML- und XPath-basierten Tests.