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

Last change on this file since 9225 was 8965, checked in by simon04, 8 years ago

see #10730 - Way splitting: fix and test (route) relation adaption

  • Property svn:eol-style set to native
File size: 7.1 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.assertSame;
6import static org.junit.Assert.assertTrue;
7
8import java.util.ArrayList;
9import java.util.Arrays;
10import java.util.Iterator;
11
12import org.junit.BeforeClass;
13import org.junit.Test;
14import org.openstreetmap.josm.JOSMFixture;
15import org.openstreetmap.josm.Main;
16import org.openstreetmap.josm.data.coor.EastNorth;
17import org.openstreetmap.josm.data.coor.LatLon;
18import org.openstreetmap.josm.data.osm.DataSet;
19import org.openstreetmap.josm.data.osm.Node;
20import org.openstreetmap.josm.data.osm.OsmPrimitive;
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.gui.layer.OsmDataLayer;
25
26/**
27 * Unit tests for class {@link SplitWayAction}.
28 */
29public final class SplitWayActionTest {
30
31 /** Class under test. */
32 private static SplitWayAction action;
33
34 /**
35 * Setup test.
36 */
37 @BeforeClass
38 public static void setUp() {
39 JOSMFixture.createUnitTestFixture().init(true);
40
41 // Enable "Align in line" feature.
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.main.addLayer(layer);
83 action.actionPerformed(null);
84 } finally {
85 // Ensure we clean the place before leaving, even if test fails.
86 Main.map.mapView.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 @Test
105 public void testRouteRelation() {
106 doTestRouteRelation(false, 0);
107 doTestRouteRelation(false, 1);
108 doTestRouteRelation(false, 2);
109 doTestRouteRelation(false, 3);
110 doTestRouteRelation(true, 0);
111 doTestRouteRelation(true, 1);
112 doTestRouteRelation(true, 2);
113 doTestRouteRelation(true, 3);
114 }
115
116 void doTestRouteRelation(final boolean wayIsReversed, final int indexOfWayToKeep) {
117 final DataSet dataSet = new DataSet();
118 final OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
119 final Node n1 = new Node(new LatLon(1, 0));
120 final Node n2 = new Node(new LatLon(2, 0));
121 final Node n3 = new Node(new LatLon(3, 0));
122 final Node n4 = new Node(new LatLon(4, 0));
123 final Node n5 = new Node(new LatLon(5, 0));
124 final Node n6 = new Node(new LatLon(6, 0));
125 final Node n7 = new Node(new LatLon(7, 0));
126 final Way w1 = new Way();
127 final Way w2 = new Way();
128 final Way w3 = new Way();
129 final Relation route = new Relation();
130 for (OsmPrimitive p : Arrays.asList(n1, n2, n3, n4, n5, n6, n7, w1, w2, w3, route)) {
131 dataSet.addPrimitive(p);
132 }
133 w1.setNodes(Arrays.asList(n1, n2));
134 w2.setNodes(wayIsReversed
135 ? Arrays.asList(n6, n5, n4, n3, n2)
136 : Arrays.asList(n2, n3, n4, n5, n6)
137 );
138 w3.setNodes(Arrays.asList(n6, n7));
139 route.put("type", "route");
140 route.addMember(new RelationMember("", w1));
141 route.addMember(new RelationMember("", w2));
142 route.addMember(new RelationMember("", w3));
143 dataSet.setSelected(Arrays.asList(w2, n3, n4, n5));
144
145
146 final SplitWayAction.Strategy strategy = new SplitWayAction.Strategy() {
147
148 @Override
149 public Way determineWayToKeep(Iterable<Way> wayChunks) {
150 final Iterator<Way> it = wayChunks.iterator();
151 for (int i = 0; i < indexOfWayToKeep; i++) {
152 it.next();
153 }
154 return it.next();
155 }
156 };
157 final SplitWayAction.SplitWayResult result = SplitWayAction.splitWay(
158 layer, w2, SplitWayAction.buildSplitChunks(w2, Arrays.asList(n3, n4, n5)), new ArrayList<OsmPrimitive>(), strategy);
159 Main.main.undoRedo.add(result.getCommand());
160
161 assertEquals(6, route.getMembersCount());
162 assertEquals(w1, route.getMemberPrimitivesList().get(0));
163 assertEquals(w3, route.getMemberPrimitivesList().get(5));
164 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(0)), n1);
165 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(0)), n2);
166 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(1)), n2);
167 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(1)), n3);
168 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(2)), n3);
169 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(2)), n4);
170 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(3)), n4);
171 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(3)), n5);
172 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(4)), n5);
173 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(4)), n6);
174 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(5)), n6);
175 assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(5)), n7);
176
177 }
178
179 static void assertFirstLastNodeIs(Way way, Node node) {
180 assertTrue("First/last node of " + way + " should be " + node, node.equals(way.firstNode()) || node.equals(way.lastNode()));
181 }
182}
Note: See TracBrowser for help on using the repository browser.