// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.command;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.openstreetmap.josm.command.CommandTest.CommandTestData;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.User;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.testutils.JOSMTestRules;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import nl.jqno.equalsverifier.EqualsVerifier;
import nl.jqno.equalsverifier.Warning;
/**
* Unit tests of {@link ChangePropertyKeyCommand} class.
*/
public class ChangePropertyKeyCommandTest {
/**
* We need prefs for nodes.
*/
@Rule
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
private CommandTestData testData;
/**
* Set up the test data.
*/
@Before
public void createTestData() {
testData = new CommandTestData();
}
/**
* Tests that a key is changed.
*/
@Test
public void testChangeKeySingle() {
assertTrue(new ChangePropertyKeyCommand(testData.existingNode, "existing", "newKey").executeCommand());
assertNull(testData.existingNode.get("existing"));
assertEquals("existing", testData.existingNode.get("newKey"));
assertTrue(testData.existingNode.isModified());
}
/**
* Tests that a key is changed.
*/
@Test
public void testChangeKey() {
assertTrue(new ChangePropertyKeyCommand(Arrays.asList(testData.existingNode, testData.existingWay), "existing",
"newKey").executeCommand());
assertNull(testData.existingNode.get("existing"));
assertEquals("existing", testData.existingNode.get("newKey"));
assertTrue(testData.existingNode.isModified());
assertNull(testData.existingWay.get("existing"));
assertEquals("existing", testData.existingWay.get("newKey"));
assertTrue(testData.existingWay.isModified());
}
/**
* Tests that nop operations are ignored.
*/
@Test
public void testChangeKeyIgnored() {
Node node1 = testData.createNode(15);
node1.removeAll();
Node node2 = testData.createNode(16);
Node node3 = testData.createNode(17);
assertTrue(new ChangePropertyKeyCommand(Arrays.asList(node1, node2), "nonexisting", "newKey").executeCommand());
assertFalse(node1.isModified());
assertFalse(node2.isModified());
assertTrue(new ChangePropertyKeyCommand(Arrays.asList(node1, node2), "existing", "newKey").executeCommand());
assertFalse(node1.isModified());
assertTrue(node2.isModified());
// removes existing
assertTrue(new ChangePropertyKeyCommand(Arrays.asList(node1, node3), "newKey", "existing").executeCommand());
assertFalse(node1.isModified());
assertTrue(node3.isModified());
assertNull(node3.get("newKey"));
assertNull(node3.get("existing"));
}
/**
* Test {@link ChangePropertyKeyCommand#getDescriptionText()}
*/
@Test
public void testDescription() {
Node node1 = testData.createNode(15);
node1.put("name", "xy");
assertTrue(new ChangePropertyKeyCommand(node1, "a", "b").getDescriptionText()
.matches("Replace \"a\" by \"b\" for.*xy.*"));
assertTrue(new ChangePropertyKeyCommand(Arrays.asList(node1, testData.existingNode), "a", "b")
.getDescriptionText().matches("Replace \"a\" by \"b\" for 2 objects"));
}
/**
* Test {@link ChangePropertyCommand#getChildren()}
*/
@Test
public void testChildren() {
Node node1 = testData.createNode(15);
Node node2 = testData.createNode(16);
node1.put("name", "node1");
node2.put("name", "node2");
ArrayList<Node> nodesToExpect = new ArrayList<>(Arrays.asList(node1, node2));
assertNull(new ChangePropertyKeyCommand(node1, "a", "b").getChildren());
Collection<PseudoCommand> children = new ChangePropertyKeyCommand(Arrays.asList(node1, node2), "a", "b").getChildren();
assertEquals(2, children.size());
for (PseudoCommand c : children) {
assertNull(c.getChildren());
Collection<? extends OsmPrimitive> part = c.getParticipatingPrimitives();
assertEquals(1, part.size());
OsmPrimitive node = part.iterator().next();
assertTrue(nodesToExpect.remove(node));
assertTrue(c.getDescriptionText().contains(node.getName()));
}
}
/**
* Unit test of methods {@link ChangePropertyKeyCommand#equals} and {@link ChangePropertyKeyCommand#hashCode}.
*/
@Test
public void testEqualsContract() {
EqualsVerifier.forClass(ChangePropertyKeyCommand.class).usingGetClass()
.withPrefabValues(DataSet.class,
new DataSet(), new DataSet())
.withPrefabValues(User.class,
User.createOsmUser(1, "foo"), User.createOsmUser(2, "bar"))
.withPrefabValues(OsmDataLayer.class,
new OsmDataLayer(new DataSet(), "1", null), new OsmDataLayer(new DataSet(), "2", null))
.suppress(Warning.NONFINAL_FIELDS)
.verify();
}
}