package jmri.jmrit.beantable; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import javax.swing.*; import jmri.Block; import jmri.InstanceManager; import jmri.SignalMastManager; import jmri.implementation.VirtualSignalMast; import jmri.jmrit.logix.*; import jmri.util.JUnitUtil; import jmri.util.JmriJFrame; import jmri.util.ThreadingUtil; import jmri.util.gui.GuiLafPreferencesManager; import jmri.util.junit.annotations.DisabledIfHeadless; import jmri.util.swing.JemmyUtil; import org.junit.jupiter.api.*; import org.netbeans.jemmy.QueueTool; import org.netbeans.jemmy.operators.*; /** * Swing tests for the OBlock etc tables. * Includes many of the jmri.jmrit.beantable.ablock classes via Jemmy UI tests. * * @author Pete Cressman Copyright 2016 * @author Egbert Broerse Copyright 2020 */ public class OBlockTableActionTest { protected OBlockTableAction a = null; @Test public void testCreate() { assertNotNull(a); assertNull(a.f); // frame should be null until action invoked } @Test public void testGetClassDescription() { assertEquals("Occupancy Block Table", a.getClassDescription(), "OBlock Table Action class description"); } /** * Check the return value of includeAddButton. The table generated by this * action includes an Add Button. */ @Test public void testIncludeAddButton() { assertFalse(a.includeAddButton(), "Default include add button"); } @Test @DisabledIfHeadless public void testInvoke() { // use original _desktop interface InstanceManager.getDefault(GuiLafPreferencesManager.class).setOblockEditTabbed(false); // ask for the window to open a.actionPerformed(new java.awt.event.ActionEvent(a, 1, "")); // Find new table window by name JmriJFrame doc = JmriJFrame.getFrame(jmri.jmrit.beantable.oblock.Bundle.getMessage("TitleOBlocks")); assertNotNull(doc, "Occupancy window"); new QueueTool().waitEmpty(); JDesktopPane dt = assertInstanceOf( JDesktopPane.class, doc.getContentPane()); JInternalFrame[] fob = dt.getAllFrames(); assertNotNull(fob, "OBlock window"); assertEquals(4, fob.length); new QueueTool().waitEmpty(); // Ask to close add window JUnitUtil.dispose(doc); } @Test @DisabledIfHeadless public void testInvokeTabbed() { // use _tabbed interface InstanceManager.getDefault(GuiLafPreferencesManager.class).setOblockEditTabbed(true); // ask for the window to open a.actionPerformed(new java.awt.event.ActionEvent(a, 1, "")); // Find new table window by name JmriJFrame doc = JmriJFrame.getFrame(Bundle.getMessage("TitleOBlocksTabbedFrame")); assertNotNull(doc, "Occupancy Blocks tabbed window"); new QueueTool().waitEmpty(); // Ask to close add window JUnitUtil.dispose(doc); } @Test @DisabledIfHeadless public void testAddOBlock() { // use _tabbed interface InstanceManager.getDefault(GuiLafPreferencesManager.class).setOblockEditTabbed(true); a.actionPerformed(new java.awt.event.ActionEvent(a, 2, "")); // show table JFrame f = JFrameOperator.waitJFrame(Bundle.getMessage("TitleOBlocksTabbedFrame"), true, true); assertNotNull(f); ThreadingUtil.runOnGUI( () -> a.addOBlockPressed(null)); JFrameOperator addFrame = new JFrameOperator(Bundle.getMessage("TitleAddOBlock")); // NOI18N assertNotNull(addFrame, "Found Add OBlock Frame"); // NOI18N new JTextFieldOperator(addFrame, 0).setText("105"); // NOI18N new JTextFieldOperator(addFrame, 2).setText("OBlock 105"); // NOI18N new JButtonOperator(addFrame, Bundle.getMessage("ButtonCreate")).push(); // NOI18N new JButtonOperator(addFrame, Bundle.getMessage("ButtonCancel")).push(); // NOI18N Block chk105 = jmri.InstanceManager.getDefault(jmri.jmrit.logix.OBlockManager.class).getOBlock("OBlock 105"); // NOI18N assertNotNull(chk105, "Verify OB105 Added"); // NOI18N assertEquals("OB105", chk105.getSystemName(), "Verify system name prefix"); // NOI18N (new JFrameOperator(f)).requestClose(); JUnitUtil.dispose(f); } @Test @DisabledIfHeadless public void testRenameOBlock() { // use _tabbed interface InstanceManager.getDefault(GuiLafPreferencesManager.class).setOblockEditTabbed(true); OBlockManager obm = InstanceManager.getDefault(OBlockManager.class); OBlock ob = obm.createNewOBlock("OB999", "OBlock Name"); // NOI18N Assertions.assertNotNull(ob); assertEquals("OBlock Name", ob.getUserName()); // NOI18N OPath path = new OPath(ob, "Path"); // Open the OBlock table a.actionPerformed(null); // show table JFrameOperator jfo = new JFrameOperator(Bundle.getMessage("TitleOBlocksTabbedFrame")); // NOI18N assertNotNull(jfo); JTabbedPaneOperator tbp = new JTabbedPaneOperator(jfo); tbp.selectPage("Occupancy Blocks"); assertNotNull(tbp); JTableOperator tbo = new JTableOperator(tbp); assertNotNull(tbo); // Click on the edit button, set the user name to empty for remove tbo.clickOnCell(0, 5); JFrameOperator jfoEdit = new JFrameOperator("Edit Occupancy Block OBlock Name"); // NOI18N JTextFieldOperator jtxt = new JTextFieldOperator(jfoEdit, 0); jtxt.clickMouse(); jtxt.setText(""); // Prepare the dialog thread and click on OK // Thread remove = JemmyUtil.createModalDialogOperatorThread("Update usage to system name", Bundle.getMessage("ButtonYes")); // NOI18N new JButtonOperator(jfoEdit, "OK").doClick(); // NOI18N JUnitUtil.waitFor(() -> !(remove.isAlive()), "remove finished"); // NOI18N tbo.clickOnCell(0, 0); // deselect the edit button // Click on the edit button, set the user name to a new value tbo.clickOnCell(0, 5); jfoEdit = new JFrameOperator("Edit Occupancy Block OB999"); // NOI18N jtxt = new JTextFieldOperator(jfoEdit, 0); jtxt.clickMouse(); jtxt.setText("New OBlock Name"); // NOI18N // Prepare the dialog thread and click on OK //Thread rename = JemmyUtil.createModalDialogOperatorThread("Update usage to system name", Bundle.getMessage("ButtonYes")); // NOI18N new JButtonOperator(jfoEdit, "OK").doClick(); // NOI18N //JUnitUtil.waitFor(() -> !(rename.isAlive()), "rename finished"); // NOI18N tbo.clickOnCell(0, 0); // deselect the edit button // Confirm the portal toBlock user name change assertEquals("New OBlock Name", path.getBlock().getUserName()); JUnitUtil.dispose(jfo.getWindow()); jfo.waitClosed(); } @Test @DisabledIfHeadless public void testAddPortal() { // use _tabbed interface InstanceManager.getDefault(GuiLafPreferencesManager.class).setOblockEditTabbed(true); a.actionPerformed(new java.awt.event.ActionEvent(a, 2, "")); // show table JFrame f = JFrameOperator.waitJFrame(Bundle.getMessage("TitleOBlocksTabbedFrame"), true, true); assertNotNull(f); a.addPortalPressed(null); JFrameOperator addFrame = new JFrameOperator(Bundle.getMessage("TitleAddPortal")); // NOI18N assertNotNull(addFrame, "Found Add Portal Frame"); // NOI18N new JButtonOperator(addFrame, Bundle.getMessage("ButtonOK")).push(); // NOI18N assertNotNull(addFrame, "Add Portal Frame still open after empty entry"); // NOI18N PortalManager pm = InstanceManager.getDefault(PortalManager.class); OBlockManager obm = InstanceManager.getDefault(OBlockManager.class); obm.createNewOBlock("OB1", "ob1"); // NOI18N obm.createNewOBlock("OB2", "ob2"); // NOI18N new JTextFieldOperator(addFrame, 0).setText("portal1"); // NOI18N new JComboBoxOperator(addFrame, 0).setSelectedIndex(1); // NOI18N new JComboBoxOperator(addFrame, 1).setSelectedIndex(2); // NOI18N new JButtonOperator(addFrame, Bundle.getMessage("ButtonOK")).push(); // NOI18N jmri.util.JUnitAppender.assertWarnMessage("Portal portal1 needs an OBlock on each side"); // TODO prevent this from showing up when oblocks are defined assertEquals(1, pm.getPortalCount(), "Verify Portal Added"); // TODO add Edit Portal test (new JFrameOperator(f)).requestClose(); JUnitUtil.dispose(f); } @Test @DisabledIfHeadless public void testAddSignal() { // use _tabbed interface InstanceManager.getDefault(GuiLafPreferencesManager.class).setOblockEditTabbed(true); a.actionPerformed(new java.awt.event.ActionEvent(a, 2, "")); // show table JFrame f = JFrameOperator.waitJFrame(Bundle.getMessage("TitleOBlocksTabbedFrame"), true, true); assertNotNull(f); OBlockManager obm = InstanceManager.getDefault(OBlockManager.class); OBlock ob1 = obm.createNewOBlock("OB1", "ob1"); // NOI18N OBlock ob2 = obm.createNewOBlock("OB2", "ob2"); // NOI18N PortalManager pm = InstanceManager.getDefault(PortalManager.class); Portal p = pm.getPortal("IP1"); if (p != null) { // make sure it is not already there p.dispose(); } Portal port1 = pm.createNewPortal("IP1"); // NOI18N port1.setFromBlock(ob1, false); port1.setToBlock(ob2, false); SignalMastManager l = InstanceManager.getDefault(SignalMastManager.class); VirtualSignalMast sm1 = (VirtualSignalMast) l.provideSignalMast("IF$vsm:basic:one-searchlight($1)"); a.addSignalPressed(null); jmri.util.JUnitAppender.assertWarnMessage("Portal IP1 needs an OBlock on each side"); JFrameOperator addFrame = new JFrameOperator(Bundle.getMessage("TitleAddSignal")); // NOI18N assertNotNull(addFrame, "Found Add Signal Frame"); // NOI18N new JButtonOperator(addFrame, Bundle.getMessage("ButtonOK")).push(); // NOI18N assertNotNull(addFrame, "Add Signal Frame still open after empty entry"); // NOI18N new JComboBoxOperator(addFrame, 0).setSelectedItem(sm1); // NOI18N select sm1 new JComboBoxOperator(addFrame, 2).setSelectedIndex(1); // NOI18N select port1 new JButtonOperator(addFrame, "Flip OBlocks").push(); // NOI18N new JTextFieldOperator(addFrame, 0).setText("19.05"); // NOI18N new JButtonOperator(addFrame, Bundle.getMessage("ButtonOK")).push(); // NOI18N assertNotNull(port1.getToSignal(), "Verify Signal Added"); // NOI18N assertEquals("IF$vsm:basic:one-searchlight($1)", port1.getToSignal().getSystemName(), "Check signal name"); // NOI18N // TODO add Edit Signal test (new JFrameOperator(f)).requestClose(); JUnitUtil.dispose(f); } @BeforeEach public void setUp() { JUnitUtil.setUp(); JUnitUtil.resetInstanceManager(); JUnitUtil.resetProfileManager(); JUnitUtil.initDefaultUserMessagePreferences(); InstanceManager.setDefault(jmri.jmrit.logix.OBlockManager.class, new jmri.jmrit.logix.OBlockManager()); a = new OBlockTableAction(); } @AfterEach public void tearDown() { a = null; JUnitUtil.deregisterBlockManagerShutdownTask(); // perhaps invoked via super, must be cleaned up JUnitUtil.tearDown(); } }