source: josm/trunk/test/unit/org/openstreetmap/josm/command/AddPrimitivesCommandTest.java@ 12636

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

see #15182 - deprecate Main.getLayerManager(). Replacement: gui.MainApplication.getLayerManager()

File size: 10.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.command;
3
4import static org.junit.Assert.assertArrayEquals;
5import static org.junit.Assert.assertEquals;
6import static org.junit.Assert.assertSame;
7import static org.junit.Assert.assertTrue;
8
9import java.util.ArrayList;
10import java.util.Arrays;
11import java.util.HashSet;
12import java.util.List;
13
14import org.junit.Rule;
15import org.junit.Test;
16import org.openstreetmap.josm.data.coor.LatLon;
17import org.openstreetmap.josm.data.osm.DataSet;
18import org.openstreetmap.josm.data.osm.Node;
19import org.openstreetmap.josm.data.osm.NodeData;
20import org.openstreetmap.josm.data.osm.OsmPrimitive;
21import org.openstreetmap.josm.data.osm.PrimitiveData;
22import org.openstreetmap.josm.data.osm.User;
23import org.openstreetmap.josm.data.osm.Way;
24import org.openstreetmap.josm.data.osm.WayData;
25import org.openstreetmap.josm.gui.MainApplication;
26import org.openstreetmap.josm.gui.layer.OsmDataLayer;
27import org.openstreetmap.josm.testutils.JOSMTestRules;
28
29import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
30import nl.jqno.equalsverifier.EqualsVerifier;
31import nl.jqno.equalsverifier.Warning;
32
33/**
34 * Unit tests of {@link AddPrimitivesCommand} class.
35 */
36public class AddPrimitivesCommandTest {
37
38 /**
39 * We need prefs for nodes.
40 */
41 @Rule
42 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
43 public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
44
45 /**
46 * Test if the add command is executed correctly and does not set the modified flag.
47 */
48 @Test
49 public void testAdd() {
50 OsmDataLayer layer1 = new OsmDataLayer(new DataSet(), "l1", null);
51 MainApplication.getLayerManager().addLayer(layer1);
52
53 List<PrimitiveData> testData = createTestData();
54 assertTrue(new AddPrimitivesCommand(testData).executeCommand());
55
56 testContainsTestData(layer1);
57 assertEquals(3, layer1.data.getAllSelected().size());
58 }
59
60 /**
61 * Test if the add command sets the selection.
62 */
63 @Test
64 public void testAddSetSelection() {
65 OsmDataLayer layer1 = new OsmDataLayer(new DataSet(), "l1", null);
66 MainApplication.getLayerManager().addLayer(layer1);
67
68 List<PrimitiveData> testData = createTestData();
69 assertTrue(new AddPrimitivesCommand(testData, testData.subList(2, 3)).executeCommand());
70
71 testContainsTestData(layer1);
72
73 assertEquals(1, layer1.data.getAllSelected().size());
74 assertEquals(1, layer1.data.getSelectedWays().size());
75 }
76
77 /**
78 * Tests if the add command respects the layer.
79 */
80 @Test
81 public void testAddToLayer() {
82 OsmDataLayer layer1 = new OsmDataLayer(new DataSet(), "l1", null);
83 OsmDataLayer layer2 = new OsmDataLayer(new DataSet(), "l1", null);
84
85 MainApplication.getLayerManager().addLayer(layer1);
86 MainApplication.getLayerManager().addLayer(layer2);
87
88 List<PrimitiveData> testData = createTestData();
89 assertTrue(new AddPrimitivesCommand(testData, testData.subList(2, 3), layer1).executeCommand());
90
91 testContainsTestData(layer1);
92 assertTrue(layer2.data.allPrimitives().isEmpty());
93
94 assertEquals(1, layer1.data.getAllSelected().size());
95 assertEquals(1, layer1.data.getSelectedWays().size());
96 }
97
98 /**
99 * Tests if the add command ignores existing data
100 */
101 @Test
102 public void testAddIgnoresExisting() {
103 OsmDataLayer layer1 = new OsmDataLayer(new DataSet(), "l1", null);
104 MainApplication.getLayerManager().addLayer(layer1);
105
106 List<PrimitiveData> testData = createTestData();
107 assertTrue(new AddPrimitivesCommand(testData).executeCommand());
108 assertEquals(2, layer1.data.getNodes().size());
109 assertEquals(1, layer1.data.getWays().size());
110
111 testData.set(2, createTestNode(7));
112 assertTrue(new AddPrimitivesCommand(testData).executeCommand());
113
114 assertEquals(3, layer1.data.getNodes().size());
115 assertEquals(1, layer1.data.getWays().size());
116 }
117
118 /**
119 * Test {@link AddPrimitivesCommand#getDescriptionText()}
120 */
121 @Test
122 public void testDescription() {
123 OsmDataLayer layer1 = new OsmDataLayer(new DataSet(), "l1", null);
124 MainApplication.getLayerManager().addLayer(layer1);
125
126 List<PrimitiveData> testData = createTestData();
127 NodeData data2 = createTestNode(7);
128
129 AddPrimitivesCommand command1 = new AddPrimitivesCommand(testData);
130 AddPrimitivesCommand command2 = new AddPrimitivesCommand(Arrays.<PrimitiveData>asList(data2));
131
132 assertEquals("Added 3 objects", command1.getDescriptionText());
133 assertEquals("Added 1 object", command2.getDescriptionText());
134
135 // Name must be the same after execution.
136 assertTrue(command1.executeCommand());
137 assertTrue(command2.executeCommand());
138
139 assertEquals("Added 3 objects", command1.getDescriptionText());
140 assertEquals("Added 1 object", command2.getDescriptionText());
141 }
142
143 /**
144 * Test {@link AddPrimitivesCommand#undoCommand()}
145 */
146 @Test
147 public void testUndo() {
148 OsmDataLayer layer1 = new OsmDataLayer(new DataSet(), "l1", null);
149 MainApplication.getLayerManager().addLayer(layer1);
150
151 List<PrimitiveData> testData = createTestData();
152
153 AddPrimitivesCommand command = new AddPrimitivesCommand(testData);
154
155 assertTrue(command.executeCommand());
156
157 assertEquals(3, layer1.data.allPrimitives().size());
158 assertEquals(1, layer1.data.getWays().size());
159 Way way = layer1.data.getWays().iterator().next();
160
161 for (int i = 0; i < 2; i++) {
162 // Needs to work multiple times.
163 command.undoCommand();
164
165 assertEquals(0, layer1.data.allPrimitives().size());
166 assertEquals(0, layer1.data.getWays().size());
167
168 // redo
169 assertTrue(command.executeCommand());
170
171 assertEquals(3, layer1.data.allPrimitives().size());
172 assertEquals(1, layer1.data.getWays().size());
173 assertSame(way, layer1.data.getWays().iterator().next());
174 }
175 }
176
177 /**
178 * Tests if the undo command does not remove
179 * data ignored by by the add command because they where already existing.
180 */
181 @Test
182 public void testUndoIgnoresExisting() {
183 OsmDataLayer layer1 = new OsmDataLayer(new DataSet(), "l1", null);
184 MainApplication.getLayerManager().addLayer(layer1);
185
186 List<PrimitiveData> testData = createTestData();
187
188 assertTrue(new AddPrimitivesCommand(testData).executeCommand());
189 assertEquals(2, layer1.data.getNodes().size());
190 assertEquals(1, layer1.data.getWays().size());
191
192 testData.set(2, createTestNode(7));
193
194 AddPrimitivesCommand command = new AddPrimitivesCommand(testData);
195
196 assertTrue(command.executeCommand());
197
198 assertEquals(3, layer1.data.getNodes().size());
199 assertEquals(1, layer1.data.getWays().size());
200
201 for (int i = 0; i < 2; i++) {
202 // Needs to work multiple times.
203 command.undoCommand();
204
205 assertEquals(2, layer1.data.getNodes().size());
206 assertEquals(1, layer1.data.getWays().size());
207
208 // redo
209 assertTrue(command.executeCommand());
210
211 assertEquals(3, layer1.data.getNodes().size());
212 assertEquals(1, layer1.data.getWays().size());
213 }
214 }
215
216 /**
217 * Test {@link AddCommand#getParticipatingPrimitives()}
218 */
219 @Test
220 public void testParticipatingPrimitives() {
221 OsmDataLayer layer1 = new OsmDataLayer(new DataSet(), "l1", null);
222 MainApplication.getLayerManager().addLayer(layer1);
223
224 List<PrimitiveData> testData = createTestData();
225 AddPrimitivesCommand command = new AddPrimitivesCommand(testData);
226 assertTrue(command.executeCommand());
227
228 assertEquals(3, command.getParticipatingPrimitives().size());
229 HashSet<OsmPrimitive> should = new HashSet<>(layer1.data.allPrimitives());
230 assertEquals(should, new HashSet<>(command.getParticipatingPrimitives()));
231
232 // needs to be the same after undo
233 command.undoCommand();
234 assertEquals(should, new HashSet<>(command.getParticipatingPrimitives()));
235 }
236
237 /**
238 * Tests {@link AddPrimitivesCommand#fillModifiedData(java.util.Collection, java.util.Collection, java.util.Collection)}
239 */
240 @Test
241 public void testFillModifiedData() {
242 ArrayList<OsmPrimitive> modified = new ArrayList<>();
243 ArrayList<OsmPrimitive> deleted = new ArrayList<>();
244 ArrayList<OsmPrimitive> added = new ArrayList<>();
245
246 List<PrimitiveData> testData = createTestData();
247 new AddPrimitivesCommand(testData).fillModifiedData(modified, deleted, added);
248
249 assertArrayEquals(new Object[] {}, modified.toArray());
250 assertArrayEquals(new Object[] {}, deleted.toArray());
251 assertArrayEquals(new Object[] {}, added.toArray());
252 }
253
254 private void testContainsTestData(OsmDataLayer layer1) {
255 assertEquals(3, layer1.data.allPrimitives().size());
256 assertEquals(2, layer1.data.getNodes().size());
257 assertEquals(1, layer1.data.getWays().size());
258 assertEquals(3, layer1.data.allModifiedPrimitives().size());
259 for (OsmPrimitive n : layer1.data.allPrimitives()) {
260 assertEquals("test", n.get("test"));
261 assertTrue(n.isModified());
262 }
263
264 for (Node n : layer1.data.getNodes()) {
265 assertEquals(LatLon.ZERO, n.getCoor());
266 }
267
268 for (Way w : layer1.data.getWays()) {
269 assertEquals(2, w.getNodes().size());
270 assertEquals(5, w.getNode(0).getId());
271 assertEquals(6, w.getNode(1).getId());
272 }
273 }
274
275 private List<PrimitiveData> createTestData() {
276 NodeData node1 = createTestNode(5);
277 NodeData node2 = createTestNode(6);
278 WayData way = new WayData();
279 way.put("test", "test");
280 way.setNodes(Arrays.asList(node1.getId(), node2.getId()));
281 List<PrimitiveData> testData = Arrays.<PrimitiveData>asList(node1, node2, way);
282 return testData;
283 }
284
285 private NodeData createTestNode(int id) {
286 NodeData node1 = new NodeData();
287 node1.setCoor(LatLon.ZERO);
288 node1.put("test", "test");
289 node1.setId(id);
290 return node1;
291 }
292
293 /**
294 * Unit test of methods {@link AddPrimitivesCommand#equals} and {@link AddPrimitivesCommand#hashCode}.
295 */
296 @Test
297 public void testEqualsContract() {
298 EqualsVerifier.forClass(AddPrimitivesCommand.class).usingGetClass()
299 .withPrefabValues(DataSet.class,
300 new DataSet(), new DataSet())
301 .withPrefabValues(User.class,
302 User.createOsmUser(1, "foo"), User.createOsmUser(2, "bar"))
303 .withPrefabValues(OsmDataLayer.class,
304 new OsmDataLayer(new DataSet(), "1", null), new OsmDataLayer(new DataSet(), "2", null))
305 .suppress(Warning.NONFINAL_FIELDS)
306 .verify();
307 }
308}
Note: See TracBrowser for help on using the repository browser.