3.16. 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. Die folgenden Testfunktionen stehen zur Verfügung:

// Methods to validate JavaScript:
.hasJavaScript()
.hasJavaScript().containing(..)
.hasJavaScript().equalsTo(..)
.hasJavaScript().equalsToSource(..)

Existenz von JavaScript

Mit der folgenden Funktion lässt sich feststellen, ob das Dokument überhaupt JavaScript enthält:

@Test
public void hasJavaScript() throws Exception {
  String filename = "javaScriptClock.pdf";

  AssertThat.document(filename)
            .hasJavaScript()
  ;
}

Vergleich gegen eine Vorlage

Das erwartete JavaScript kann aus einer Datei eingelesen und mit dem des PDF-Dokumentes verglichen werden. Für die Extraktion steht das Hilfsprogramm ExtractJavaScript zur Verfügung. Die so erzeugte Datei kann in einem Test verwendet werden:

@Test
public void hasJavaScript_ScriptFromFile() throws Exception {
  String filename = "javaScriptClock.pdf";
  File file = new File("javascript/javascriptClock.js");
  
  AssertThat.document(filename)
            .hasJavaScript()
            .equalsToSource(file)  1
  ;
}

1

Neben java.io.File sind auch java.io.Reader, java.io.InputStream und der Dateiname als java.lang.String möglich.

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:

@Test
public void hasJavaScript_ComparedToString() throws Exception {
  String filename = "javaScriptClock.pdf";
  String scriptFile = "javascript/javascriptClock.js";
  String scriptContent = IOHelper.getContentAsString(scriptFile);

  AssertThat.document(filename)
            .hasJavaScript()
            .equalsTo(scriptContent)
  ;
}

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:

public void hasJavaScript_ContainingText() throws Exception {
  String filename = "javaScriptClock.pdf";

  String javascriptFunction =  "function DoTimers() "
                             + "{ "
                             + "   var nCurTime = (new Date()).getTime(); "
                             + "   ClockProc(nCurTime); "
                             + "   StopWatchProc(nCurTime); "
                             + "   CountDownProc(nCurTime); "
                             + "   this.dirty = false; "
                             + "}"
                             ;

  AssertThat.document(filename)
            .hasJavaScript()
            .containing(javascriptFunction)
  ;
}
@Test
public void hasJavaScript_ContainingText_FunctionNames() throws Exception {
  String filename = "javaScriptClock.pdf";
  
  AssertThat.document(filename)
            .hasJavaScript()
            .containing("StopWatchProc")
            .containing("SetFldEnable")
            .containing("DoTimers")
            .containing("ClockProc")
            .containing("CountDownProc")
            .containing("CDEnables")
            .containing("SWSetEnables")
  ;
}

Whitespaces werden bei allen Vergleichen ignoriert, sowohl bei dem JavaScript aus dem PDF-Dokument, als auch bei dem aus Dateien oder String-Parametern.