1 /*
   2  * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package test.javafx.scene.control;
  27 
  28 import com.sun.javafx.scene.SceneHelper;
  29 import static org.junit.Assert.assertEquals;
  30 import static org.junit.Assert.assertFalse;
  31 import static org.junit.Assert.assertTrue;
  32 
  33 import javafx.scene.Node;
  34 import javafx.scene.Parent;
  35 import javafx.scene.Scene;
  36 import javafx.scene.control.skin.MenuBarSkinShim;
  37 import javafx.scene.input.KeyCode;
  38 import javafx.scene.input.MouseEvent;
  39 import javafx.scene.layout.AnchorPane;
  40 import javafx.scene.layout.VBox;
  41 import javafx.stage.Stage;
  42 
  43 import org.junit.Before;
  44 import org.junit.Test;
  45 
  46 import test.com.sun.javafx.pgstub.StubToolkit;
  47 import test.com.sun.javafx.scene.control.infrastructure.KeyEventFirer;
  48 import test.com.sun.javafx.scene.control.infrastructure.KeyModifier;
  49 import test.com.sun.javafx.scene.control.infrastructure.MouseEventGenerator;
  50 import com.sun.javafx.scene.control.ContextMenuContent;
  51 import com.sun.javafx.scene.control.MenuBarMenuButtonShim;
  52 import javafx.scene.control.skin.MenuBarSkin;
  53 import com.sun.javafx.tk.Toolkit;
  54 import javafx.scene.control.CheckBox;
  55 import javafx.scene.control.Menu;
  56 import javafx.scene.control.MenuBar;
  57 import javafx.scene.control.MenuButton;
  58 import javafx.scene.control.MenuItem;
  59 
  60 
  61 /**
  62  *
  63  * @author lubermud
  64  */
  65 
  66 public class MenuBarTest {
  67     private MenuBar menuBar;
  68     private Toolkit tk;
  69     private Scene scene;
  70     private Stage stage;
  71 
  72     @Before public void setup() {
  73         tk = (StubToolkit)Toolkit.getToolkit();
  74         menuBar = new MenuBar();
  75         menuBar.setUseSystemMenuBar(false);
  76     }
  77 
  78     protected void startApp(Parent root) {
  79         scene = new Scene(root,800,600);
  80         stage = new Stage();
  81         stage.setX(0); // The MouseEventGenerator set the screen X/Y to be the same as local Node X/Y, so we need to keep stage at 0,0
  82         stage.setY(0);
  83         stage.setScene(scene);
  84         stage.show();
  85         tk.firePulse();
  86     }
  87 
  88     @Test public void defaultConstructorHasFalseFocusTraversable() {
  89         assertFalse(menuBar.isFocusTraversable());
  90     }
  91 
  92     @Test public void defaultConstructorButSetTrueFocusTraversable() {
  93             menuBar.setFocusTraversable(true);
  94         assertTrue(menuBar.isFocusTraversable());
  95     }
  96 
  97     @Test public void getMenusHasSizeZero() {
  98         assertEquals(0, menuBar.getMenus().size());
  99     }
 100 
 101     @Test public void getMenusIsAddable() {
 102         menuBar.getMenus().add(new Menu(""));
 103         assertTrue(menuBar.getMenus().size() > 0);
 104     }
 105 
 106     @Test public void getMenusIsClearable() {
 107         menuBar.getMenus().add(new Menu(""));
 108         menuBar.getMenus().clear();
 109         assertEquals(0, menuBar.getMenus().size());
 110     }
 111 
 112      @Test public void getMenusIsRemovable() {
 113            menuBar.getMenus().add(new Menu("blah"));
 114            menuBar.getMenus().add(new Menu("foo"));
 115            menuBar.getMenus().remove(0);
 116            assertEquals(1, menuBar.getMenus().size());
 117      }
 118 
 119     @Test public void testMenuShowHideWithMenuBarWithXYTranslation() {
 120         final MouseEventGenerator generator = new MouseEventGenerator();
 121         AnchorPane root = new AnchorPane();
 122         Menu menu = new Menu("Menu");
 123         menu.getItems().add(new MenuItem("MenuItem"));
 124         menuBar.getMenus().add(menu);
 125         menuBar.setLayoutX(100);
 126         menuBar.setLayoutY(100);
 127         root.getChildren().add(menuBar);
 128         startApp(root);
 129         tk.firePulse();
 130 
 131         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 132         assertTrue(skin != null);
 133 
 134         double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
 135         double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
 136 
 137         MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
 138         mb.getScene().getWindow().requestFocus();
 139         SceneHelper.processMouseEvent(scene,
 140             generator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
 141         SceneHelper.processMouseEvent(scene,
 142             generator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
 143         assertTrue(menu.isShowing());
 144 
 145     }
 146 
 147     @Test public void testSubMenuDismissalWithKeyNavigation() {
 148         final MouseEventGenerator generator = new MouseEventGenerator();
 149         AnchorPane root = new AnchorPane();
 150         Menu menu = new Menu("Menu");
 151         Menu menu1 = new Menu("Menu With SubMenu");
 152         menu.getItems().add(menu1);
 153 
 154         MenuItem menuItem1 = new MenuItem("MenuItem1");
 155         MenuItem menuItem2 = new MenuItem("MenuItem2");
 156         menu1.getItems().addAll(menuItem1, menuItem2);
 157 
 158         menuBar.getMenus().add(menu);
 159         menuBar.setLayoutX(100);
 160         menuBar.setLayoutY(100);
 161 
 162         root.getChildren().add(menuBar);
 163         startApp(root);
 164         tk.firePulse();
 165 
 166         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 167         assertTrue(skin != null);
 168 
 169         double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
 170         double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
 171 
 172         MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
 173         mb.getScene().getWindow().requestFocus();
 174         SceneHelper.processMouseEvent(scene,
 175             generator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
 176         SceneHelper.processMouseEvent(scene,
 177             generator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
 178         assertTrue(menu.isShowing());
 179          /* ------------------------------------------------------------------ */
 180 
 181         // Show subMenu
 182         ContextMenuContent menuContent = MenuBarSkinShim.getMenuContent(mb); // ContextMenuContent
 183         Node displayNode = MenuBarMenuButtonShim.getDisplayNodeForMenuItem(menuContent, 0); // MenuItemContainer
 184 
 185         displayNode.getScene().getWindow().requestFocus();
 186         assertTrue(displayNode.getScene().getWindow().isFocused());
 187 
 188         displayNode.requestFocus(); // requestFocus on 1st Menu
 189         assertTrue(displayNode.isFocused());
 190         // update currentFocusedIndex
 191         MenuBarMenuButtonShim.setCurrentFocusedIndex(menuContent, 0);
 192 
 193         // fire KeyEvent (Enter) on menu1 to show submenu
 194         KeyEventFirer keyboard = new KeyEventFirer(menuContent);
 195         keyboard.doKeyPress(KeyCode.ENTER);
 196         tk.firePulse();
 197         assertTrue(menu1.isShowing()); // subMenu is showing
 198         /* ------------------------------------------------------------------ */
 199 
 200         // Get 1st MenuItem from the submenu
 201         ContextMenuContent subMenuContent = MenuBarMenuButtonShim.getSubMenuContent(menuContent);
 202         subMenuContent.getScene().getWindow().requestFocus(); // requestFocus on submenu
 203         assertTrue(subMenuContent.getScene().getWindow().isFocused());
 204 
 205         displayNode = MenuBarMenuButtonShim.getDisplayNodeForMenuItem(subMenuContent, 0);
 206         displayNode.requestFocus();
 207         assertTrue(displayNode.isFocused());
 208 
 209         MenuBarMenuButtonShim.setCurrentFocusedIndex(subMenuContent, 0);
 210         // fire KeyEvent (Enter) on menuItem1 to hide all menus
 211         keyboard = new KeyEventFirer(subMenuContent);
 212         keyboard.doKeyPress(KeyCode.ENTER);
 213         tk.firePulse();
 214 
 215         // confirm all menus are closed.
 216         assertTrue(!menu1.isShowing());
 217         assertTrue(!menu.isShowing());
 218     }
 219 
 220     @Test public void checkMenuBarMenusSelectionResetAfterMenuItemIsSelected() {
 221         final MouseEventGenerator generator = new MouseEventGenerator();
 222         AnchorPane root = new AnchorPane();
 223         Menu menu = new Menu("Menu");
 224         MenuItem menuItem = new MenuItem("MenuItem");
 225         menu.getItems().add(menuItem);
 226 
 227         menuBar.getMenus().add(menu);
 228         menuBar.setLayoutX(100);
 229         menuBar.setLayoutY(100);
 230 
 231         root.getChildren().addAll(menuBar);
 232 
 233         startApp(root);
 234         tk.firePulse();
 235 
 236         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 237         assertTrue(skin != null);
 238         MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
 239         mb.getScene().getWindow().requestFocus();
 240 
 241         double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
 242         double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
 243 
 244         SceneHelper.processMouseEvent(scene,
 245             generator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
 246         SceneHelper.processMouseEvent(scene,
 247             generator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
 248         assertTrue(menu.isShowing());
 249          /* ------------------------------------------------------------------ */
 250 
 251         // Show Menu
 252         ContextMenuContent menuContent = MenuBarSkinShim.getMenuContent(mb); // ContextMenuContent
 253         Node displayNode = MenuBarMenuButtonShim.getDisplayNodeForMenuItem(menuContent, 0); // MenuItemContainer
 254 
 255         displayNode.getScene().getWindow().requestFocus();
 256         assertTrue(displayNode.getScene().getWindow().isFocused());
 257 
 258         displayNode.requestFocus(); // requestFocus on 1st Menu
 259         assertTrue(displayNode.isFocused());
 260 
 261         // fire KeyEvent (Enter) on menuitem
 262         KeyEventFirer keyboard = new KeyEventFirer(menuContent);
 263         keyboard.doKeyPress(KeyCode.ENTER);
 264         tk.firePulse();
 265 
 266         // confirm menu is closed.
 267         assertTrue(!menu.isShowing());
 268         keyboard.doKeyPress(KeyCode.LEFT);
 269         tk.firePulse();
 270 
 271         // check if focusedMenuIndex is reset to -1 so navigation happens.
 272         int focusedIndex = MenuBarSkinShim.getFocusedIndex(skin);
 273         assertEquals(focusedIndex, -1);
 274     }
 275 
 276     @Test public void testMenuOnShownEventFiringWithKeyNavigation() {
 277         final MouseEventGenerator generator = new MouseEventGenerator();
 278         VBox root = new VBox();
 279         Menu menu = new Menu("Menu");
 280 
 281         MenuItem menuItem1 = new MenuItem("MenuItem1");
 282         MenuItem menuItem2 = new MenuItem("MenuItem2");
 283         menu.getItems().addAll(menuItem1, menuItem2);
 284 
 285         menuBar.getMenus().add(menu);
 286         menuBar.setLayoutX(100);
 287         menuBar.setLayoutY(100);
 288 
 289         final CheckBox cb = new CheckBox("showing");
 290 
 291         root.getChildren().addAll(cb,menuBar);
 292         startApp(root);
 293         tk.firePulse();
 294 
 295         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 296         assertTrue(skin != null);
 297 
 298         MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
 299         mb.getScene().getWindow().requestFocus();
 300         assertTrue(mb.getScene().getWindow().isFocused());
 301 
 302 
 303         KeyEventFirer keyboard = new KeyEventFirer(mb.getScene());
 304         keyboard.doKeyPress(KeyCode.TAB);
 305         tk.firePulse();
 306         mb.requestFocus();
 307         assertTrue(mb.isFocused());
 308 
 309         keyboard = new KeyEventFirer(mb);
 310         keyboard.doDownArrowPress();
 311         tk.firePulse();
 312         assertEquals(menu.showingProperty().get(), true);
 313     }
 314 
 315     @Test public void testKeyNavigationWithDisabledMenuItem() {
 316         VBox root = new VBox();
 317         Menu menu1 = new Menu("Menu1");
 318         Menu menu2 = new Menu("Menu2");
 319         Menu menu3 = new Menu("Menu3");
 320 
 321         MenuItem menuItem1 = new MenuItem("MenuItem1");
 322         MenuItem menuItem2 = new MenuItem("MenuItem2");
 323         MenuItem menuItem3 = new MenuItem("MenuItem3");
 324 
 325         menu1.getItems().add(menuItem1);
 326         menu2.getItems().add(menuItem2);
 327         menu3.getItems().add(menuItem3);
 328 
 329         menuBar.getMenus().addAll(menu1, menu2, menu3);
 330         menu2.setDisable(true);
 331 
 332         root.getChildren().addAll(menuBar);
 333         startApp(root);
 334         tk.firePulse();
 335 
 336         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 337         assertTrue(skin != null);
 338 
 339         double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
 340         double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
 341 
 342         MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
 343         mb.getScene().getWindow().requestFocus();
 344         SceneHelper.processMouseEvent(scene,
 345             MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
 346         SceneHelper.processMouseEvent(scene,
 347             MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
 348         assertTrue(menu1.isShowing());
 349 
 350         KeyEventFirer keyboard = new KeyEventFirer(mb.getScene());
 351         keyboard.doKeyPress(KeyCode.RIGHT);
 352         tk.firePulse();
 353         assertTrue(menu3.isShowing());
 354     }
 355 
 356     @Test public void testKeyNavigationForward() {
 357         VBox root = new VBox();
 358         Menu menu1 = new Menu("Menu1");
 359         Menu menu2 = new Menu("Menu2");
 360         Menu menu3 = new Menu("Menu3");
 361 
 362         MenuItem menuItem1 = new MenuItem("MenuItem1");
 363         MenuItem menuItem2 = new MenuItem("MenuItem2");
 364         MenuItem menuItem3 = new MenuItem("MenuItem3");
 365 
 366         menu1.getItems().add(menuItem1);
 367         menu2.getItems().add(menuItem2);
 368         menu3.getItems().add(menuItem3);
 369 
 370         menuBar.getMenus().addAll(menu1, menu2, menu3);
 371         menu2.setDisable(true);
 372 
 373         root.getChildren().addAll(menuBar);
 374         startApp(root);
 375         tk.firePulse();
 376 
 377         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 378         assertTrue(skin != null);
 379 
 380         double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
 381         double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
 382 
 383         // Click on menu1 to open it
 384         MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
 385         mb.getScene().getWindow().requestFocus();
 386         SceneHelper.processMouseEvent(scene,
 387             MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
 388         SceneHelper.processMouseEvent(scene,
 389             MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
 390         assertTrue(menu1.isShowing());
 391 
 392         // Right key press should skip menu2 that is disabled
 393         // and should open up menu3
 394         KeyEventFirer keyboard = new KeyEventFirer(mb.getScene());
 395         keyboard.doKeyPress(KeyCode.RIGHT);
 396         tk.firePulse();
 397         assertTrue(menu3.isShowing());
 398 
 399         // Another Right key press should loop back and should open up menu1
 400         keyboard.doKeyPress(KeyCode.RIGHT);
 401         tk.firePulse();
 402         assertTrue(menu1.isShowing());
 403     }
 404 
 405     @Test public void testKeyNavigationBackward() {
 406         VBox root = new VBox();
 407         Menu menu1 = new Menu("Menu1");
 408         Menu menu2 = new Menu("Menu2");
 409         Menu menu3 = new Menu("Menu3");
 410 
 411         MenuItem menuItem1 = new MenuItem("MenuItem1");
 412         MenuItem menuItem2 = new MenuItem("MenuItem2");
 413         MenuItem menuItem3 = new MenuItem("MenuItem3");
 414 
 415         menu1.getItems().add(menuItem1);
 416         menu2.getItems().add(menuItem2);
 417         menu3.getItems().add(menuItem3);
 418 
 419         menuBar.getMenus().addAll(menu1, menu2, menu3);
 420         menu2.setDisable(true);
 421 
 422         root.getChildren().addAll(menuBar);
 423         startApp(root);
 424         tk.firePulse();
 425 
 426         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 427         assertTrue(skin != null);
 428 
 429         double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
 430         double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
 431 
 432         // Click on menu1 to open it
 433         MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
 434         mb.getScene().getWindow().requestFocus();
 435         SceneHelper.processMouseEvent(scene,
 436             MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
 437         SceneHelper.processMouseEvent(scene,
 438             MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
 439         assertTrue(menu1.isShowing());
 440 
 441         // Left key press should cycle back and should open up menu3
 442         KeyEventFirer keyboard = new KeyEventFirer(mb.getScene());
 443         keyboard.doKeyPress(KeyCode.LEFT);
 444         tk.firePulse();
 445         assertTrue(menu3.isShowing());
 446 
 447         // Another Left key press should skip menu2 that is disabled
 448         // and should open up menu1
 449         keyboard.doKeyPress(KeyCode.LEFT);
 450         tk.firePulse();
 451         assertTrue(menu1.isShowing());
 452     }
 453 
 454     @Test public void testKeyNavigationWithAllDisabledMenuItems() {
 455 
 456         // Test key navigation with a single disabled menu in menubar
 457         VBox root = new VBox();
 458         Menu menu1 = new Menu("Menu1");
 459         MenuItem menuItem1 = new MenuItem("MenuItem1");
 460 
 461         menu1.getItems().add(menuItem1);
 462         menuBar.getMenus().addAll(menu1);
 463         menu1.setDisable(true);
 464 
 465         root.getChildren().addAll(menuBar);
 466         startApp(root);
 467         tk.firePulse();
 468 
 469         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 470         assertTrue(skin != null);
 471 
 472         MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
 473         mb.getScene().getWindow().requestFocus();
 474         KeyEventFirer keyboard = new KeyEventFirer(mb.getScene());
 475 
 476         // Selection key press
 477         keyboard.doKeyPress(KeyCode.RIGHT, KeyModifier.ALT);
 478         tk.firePulse();
 479         assertFalse(menu1.isShowing());
 480 
 481 
 482         // Test key navigation with multiple disabled menus in menubar
 483         Menu menu2 = new Menu("Menu2");
 484         Menu menu3 = new Menu("Menu3");
 485 
 486         MenuItem menuItem2 = new MenuItem("MenuItem2");
 487         MenuItem menuItem3 = new MenuItem("MenuItem3");
 488 
 489         menu2.getItems().add(menuItem2);
 490         menu3.getItems().add(menuItem3);
 491 
 492         menuBar.getMenus().add(menu2);
 493         menuBar.getMenus().add(menu3);
 494 
 495         menu2.setDisable(true);
 496         menu3.setDisable(true);
 497 
 498         // Selection key press
 499         keyboard.doKeyPress(KeyCode.RIGHT, KeyModifier.ALT);
 500         tk.firePulse();
 501         assertFalse(menu1.isShowing());
 502         assertFalse(menu2.isShowing());
 503         assertFalse(menu3.isShowing());
 504     }
 505 
 506      @Test public void testMenuOnShowingEventFiringWithMenuHideOperation() {
 507         VBox root = new VBox();
 508         Menu menu = new Menu("Menu");
 509 
 510         MenuItem menuItem1 = new MenuItem("MenuItem1");
 511         menu.getItems().addAll(menuItem1);
 512 
 513         menuBar.getMenus().add(menu);
 514         menuBar.setLayoutX(100);
 515         menuBar.setLayoutY(100);
 516 
 517         root.getChildren().addAll(menuBar);
 518         startApp(root);
 519         tk.firePulse();
 520 
 521         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 522         assertTrue(skin != null);
 523         double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
 524         double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
 525 
 526         boolean click = true;
 527         final Boolean firstClick = new Boolean(click);
 528 
 529         menu.setOnShowing(t -> {
 530             // we should not get here when the menu is hidden
 531             assertEquals(firstClick.booleanValue(), true);
 532         });
 533 
 534         MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
 535         mb.getScene().getWindow().requestFocus();
 536         mb.requestFocus();
 537         assertTrue(mb.isFocused());
 538         // click on menu to show
 539         SceneHelper.processMouseEvent(scene,
 540             MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
 541         SceneHelper.processMouseEvent(scene,
 542             MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
 543         tk.firePulse();
 544         assertEquals(menu.showingProperty().get(), true);
 545         click = false;
 546         // click on menu to hide
 547         SceneHelper.processMouseEvent(scene,
 548             MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
 549         SceneHelper.processMouseEvent(scene,
 550             MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
 551         tk.firePulse();
 552         assertEquals(menu.showingProperty().get(), false);
 553     }
 554 
 555     @Test public void testMenuBarUpdateOnMenuVisibilityChange() {
 556         VBox root = new VBox();
 557         Menu menu1 = new Menu("Menu1");
 558         Menu menu2 = new Menu("Menu2");
 559 
 560         menuBar.getMenus().addAll(menu1, menu2);
 561 
 562         root.getChildren().addAll(menuBar);
 563         startApp(root);
 564         tk.firePulse();
 565 
 566         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 567         assertTrue(skin != null);
 568 
 569         // Test menuBar height to be non-zero as both menus are
 570         // visible by default
 571         int x = Double.compare(menuBar.getHeight(), 0.0);
 572         assertTrue(x > 0);
 573 
 574         // Test menubar height to be zero in case all of its
 575         // children are invisible
 576         menu1.setVisible(false);
 577         menu2.setVisible(false);
 578         tk.firePulse();
 579 
 580         assertEquals(menuBar.getHeight(), 0.0, 0.0001);
 581 
 582         // Test menuBar height to be non-zero if another menu is added
 583         Menu menu3 = new Menu("Menu3");
 584         menuBar.getMenus().add(menu3);
 585         tk.firePulse();
 586 
 587         x = Double.compare(menuBar.getHeight(), 0.0);
 588         assertTrue(x > 0);
 589 
 590         // Test menuBar height to be zero in case all of its
 591         // children are invisible
 592         menu3.setVisible(false);
 593         tk.firePulse();
 594 
 595         assertEquals(menuBar.getHeight(), 0.0, 0.0001);
 596     }
 597 
 598     @Test public void testRemovingMenuItemFromMenuNotInScene() {
 599         VBox root = new VBox();
 600         Menu menu = new Menu("Menu");
 601 
 602         MenuItem menuItem1 = new MenuItem("MenuItem1");
 603         menu.getItems().addAll(menuItem1);
 604 
 605         menuBar.getMenus().add(menu);
 606         root.getChildren().addAll(menuBar);
 607         startApp(root);
 608         tk.firePulse();
 609 
 610         // remove menu from menubar
 611         menuBar.getMenus().remove(menu);
 612         //remove menuitem from menu that was just removed itself.
 613         menu.getItems().remove(menuItem1);
 614         assertEquals(true, menu.getItems().isEmpty());
 615     }
 616 
 617     @Test public void test_rt_37118() {
 618         MenuBar menuBar = new MenuBar();
 619         MenuBarSkin menuBarSkin = new MenuBarSkin(menuBar);
 620     }
 621 
 622     @Test public void testMenubarAltKeysupport() {
 623         // First Menu gets selected when ALT key is pressed and released.
 624         VBox root = new VBox();
 625         Menu menu1 = new Menu("Menu1");
 626         Menu menu2 = new Menu("Menu2");
 627         Menu menu3 = new Menu("Menu3");
 628 
 629         MenuItem menuItem1 = new MenuItem("MenuItem1");
 630         MenuItem menuItem2 = new MenuItem("MenuItem2");
 631         MenuItem menuItem3 = new MenuItem("MenuItem3");
 632 
 633         menu1.getItems().add(menuItem1);
 634         menu2.getItems().add(menuItem2);
 635         menu3.getItems().add(menuItem3);
 636 
 637         menuBar.getMenus().addAll(menu1, menu2, menu3);
 638         root.getChildren().addAll(menuBar);
 639         startApp(root);
 640         tk.firePulse();
 641 
 642         MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
 643         assertTrue(skin != null);
 644 
 645         MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
 646         mb.getScene().getWindow().requestFocus();
 647         KeyEventFirer keyboard = new KeyEventFirer(mb.getScene());
 648 
 649         // Left ALT key 
 650         keyboard.doKeyPress(KeyCode.ALT);
 651         tk.firePulse();
 652         keyboard.doDownArrowPress();
 653         tk.firePulse();
 654         assertTrue(menu1.isShowing());
 655 
 656         keyboard.doKeyPress(KeyCode.ESCAPE);
 657         tk.firePulse();
 658 
 659         // Right ALT key
 660         keyboard.doKeyPress(KeyCode.ALT_GRAPH);
 661         tk.firePulse();
 662         keyboard.doDownArrowPress();
 663         tk.firePulse();
 664         assertTrue(menu1.isShowing()); 
 665 
 666     }
 667 }