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