source: josm/trunk/test/unit/org/openstreetmap/josm/actions/mapmode/SelectActionTest.java@ 8949

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

see #11968, see #12011 - add a new non-regression unit test reproducing #12011

  • Property svn:eol-style set to native
File size: 5.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions.mapmode;
3
4import static org.junit.Assert.assertFalse;
5import static org.junit.Assert.assertSame;
6import static org.junit.Assert.assertTrue;
7import static org.junit.Assert.fail;
8
9import java.awt.event.InputEvent;
10import java.awt.event.MouseEvent;
11import java.lang.reflect.Field;
12import java.util.Arrays;
13import java.util.Collection;
14
15import org.junit.BeforeClass;
16import org.junit.Test;
17import org.openstreetmap.josm.JOSMFixture;
18import org.openstreetmap.josm.Main;
19import org.openstreetmap.josm.data.Preferences;
20import org.openstreetmap.josm.data.coor.EastNorth;
21import org.openstreetmap.josm.data.osm.DataSet;
22import org.openstreetmap.josm.data.osm.Node;
23import org.openstreetmap.josm.data.osm.Way;
24import org.openstreetmap.josm.gui.MapFrame;
25import org.openstreetmap.josm.gui.layer.OsmDataLayer;
26
27/**
28 * Unit tests for class {@link SelectAction}.
29 */
30public class SelectActionTest {
31
32 /**
33 * Override some configuration variables without change in preferences.xml
34 */
35 class PreferencesMock extends Preferences {
36 @Override
37 public synchronized int getInteger(String key, int def) {
38 if (key == "edit.initial-move-delay") {
39 return 0;
40 } else {
41 return super.getInteger(key, def);
42 }
43 }
44 }
45
46 boolean nodesMerged;
47
48 class SelectActionMock extends SelectAction {
49 SelectActionMock(MapFrame mapFrame, DataSet dataSet, OsmDataLayer layer) {
50 super(mapFrame);
51 try {
52 Field mv = SelectAction.class.getDeclaredField("mv");
53 mv.setAccessible(true);
54 mv.set(this, new MapViewMock(dataSet, layer));
55 } catch (Exception e) {
56 e.printStackTrace();
57 fail("Can't setup testing environnement");
58 }
59 }
60
61 @Override
62 public void mergeNodes(OsmDataLayer layer, Collection<Node> nodes,
63 Node targetLocationNode) {
64 assertSame(String.format("Should merge two nodes, %d found", nodes.size()),
65 nodes.size(), 2);
66 nodesMerged = true;
67 }
68 }
69
70 /**
71 * Setup test.
72 */
73 @BeforeClass
74 public static void setUpBeforeClass() {
75 JOSMFixture.createUnitTestFixture().init(true);
76 }
77
78 /**
79 * Test case: Move a two nodes way near a third node.
80 * Resulting way should be attach to the third node.
81 * see #10748
82 */
83 @Test
84 public void test10748() {
85 DataSet dataSet = new DataSet();
86 OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
87
88 Node n1 = new Node(new EastNorth(0, 0));
89 Node n2 = new Node(new EastNorth(100, 0));
90 Node n3 = new Node(new EastNorth(200, 0));
91 dataSet.addPrimitive(n1);
92 dataSet.addPrimitive(n2);
93 dataSet.addPrimitive(n3);
94
95 Way w = new Way();
96 w.setNodes(Arrays.asList(new Node[] {n2, n3}));
97 dataSet.addPrimitive(w);
98
99 dataSet.addSelected(n2);
100 dataSet.addSelected(w);
101
102 Main.pref = new PreferencesMock();
103 Main.main.addLayer(layer);
104 SelectAction action = new SelectActionMock(Main.map, dataSet, layer);
105 nodesMerged = false;
106
107 action.setEnabled(true);
108 action.putValue("active", true);
109
110 MouseEvent event;
111 event = new MouseEvent(Main.map,
112 MouseEvent.MOUSE_PRESSED,
113 0,
114 InputEvent.BUTTON1_MASK | InputEvent.CTRL_MASK,
115 100, 0,
116 1,
117 false);
118 action.mousePressed(event);
119 event = new MouseEvent(Main.map,
120 MouseEvent.MOUSE_DRAGGED,
121 1000,
122 InputEvent.BUTTON1_MASK | InputEvent.CTRL_MASK,
123 50, 0,
124 1,
125 false);
126 action.mouseDragged(event);
127 event = new MouseEvent(Main.map,
128 MouseEvent.MOUSE_RELEASED,
129 2000,
130 InputEvent.BUTTON1_MASK | InputEvent.CTRL_MASK,
131 5, 0,
132 1,
133 false);
134 action.mouseReleased(event);
135
136 // As result of test, we must find a 2 nodes way, from EN(0, 0) to EN(100, 0)
137 assertTrue("Nodes are not merged", nodesMerged);
138 assertSame(String.format("Expect exactly one way, found %d\n", dataSet.getWays().size()),
139 dataSet.getWays().size(), 1);
140 Way rw = dataSet.getWays().iterator().next();
141 assertFalse("Way shouldn't be deleted\n", rw.isDeleted());
142 assertSame(String.format("Way shouldn't have 2 nodes, %d found\n", w.getNodesCount()),
143 rw.getNodesCount(), 2);
144 Node r1 = rw.firstNode();
145 Node r2 = rw.lastNode();
146 if (r1.getEastNorth().east() > r2.getEastNorth().east()) {
147 Node tmp = r1;
148 r1 = r2;
149 r2 = tmp;
150 }
151 assertSame(String.format("East should be 0, found %f\n", r1.getEastNorth().east()),
152 Double.compare(r1.getEastNorth().east(), 0), 0);
153 assertSame(String.format("East should be 100, found %f\n", r2.getEastNorth().east()),
154 Double.compare(r2.getEastNorth().east(), 100), 0);
155 }
156}
Note: See TracBrowser for help on using the repository browser.