source: josm/trunk/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java@ 12641

Last change on this file since 12641 was 12641, checked in by Don-vip, 7 years ago

see #15182 - deprecate Main.main.undoRedo. Replacement: gui.MainApplication.undoRedo

  • Property svn:eol-style set to native
File size: 8.7 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.assertNull;
6import static org.junit.Assert.assertSame;
7import static org.junit.Assert.assertTrue;
8
9import java.util.ArrayList;
10import java.util.Arrays;
11import java.util.Iterator;
12
13import org.junit.Before;
14import org.junit.Rule;
15import org.junit.Test;
16import org.openstreetmap.josm.Main;
17import org.openstreetmap.josm.actions.SplitWayAction.Strategy;
18import org.openstreetmap.josm.data.coor.EastNorth;
19import org.openstreetmap.josm.data.coor.LatLon;
20import org.openstreetmap.josm.data.osm.DataSet;
21import org.openstreetmap.josm.data.osm.Node;
22import org.openstreetmap.josm.data.osm.OsmPrimitive;
23import org.openstreetmap.josm.data.osm.Relation;
24import org.openstreetmap.josm.data.osm.RelationMember;
25import org.openstreetmap.josm.data.osm.Way;
26import org.openstreetmap.josm.gui.MainApplication;
27import org.openstreetmap.josm.gui.layer.OsmDataLayer;
28import org.openstreetmap.josm.testutils.JOSMTestRules;
29
30import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
31
32/**
33 * Unit tests for class {@link SplitWayAction}.
34 */
35public final class SplitWayActionTest {
36
37 /** Class under test. */
38 private static SplitWayAction action;
39
40 /**
41 * Setup test.
42 */
43 @Rule
44 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
45 public JOSMTestRules test = new JOSMTestRules().main().projection();
46
47 /**
48 * Setup test.
49 */
50 @Before
51 public void setUp() {
52 if (action == null) {
53 action = Main.main.menu.splitWay;
54 action.setEnabled(true);
55 }
56 }
57
58 /**
59 * Test case: When node is share by multiple ways, split selected way.
60 * see #11184
61 */
62 @Test
63 public void testTicket11184() {
64 DataSet dataSet = new DataSet();
65 OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
66
67 Node n1 = new Node(new EastNorth(0, 0));
68 Node n2 = new Node(new EastNorth(-1, 1));
69 Node n3 = new Node(new EastNorth(1, 1));
70 Node n4 = new Node(new EastNorth(-1, -1));
71 Node n5 = new Node(new EastNorth(1, -1));
72 Node n6 = new Node(new EastNorth(-1, 0));
73 Node n7 = new Node(new EastNorth(1, 0));
74 dataSet.addPrimitive(n1);
75 dataSet.addPrimitive(n2);
76 dataSet.addPrimitive(n3);
77 dataSet.addPrimitive(n4);
78 dataSet.addPrimitive(n5);
79 dataSet.addPrimitive(n6);
80 dataSet.addPrimitive(n7);
81
82 Way w1 = new Way();
83 Node[] w1NodesArray = new Node[] {n6, n1, n7};
84 w1.setNodes(Arrays.asList(w1NodesArray));
85 Way w2 = new Way();
86 w2.setNodes(Arrays.asList(new Node[] {n1, n2, n3, n1, n4, n5, n1}));
87 dataSet.addPrimitive(w1);
88 dataSet.addPrimitive(w2);
89
90 dataSet.addSelected(n1);
91 dataSet.addSelected(w2);
92
93 try {
94 MainApplication.getLayerManager().addLayer(layer);
95 action.actionPerformed(null);
96 } finally {
97 // Ensure we clean the place before leaving, even if test fails.
98 MainApplication.getLayerManager().removeLayer(layer);
99 }
100
101 // Ensures 3 ways.
102 assertSame(String.format("Found %d ways after split action instead of 3.", dataSet.getWays().size()),
103 dataSet.getWays().size(), 3);
104
105 // Ensures way w1 is unchanged.
106 assertTrue("Unselected ways disappear during split action.",
107 dataSet.getWays().contains(w1));
108 assertSame("Unselected way seems to have change during split action.",
109 w1.getNodesCount(), 3);
110 for (int i = 0; i < 3; i++) {
111 assertSame("Node change in unselected way during split action.",
112 w1.getNode(i), w1NodesArray[i]);
113 }
114 }
115
116 /**
117 * Unit test of {@link SplitWayAction#findVia}.
118 */
119 @Test
120 public void testFindVia() {
121 // empty relation
122 assertNull(SplitWayAction.findVia(new Relation(), null));
123 // restriction relation without via member
124 Relation r = new Relation();
125 r.addMember(new RelationMember("", new Node()));
126 assertNull(SplitWayAction.findVia(r, "restriction"));
127 // restriction relation with via member
128 r = new Relation();
129 OsmPrimitive via = new Node();
130 r.addMember(new RelationMember("via", via));
131 assertEquals(via, SplitWayAction.findVia(r, "restriction"));
132 // destination_sign relation without sign nor intersection
133 r = new Relation();
134 r.addMember(new RelationMember("", new Node()));
135 assertNull(SplitWayAction.findVia(r, "destination_sign"));
136 // destination_sign with sign
137 r = new Relation();
138 via = new Node();
139 r.addMember(new RelationMember("sign", via));
140 assertEquals(via, SplitWayAction.findVia(r, "destination_sign"));
141 // destination_sign with intersection
142 r = new Relation();
143 via = new Node();
144 r.addMember(new RelationMember("intersection", via));
145 assertEquals(via, SplitWayAction.findVia(r, "destination_sign"));
146 }
147
148 /**
149 * Unit tests of route relations.
150 */
151 @Test
152 public void testRouteRelation() {
153 doTestRouteRelation(false, 0);
154 doTestRouteRelation(false, 1);
155 doTestRouteRelation(false, 2);
156 doTestRouteRelation(false, 3);
157 doTestRouteRelation(true, 0);
158 doTestRouteRelation(true, 1);
159 doTestRouteRelation(true, 2);
160 doTestRouteRelation(true, 3);
161 }
162
163 void doTestRouteRelation(final boolean wayIsReversed, final int indexOfWayToKeep) {
164 final DataSet dataSet = new DataSet();
165 final OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
166 final Node n1 = new Node(new LatLon(1, 0));
167 final Node n2 = new Node(new LatLon(2, 0));
168 final Node n3 = new Node(new LatLon(3, 0));
169 final Node n4 = new Node(new LatLon(4, 0));
170 final Node n5 = new Node(new LatLon(5, 0));
171 final Node n6 = new Node(new LatLon(6, 0));
172 final Node n7 = new Node(new LatLon(7, 0));
173 final Way w1 = new Way();
174 final Way w2 = new Way();
175 final Way w3 = new Way();
176 final Relation route = new Relation();
177 for (OsmPrimitive p : Arrays.asList(n1, n2, n3, n4, n5, n6, n7, w1, w2, w3, route)) {
178 dataSet.addPrimitive(p);
179 }
180 w1.setNodes(Arrays.asList(n1, n2));
181 w2.setNodes(wayIsReversed
182 ? Arrays.asList(n6, n5, n4, n3, n2)
183 : Arrays.asList(n2, n3, n4, n5, n6)
184 );
185 w3.setNodes(Arrays.asList(n6, n7));
186 route.put("type", "route");
187 route.addMember(new RelationMember("", w1));
188 route.addMember(new RelationMember("", w2));
189 route.addMember(new RelationMember("", w3));
190 dataSet.setSelected(Arrays.asList(w2, n3, n4, n5));
191
192 final Strategy strategy = wayChunks -> {
193 final Iterator<Way> it = wayChunks.iterator();
194 for (int i = 0; i < indexOfWayToKeep; i++) {
195 it.next();
196 }
197 return it.next();
198 };
199 final SplitWayAction.SplitWayResult result = SplitWayAction.splitWay(
200 layer, w2, SplitWayAction.buildSplitChunks(w2, Arrays.asList(n3, n4, n5)), new ArrayList<OsmPrimitive>(), strategy);
201 MainApplication.undoRedo.add(result.getCommand());
202
203 assertEquals(6, route.getMembersCount());
204 assertEquals(w1, route.getMemberPrimitivesList().get(0));
205 assertEquals(w3, route.getMemberPrimitivesList().get(5));
206 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(0)), n1);
207 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(0)), n2);
208 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(1)), n2);
209 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(1)), n3);
210 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(2)), n3);
211 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(2)), n4);
212 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(3)), n4);
213 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(3)), n5);
214 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(4)), n5);
215 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(4)), n6);
216 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(5)), n6);
217 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(5)), n7);
218 }
219
220 static void assertFirstLastNodeIs(Way way, Node node) {
221 assertTrue("First/last node of " + way + " should be " + node, node.equals(way.firstNode()) || node.equals(way.lastNode()));
222 }
223}
Note: See TracBrowser for help on using the repository browser.