boot-fx/src/test/java/org/netbeans/html/boot/fx/ReloadTest.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 02 Aug 2014 12:59:31 +0200
changeset 790 30f20d9c0986
parent 736 8e6e4f811215
child 838 bdc3d696dd4a
permissions -rw-r--r--
Fixing Javadoc to succeed on JDK8
     1 /**
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
     5  *
     6  * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
     7  * Other names may be trademarks of their respective owners.
     8  *
     9  * The contents of this file are subject to the terms of either the GNU
    10  * General Public License Version 2 only ("GPL") or the Common
    11  * Development and Distribution License("CDDL") (collectively, the
    12  * "License"). You may not use this file except in compliance with the
    13  * License. You can obtain a copy of the License at
    14  * http://www.netbeans.org/cddl-gplv2.html
    15  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    16  * specific language governing permissions and limitations under the
    17  * License.  When distributing the software, include this License Header
    18  * Notice in each file and include the License file at
    19  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
    20  * particular file as subject to the "Classpath" exception as provided
    21  * by Oracle in the GPL Version 2 section of the License file that
    22  * accompanied this code. If applicable, add the following below the
    23  * License Header, with the fields enclosed by brackets [] replaced by
    24  * your own identifying information:
    25  * "Portions Copyrighted [year] [name of copyright owner]"
    26  *
    27  * Contributor(s):
    28  *
    29  * The Original Software is NetBeans. The Initial Developer of the Original
    30  * Software is Oracle. Portions Copyright 2013-2014 Oracle. All Rights Reserved.
    31  *
    32  * If you wish your version of this file to be governed by only the CDDL
    33  * or only the GPL Version 2, indicate your decision by adding
    34  * "[Contributor] elects to include this software in this distribution
    35  * under the [CDDL or GPL Version 2] license." If you do not indicate a
    36  * single choice of license, a recipient has the option to distribute
    37  * your version of this file under either the CDDL, the GPL Version 2 or
    38  * to extend the choice of license to its licensees as provided above.
    39  * However, if you add GPL Version 2 code and therefore, elected the GPL
    40  * Version 2 license, then the option applies only if the new code is
    41  * made subject to such option by the copyright holder.
    42  */
    43 package org.netbeans.html.boot.fx;
    44 
    45 import java.util.concurrent.CountDownLatch;
    46 import java.util.concurrent.Executors;
    47 import javafx.application.Platform;
    48 import net.java.html.BrwsrCtx;
    49 import net.java.html.boot.BrowserBuilder;
    50 import net.java.html.js.JavaScriptBody;
    51 import org.apidesign.html.boot.spi.Fn;
    52 import static org.testng.Assert.*;
    53 import org.testng.annotations.Test;
    54 
    55 /**
    56  *
    57  * @author Jaroslav Tulach
    58  */
    59 public class ReloadTest {
    60     private static Runnable whenInitialized;
    61     
    62     public ReloadTest() {
    63     }
    64 
    65     @JavaScriptBody(args = { "a", "b"  }, body = "return a + b;")
    66     private static native int plus(int a, int b);
    67     
    68     @Test public void checkReload() throws Throwable {
    69         final Throwable[] arr = { null };
    70         
    71         final BrowserBuilder bb = BrowserBuilder.newBrowser().loadClass(ReloadTest.class).
    72                 loadPage("empty.html").
    73                 invoke("initialized");
    74         
    75         class ShowBrowser implements Runnable {
    76             @Override
    77             public void run() {
    78                 bb.showAndWait();
    79             }
    80         }
    81         
    82         class WhenInitialized implements Runnable {
    83             CountDownLatch cdl = new CountDownLatch(1);
    84             AbstractFXPresenter p;
    85             BrwsrCtx ctx;
    86             
    87             @Override
    88             public void run() {
    89                 try {
    90                     whenInitialized = null;
    91                     doCheckReload();
    92                     p = (AbstractFXPresenter) Fn.activePresenter();
    93                     assertNotNull(p, "Presenter is defined");
    94                     ctx = BrwsrCtx.findDefault(WhenInitialized.class);
    95                 } catch (Throwable ex) {
    96                     arr[0] = ex;
    97                 } finally {
    98                     cdl.countDown();
    99                 }
   100             }
   101         }
   102         WhenInitialized when = new WhenInitialized();
   103         whenInitialized = when;
   104         Executors.newSingleThreadExecutor().submit(new ShowBrowser());
   105         when.cdl.await();
   106         if (arr[0] != null) throw arr[0];
   107         
   108         class ReloadPage implements Runnable {
   109             final CountDownLatch cdl = new CountDownLatch(1);
   110             private final AbstractFXPresenter p;
   111 
   112             public ReloadPage(AbstractFXPresenter p) {
   113                 this.p = p;
   114             }
   115 
   116             @Override
   117             public void run() {
   118                 p.engine.reload();
   119                 cdl.countDown();
   120             }
   121         }
   122         ReloadPage relPage = new ReloadPage(when.p);
   123         
   124         class SecondInit implements Runnable {
   125             CountDownLatch cdl = new CountDownLatch(1);
   126             
   127             @Override
   128             public void run() {
   129                 try {
   130                     whenInitialized = null;
   131                     doCheckReload();
   132                 } catch (Throwable ex) {
   133                     arr[0] = ex;
   134                 } finally {
   135                     cdl.countDown();
   136                 }
   137                 
   138             }
   139         }
   140         SecondInit second = new SecondInit();
   141         whenInitialized = second;
   142         
   143         Platform.runLater(relPage);
   144         
   145         second.cdl.await();
   146         if (arr[0] != null) throw arr[0];
   147     }
   148     
   149     final void doCheckReload() throws Exception {
   150         int res = plus(30, 12);
   151         assertEquals(res, 42, "Meaning of world computed");
   152     }
   153     
   154     public static synchronized void initialized() throws Exception {
   155         whenInitialized.run();
   156     }
   157 }