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 }