source: josm/trunk/test/unit/org/openstreetmap/josm/actions/CreateCircleActionTest.java@ 10956

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

convert more unit tests to JOSMTestRules

  • Property svn:eol-style set to native
File size: 6.8 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.awt.geom.Area;
8import java.lang.reflect.Field;
9import java.lang.reflect.Method;
10import java.util.ArrayList;
11import java.util.Arrays;
12import java.util.Collection;
13import java.util.Collections;
14
15import org.junit.Rule;
16import org.junit.Test;
17import org.openstreetmap.josm.Main;
18import org.openstreetmap.josm.data.coor.EastNorth;
19import org.openstreetmap.josm.data.coor.LatLon;
20import org.openstreetmap.josm.data.osm.BBox;
21import org.openstreetmap.josm.data.osm.DataSet;
22import org.openstreetmap.josm.data.osm.Node;
23import org.openstreetmap.josm.data.osm.OsmPrimitive;
24import org.openstreetmap.josm.data.osm.Way;
25import org.openstreetmap.josm.gui.layer.OsmDataLayer;
26import org.openstreetmap.josm.testutils.JOSMTestRules;
27import org.openstreetmap.josm.tools.GeoPropertyIndex;
28import org.openstreetmap.josm.tools.GeoPropertyIndex.GeoProperty;
29import org.openstreetmap.josm.tools.Geometry;
30import org.openstreetmap.josm.tools.RightAndLefthandTraffic;
31import org.openstreetmap.josm.tools.Utils;
32
33import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
34
35/**
36 * Unit tests for class {@link CreateCircleAction}.
37 */
38public final class CreateCircleActionTest {
39
40 /**
41 * Setup test.
42 */
43 @Rule
44 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
45 public JOSMTestRules test = new JOSMTestRules().platform();
46
47 /**
48 * FIXME: Conveniance method to prevent Selection Change events.
49 * A more proper way should be to define a TestingDataSet class with limited
50 * functionalities, but DataSet is declare as final (due to Cloneable interface).
51 *
52 * I don't know why, but in other tests there are no problem to add selected primitives
53 * but in this case there is a problem with an even listener of selection change.
54 * @param p primitive
55 * @param ds data set
56 * @throws ReflectiveOperationException if an error occurs
57 */
58 public void addSelected(OsmPrimitive p, DataSet ds) throws ReflectiveOperationException {
59 Method method = ds.getClass().getDeclaredMethod("addSelected",
60 new Class<?>[] {Collection.class, boolean.class});
61 Utils.setObjectsAccessible(method);
62 method.invoke(ds, Collections.singleton(p), false);
63 }
64
65 /**
66 * Test case: When Create Circle action is performed with a single way selected,
67 * circle direction must equals way direction.
68 * see #7421
69 * @throws ReflectiveOperationException if an error occurs
70 */
71 @Test
72 public void testTicket7421case0() throws ReflectiveOperationException {
73 DataSet dataSet = new DataSet();
74 OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
75
76 Node n1 = new Node(new EastNorth(0, 0));
77 Node n2 = new Node(new EastNorth(-1, 1));
78 Node n3 = new Node(new EastNorth(1, 1));
79 dataSet.addPrimitive(n1);
80 dataSet.addPrimitive(n2);
81 dataSet.addPrimitive(n3);
82
83 Way w = new Way(); // Way is Clockwize
84 w.setNodes(Arrays.asList(new Node[] {n1, n2, n3}));
85 dataSet.addPrimitive(w);
86
87 addSelected(w, dataSet);
88
89 CreateCircleAction action = new CreateCircleAction();
90 action.setEnabled(true);
91 try {
92 Main.getLayerManager().addLayer(layer);
93 action.actionPerformed(null);
94 } finally {
95 // Ensure we clean the place before leaving, even if test fails.
96 Main.getLayerManager().removeLayer(layer);
97 }
98
99 // Expected result: Dataset contain one closed way, clockwise
100 Collection<Way> resultingWays = dataSet.getWays();
101 assertSame(String.format("Expect one way after perform action. %d found", resultingWays.size()),
102 resultingWays.size(), 1);
103 Way resultingWay = resultingWays.iterator().next();
104 assertTrue("Resulting way is not closed",
105 resultingWay.isClosed());
106 assertTrue("Found anti-clockwize circle while way was clockwize",
107 Geometry.isClockwise(resultingWay));
108 }
109
110 /**
111 * Mock left/right hand traffic database with constant traffic hand
112 */
113 private static class ConstantTrafficHand implements GeoProperty<Boolean> {
114 boolean isLeft;
115
116 ConstantTrafficHand(boolean isLeft) {
117 this.isLeft = isLeft;
118 }
119
120 @Override
121 public Boolean get(LatLon ll) {
122 return isLeft;
123 }
124
125 @Override
126 public Boolean get(BBox box) {
127 return isLeft;
128 }
129 }
130
131 /**
132 * Test case: When Create Circle action is performed with nodes, resulting
133 * circle direction depend on traffic hand. Simulate a left hand traffic.
134 * see #7421
135 * @throws ReflectiveOperationException if an error occurs
136 */
137 @Test
138 public void testTicket7421case1() throws ReflectiveOperationException {
139 DataSet dataSet = new DataSet();
140 OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
141
142 Node n1 = new Node(new EastNorth(0, 0));
143 Node n2 = new Node(new EastNorth(-1, 1));
144 Node n3 = new Node(new EastNorth(1, 1));
145 dataSet.addPrimitive(n1);
146 dataSet.addPrimitive(n2);
147 dataSet.addPrimitive(n3);
148
149 addSelected(n1, dataSet);
150 addSelected(n2, dataSet);
151 addSelected(n3, dataSet);
152
153 // Mock left/right hand traffic database
154 Field leftHandTrafficPolygons = RightAndLefthandTraffic.class
155 .getDeclaredField("leftHandTrafficPolygons");
156 Field rlCache = RightAndLefthandTraffic.class.getDeclaredField("rlCache");
157 Utils.setObjectsAccessible(leftHandTrafficPolygons, rlCache);
158 leftHandTrafficPolygons.set(null, new ArrayList<Area>());
159 rlCache.set(null, new GeoPropertyIndex<>(new ConstantTrafficHand(true), 24));
160
161 CreateCircleAction action = new CreateCircleAction();
162 action.setEnabled(true);
163 try {
164 Main.getLayerManager().addLayer(layer);
165 action.actionPerformed(null);
166 } finally {
167 // Ensure we clean the place before leaving, even if test fails.
168 Main.getLayerManager().removeLayer(layer);
169 }
170
171 // Expected result: Dataset contain one closed way, clockwise
172 Collection<Way> resultingWays = dataSet.getWays();
173 assertSame(String.format("Expect one way after perform action. %d found", resultingWays.size()),
174 resultingWays.size(), 1);
175 Way resultingWay = resultingWays.iterator().next();
176 assertTrue("Resulting way is not closed",
177 resultingWay.isClosed());
178 assertTrue("Found anti-clockwise way while traffic is left hand.",
179 Geometry.isClockwise(resultingWay));
180 }
181}
Note: See TracBrowser for help on using the repository browser.