// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.datatransfer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.awt.GraphicsEnvironment;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import org.junit.Rule;
import org.junit.Test;
import org.openstreetmap.josm.testutils.JOSMTestRules;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
/**
* Basic tests for the clipboard utils class.
* @author Michael Zangl
*/
public class ClipboardUtilsTest {
private static final class ThrowIllegalStateClipboard extends Clipboard {
private int failingAccesses = 3;
private ThrowIllegalStateClipboard(String name) {
super(name);
}
@Override
public synchronized Transferable getContents(Object requestor) {
if (failingAccesses >= 0) {
failingAccesses--;
throw new IllegalStateException();
}
return super.getContents(requestor);
}
protected synchronized void setFailingAccesses(int failingAccesses) {
this.failingAccesses = failingAccesses;
}
}
private static final class SupportNothingTransferable implements Transferable {
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return false;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[0];
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
throw new UnsupportedFlavorException(flavor);
}
}
/**
* No dependencies
*/
@Rule
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
public JOSMTestRules test = new JOSMTestRules();
/**
* Test {@link ClipboardUtils#getClipboard()}
*/
@Test
public void testGetClipboard() {
Clipboard c = ClipboardUtils.getClipboard();
assertNotNull(c);
assertSame(c, ClipboardUtils.getClipboard());
}
/**
* Test {@link ClipboardUtils#copyString(String)} and {@link ClipboardUtils#getClipboardStringContent()}
*/
@Test
public void testCopyPasteString() {
ClipboardUtils.copyString("");
assertEquals("", ClipboardUtils.getClipboardStringContent());
ClipboardUtils.copyString("xxx\nx");
assertEquals("xxx\nx", ClipboardUtils.getClipboardStringContent());
ClipboardUtils.copy(new SupportNothingTransferable());
assertEquals(null, ClipboardUtils.getClipboardStringContent());
}
/**
* Test that {@link ClipboardUtils#getClipboardContent(Clipboard)} handles illegal state exceptions
*/
@Test
public void testGetContentIllegalState() {
ThrowIllegalStateClipboard throwingClipboard = new ThrowIllegalStateClipboard("test");
throwingClipboard.setContents(new StringSelection(""), null);
Transferable content = ClipboardUtils.getClipboardContent(throwingClipboard);
assertTrue(content.isDataFlavorSupported(DataFlavor.stringFlavor));
throwingClipboard.setFailingAccesses(50);
content = ClipboardUtils.getClipboardContent(new ThrowIllegalStateClipboard("test"));
assertNull(content);
}
/**
* Test that {@link ClipboardUtils#getSystemSelection()} works in headless mode.
*/
@Test
public void testSystemSelectionDoesNotFail() {
assertTrue(GraphicsEnvironment.isHeadless());
assertNull(ClipboardUtils.getSystemSelection());
}
}