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

Last change on this file since 10956 was 10599, checked in by Don-vip, 8 years ago

see #11390 - sonar - squid:S1610 - Java 8: Abstract classes without fields should be converted to interfaces

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