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

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

see #13001 - replace calls to Main.main.[add|remove]Layer by Main.getLayerManager().[add|remove]Layer

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