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

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

fix #13350 - Copy&pasting an object is not considered a change (patch by michael2402, regression) - gsoc-core

File size: 9.5 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.Main;
17import org.openstreetmap.josm.data.coor.LatLon;
18import org.openstreetmap.josm.data.osm.DataSet;
19import org.openstreetmap.josm.data.osm.Node;
20import org.openstreetmap.josm.data.osm.NodeData;
21import org.openstreetmap.josm.data.osm.OsmPrimitive;
22import org.openstreetmap.josm.data.osm.PrimitiveData;
23import org.openstreetmap.josm.data.osm.User;
24import org.openstreetmap.josm.data.osm.Way;
25import org.openstreetmap.josm.data.osm.WayData;
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 Main.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 Main.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 Main.getLayerManager().addLayer(layer1);
86 Main.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 Main.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 Main.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 Main.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 * Test {@link AddCommand#getParticipatingPrimitives()}
179 */
180 @Test
181 public void testParticipatingPrimitives() {
182 OsmDataLayer layer1 = new OsmDataLayer(new DataSet(), "l1", null);
183 Main.getLayerManager().addLayer(layer1);
184
185 List<PrimitiveData> testData = createTestData();
186 AddPrimitivesCommand command = new AddPrimitivesCommand(testData);
187 assertTrue(command.executeCommand());
188
189 assertEquals(3, command.getParticipatingPrimitives().size());
190 HashSet<OsmPrimitive> should = new HashSet<>(layer1.data.allPrimitives());
191 assertEquals(should, new HashSet<>(command.getParticipatingPrimitives()));
192
193 // needs to be the same after undo
194 command.undoCommand();
195 assertEquals(should, new HashSet<>(command.getParticipatingPrimitives()));
196 }
197
198 /**
199 * Tests {@link AddPrimitivesCommand#fillModifiedData(java.util.Collection, java.util.Collection, java.util.Collection)}
200 */
201 @Test
202 public void testFillModifiedData() {
203 ArrayList<OsmPrimitive> modified = new ArrayList<>();
204 ArrayList<OsmPrimitive> deleted = new ArrayList<>();
205 ArrayList<OsmPrimitive> added = new ArrayList<>();
206
207 List<PrimitiveData> testData = createTestData();
208 new AddPrimitivesCommand(testData).fillModifiedData(modified, deleted, added);
209
210 assertArrayEquals(new Object[] {}, modified.toArray());
211 assertArrayEquals(new Object[] {}, deleted.toArray());
212 assertArrayEquals(new Object[] {}, added.toArray());
213 }
214
215 private void testContainsTestData(OsmDataLayer layer1) {
216 assertEquals(3, layer1.data.allPrimitives().size());
217 assertEquals(2, layer1.data.getNodes().size());
218 assertEquals(1, layer1.data.getWays().size());
219 assertEquals(3, layer1.data.allModifiedPrimitives().size());
220 for (OsmPrimitive n : layer1.data.allPrimitives()) {
221 assertEquals("test", n.get("test"));
222 assertTrue(n.isModified());
223 }
224
225 for (Node n : layer1.data.getNodes()) {
226 assertEquals(LatLon.ZERO, n.getCoor());
227 }
228
229 for (Way w : layer1.data.getWays()) {
230 assertEquals(2, w.getNodes().size());
231 assertEquals(5, w.getNode(0).getId());
232 assertEquals(6, w.getNode(1).getId());
233 }
234 }
235
236 private List<PrimitiveData> createTestData() {
237 NodeData node1 = createTestNode(5);
238 NodeData node2 = createTestNode(6);
239 WayData way = new WayData();
240 way.put("test", "test");
241 way.setNodes(Arrays.asList(node1.getId(), node2.getId()));
242 List<PrimitiveData> testData = Arrays.<PrimitiveData>asList(node1, node2, way);
243 return testData;
244 }
245
246 private NodeData createTestNode(int id) {
247 NodeData node1 = new NodeData();
248 node1.setCoor(LatLon.ZERO);
249 node1.put("test", "test");
250 node1.setId(id);
251 return node1;
252 }
253
254 /**
255 * Unit test of methods {@link AddPrimitivesCommand#equals} and {@link AddPrimitivesCommand#hashCode}.
256 */
257 @Test
258 public void testEqualsContract() {
259 EqualsVerifier.forClass(AddPrimitivesCommand.class).usingGetClass()
260 .withPrefabValues(DataSet.class,
261 new DataSet(), new DataSet())
262 .withPrefabValues(User.class,
263 User.createOsmUser(1, "foo"), User.createOsmUser(2, "bar"))
264 .withPrefabValues(OsmDataLayer.class,
265 new OsmDataLayer(new DataSet(), "1", null), new OsmDataLayer(new DataSet(), "2", null))
266 .suppress(Warning.NONFINAL_FIELDS)
267 .verify();
268 }
269}
Note: See TracBrowser for help on using the repository browser.