/* * $Id$ * * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. */ package org.jdesktop.swingx; import java.awt.GraphicsEnvironment; import java.awt.event.ActionEvent; import java.awt.event.MouseListener; import java.util.logging.Logger; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.plaf.UIResource; import junit.framework.TestCase; import org.jdesktop.swingx.hyperlink.AbstractHyperlinkAction; import org.jdesktop.swingx.hyperlink.HyperlinkAction; import org.jdesktop.swingx.plaf.basic.BasicHyperlinkUI.BasicHyperlinkListener; import org.jdesktop.test.PropertyChangeReport; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Test of JXHyperlink. Raw usage and as hyperlinkRenderer. * <p> * * @author Jeanette Winzenburg */ @RunWith(JUnit4.class) public class JXHyperlinkTest extends TestCase { @SuppressWarnings("all") private static final Logger LOG = Logger.getLogger(JXHyperlinkTest.class .getName()); private PropertyChangeReport report; @Before public void setUpJ4() throws Exception { setUp(); } @After public void tearDownJ4() throws Exception { tearDown(); } @Test public void testSetURI() { // This test will not work in a headless configuration. if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run ui test - headless environment"); return; } JXHyperlink hyperlink = new JXHyperlink(); hyperlink.setURI(null); assertNotNull(hyperlink.getAction()); assertTrue(hyperlink.getAction() instanceof HyperlinkAction); } @Test public void testBorderUIResource() { JXHyperlink hyperlink = new JXHyperlink(); if (!(hyperlink.getBorder() instanceof UIResource)) { LOG.info("not running test, LAF doesn't install hyperlink border"); return; } Border border = new EmptyBorder(1, 2, 3, 4); hyperlink.setBorder(border); hyperlink.updateUI(); assertSame("border untouched in updateUI ", border, hyperlink.getBorder()); } @Test public void testHyperlinkButtonListener() { JXHyperlink hyperlink = new JXHyperlink(); MouseListener[] listeners = hyperlink.getMouseListeners(); for (MouseListener mouseListener : listeners) { if(mouseListener instanceof BasicHyperlinkListener) return; } fail("hyperlink must have installed a BasicHyperlinkListener"); } /** * test control of the clicked property. * * Default behaviour * * */ @Test public void testAutoClicked() { // no action JXHyperlink hyperlink = new JXHyperlink(); hyperlink.doClick(); assertTrue("hyperlink autoClicks if it has no action", hyperlink.isClicked()); AbstractHyperlinkAction<Object> emptyAction = createEmptyLinkAction(); JXHyperlink hyperlink2 = new JXHyperlink(emptyAction); hyperlink2.doClick(); assertFalse(emptyAction.isVisited()); assertFalse("hyperlink does nothing if has action", hyperlink2.isClicked()); AbstractHyperlinkAction<?> emptyAction3 = createEmptyLinkAction(); JXHyperlink hyperlink3 = new JXHyperlink(emptyAction3); hyperlink3.setOverrulesActionOnClick(true); hyperlink3.doClick(); assertFalse(emptyAction.isVisited()); assertTrue("hyperlink overrules action", hyperlink3.isClicked()); } @Test public void testOverrulesActionOnClick() { JXHyperlink hyperlink = new JXHyperlink(); assertFalse(hyperlink.getOverrulesActionOnClick()); hyperlink.addPropertyChangeListener(report); hyperlink.setOverrulesActionOnClick(true); assertTrue(hyperlink.getOverrulesActionOnClick()); assertEquals(1, report.getEventCount("overrulesActionOnClick")); } /** * sanity (duplicate of LinkActionTest method) to * guarantee that hyperlink is updated as expected. * */ @Test public void testLinkActionSetTarget() { AbstractHyperlinkAction<Object> linkAction = createEmptyLinkAction(); linkAction.setVisited(true); JXHyperlink hyperlink = new JXHyperlink(linkAction); Object target = new Object(); linkAction.setTarget(target); assertEquals(linkAction.getName(), hyperlink.getText()); assertFalse(hyperlink.isClicked()); } /** * test that hyperlink.setClicked doesn't change action.isVisited(); * */ @Test public void testSetClickedActionUnchanged() { AbstractHyperlinkAction<Object> linkAction = createEmptyLinkAction(); linkAction.setVisited(true); JXHyperlink hyperlink = new JXHyperlink(linkAction); // sanity assert.. assertTrue(hyperlink.isClicked()); hyperlink.setClicked(false); // action state must be unchanged; assertTrue(linkAction.isVisited()); } /** * test hyperlink's clicked property. * */ @Test public void testClicked() { JXHyperlink hyperlink = new JXHyperlink(); boolean isClicked = hyperlink.isClicked(); assertFalse(isClicked); hyperlink.addPropertyChangeListener(report); hyperlink.setClicked(!isClicked); assertEquals(1, report.getEventCount("clicked")); } /** * JXHyperlink must handle null action gracefully. * * Was NPE in configureFromAction * */ @Test public void testInitNullAction() { JXHyperlink hyperlink = new JXHyperlink(); assertNull(hyperlink.getAction()); } /** * JXHyperlink must handle null action gracefully. * * Was NPE in configureFromAction * */ @Test public void testSetNullAction() { AbstractHyperlinkAction<?> action = createEmptyLinkAction(); JXHyperlink hyperlink = new JXHyperlink(action); assertEquals("hyperlink action must be equal to linkAction", action, hyperlink.getAction()); hyperlink.setAction(null); assertNull(hyperlink.getAction()); } /** * JXHyperlink must handle null action gracefully. * * Was NPE in configureFromAction * */ @Test public void testSetAction() { JXHyperlink hyperlink = new JXHyperlink(); AbstractHyperlinkAction<?> action = createEmptyLinkAction(); hyperlink.setAction(action); assertEquals("hyperlink action must be equal to linkAction", action, hyperlink.getAction()); } /** * test that JXHyperlink visited state keeps synched * to LinkAction. * */ @Test public void testListeningVisited() { AbstractHyperlinkAction<Object> linkAction = createEmptyLinkAction(); JXHyperlink hyperlink = new JXHyperlink(linkAction); // sanity: both are expected to be false assertEquals(linkAction.isVisited(), hyperlink.isClicked()); assertFalse(linkAction.isVisited()); linkAction.setVisited(!linkAction.isVisited()); assertEquals(linkAction.isVisited(), hyperlink.isClicked()); } /** * test initial visited state in JXHyperlink is synched to * linkAction given in constructor. * * There was the usual "init" problem with the constructor. * Solved by chaining. * */ @Test public void testInitialVisitedSynched() { AbstractHyperlinkAction<Object> linkAction = createEmptyLinkAction(); linkAction.setVisited(true); // sanity: linkAction is changed to true assertTrue(linkAction.isVisited()); JXHyperlink hyperlink = new JXHyperlink(linkAction); assertEquals(linkAction.isVisited(), hyperlink.isClicked()); } public static class Player { String name; int score; public Player(String name, int score) { this.name = name; this.score = score; } @Override public String toString() { return name + " has score: " + score; } } protected AbstractHyperlinkAction<Object> createEmptyLinkAction() { AbstractHyperlinkAction<Object> linkAction = new AbstractHyperlinkAction<Object>(null) { public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } }; return linkAction; } protected AbstractHyperlinkAction<?> createEmptyLinkAction(String name) { AbstractHyperlinkAction<?> linkAction = createEmptyLinkAction(); linkAction.setName(name); return linkAction; } @Override protected void setUp() throws Exception { super.setUp(); report = new PropertyChangeReport(); } }