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

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

fix #17810 - incompletely downloaded turn restrictions sometimes break when splitting the from way (patch by taylor.smock, modified)

  • Property svn:eol-style set to native
File size: 4.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.junit.Assert.assertSame;
5import static org.junit.Assert.assertTrue;
6
7import java.util.Arrays;
8
9import org.junit.Assert;
10import org.junit.Rule;
11import org.junit.Test;
12import org.openstreetmap.josm.TestUtils;
13import org.openstreetmap.josm.data.coor.EastNorth;
14import org.openstreetmap.josm.data.coor.LatLon;
15import org.openstreetmap.josm.data.osm.DataSet;
16import org.openstreetmap.josm.data.osm.Node;
17import org.openstreetmap.josm.data.osm.Relation;
18import org.openstreetmap.josm.data.osm.RelationMember;
19import org.openstreetmap.josm.data.osm.Way;
20import org.openstreetmap.josm.testutils.JOSMTestRules;
21
22import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
23
24/**
25 * Unit tests for class {@link SplitWayAction}.
26 */
27public final class SplitWayActionTest {
28
29 /**
30 * Setup test.
31 */
32 @Rule
33 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
34 public JOSMTestRules test = new JOSMTestRules().projection();
35
36 /**
37 * Test case: When node is share by multiple ways, split selected way.
38 * see #11184
39 */
40 @Test
41 public void testTicket11184() {
42 DataSet dataSet = new DataSet();
43
44 Node n1 = new Node(new EastNorth(0, 0));
45 Node n2 = new Node(new EastNorth(-1, 1));
46 Node n3 = new Node(new EastNorth(1, 1));
47 Node n4 = new Node(new EastNorth(-1, -1));
48 Node n5 = new Node(new EastNorth(1, -1));
49 Node n6 = new Node(new EastNorth(-1, 0));
50 Node n7 = new Node(new EastNorth(1, 0));
51 dataSet.addPrimitive(n1);
52 dataSet.addPrimitive(n2);
53 dataSet.addPrimitive(n3);
54 dataSet.addPrimitive(n4);
55 dataSet.addPrimitive(n5);
56 dataSet.addPrimitive(n6);
57 dataSet.addPrimitive(n7);
58
59 Way w1 = new Way();
60 Node[] w1NodesArray = new Node[] {n6, n1, n7};
61 w1.setNodes(Arrays.asList(w1NodesArray));
62 Way w2 = new Way();
63 w2.setNodes(Arrays.asList(new Node[] {n1, n2, n3, n1, n4, n5, n1}));
64 dataSet.addPrimitive(w1);
65 dataSet.addPrimitive(w2);
66
67 dataSet.addSelected(n1);
68 dataSet.addSelected(w2);
69
70 SplitWayAction.runOn(dataSet);
71
72 // Ensures 3 ways.
73 assertSame(String.format("Found %d ways after split action instead of 3.", dataSet.getWays().size()),
74 dataSet.getWays().size(), 3);
75
76 // Ensures way w1 is unchanged.
77 assertTrue("Unselected ways disappear during split action.",
78 dataSet.getWays().contains(w1));
79 assertSame("Unselected way seems to have change during split action.",
80 w1.getNodesCount(), 3);
81 for (int i = 0; i < 3; i++) {
82 assertSame("Node change in unselected way during split action.",
83 w1.getNode(i), w1NodesArray[i]);
84 }
85 }
86
87 /**
88 * Test case: when a way is split with a turn restriction relation,
89 * the relation should not be broken.
90 * see #17810
91 */
92 @Test
93 public void testTicket17810() {
94 DataSet dataSet = new DataSet();
95 Way from = TestUtils.newWay("highway=residential", new Node(new LatLon(0.0, 0.0)),
96 new Node(new LatLon(0.00033, 0.00033)), new Node(new LatLon(0.00066, 0.00066)),
97 new Node(new LatLon(0.001, 0.001)));
98 from.getNodes().forEach(node -> dataSet.addPrimitive(node));
99 dataSet.addPrimitive(from);
100 Node via = from.lastNode();
101 Way to = TestUtils.newWay("highway=residential", new Node(new LatLon(0.002, 0.001)), via);
102 to.getNodes().forEach(node -> {
103 if (!dataSet.containsNode(node)) {
104 dataSet.addPrimitive(node);
105 }
106 });
107 dataSet.addPrimitive(to);
108 Relation restriction = TestUtils.newRelation("type=restriction restriction=no_left_turn",
109 new RelationMember("from", from), new RelationMember("to", to),
110 new RelationMember("via", via));
111 dataSet.addPrimitive(restriction);
112 dataSet.clearSelection();
113 dataSet.addSelected(from.getNode(2), from);
114 SplitWayAction.runOn(dataSet);
115 for (RelationMember member : restriction.getMembers()) {
116 if ("from".equals(member.getRole())) {
117 Assert.assertTrue(member.getWay().containsNode(via));
118 }
119 }
120 }
121}
Note: See TracBrowser for help on using the repository browser.