Ticket #13033: patch-test-JoinAreasActionTest.patch

File patch-test-JoinAreasActionTest.patch, 11.0 KB (added by michael2402, 9 years ago)
  • src/org/openstreetmap/josm/actions/JoinAreasAction.java

    diff --git a/src/org/openstreetmap/josm/actions/JoinAreasAction.java b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
    index f1b45b8..f9697b9 100644
    a b public class JoinAreasAction extends JosmAction {  
    499499                }
    500500                if (ds != null) {
    501501                    ds.setSelected(allWays);
    502                     Main.map.mapView.repaint();
    503502                }
    504503            } else {
    505504                new Notification(
  • src/org/openstreetmap/josm/actions/search/SearchAction.java

    diff --git a/src/org/openstreetmap/josm/actions/search/SearchAction.java b/src/org/openstreetmap/josm/actions/search/SearchAction.java
    index 6d4eed1..59a9d47 100644
    a b public class SearchAction extends JosmAction implements ParameterizedAction {  
    529529    }
    530530
    531531    static void search(SearchSetting s) {
    532         SearchTask.newSearchTask(s).run();
     532        SearchTask.newSearchTask(s, new SelectSearchReceiver()).run();
     533    }
     534
     535    /**
     536     * Performs the search specified by the search string {@code search} and the search mode {@code mode} and returns the result of the search.
     537     *
     538     * @param search the search string to use
     539     * @param mode the search mode to use
     540     * @return The result of the search.
     541     */
     542    public static Collection<OsmPrimitive> searchAndReturn(String search, SearchMode mode) {
     543        final SearchSetting searchSetting = new SearchSetting();
     544        searchSetting.text = search;
     545        searchSetting.mode = mode;
     546        CapturingSearchReceiver receiver = new CapturingSearchReceiver();
     547        SearchTask.newSearchTask(searchSetting, receiver).run();
     548        return receiver.result;
     549    }
     550
     551    /**
     552     * Interfaces implementing this may receive the result of the current search.
     553     * @author Michael Zangl
     554     * @since xxx
     555     */
     556    interface SearchReceiver {
     557        /**
     558         * Receive the search result
     559         * @param ds The data set searched on.
     560         * @param result The result collection, including the initial collection.
     561         * @param foundMatches The number of matches added to the result.
     562         * @param setting The setting used.
     563         */
     564        public void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches, SearchSetting setting);
     565    }
     566
     567    /**
     568     * Select the search result and display a status text for it.
     569     * @since xxx
     570     */
     571    private static class SelectSearchReceiver implements SearchReceiver {
     572
     573        @Override
     574        public void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches, SearchSetting setting) {
     575            ds.setSelected(result);
     576            if (foundMatches == 0) {
     577                final String msg;
     578                final String text = Utils.shortenString(setting.text, MAX_LENGTH_SEARCH_EXPRESSION_DISPLAY);
     579                if (setting.mode == SearchMode.replace) {
     580                    msg = tr("No match found for ''{0}''", text);
     581                } else if (setting.mode == SearchMode.add) {
     582                    msg = tr("Nothing added to selection by searching for ''{0}''", text);
     583                } else if (setting.mode == SearchMode.remove) {
     584                    msg = tr("Nothing removed from selection by searching for ''{0}''", text);
     585                } else if (setting.mode == SearchMode.in_selection) {
     586                    msg = tr("Nothing found in selection by searching for ''{0}''", text);
     587                } else {
     588                    msg = null;
     589                }
     590                Main.map.statusLine.setHelpText(msg);
     591                JOptionPane.showMessageDialog(
     592                        Main.parent,
     593                        msg,
     594                        tr("Warning"),
     595                        JOptionPane.WARNING_MESSAGE
     596                );
     597            } else {
     598                Main.map.statusLine.setHelpText(tr("Found {0} matches", foundMatches));
     599            }
     600        }
     601    }
     602
     603    /**
     604     * This class stores the result of the search in a local variable.
     605     * @author Michael Zangl
     606     * @since xxx
     607     */
     608    private static final class CapturingSearchReceiver implements SearchReceiver {
     609        private Collection<OsmPrimitive> result;
     610
     611        @Override
     612        public void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches,
     613                SearchSetting setting) {
     614                    this.result = result;
     615        }
    533616    }
    534617
    535618    static final class SearchTask extends PleaseWaitRunnable {
    public class SearchAction extends JosmAction implements ParameterizedAction {  
    539622        private final Predicate<OsmPrimitive> predicate;
    540623        private boolean canceled;
    541624        private int foundMatches;
     625        private SearchReceiver resultReceiver;
    542626
    543         private SearchTask(DataSet ds, SearchSetting setting, Collection<OsmPrimitive> selection, Predicate<OsmPrimitive> predicate) {
     627        private SearchTask(DataSet ds, SearchSetting setting, Collection<OsmPrimitive> selection, Predicate<OsmPrimitive> predicate,
     628                SearchReceiver resultReceiver) {
    544629            super(tr("Searching"));
    545630            this.ds = ds;
    546631            this.setting = setting;
    547632            this.selection = selection;
    548633            this.predicate = predicate;
     634            this.resultReceiver = resultReceiver;
    549635        }
    550636
    551         static SearchTask newSearchTask(SearchSetting setting) {
     637        static SearchTask newSearchTask(SearchSetting setting, SearchReceiver resultReceiver) {
    552638            final DataSet ds = Main.getLayerManager().getEditDataSet();
     639            return newSearchTask(setting, ds, resultReceiver);
     640        }
     641
     642        /**
     643         * Create a new search task for the given search setting.
     644         * @param setting The setting to use
     645         * @param ds The data set to search on
     646         * @return A new search task.
     647         */
     648        private static SearchTask newSearchTask(SearchSetting setting, final DataSet ds, SearchReceiver resultReceiver) {
    553649            final Collection<OsmPrimitive> selection = new HashSet<>(ds.getAllSelected());
    554650            return new SearchTask(ds, setting, selection, new Predicate<OsmPrimitive>() {
    555651                @Override
    556652                public boolean evaluate(OsmPrimitive o) {
    557653                    return ds.isSelected(o);
    558654                }
    559             });
     655            }, resultReceiver);
    560656        }
    561657
    562658        @Override
    public class SearchAction extends JosmAction implements ParameterizedAction {  
    613709                        e.getMessage(),
    614710                        tr("Error"),
    615711                        JOptionPane.ERROR_MESSAGE
    616 
    617712                );
    618713            }
    619714        }
    public class SearchAction extends JosmAction implements ParameterizedAction {  
    623718            if (canceled) {
    624719                return;
    625720            }
    626             ds.setSelected(selection);
    627             if (foundMatches == 0) {
    628                 final String msg;
    629                 final String text = Utils.shortenString(setting.text, MAX_LENGTH_SEARCH_EXPRESSION_DISPLAY);
    630                 if (setting.mode == SearchMode.replace) {
    631                     msg = tr("No match found for ''{0}''", text);
    632                 } else if (setting.mode == SearchMode.add) {
    633                     msg = tr("Nothing added to selection by searching for ''{0}''", text);
    634                 } else if (setting.mode == SearchMode.remove) {
    635                     msg = tr("Nothing removed from selection by searching for ''{0}''", text);
    636                 } else if (setting.mode == SearchMode.in_selection) {
    637                     msg = tr("Nothing found in selection by searching for ''{0}''", text);
    638                 } else {
    639                     msg = null;
    640                 }
    641                 Main.map.statusLine.setHelpText(msg);
    642                 JOptionPane.showMessageDialog(
    643                         Main.parent,
    644                         msg,
    645                         tr("Warning"),
    646                         JOptionPane.WARNING_MESSAGE
    647                 );
    648             } else {
    649                 Main.map.statusLine.setHelpText(tr("Found {0} matches", foundMatches));
    650             }
     721            resultReceiver.receiveSearchResult(ds, selection, foundMatches, setting);
    651722        }
    652723    }
    653724
  • test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java

    diff --git a/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java b/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
    index 32ffc60..231f693 100644
    a b import static org.junit.Assert.assertEquals;  
    55
    66import java.io.IOException;
    77import java.io.InputStream;
     8import java.util.Collection;
    89
    910import org.junit.BeforeClass;
    1011import org.junit.Test;
    import org.openstreetmap.josm.Main;  
    1314import org.openstreetmap.josm.TestUtils;
    1415import org.openstreetmap.josm.actions.search.SearchAction;
    1516import org.openstreetmap.josm.data.osm.DataSet;
     17import org.openstreetmap.josm.data.osm.OsmPrimitive;
     18import org.openstreetmap.josm.data.osm.Way;
    1619import org.openstreetmap.josm.gui.layer.Layer;
    1720import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    1821import org.openstreetmap.josm.io.IllegalDataException;
    1922import org.openstreetmap.josm.io.OsmReader;
     23import org.openstreetmap.josm.tools.Utils;
    2024
    2125/**
    2226 * Unit tests of {@link JoinAreasAction} class.
    public class JoinAreasActionTest {  
    6468            assertEquals(10, ds.getWays().size());
    6569            Layer layer = new OsmDataLayer(ds, null, null);
    6670            Main.getLayerManager().addLayer(layer);
    67             try {
    68                 for (String ref : new String[]{"A", "B", "C", "D", "E"}) {
    69                     System.out.print("Joining ways " + ref);
    70                     SearchAction.search("type:way ref="+ref, SearchAction.SearchMode.replace);
    71                     assertEquals(2, ds.getSelectedWays().size());
    72                     Main.main.menu.joinAreas.join(ds.getSelectedWays());
    73                     assertEquals(1, ds.getSelectedWays().size());
    74                     System.out.println(" ==> OK");
    75                 }
    76             } finally {
    77                 // Ensure we clean the place before leaving, even if test fails.
    78                 Main.getLayerManager().removeLayer(layer);
     71            for (String ref : new String[]{"A", "B", "C", "D", "E"}) {
     72                System.out.print("Joining ways " + ref);
     73                Collection<OsmPrimitive> found = SearchAction.searchAndReturn("type:way ref="+ref, SearchAction.SearchMode.replace);
     74                assertEquals(2, found.size());
     75
     76                Main.main.menu.joinAreas.join(Utils.filteredCollection(found, Way.class));
     77
     78                Collection<OsmPrimitive> found2 = SearchAction.searchAndReturn("type:way ref="+ref, SearchAction.SearchMode.replace);
     79                assertEquals(1, found2.size());
     80                System.out.println(" ==> OK");
    7981            }
    8082        }
    8183    }