PDF-Dokumente werden durch Aktionen interaktiv aber auch komplizierter. Und „kompliziert“ bedeutet, dass sie getestet werden müssen, zumal wenn die interaktiven Teile eines Dokumentes ein wichtiger Teil einer Prozesskette sind.
Technisch betrachtet ist eine „Aktion“ ein Dictionary-Objekt mit
den Elementen /S
und /Type
.
Das Element /Type
hat immer immer den Wert „Action“
und das Element /S
(Subtype) hat typabhängige Werte:
// Types of actions: GoTo: Set the focus to a destination in the current PDF document GoToR: Set the focus to a destination in another PDF document GoToE: Go to a destination inside an embedded file GoTo3DView: Set the view to a 3D annotation Hide: Set the hidden flag of the specified annotation ImportData: Import data from a file to the current document JavaScript: Execute JavaScript code Movie: Play a specified movie Named: Execute an action, which is predefined by the PDF viewer Rendition: Control the playing of multimedia content ResetForm: Set the values of form fields to default SetOCGState: Set the state of an OCG Sound: Play a specified sound SubmitForm: Send the form data to an URL Launch: Execute an application Thread: Set the viewer to the beginning of a specified article Trans: Update the display of a document, using a transition dictionary URI: Go to the remote URI
Für einige dieser Aktionen stellt PDFUnit Testmethoden zur Verfügung. In zukünftigen Releases werden weitere Testmethoden zur Verfügung gestellt.
// Simple tests: .hasNumberOfActions(..) // Action specific tests: .hasJavaScriptAction() .hasJavaScriptAction().containing(..) .hasJavaScriptAction().containingSource(..) .hasJavaScriptAction().equalsTo(..) .hasJavaScriptAction().equalsToSource(..) .hasJavaScriptAction().matchingRegex(..) .hasLocalGotoAction() .hasLocalGotoAction().toDestination(..) .hasLocalGotoAction().toDestination(.., pageNumber)
Die folgenden Abschnitte zeigen Beispiele für diese Testmethoden.
JavaScript-Text ist gewöhnlich etwas umfangreich, deshalb macht es Sinn, den Vergleichstext für einen JavaScript-Action-Test aus einer Datei zu lesen:
@Test public void hasJavaScriptAction_WithWhitespaceProcessing() throws Exception { String filename = "documentUnderTest.pdf"; String scriptFileName = "javascript/javascriptAction_OneSimpleAlert.js"; Reader scriptFileAsReader = new FileReader(scriptFileName); AssertThat.document(filename) .hasJavaScriptAction() .equalsToSource(scriptFileAsReader, WhitespaceProcessing.IGNORE) ; }
Die Methoden containingSource(..)
und equalsToSource(..)
nehmen
Parameter vom Typ java.io.Reader
, java.io.InputStream
oder
java.lang.String
entgegen.
In dem vorhergehenden Beispiel wird der vollständige Inhalt der JavaScript-Datei mit dem Inhalt der JavaScript-Action verglichen. Whitespaces werden dabei ignoriert.
Es können aber auch einfache Zeichenkette innerhalb des JavaScript-Codes geprüft werden:
@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") ; }
Das Kapitel 13.5: „Behandlung von Whitespaces“ geht ausführlich auf den flexiblen Umgang mit Whitespaces ein.
Goto-Actions benötigen ein Sprungziel in derselben Datei:
@Test public void hasGotoAction_ToNamedDestination() throws Exception { String filename = "documentUnderTest.pdf"; String destinationName21 = "destination2.1"; AssertThat.document(filename) .hasLocalGotoAction() .toDestination(destinationName21) ; }
Dieser Test ist erfolgreich, wenn das aktuelle Test-PDF eine GoTo-Action enthält die auf das Sprungziel „destination2.1“ zeigt. Sprungziele können im Zusammenhang mit Lesezeichen (Bookmarks) getestet werden. Darauf geht Kapitel 4.12: „"Named Destinations" vergleichen“ ein.
Es kann auch geprüft werden, ob sich ein Sprungziel auf einer bestimmten Seite befindet:
@Test public void hasGotoAction_ToDestinationWithPage_Page3() throws Exception { String filename = "documentUnderTest.pdf"; String destinationName21 = "destination2.1"; int page3 = 3; AssertThat.document(filename) .hasLocalGotoAction() .toDestination(destinationName21, page3) ; }