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

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

add IWay.setNodes()

File size: 9.8 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.TestUtils;
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 DataSet ds = new DataSet();
51
52 List<PrimitiveData> testData = createTestData();
53 assertTrue(new AddPrimitivesCommand(testData, ds).executeCommand());
54
55 testContainsTestData(ds);
56 assertEquals(3, ds.getAllSelected().size());
57 }
58
59 /**
60 * Test if the add command sets the selection.
61 */
62 @Test
63 public void testAddSetSelection() {
64 DataSet ds = new DataSet();
65
66 List<PrimitiveData> testData = createTestData();
67 assertTrue(new AddPrimitivesCommand(testData, testData.subList(2, 3), ds).executeCommand());
68
69 testContainsTestData(ds);
70
71 assertEquals(1, ds.getAllSelected().size());
72 assertEquals(1, ds.getSelectedWays().size());
73 }
74
75 /**
76 * Tests if the add command respects the data set.
77 */
78 @Test
79 public void testAddToLayer() {
80 DataSet ds1 = new DataSet();
81 DataSet ds2 = new DataSet();
82
83 List<PrimitiveData> testData = createTestData();
84 assertTrue(new AddPrimitivesCommand(testData, testData.subList(2, 3), ds1).executeCommand());
85
86 testContainsTestData(ds1);
87 assertTrue(ds2.allPrimitives().isEmpty());
88
89 assertEquals(1, ds1.getAllSelected().size());
90 assertEquals(1, ds1.getSelectedWays().size());
91 }
92
93 /**
94 * Tests if the add command ignores existing data
95 */
96 @Test
97 public void testAddIgnoresExisting() {
98 DataSet ds = new DataSet();
99
100 List<PrimitiveData> testData = createTestData();
101 assertTrue(new AddPrimitivesCommand(testData, ds).executeCommand());
102 assertEquals(2, ds.getNodes().size());
103 assertEquals(1, ds.getWays().size());
104
105 testData.set(2, createTestNode(7));
106 assertTrue(new AddPrimitivesCommand(testData, ds).executeCommand());
107
108 assertEquals(3, ds.getNodes().size());
109 assertEquals(1, ds.getWays().size());
110 }
111
112 /**
113 * Test {@link AddPrimitivesCommand#getDescriptionText()}
114 */
115 @Test
116 public void testDescription() {
117 DataSet ds = new DataSet();
118
119 List<PrimitiveData> testData = createTestData();
120 NodeData data2 = createTestNode(7);
121
122 AddPrimitivesCommand command1 = new AddPrimitivesCommand(testData, ds);
123 AddPrimitivesCommand command2 = new AddPrimitivesCommand(Arrays.<PrimitiveData>asList(data2), ds);
124
125 assertEquals("Added 3 objects", command1.getDescriptionText());
126 assertEquals("Added 1 object", command2.getDescriptionText());
127
128 // Name must be the same after execution.
129 assertTrue(command1.executeCommand());
130 assertTrue(command2.executeCommand());
131
132 assertEquals("Added 3 objects", command1.getDescriptionText());
133 assertEquals("Added 1 object", command2.getDescriptionText());
134 }
135
136 /**
137 * Test {@link AddPrimitivesCommand#undoCommand()}
138 */
139 @Test
140 public void testUndo() {
141 DataSet ds = new DataSet();
142
143 List<PrimitiveData> testData = createTestData();
144
145 AddPrimitivesCommand command = new AddPrimitivesCommand(testData, ds);
146
147 assertTrue(command.executeCommand());
148
149 assertEquals(3, ds.allPrimitives().size());
150 assertEquals(1, ds.getWays().size());
151 Way way = ds.getWays().iterator().next();
152
153 for (int i = 0; i < 2; i++) {
154 // Needs to work multiple times.
155 command.undoCommand();
156
157 assertEquals(0, ds.allPrimitives().size());
158 assertEquals(0, ds.getWays().size());
159
160 // redo
161 assertTrue(command.executeCommand());
162
163 assertEquals(3, ds.allPrimitives().size());
164 assertEquals(1, ds.getWays().size());
165 assertSame(way, ds.getWays().iterator().next());
166 }
167 }
168
169 /**
170 * Tests if the undo command does not remove
171 * data ignored by by the add command because they where already existing.
172 */
173 @Test
174 public void testUndoIgnoresExisting() {
175 DataSet ds = new DataSet();
176
177 List<PrimitiveData> testData = createTestData();
178
179 assertTrue(new AddPrimitivesCommand(testData, ds).executeCommand());
180 assertEquals(2, ds.getNodes().size());
181 assertEquals(1, ds.getWays().size());
182
183 testData.set(2, createTestNode(7));
184
185 AddPrimitivesCommand command = new AddPrimitivesCommand(testData, ds);
186
187 assertTrue(command.executeCommand());
188
189 assertEquals(3, ds.getNodes().size());
190 assertEquals(1, ds.getWays().size());
191
192 for (int i = 0; i < 2; i++) {
193 // Needs to work multiple times.
194 command.undoCommand();
195
196 assertEquals(2, ds.getNodes().size());
197 assertEquals(1, ds.getWays().size());
198
199 // redo
200 assertTrue(command.executeCommand());
201
202 assertEquals(3, ds.getNodes().size());
203 assertEquals(1, ds.getWays().size());
204 }
205 }
206
207 /**
208 * Test {@link AddCommand#getParticipatingPrimitives()}
209 */
210 @Test
211 public void testParticipatingPrimitives() {
212 DataSet ds = new DataSet();
213
214 List<PrimitiveData> testData = createTestData();
215 AddPrimitivesCommand command = new AddPrimitivesCommand(testData, ds);
216 assertTrue(command.executeCommand());
217
218 assertEquals(3, command.getParticipatingPrimitives().size());
219 HashSet<OsmPrimitive> should = new HashSet<>(ds.allPrimitives());
220 assertEquals(should, new HashSet<>(command.getParticipatingPrimitives()));
221
222 // needs to be the same after undo
223 command.undoCommand();
224 assertEquals(should, new HashSet<>(command.getParticipatingPrimitives()));
225 }
226
227 /**
228 * Tests {@link AddPrimitivesCommand#fillModifiedData(java.util.Collection, java.util.Collection, java.util.Collection)}
229 */
230 @Test
231 public void testFillModifiedData() {
232 ArrayList<OsmPrimitive> modified = new ArrayList<>();
233 ArrayList<OsmPrimitive> deleted = new ArrayList<>();
234 ArrayList<OsmPrimitive> added = new ArrayList<>();
235
236 List<PrimitiveData> testData = createTestData();
237 new AddPrimitivesCommand(testData, new DataSet()).fillModifiedData(modified, deleted, added);
238
239 assertArrayEquals(new Object[] {}, modified.toArray());
240 assertArrayEquals(new Object[] {}, deleted.toArray());
241 assertArrayEquals(new Object[] {}, added.toArray());
242 }
243
244 private void testContainsTestData(DataSet data) {
245 assertEquals(3, data.allPrimitives().size());
246 assertEquals(2, data.getNodes().size());
247 assertEquals(1, data.getWays().size());
248 assertEquals(3, data.allModifiedPrimitives().size());
249 for (OsmPrimitive n : data.allPrimitives()) {
250 assertEquals("test", n.get("test"));
251 assertTrue(n.isModified());
252 }
253
254 for (Node n : data.getNodes()) {
255 assertEquals(LatLon.ZERO, n.getCoor());
256 }
257
258 for (Way w : data.getWays()) {
259 assertEquals(2, w.getNodes().size());
260 assertEquals(5, w.getNode(0).getId());
261 assertEquals(6, w.getNode(1).getId());
262 }
263 }
264
265 private List<PrimitiveData> createTestData() {
266 NodeData node1 = createTestNode(5);
267 NodeData node2 = createTestNode(6);
268 WayData way = new WayData();
269 way.put("test", "test");
270 way.setNodeIds(Arrays.asList(node1.getId(), node2.getId()));
271 List<PrimitiveData> testData = Arrays.<PrimitiveData>asList(node1, node2, way);
272 return testData;
273 }
274
275 private NodeData createTestNode(int id) {
276 NodeData node1 = new NodeData();
277 node1.setCoor(LatLon.ZERO);
278 node1.put("test", "test");
279 node1.setId(id);
280 return node1;
281 }
282
283 /**
284 * Unit test of methods {@link AddPrimitivesCommand#equals} and {@link AddPrimitivesCommand#hashCode}.
285 */
286 @Test
287 public void testEqualsContract() {
288 TestUtils.assumeWorkingEqualsVerifier();
289 EqualsVerifier.forClass(AddPrimitivesCommand.class).usingGetClass()
290 .withPrefabValues(DataSet.class,
291 new DataSet(), new DataSet())
292 .withPrefabValues(User.class,
293 User.createOsmUser(1, "foo"), User.createOsmUser(2, "bar"))
294 .withPrefabValues(OsmDataLayer.class,
295 new OsmDataLayer(new DataSet(), "1", null), new OsmDataLayer(new DataSet(), "2", null))
296 .suppress(Warning.NONFINAL_FIELDS)
297 .verify();
298 }
299}
Note: See TracBrowser for help on using the repository browser.