// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.dialogs.relation.actions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
import java.util.Set;
import org.junit.Test;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.data.osm.RelationMember;
import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
import org.openstreetmap.josm.gui.datatransfer.RelationMemberTransferable;
import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData;
import org.openstreetmap.josm.gui.util.GuiHelper;
/**
* Test for {@link PasteMembersAction}
* @author Michael Zangl
*/
public class PasteMembersActionTest extends AbstractRelationEditorActionTest {
/**
* Test {@link PasteMembersAction#isEnabled()}
*/
@Test
public void testEnabledState() {
copyString();
PasteMembersAction action = new PasteMembersAction(memberTable, layer, editor);
ClipboardUtils.getClipboard().addFlavorListener(action);
try {
assertFalse(action.isEnabled());
Node node = new Node();
copyNode(node);
syncListener();
assertTrue(action.isEnabled());
copyMember(node);
syncListener();
assertTrue(action.isEnabled());
copyString();
syncListener();
assertFalse(action.isEnabled());
} finally {
ClipboardUtils.getClipboard().removeFlavorListener(action);
}
}
private void syncListener() {
GuiHelper.runInEDTAndWait(() -> {
// nop
});
}
/**
* Test that pasting produces the result required
*/
@Test
public void testActionWrongClipboard() {
copyString();
PasteMembersAction action = new PasteMembersAction(memberTable, layer, editor);
action.actionPerformed(null);
Relation relation = new Relation(1);
memberTableModel.applyToRelation(relation);
assertEquals(0, relation.getMembersCount());
}
/**
* Test that pasting produces the result required
*/
@Test
public void testActionForMembers() {
Node testNode = new Node(10);
layer.data.addPrimitive(testNode);
copyMember(testNode);
PasteMembersAction action = new PasteMembersAction(memberTable, layer, editor);
action.actionPerformed(null);
Relation relation = new Relation(1);
memberTableModel.applyToRelation(relation);
assertEquals(1, relation.getMembersCount());
assertEquals("test", relation.getMember(0).getRole());
assertSame(testNode, relation.getMember(0).getMember());
}
/**
* Test that pasting primitvies produces the result required
*/
@Test
public void testActionForPrimitives() {
Node testNode = new Node(10);
layer.data.addPrimitive(testNode);
copyNode(testNode);
PasteMembersAction action = new PasteMembersAction(memberTable, layer, editor);
action.actionPerformed(null);
Relation relation = new Relation(1);
memberTableModel.applyToRelation(relation);
assertEquals(1, relation.getMembersCount());
assertEquals("", relation.getMember(0).getRole());
assertSame(testNode, relation.getMember(0).getMember());
}
private void copyNode(Node node) {
PrimitiveTransferData data = PrimitiveTransferData.getData(Collections.singleton(node));
ClipboardUtils.copy(new PrimitiveTransferable(data));
}
private void copyMember(Node node) {
Set<RelationMember> members = Collections.singleton(new RelationMember("test", node));
ClipboardUtils.copy(new RelationMemberTransferable(members));
}
private void copyString() {
ClipboardUtils.copyString("");
}
}