source: josm/trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.java@ 15141

Last change on this file since 15141 was 15141, checked in by GerdP, 5 years ago

see #17767 and #17768: add non regression unit tests
Test testTicket17768() fails with current code and is ignored for now.

  • Property svn:eol-style set to native
File size: 6.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.junit.Assert.assertEquals;
5import static org.junit.Assert.assertFalse;
6import static org.junit.Assert.assertTrue;
7
8import java.nio.file.Files;
9import java.nio.file.Paths;
10import java.util.Collection;
11import java.util.Map;
12import java.util.TreeMap;
13
14import org.junit.Ignore;
15import org.junit.Rule;
16import org.junit.Test;
17import org.openstreetmap.josm.TestUtils;
18import org.openstreetmap.josm.command.SequenceCommand;
19import org.openstreetmap.josm.data.osm.DataSet;
20import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
21import org.openstreetmap.josm.data.osm.Relation;
22import org.openstreetmap.josm.data.osm.RelationMember;
23import org.openstreetmap.josm.data.osm.Way;
24import org.openstreetmap.josm.data.osm.search.SearchCompiler;
25import org.openstreetmap.josm.data.osm.search.SearchParseError;
26import org.openstreetmap.josm.data.osm.search.SearchSetting;
27import org.openstreetmap.josm.gui.MainApplication;
28import org.openstreetmap.josm.gui.layer.Layer;
29import org.openstreetmap.josm.gui.layer.OsmDataLayer;
30import org.openstreetmap.josm.io.OsmReader;
31import org.openstreetmap.josm.testutils.JOSMTestRules;
32import org.openstreetmap.josm.tools.Pair;
33import org.openstreetmap.josm.tools.SubclassFilteredCollection;
34
35import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
36
37/**
38 * Unit test of {@link CreateMultipolygonAction}
39 */
40public class CreateMultipolygonActionTest {
41
42 /**
43 * Setup test.
44 */
45 @Rule
46 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
47 public JOSMTestRules test = new JOSMTestRules().projection().main().preferences();
48
49 private static Map<String, String> getRefToRoleMap(Relation relation) {
50 Map<String, String> refToRole = new TreeMap<>();
51 String ref = relation.get("ref");
52 if (ref != null) {
53 refToRole.put(ref, "outer");
54 }
55 for (RelationMember i : relation.getMembers()) {
56 ref = i.getMember().get("ref");
57 if (ref != null) {
58 refToRole.put(ref, i.getRole());
59 }
60 }
61 return refToRole;
62 }
63
64 private static SearchSetting regexpSearch(String search) {
65 SearchSetting setting = new SearchSetting();
66 setting.text = search;
67 setting.regexSearch = true;
68 return setting;
69 }
70
71 @SuppressWarnings("unchecked")
72 private static Relation createMultipolygon(Collection<Way> ways, String pattern, Relation r, boolean runCmd)
73 throws SearchParseError {
74 Pair<SequenceCommand, Relation> cmd = CreateMultipolygonAction.createMultipolygonCommand(
75 (Collection<Way>) (Collection<?>) SubclassFilteredCollection.filter(ways, SearchCompiler.compile(regexpSearch(pattern))), r);
76 if (runCmd) {
77 cmd.a.executeCommand();
78 }
79 return cmd.b;
80 }
81
82 @Test
83 public void testCreate1() throws Exception {
84 DataSet ds = OsmReader.parseDataSet(Files.newInputStream(Paths.get(TestUtils.getTestDataRoot(), "create_multipolygon.osm")), null);
85 Pair<SequenceCommand, Relation> mp = CreateMultipolygonAction.createMultipolygonCommand(ds.getWays(), null);
86 assertEquals("Sequence: Create multipolygon", mp.a.getDescriptionText());
87 assertEquals("{1=outer, 1.1=inner, 1.1.1=outer, 1.1.2=outer, 1.2=inner}", getRefToRoleMap(mp.b).toString());
88 }
89
90 @Test
91 public void testCreate2() throws Exception {
92 DataSet ds = OsmReader.parseDataSet(Files.newInputStream(Paths.get(TestUtils.getTestDataRoot(), "create_multipolygon.osm")), null);
93 Relation mp = createMultipolygon(ds.getWays(), "ref=1 OR ref:1.1.", null, true);
94 assertEquals("{1=outer, 1.1.1=inner, 1.1.2=inner}", getRefToRoleMap(mp).toString());
95 }
96
97 @Test
98 public void testUpdate1() throws Exception {
99 DataSet ds = OsmReader.parseDataSet(Files.newInputStream(Paths.get(TestUtils.getTestDataRoot(), "create_multipolygon.osm")), null);
100 Relation mp = createMultipolygon(ds.getWays(), "ref=\".*1$\"", null, true);
101 assertEquals(3, mp.getMembersCount());
102 assertEquals("{1=outer, 1.1=inner, 1.1.1=outer}", getRefToRoleMap(mp).toString());
103 Relation mp2 = createMultipolygon(ds.getWays(), "ref=1.2", mp, true);
104 assertEquals(4, mp2.getMembersCount());
105 assertEquals("{1=outer, 1.1=inner, 1.1.1=outer, 1.2=inner}", getRefToRoleMap(mp2).toString());
106 }
107
108 @Test
109 public void testUpdate2() throws Exception {
110 DataSet ds = OsmReader.parseDataSet(Files.newInputStream(Paths.get(TestUtils.getTestDataRoot(), "create_multipolygon.osm")), null);
111 Relation mp = createMultipolygon(ds.getWays(), "ref=1 OR ref:1.1.1", null, true);
112 assertEquals("{1=outer, 1.1.1=inner}", getRefToRoleMap(mp).toString());
113 Relation mp2 = createMultipolygon(ds.getWays(), "ref=1.1 OR ref=1.2 OR ref=1.1.2", mp, false);
114 assertEquals("{1=outer, 1.1=inner, 1.1.1=outer, 1.1.2=outer, 1.2=inner}", getRefToRoleMap(mp2).toString());
115 }
116
117 /**
118 * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/17767">Bug #17767</a>.
119 * @throws Exception if an error occurs
120 */
121 @Test
122 public void testTicket17767() throws Exception {
123 DataSet ds = OsmReader.parseDataSet(TestUtils.getRegressionDataStream(17767, "upd-mp.osm"), null);
124 Layer layer = new OsmDataLayer(ds, null, null);
125 MainApplication.getLayerManager().addLayer(layer);
126 try {
127 CreateMultipolygonAction updateAction = new CreateMultipolygonAction(true);
128 CreateMultipolygonAction createAction = new CreateMultipolygonAction(false);
129 assertFalse(updateAction.isEnabled());
130 assertFalse(createAction.isEnabled());
131 ds.setSelected(ds.getPrimitiveById(189944949L, OsmPrimitiveType.WAY));
132 assertFalse(updateAction.isEnabled());
133 assertTrue(createAction.isEnabled());
134 } finally {
135 MainApplication.getLayerManager().removeLayer(layer);
136 }
137 }
138
139 /**
140 * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/17768">Bug #17768</a>.
141 * @throws Exception if an error occurs
142 */
143 @Test
144 @Ignore
145 public void testTicket17768() throws Exception {
146 DataSet ds = OsmReader.parseDataSet(TestUtils.getRegressionDataStream(17768, "dupmem.osm"), null);
147 Layer layer = new OsmDataLayer(ds, null, null);
148 MainApplication.getLayerManager().addLayer(layer);
149 try {
150 Relation old = (Relation) ds.getPrimitiveById(580092, OsmPrimitiveType.RELATION);
151 assertEquals(3, old.getMembersCount());
152 Relation mp = createMultipolygon(ds.getWays(), "type:way", old, true);
153 assertEquals(mp.getPrimitiveId(), old.getPrimitiveId());
154 assertEquals(2, mp.getMembersCount());
155 } finally {
156 MainApplication.getLayerManager().removeLayer(layer);
157 }
158
159 }
160}
Note: See TracBrowser for help on using the repository browser.