Ticket #16906: v1-0002-RelationEditorActionsTest-fix-for-non-headless-mo.patch

File v1-0002-RelationEditorActionsTest-fix-for-non-headless-mo.patch, 9.0 KB (added by ris, 5 months ago)
  • src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java

    From 0646ed443239ec4213af0fa7141d68a1ce97542c Mon Sep 17 00:00:00 2001
    From: Robert Scott <code@humanleg.org.uk>
    Date: Sun, 28 Oct 2018 13:35:42 +0000
    Subject: [PATCH v1 2/2] RelationEditorActionsTest: fix for non-headless mode
    
    Splitting DeleteCurrentRelationAction and SetRoleAction out into their own tests
    ---
     .../josm/gui/ConditionalOptionPaneUtil.java        | 16 +---
     .../actions/RelationEditorActionsTest.java         | 97 +++++++++++++++++++++-
     2 files changed, 96 insertions(+), 17 deletions(-)
    
    diff --git a/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java b/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java
    index 0f4d3ac0a..3a304e341 100644
    a b public final class ConditionalOptionPaneUtil { 
    115115     *
    116116     * @return the option selected by user.
    117117     *         {@link JOptionPane#CLOSED_OPTION} if the dialog was closed.
    118      *         {@link JOptionPane#YES_OPTION} if <code>GraphicsEnvironment.isHeadless</code> returns <code>true</code>
    119118     */
    120119    public static int showOptionDialog(String preferenceKey, Component parent, Object message, String title, int optionType,
    121120            int messageType, Object[] options, Object defaultOption) {
    public final class ConditionalOptionPaneUtil { 
    123122        if (isYesOrNo(ret))
    124123            return ret;
    125124        MessagePanel pnl = new MessagePanel(message, isInBulkOperation(preferenceKey));
    126         if (GraphicsEnvironment.isHeadless()) {
    127             // for unit tests
    128             ret = JOptionPane.YES_OPTION;
    129         } else {
    130             ret = JOptionPane.showOptionDialog(parent, pnl, title, optionType, messageType, null, options, defaultOption);
    131         }
     125        ret = JOptionPane.showOptionDialog(parent, pnl, title, optionType, messageType, null, options, defaultOption);
    132126        if (isYesOrNo(ret)) {
    133127            pnl.getNotShowAgain().store(preferenceKey, ret);
    134128        }
    public final class ConditionalOptionPaneUtil { 
    161155     *
    162156     *
    163157     * @return true, if the selected option is equal to <code>trueOption</code>, otherwise false.
    164      *         {@code trueOption} if <code>GraphicsEnvironment.isHeadless</code> returns <code>true</code>
    165158     *
    166159     * @see JOptionPane#INFORMATION_MESSAGE
    167160     * @see JOptionPane#WARNING_MESSAGE
    public final class ConditionalOptionPaneUtil { 
    173166        if (isYesOrNo(ret))
    174167            return ret == trueOption;
    175168        MessagePanel pnl = new MessagePanel(message, isInBulkOperation(preferenceKey));
    176         if (GraphicsEnvironment.isHeadless()) {
    177             // for unit tests
    178             ret = trueOption;
    179         } else {
    180             ret = JOptionPane.showConfirmDialog(parent, pnl, title, optionType, messageType);
    181         }
     169        ret = JOptionPane.showConfirmDialog(parent, pnl, title, optionType, messageType);
    182170        if (isYesOrNo(ret)) {
    183171            pnl.getNotShowAgain().store(preferenceKey, ret);
    184172        }
  • test/unit/org/openstreetmap/josm/gui/dialogs/relation/actions/RelationEditorActionsTest.java

    diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/actions/RelationEditorActionsTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/actions/RelationEditorActionsTest.java
    index 87c18675e..a5e06b227 100644
    a b  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.gui.dialogs.relation.actions;
    33
     4import static org.junit.Assert.assertEquals;
     5import static org.junit.Assert.assertTrue;
     6
     7import java.awt.Component;
     8import java.awt.Container;
     9import javax.swing.Icon;
     10import javax.swing.JOptionPane;
     11import javax.swing.text.JTextComponent;
     12
     13import org.openstreetmap.josm.testutils.mockers.JOptionPaneSimpleMocker;
     14import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
     15
     16import com.google.common.collect.ImmutableMap;
     17
     18import mockit.Mock;
     19import mockit.MockUp;
     20
    421import org.junit.Test;
    522
    623/**
    import org.junit.Test; 
    926public class RelationEditorActionsTest extends AbstractRelationEditorActionTest {
    1027
    1128    /**
    12      * Check that all actions do not crash.
     29     * Check that all dialog-less actions do not crash.
    1330     */
    1431    @Test
    15     public void testAllActions() {
     32    public void testNoDialogActions() {
    1633        new AddSelectedAfterSelection(relationEditorAccess).actionPerformed(null);
    1734        new AddSelectedBeforeSelection(relationEditorAccess).actionPerformed(null);
    1835        new AddSelectedAtStartAction(relationEditorAccess).actionPerformed(null);
    public class RelationEditorActionsTest extends AbstractRelationEditorActionTest 
    2744        new PasteMembersAction(relationEditorAccess).actionPerformed(null);
    2845
    2946        new SelectAction(relationEditorAccess).actionPerformed(null);
    30         new DeleteCurrentRelationAction(relationEditorAccess).actionPerformed(null);
    3147
    3248        new DownloadIncompleteMembersAction(relationEditorAccess, "downloadincomplete").actionPerformed(null);
    3349        new DownloadSelectedIncompleteMembersAction(relationEditorAccess).actionPerformed(null);
    public class RelationEditorActionsTest extends AbstractRelationEditorActionTest 
    4763        new SortAction(relationEditorAccess).actionPerformed(null);
    4864        new SortBelowAction(relationEditorAccess).actionPerformed(null);
    4965        new ReverseAction(relationEditorAccess).actionPerformed(null);
     66    }
     67
     68    /**
     69     * Test DeleteCurrentRelationAction
     70     */
     71    @Test
     72    public void testDeleteCurrentRelationAction() {
     73        final JOptionPaneSimpleMocker jopsMocker = new JOptionPaneSimpleMocker(
     74            ImmutableMap.<String, Object>of(
     75                "<html>\n  <head>\n    \n  </head>\n  <body>\n    You are about to delete 1 "
     76                + "relation:\n\n    "
     77                + "<ul>\n      <li>\n        incomplete\n      </li>\n    </ul>\n    <br>\n    "
     78                + "This step is rarely necessary and cannot be undone easily after being \n    "
     79                + "uploaded to the server.<br>Do you really want to delete?\n  </body>\n</html>\n", JOptionPane.YES_OPTION,
     80                "<html>\n  <head>\n    \n  </head>\n  <body>\n    You are about to delete incomplete "
     81                + "objects.<br>This will cause problems \n    because you don\'t see the real object.<br>"
     82                + "Do you really want to delete?\n  </body>\n</html>\n",
     83                JOptionPane.YES_OPTION
     84            )
     85        ) {
     86            public String getStringFromOriginalMessage(Object originalMessage) {
     87                return ((JTextComponent) ((Container) originalMessage).getComponent(0)).getText();
     88            }
     89        };
     90
     91        new DeleteCurrentRelationAction(relationEditorAccess).actionPerformed(null);
     92
     93        assertEquals(2, jopsMocker.getInvocationLog().size());
     94
     95        Object[] invocationLogEntry = jopsMocker.getInvocationLog().get(0);
     96        assertEquals(JOptionPane.YES_OPTION, (int) invocationLogEntry[0]);
     97        assertEquals("Delete relation?", invocationLogEntry[2]);
     98
     99        invocationLogEntry = jopsMocker.getInvocationLog().get(1);
     100        assertEquals(JOptionPane.YES_OPTION, (int) invocationLogEntry[0]);
     101        assertEquals("Delete confirmation", invocationLogEntry[2]);
     102    }
     103
     104    /**
     105     * Test SetRoleAction
     106     */
     107    @Test
     108    public void testSetRoleAction() {
     109        final JOptionPaneSimpleMocker.MessagePanelMocker mpMocker = new JOptionPaneSimpleMocker.MessagePanelMocker();
     110        // JOptionPaneSimpleMocker doesn't handle showOptionDialog calls because of their potential
     111        // complexity, but this is quite a simple use of showOptionDialog which we can mock
     112        // from scratch.
     113        final boolean[] jopMockerCalled = new boolean[] { false };
     114        final MockUp<JOptionPane> jopMocker = new MockUp<JOptionPane> () {
     115            @Mock
     116            public int showOptionDialog(
     117                Component parentComponent,
     118                Object message,
     119                String title,
     120                int optionType,
     121                int messageType,
     122                Icon icon,
     123                Object[] options,
     124                Object initialValue
     125            ) {
     126                assertEquals(
     127                    "<html>You are setting an empty role on 0 objects.<br>This is equal to deleting the "
     128                    + "roles of these objects.<br>Do you really want to apply the new role?</html>",
     129                    mpMocker.getOriginalMessage((ConditionalOptionPaneUtil.MessagePanel) message).toString()
     130                );
     131                assertEquals(
     132                    "Confirm empty role",
     133                    title
     134                );
     135                jopMockerCalled[0] = true;
     136                return JOptionPane.YES_OPTION;
     137            }
     138        };
    50139
    51140        new SetRoleAction(relationEditorAccess).actionPerformed(null);
     141
     142        assertTrue(jopMockerCalled[0]);
    52143    }
    53144}