/*
* $Id$
*
* Copyright 2007 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
package org.jdesktop.swingx.decorator;
import java.awt.Color;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.UIManager;
import org.jdesktop.swingx.InteractiveTestCase;
import org.jdesktop.swingx.renderer.JRendererLabel;
import org.jdesktop.test.ChangeReport;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Test CompoundHighlighter.
*
* @author Jeanette Winzenburg
*/
@RunWith(JUnit4.class)
public class CompoundHighlighterTest extends InteractiveTestCase {
@SuppressWarnings("unused")
private static final Logger LOG = Logger
.getLogger(CompoundHighlighterTest.class.getName());
protected JLabel backgroundNull ;
protected JLabel foregroundNull;
protected JLabel allNull;
protected JRendererLabel allColored;
protected Color background = Color.RED;
protected Color foreground = Color.BLUE;
protected Color unselectedBackground = Color.CYAN;
protected Color unselectedForeground = Color.GREEN;
protected Color selectedBackground = Color.LIGHT_GRAY;
protected Color selectedForeground = Color.MAGENTA;
protected ColorHighlighter emptyHighlighter;
// flag used in setup to explicitly choose LF
protected boolean defaultToSystemLF;
@Override
protected void setUp() {
backgroundNull = new JLabel("test");
backgroundNull.setForeground(foreground);
backgroundNull.setBackground(null);
foregroundNull = new JLabel("test");
foregroundNull.setForeground(null);
foregroundNull.setBackground(background);
allNull = new JLabel("test");
allNull.setForeground(null);
allNull.setBackground(null);
allColored = new JRendererLabel();
allColored.setText("test");
allColored.setForeground(foreground);
allColored.setBackground(background);
allColored.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
emptyHighlighter = new ColorHighlighter();
// make sure we have the same default for each test
defaultToSystemLF = false;
setSystemLF(defaultToSystemLF);
}
/**
* Test that the client is messaged on change to a managed Highlighter.
*/
@Test
public void testUpdateUI() {
CompoundHighlighter support = new CompoundHighlighter();
// force loading of striping colors
ColorHighlighter colorHighlighter = (ColorHighlighter) HighlighterFactory.createSimpleStriping();
Color uiColor = UIManager.getColor("UIColorHighlighter.stripingBackground");
if (uiColor == null) {
LOG.info("cannot run test - no ui striping color");
return;
}
assertSame("sanity", uiColor, colorHighlighter.getBackground());
support.addHighlighter(colorHighlighter);
Color changedUIColor = Color.RED;
UIManager.put("UIColorHighlighter.stripingBackground", changedUIColor);
support.updateUI();
try {
assertSame("support must update ui color", changedUIColor, colorHighlighter.getBackground());
} finally {
UIManager.put("UIColorHighlighter.stripingBackground", uiColor);
}
}
/**
*
* Test that setting zero highlighter removes all.
*/
@Test
public void testSetHighlightersReset() {
CompoundHighlighter support = new CompoundHighlighter();
support.addHighlighter(new ColorHighlighter());
// sanity
assertEquals(1, support.getHighlighters().length);
support.setHighlighters();
assertEquals(0, support.getHighlighters().length);
}
/**
*
* Test that setting zero highlighter removes all.
*/
@Test
public void testSetHighlightersResetRemoveListeners() {
CompoundHighlighter support = new CompoundHighlighter();
ColorHighlighter colorHighlighter = new ColorHighlighter();
support.addHighlighter(colorHighlighter);
// sanity
assertEquals(1, support.getHighlighters().length);
ChangeReport report = new ChangeReport();
support.addChangeListener(report);
support.setHighlighters();
assertEquals(0, support.getHighlighters().length);
assertEquals("compound must fire on modification", 1, report.getEventCount());
report.clear();
colorHighlighter.setBackground(Color.RED);
assertEquals("compound must have removed listener", 0, report.getEventCount());
}
/**
*
* Test that setting zero highlighter removes all.
*/
@Test
public void testSetHighlightersResetSingleEvent() {
ColorHighlighter colorHighlighter = new ColorHighlighter();
CompoundHighlighter support = new CompoundHighlighter(colorHighlighter, new ColorHighlighter());
// sanity
assertEquals(2, support.getHighlighters().length);
ChangeReport report = new ChangeReport();
support.addChangeListener(report);
support.setHighlighters();
assertEquals(0, support.getHighlighters().length);
assertEquals("compound must fire on modification", 1, report.getEventCount());
}
/**
*
* Test that setting zero highlighter removes all.
*/
@Test
public void testSetHighlightersSingleEvent() {
ColorHighlighter colorHighlighter = new ColorHighlighter();
CompoundHighlighter support = new CompoundHighlighter();
ChangeReport report = new ChangeReport();
support.addChangeListener(report);
support.setHighlighters(colorHighlighter, new ColorHighlighter());
assertEquals(2, support.getHighlighters().length);
assertEquals("compound must fire on modification", 1, report.getEventCount());
}
/**
*
* Test that setting zero Highlighters on empty compound does not fire.
*/
@Test
public void testSetHighlightersResetEmptyNoEvent() {
CompoundHighlighter support = new CompoundHighlighter();
ChangeReport report = new ChangeReport();
support.addChangeListener(report);
support.setHighlighters();
assertEquals(0, support.getHighlighters().length);
assertEquals("compound must not fire without modification", 0, report.getEventCount());
}
/**
* Sanity: handles empty array.
*/
@Test
public void testSetHighlightersEmptyArray() {
CompoundHighlighter support = new CompoundHighlighter();
support.setHighlighters(new Highlighter[] {});
assertEquals(0, support.getHighlighters().length);
assertSame(CompoundHighlighter.EMPTY_HIGHLIGHTERS, support.getHighlighters());
}
/**
* test if removeHighlighter behaves as doc'ed.
*
*/
@Test
public void testTableRemoveHighlighter() {
CompoundHighlighter support = new CompoundHighlighter();
// test cope with null
support.removeHighlighter(null);
Highlighter presetHighlighter = new ColorHighlighter();
support.setHighlighters(presetHighlighter);
Highlighter[] highlighters = support.getHighlighters();
// sanity
assertEquals(1, highlighters.length);
// remove uncontained
support.removeHighlighter(new ColorHighlighter());
// assert no change
assertSameContent(highlighters, support.getHighlighters());
support.removeHighlighter(presetHighlighter);
assertEquals(0, support.getHighlighters().length);
}
/**
* test if addHighlighter behaves as doc'ed.
*
*/
@Test
public void testTableAddHighlighter() {
CompoundHighlighter support = new CompoundHighlighter();
Highlighter presetHighlighter = new ColorHighlighter();
// add the first
support.addHighlighter(presetHighlighter);
// assert that it is added
assertEquals(1, support.getHighlighters().length);
assertAsLast(support.getHighlighters(), presetHighlighter);
Highlighter highlighter = new ColorHighlighter();
// add the second
support.addHighlighter(highlighter);
assertEquals(2, support.getHighlighters().length);
// assert that it is appended
assertAsLast(support.getHighlighters(), highlighter);
}
/**
* Test strict enforcement of not null allowed in setHighlighters.
*/
@Test
public void testSetHighlightersNull() {
CompoundHighlighter table = new CompoundHighlighter();
try {
table.setHighlighters((Highlighter) null);
fail("illegal to call setHighlighters(null)");
} catch (NullPointerException e) {
// expected
}
}
/**
* Test strict enforcement of not null allowed in setHighlighters.
*/
@Test
public void testSetHighlightersWithNullArray() {
CompoundHighlighter table = new CompoundHighlighter();
try {
table.setHighlighters((Highlighter[]) null);
fail("illegal to call setHighlighters(null)");
} catch (NullPointerException e) {
// expected
}
}
/**
* Test strict enforcement of not null allowed in setHighlighters.
*/
@Test
public void testSetHighlightersArrayNullElement() {
CompoundHighlighter table = new CompoundHighlighter();
try {
table.setHighlighters(new Highlighter[] {null});
fail("illegal to call setHighlighters(null)");
} catch (NullPointerException e) {
// expected
}
}
//----------------------- CompoundHighlighter
/**
* there had been exceptions when adding/removing highlighters to/from
* an initially empty pipeline.
*/
@Test
public void testAddToEmptyCompoundHiglighter() {
CompoundHighlighter pipeline = new CompoundHighlighter();
pipeline.addHighlighter(new ColorHighlighter());
}
@Test
public void testRemoveFromEmptyCompoundHighlighter() {
CompoundHighlighter pipeline = new CompoundHighlighter();
pipeline.removeHighlighter(new ColorHighlighter());
}
@Test
public void testApplyEmptyCompoundHighlighter() {
CompoundHighlighter pipeline = new CompoundHighlighter();
pipeline.highlight(new JLabel(), createComponentAdapter(new JLabel(), false));
}
/*
*/
@Test
public void testAddRemoveHighlighter() {
CompoundHighlighter pipeline = new CompoundHighlighter(
new ColorHighlighter(Color.white, new Color(0xF0, 0xF0, 0xE0)),
new ColorHighlighter(null, foreground)
);
ColorHighlighter hl = new ColorHighlighter(Color.blue, Color.red);
ColorHighlighter hl2 = new ColorHighlighter(Color.white, Color.black);
// added highlighter should be appended
pipeline.addHighlighter(hl);
Highlighter[] hls = pipeline.getHighlighters();
assertTrue(hls.length == 3);
assertTrue(hls[2] == hl);
// added highlighter should be prepended
pipeline.addHighlighter(hl2, true);
hls = pipeline.getHighlighters();
assertTrue(hls.length == 4);
assertTrue(hls[0] == hl2);
// remove highlighter
pipeline.removeHighlighter(hl);
hls = pipeline.getHighlighters();
assertTrue(hls.length == 3);
for (int i = 0; i < hls.length; i++) {
assertTrue(hls[i] != hl);
}
// remove another highligher
pipeline.removeHighlighter(hl2);
hls = pipeline.getHighlighters();
assertTrue(hls.length == 2);
for (int i = 0; i < hls.length; i++) {
assertTrue(hls[i] != hl2);
}
}
//----------------- testing change notification of pipeline
/**
* @todo - how to handle same highlighter inserted more than once?
*/
@Test
public void testCompoundHighlighterWithDuplicates() {
}
/**
* test doc'ed NPE when adding null Highlighter.
*
*/
@Test
public void testCompoundHighlighterAddNull() {
CompoundHighlighter pipeline = new CompoundHighlighter();
try {
pipeline.addHighlighter(null);
fail("compoundHighlighter must not accept null highlighter");
} catch(NullPointerException ex) {
}
ComponentAdapter adapter = createComponentAdapter(allColored, false);
// was added even with NPE.
pipeline.highlight(allColored, adapter);
}
@Test
public void testCompoundHighlighterChange() {
ColorHighlighter highlighter = new ColorHighlighter();
CompoundHighlighter pipeline = new CompoundHighlighter();
ChangeReport changeReport = new ChangeReport();
pipeline.addChangeListener(changeReport);
int count = changeReport.getEventCount();
pipeline.addHighlighter(highlighter);
assertEquals("event count must be increased", ++count, changeReport.getEventCount() );
assertCompoundHighlighterChange(highlighter, pipeline, changeReport);
}
@Test
public void testCompoundHighlighterChangeConstructor() {
ColorHighlighter highlighter = new ColorHighlighter();
CompoundHighlighter pipeline = new CompoundHighlighter(highlighter);
ChangeReport changeReport = new ChangeReport();
pipeline.addChangeListener(changeReport);
assertCompoundHighlighterChange(highlighter, pipeline, changeReport);
}
private void assertCompoundHighlighterChange(ColorHighlighter highlighter, CompoundHighlighter pipeline, ChangeReport changeReport) {
int count = changeReport.getEventCount();
highlighter.setBackground(Color.red);
assertEquals("event count must be increased", ++count, changeReport.getEventCount() );
assertEquals("event source must be pipeline", pipeline, changeReport.getLastEvent().getSource());
pipeline.removeHighlighter(highlighter);
assertEquals("event count must be increased", ++count, changeReport.getEventCount() );
pipeline.removeHighlighter(highlighter);
assertEquals("event count must not be increased", count, changeReport.getEventCount() );
highlighter.setBackground(Color.BLUE);
assertEquals("event count must not be increased", count, changeReport.getEventCount() );
}
/**
* Same content in both.
* @param highlighters
* @param highlighters2
*/
private void assertSameContent(Highlighter[] highlighters, Highlighter[] highlighters2) {
assertEquals(highlighters.length, highlighters2.length);
for (int i = 0; i < highlighters.length; i++) {
assertSame("must contain same element", highlighters[i], highlighters2[i]);
}
}
/**
* Last in list.
*
* @param highlighters
* @param highlighter
*/
private void assertAsLast(Highlighter[] highlighters, Highlighter highlighter) {
assertTrue("pipeline must not be empty", highlighters.length > 0);
assertSame("highlighter must be added as last", highlighter, highlighters[highlighters.length - 1]);
}
// --------------------- factory methods
/**
* Creates and returns a ComponentAdapter on the given
* label with the unselected state.
*
* @param label
* @param selected
* @return
*/
protected ComponentAdapter createComponentAdapter(final JLabel label) {
return createComponentAdapter(label, false);
}
/**
* Creates and returns a ComponentAdapter on the given
* label with the specified selection state.
*
* @param label
* @param selected
* @return
*/
protected ComponentAdapter createComponentAdapter(final JLabel label, final boolean selected) {
ComponentAdapter adapter = new ComponentAdapter(label) {
@Override
public Object getValueAt(int row, int column) {
return label.getText();
}
@Override
public Object getFilteredValueAt(int row, int column) {
return getValueAt(row, column);
}
@Override
public Object getValue() {
return getValueAt(row, column);
}
@Override
public boolean isCellEditable(int row, int column) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean hasFocus() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isEditable() {
return false;
}
@Override
public boolean isSelected() {
return selected;
}
@Override
public String getColumnName(int columnIndex) {
return null;
}
};
return adapter;
}
}