source: josm/trunk/test/unit/org/openstreetmap/josm/actions/JoinNodeWayActionTest.java@ 15428

Last change on this file since 15428 was 15428, checked in by GerdP, 5 years ago

fix #18189 (18189-v3.patch)

File size: 7.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.junit.Assert.assertTrue;
5
6import java.awt.Rectangle;
7import java.util.Arrays;
8import java.util.List;
9import java.util.stream.Collectors;
10
11import org.junit.Rule;
12import org.junit.Test;
13import org.openstreetmap.josm.TestUtils;
14import org.openstreetmap.josm.data.coor.EastNorth;
15import org.openstreetmap.josm.data.coor.LatLon;
16import org.openstreetmap.josm.data.osm.DataSet;
17import org.openstreetmap.josm.data.osm.Node;
18import org.openstreetmap.josm.data.osm.Way;
19import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
20import org.openstreetmap.josm.gui.MainApplication;
21import org.openstreetmap.josm.gui.layer.Layer;
22import org.openstreetmap.josm.gui.layer.OsmDataLayer;
23import org.openstreetmap.josm.io.OsmReader;
24import org.openstreetmap.josm.testutils.JOSMTestRules;
25import org.openstreetmap.josm.tools.Geometry;
26
27import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
28
29/**
30 * Unit tests for class {@link JoinNodeWayAction}.
31 */
32public final class JoinNodeWayActionTest {
33 /**
34 * Setup test.
35 */
36 @Rule
37 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
38 public JOSMTestRules test = new JOSMTestRules().projection().main().preferences();
39
40 private void setupMapView(DataSet ds) {
41 // setup a reasonable screen size
42 MainApplication.getMap().mapView.setBounds(new Rectangle(1920, 1080));
43 if (ds.getDataSourceBoundingBox() != null) {
44 MainApplication.getMap().mapView.zoomTo(ds.getDataSourceBoundingBox());
45 } else {
46 BoundingXYVisitor v = new BoundingXYVisitor();
47 for (Layer l : MainApplication.getLayerManager().getLayers()) {
48 l.visitBoundingBox(v);
49 }
50 MainApplication.getMap().mapView.zoomTo(v);
51 }
52 }
53
54 /**
55 * Test case: Move node onto two almost overlapping ways
56 * see #18189 moveontoway.osm
57 * @throws Exception if an error occurs
58 */
59 @Test
60 public void testTicket18189() throws Exception {
61 DataSet dataSet = new DataSet();
62 OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
63 MainApplication.getLayerManager().addLayer(layer);
64 try {
65 Node n1 = new Node(new LatLon(59.92881498658, 30.30104052971));
66 Node n2 = new Node(new LatLon(59.92881459851, 30.30104056556));
67 Node n3 = new Node(new LatLon(59.92881498658, 30.3010405297));
68 Node n4 = new Node(new LatLon(59.92881459851, 30.30104056556));
69 Node n5 = new Node(new LatLon(59.92881483122, 30.30104056465));
70
71 dataSet.addPrimitive(n1);
72 dataSet.addPrimitive(n2);
73 dataSet.addPrimitive(n3);
74 dataSet.addPrimitive(n4);
75 dataSet.addPrimitive(n5);
76
77 Way w1 = new Way();
78 w1.setNodes(Arrays.asList(n1, n2));
79 dataSet.addPrimitive(w1);
80 Way w2 = new Way();
81 w2.setNodes(Arrays.asList(n3, n4));
82 dataSet.addPrimitive(w2);
83
84 dataSet.addSelected(n5);
85 EastNorth expected = Geometry.closestPointToSegment(n1.getEastNorth(), n2.getEastNorth(), n5.getEastNorth());
86
87 setupMapView(dataSet);
88 JoinNodeWayAction action = JoinNodeWayAction.createMoveNodeOntoWayAction();
89 action.setEnabled(true);
90 action.actionPerformed(null);
91 // Make sure the node was only moved once
92 assertTrue("Node n5 wasn't added to way w1.", w1.containsNode(n5));
93 assertTrue("Node n5 wasn't added to way w2.", w2.containsNode(n5));
94 assertTrue("Node was moved to an unexpected position", n5.getEastNorth().equalsEpsilon(expected, 1e-7));
95 } finally {
96 MainApplication.getLayerManager().removeLayer(layer);
97 }
98 }
99
100 /**
101 * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/11508">Bug #11508</a>.
102 * @throws Exception if an error occurs
103 */
104 @Test
105 public void testTicket11508() throws Exception {
106 DataSet ds = OsmReader.parseDataSet(TestUtils.getRegressionDataStream(11508, "11508_example.osm"), null);
107 Layer layer = new OsmDataLayer(ds, OsmDataLayer.createNewName(), null);
108 MainApplication.getLayerManager().addLayer(layer);
109 try {
110 List<Node> nodesToMove = ds.getNodes().stream().filter(n -> n.hasTag("name", "select me and press N"))
111 .collect(Collectors.toList());
112 assertTrue(nodesToMove.size() == 1);
113 Node toMove = nodesToMove.iterator().next();
114 Node expected = new Node(new LatLon(47.56331849690742, 8.800789259499311));
115 ds.setSelected(toMove);
116 setupMapView(ds);
117 JoinNodeWayAction action = JoinNodeWayAction.createMoveNodeOntoWayAction();
118 action.setEnabled(true);
119 action.actionPerformed(null);
120
121 assertTrue("Node was moved to an unexpected position", toMove.getEastNorth().equalsEpsilon(expected.getEastNorth(), 1e-7));
122 assertTrue("Node was not added to expected number of ways", toMove.getParentWays().size() == 2);
123 } finally {
124 MainApplication.getLayerManager().removeLayer(layer);
125 }
126 }
127
128 /**
129 * Check that nothing is changed if ways are too far.
130 * @throws Exception if an error occurs
131 */
132 @Test
133 public void testTicket18189Crossing() throws Exception {
134 DataSet ds = OsmReader.parseDataSet(TestUtils.getRegressionDataStream(18189, "moveontocrossing.osm"), null);
135 Layer layer = new OsmDataLayer(ds, OsmDataLayer.createNewName(), null);
136 MainApplication.getLayerManager().addLayer(layer);
137 try {
138 setupMapView(ds);
139 JoinNodeWayAction action = JoinNodeWayAction.createMoveNodeOntoWayAction();
140 action.setEnabled(true);
141 List<Node> nodesToMove = ds.getNodes().stream().filter(n -> n.hasTag("name", "select me and press N"))
142 .collect(Collectors.toList());
143 assertTrue(nodesToMove.size() == 1);
144 Node toMove = nodesToMove.iterator().next();
145 ds.setSelected(toMove);
146 action.actionPerformed(null);
147 assertTrue(toMove.getParentWays().isEmpty());
148 } finally {
149 MainApplication.getLayerManager().removeLayer(layer);
150 }
151 }
152
153 /**
154 * Check that nothing is changed if ways are too far.
155 * @throws Exception if an error occurs
156 */
157 @Test
158 public void testTicket18189ThreeWays() throws Exception {
159 DataSet ds = OsmReader.parseDataSet(TestUtils.getRegressionDataStream(18189, "data.osm"), null);
160 Layer layer = new OsmDataLayer(ds, OsmDataLayer.createNewName(), null);
161 MainApplication.getLayerManager().addLayer(layer);
162 try {
163 setupMapView(ds);
164 JoinNodeWayAction action = JoinNodeWayAction.createMoveNodeOntoWayAction();
165 action.setEnabled(true);
166 List<Node> nodesToMove = ds.getNodes().stream().filter(n -> n.hasTag("name", "select me and press N"))
167 .collect(Collectors.toList());
168 assertTrue(nodesToMove.size() == 1);
169 Node toMove = nodesToMove.iterator().next();
170 Node expected = new Node(new LatLon(-21.088998104148224, -50.38629102179512));
171 ds.setSelected(toMove);
172 action.actionPerformed(null);
173 assertTrue("Node was moved to an unexpected position", toMove.getEastNorth().equalsEpsilon(expected.getEastNorth(), 1e-7));
174 assertTrue("Node was not added to expected number of ways", toMove.getParentWays().size() == 4);
175
176 } finally {
177 MainApplication.getLayerManager().removeLayer(layer);
178 }
179 }
180
181}
Note: See TracBrowser for help on using the repository browser.