On Wed, 2 Sep 2020 17:16:00 GMT, Kevin Rushforth <k...@openjdk.org> wrote:

>> I wrote the following test:
>> 
>> import static org.junit.Assert.assertTrue;
>> import static org.junit.Assert.fail;
>> 
>> import java.util.concurrent.CountDownLatch;
>> import java.util.concurrent.TimeUnit;
>> 
>> import org.junit.AfterClass;
>> import org.junit.BeforeClass;
>> import org.junit.Test;
>> 
>> import javafx.application.Application;
>> import javafx.application.Platform;
>> import javafx.scene.Group;
>> import javafx.scene.PointLight;
>> import javafx.scene.Scene;
>> import javafx.scene.paint.Color;
>> import javafx.scene.shape.Box;
>> import javafx.stage.Stage;
>> import javafx.stage.WindowEvent;
>> 
>> public class PointLightAttenuationTest {
>> 
>>     private static CountDownLatch startupLatch;
>>     private static Stage stage;
>>     private static PointLight light = new PointLight(Color.BLUE);
>>     private static Box box = new Box(100, 100, 1);
>> 
>>     @BeforeClass
>>     public static void initFX() throws Exception {
>>         startupLatch = new CountDownLatch(1);
>>         new Thread(() -> Application.launch(TestApp.class, 
>> (String[])null)).start();
>>         assertTrue("Timeout waiting for FX runtime to start", 
>> startupLatch.await(15, TimeUnit.SECONDS));
>>     }
>> 
>>     public class TestApp extends Application {
>> 
>>         @Override
>>         public void start(Stage mainStage) {
>>             stage = mainStage;
>>             light.setTranslateZ(-50);
>>             var root = new Group(light, box);
>>             var scene = new Scene(root);
>>             stage.setScene(scene);
>>             stage.setFullScreen(true);
>>             stage.addEventHandler(WindowEvent.WINDOW_SHOWN, e -> 
>> Platform.runLater(startupLatch::countDown));
>>             stage.show();
>>         }
>>     }
>>     
>>     @Test
>>     public void testAttenuation() {
>>         var image = box.snapshot(null, null);
>>         var nonAttenColor = image.getPixelReader().getColor(1, 1);
>> 
>>         light.setLinearAttenuation(2);
>>         image = box.snapshot(null, null);
>>         var attenColor = image.getPixelReader().getColor(1, 1);
>> 
>>         System.out.println(nonAttenColor);
>>         System.out.println(attenColor);
>>         if (nonAttenColor.getBlue() > attenColor.getBlue()) {
>>             throw new AssertionError("Attenuation color should be less than 
>> non-attenuated");
>>         }
>>     }
>> 
>>     @AfterClass
>>     public static void teardown() {
>>         Platform.runLater(() -> {
>>             stage.hide();
>>             Platform.exit();
>>         });
>>     }
>> }
>> But when executing it with
>> 
>>     ./gradlew -PFULL_TEST=true -PUSE_ROBOT=true :systemTests:test --tests 
>> PointLightAttenuationTest
>> 
>> I get the error
>> 
>> test.javafx.scene.lighting3D.PointLightAttenuationTest > classMethod FAILED
>>     java.lang.AssertionError: Timeout waiting for FX runtime to start
>>         at org.junit.Assert.fail(Assert.java:91)
>>         at org.junit.Assert.assertTrue(Assert.java:43)
>>         at 
>> test.javafx.scene.lighting3D.PointLightAttenuationTest.initFX(PointLightAttenuationTest.java:59)
>> 
>> So for some reason the Application doesn't start, it seems. I ran 
>> `ShapeViewOrderLeakTest` and `RestoreSceneSizeTest`
>> which look the same, and those work. Any idea?
>
> If you run it with `--info` you will see something like this:
> 
> test.javafx.scene.shape.PointLightAttenuationTest STANDARD_ERROR
>     Exception in Application constructor
>     Exception in thread "Thread-4" java.lang.RuntimeException: Unable to 
> construct Application instance: class
>     test.javafx.scene.shape.PointLightAttenuationTest$TestApp
>         at 
> javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:890)
>         at 
> javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
>         at java.base/java.lang.Thread.run(Thread.java:832)
>     Caused by: java.lang.NoSuchMethodException: 
> test.javafx.scene.shape.PointLightAttenuationTest$TestApp.<init>()
>         at java.base/java.lang.Class.getConstructor0(Class.java:3427)
>         at java.base/java.lang.Class.getConstructor(Class.java:2165)
>         at 
> javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:801)
>         at 
> javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
>         at 
> javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
>         at 
> java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
>         at 
> javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
>         at 
> javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
>         at 
> javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
>         at 
> javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
>         ... 1 more
> 
> The nested `TestApp` class should be declared as `static`. Btw, I don't 
> recommend using `setFullScreen` for a test such
> as this.

Thanks, the test runs now, but I've run into an issue with `snapshot`.

`Node#snapshot` uses its scene parameters (like lights) to render the image, 
but if the node is in a subscene then the
image will be wrong since it takes the wrong data. Bounds transforms like 
`sceneToLocal` and `localToScene` do take
care of this case. I think that this is a mistake in `snapshot`, and maybe it 
should use the subscene, or a `boolean
subScene` parameter should be offered, or `SnapshotParameters` should allow to 
specify it.

-------------

PR: https://git.openjdk.java.net/jfx/pull/43

Reply via email to