After studying [1], not sure whether one is supposed to announce a WIP here or 
not, so in doubt also
announcing the URL for the suggested test unit (part of the systemTests) for 
those interested in
checking it out: <https://github.com/openjdk/jfx/pull/123>.  To run the 
systemTests tests only one
can issue:

|    ./gradlew -PFULL_TEST=true :systemTests:test --tests ModuleLauncherTest|

This will include the suggested WIP test unit "testscriptapp1".

---rony

[1] "Contributing to OpenJFX": 
<https://github.com/openjdk/jfx/blob/master/CONTRIBUTING.md>


On 18.02.2020 14:25, Rony G. Flatscher wrote:
> For creating a test unit to test whether [1] is present or not, it is 
> necessary to have a Java
> script engine to test again. As discussed in a different thread it is not 
> advisable to use any
> concrete, existing Java script engine that is not part of the JDK. Therefore 
> it becomes necessary to
> come up with a proper implementation of javax.script.ScriptEngine and
> javax.script.ScriptEngineFactory to serve for the sole purpose of testing.
>
> I have come up with such a "pseudo script engine" which will log each script 
> invocation together
> with the script code, a copy of the ScriptContext in effect (for later 
> inspection) and the time of
> invocation.
>
> For a test unit it is necessary to have this pseudo script engine loaded via 
> the SPI to be able to
> use from a test application. For this one can define a
> "META-INF/services/javax.script.ScriptEngineFactory" file and/or a 
> "module-info.java" file. In order
> to be as flexible as possible both approaches were chosen (also in mind that 
> others may have a need
> for such a pseudo script engine for testing purposes). This implementation 
> creates a module that
> contains a test application where the ideas and structures are modelled after 
> the "systemTests"
> modules (many thanks to Keving Rushforts for pointing at that!).
>
> The test application will create a JavaFX application that processes some 
> fxml file "demo_01.fxml"
> which defines the pseudo script engine to be used for executing all of the 
> scripts defined in that
> file. The "start" method will fire the Button using  "btn.fire()", 
> "btn.fireEvent( new ActionEvent()
> )", and "btn.fireEvent( new MouseEvent( ... ) )" to have the event scripts 
> executed. As mentioned
> the pseudo script engine will log each invocation.
>
> Upon return of the "start" method the test application's main method will 
> fetch the log of
> invocations from the pseudo script engine and then assert that the sequence 
> of invocations, the
> scripts and the ScriptContext Bindings are correct with respect to some 
> "demo_01.fxml". This not
> only asserts the proper existence of the entries "javax.script.filename" 
> (also the proper values of
> the file names) and "javax.script.argv" in the engine Bindings, but also 
> whether the global Bindings
> are correctly defined and their values (and types) are correct. These 
> assertion tests are dependent
> on a) how FXMLLoader populates the ScriptContext Bindings and b) how the test 
> case in form of the
> fxml-file and the supplied pseudo scripts is formulated.
>
> The test unit uses assertion methods of its own (like the other module based 
> tests) and if it ends
> with an exit code of 0 it has passed. In the case of assertion errors (or 
> unexpected errors) an
> appropriate error message with a stack trace is given and a non-zero exit 
> code is returned via
> "System.exit()" (again modeled after/copied from the other module tests).
>
> To make this test unit as simple as possible the module includes the pseudo 
> script engine (it is not
> a separate module). It needs to be run on its own JVM (as is the case with 
> the other module tests).
>
> Any comments, questions, suggestions?
>
> ---rony
>
> [1] "JDK-8234959 FXMLLoader does not populate ENGINE_SCOPE Bindings with 
> FILENAME and ARGV":
> <https://bugs.openjdk.java.net/browse/JI-9062887>
>

Reply via email to