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

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

see #15182 - fix unit tests

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