/* * $Id$ * * Copyright 2010 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; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.sameInstance; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import java.awt.Color; import javax.swing.ListCellRenderer; import org.jdesktop.swingx.JXComboBox.DelegatingRenderer; import org.jdesktop.swingx.JXListTest.CustomDefaultRenderer; import org.jdesktop.swingx.decorator.ComponentAdapter; import org.jdesktop.swingx.decorator.ComponentAdapterTest.JXListT; import org.jdesktop.swingx.renderer.DefaultListRenderer; import org.jdesktop.swingx.renderer.StringValue; import org.jdesktop.swingx.renderer.StringValues; import org.jdesktop.swingx.sort.StringValueRegistry; import org.jdesktop.test.AncientSwingTeam; import org.jdesktop.test.EDTRunner; import org.jdesktop.test.PropertyChangeReport; import org.jdesktop.test.TestUtils; import org.junit.Test; import org.junit.runner.RunWith; /** * Unit tests for JXComboBox. * * @author kschaefer */ @RunWith(EDTRunner.class) public class JXComboBoxTest { /** * test convenience method accessing the configured adapter. */ @Test public void testConfiguredComponentAdapter() { JXComboBox combo = new JXComboBox(new Object[] {1, 2, 3}); ComponentAdapter adapter = combo.getComponentAdapter(); assertThat(adapter.column, is(0)); assertThat(adapter.row, is(0)); // corrupt adapter adapter.row = 1; adapter.column = 1; adapter = combo.getComponentAdapter(0); assertThat(adapter.column, is(0)); assertThat(adapter.row, is(0)); } /** * test that swingx renderer is used by default. */ @Test public void testDefaultListRenderer() { JXComboBox combo = new JXComboBox(); ListCellRenderer renderer = ((DelegatingRenderer) combo.getRenderer()).getDelegateRenderer(); assertThat(renderer, is(instanceOf(DefaultListRenderer.class))); } /** * Delegating renderer must create combo box's default. * <p> * Delegating has default from combo box initially, here: default default. */ @Test public void testDelegatingRendererUseDefault() { JXComboBox combo = new JXComboBox(); ListCellRenderer defaultRenderer = combo.createDefaultCellRenderer(); assertThat(defaultRenderer, is(instanceOf(DefaultListRenderer.class))); DelegatingRenderer renderer = (DelegatingRenderer) combo.getRenderer(); assertThat(renderer.getDelegateRenderer(), is(instanceOf(defaultRenderer.getClass()))); } /** * Delegating renderer must create combo box's default. * <p> * Delegating has default from combo box initially, here: custom default. */ @Test public void testDelegatingRendererUseCustomDefault() { JXComboBox combo = new JXComboBox() { @Override protected ListCellRenderer createDefaultCellRenderer() { return new CustomDefaultRenderer(); } }; ListCellRenderer defaultRenderer = combo.createDefaultCellRenderer(); assertThat(defaultRenderer, is(instanceOf(CustomDefaultRenderer.class))); ListCellRenderer renderer = ((DelegatingRenderer) combo.getRenderer()).getDelegateRenderer(); assertThat(renderer, is(instanceOf(CustomDefaultRenderer.class))); } /** * Delegating renderer must create combo box's default. * <p> * Delegating has default from combo box initially, here: default default. */ @Test public void testDelegatingRendererUseDefaultSetNull() { JXComboBox combo = new JXComboBox(); ListCellRenderer defaultRenderer = combo.createDefaultCellRenderer(); DelegatingRenderer renderer = (DelegatingRenderer) combo.getRenderer(); combo.setRenderer(null); assertThat(renderer.getDelegateRenderer(), is(instanceOf(defaultRenderer.getClass()))); } /** * Delegating renderer must create combo box's default. * <p> * Delegating has default from list initially, here: custom default. */ @Test public void testDelegatingRendererUseCustomDefaultSetNull() { JXComboBox combo = new JXComboBox() { @Override protected ListCellRenderer createDefaultCellRenderer() { return new CustomDefaultRenderer(); } }; ListCellRenderer defaultRenderer = combo.createDefaultCellRenderer(); DelegatingRenderer renderer = (DelegatingRenderer) combo.getRenderer(); combo.setRenderer(null); assertThat(renderer.getDelegateRenderer(), is(instanceOf(defaultRenderer.getClass()))); } /** * JXComboBox must fire property change on setRenderer. */ @Test public void testRendererNotification() { JXComboBox combo = new JXComboBox(); assertThat(combo.getRenderer(), is(notNullValue())); PropertyChangeReport report = new PropertyChangeReport(combo); // very first setting: fires twice ... a bit annoying but ... waiting for complaints ;-) combo.setRenderer(new DefaultListRenderer()); TestUtils.assertPropertyChangeEvent(report, "renderer", null, combo.getRenderer()); } /** * Delegating renderer must create list's default. * <p> * Consistent API: expose wrappedRenderer the same way as wrappedModel */ @Test public void testWrappedRendererDefault() { JXComboBox combo = new JXComboBox(); DelegatingRenderer renderer = (DelegatingRenderer) combo.getRenderer(); assertThat(renderer.getDelegateRenderer(), is(sameInstance(combo.getWrappedRenderer()))); } /** * Delegating renderer must create list's default. * <p> * Consistent API: expose wrappedRenderer the same way as wrappedModel */ @Test public void testWrappedRendererCustom() { JXComboBox combo = new JXComboBox(); ListCellRenderer custom = new DefaultListRenderer(); combo.setRenderer(custom); assertThat(custom, is(sameInstance(combo.getWrappedRenderer()))); } private StringValue createColorStringValue() { StringValue sv = new StringValue() { public String getString(Object value) { if (value instanceof Color) { Color color = (Color) value; return "R/G/B: " + color.getRGB(); } return StringValues.TO_STRING.getString(value); } }; return sv; } /** * Issue #1382-swingx: use StringValueRegistry and supply getStringAt. * <p> * Here: test updates on renderer change. */ @Test public void testStringValueRegistryFromRendererChange() { JXComboBox combo = new JXComboBox(AncientSwingTeam.createNamedColorComboBoxModel()); StringValueRegistry provider = combo.getStringValueRegistry(); combo.setRenderer(new DefaultListRenderer(createColorStringValue())); assertEquals(combo.getWrappedRenderer(), provider.getStringValue(0, 0)); } /** * Issue #1382-swingx: use StringValueRegistry and supply getStringAt. * * Here: test getStringAt use provider (sanity, trying to pull the rag failed * during re-enable) */ @Test public void testStringAtUseProvider() { JXComboBox combo = new JXComboBox(AncientSwingTeam.createNamedColorComboBoxModel()); combo.setRenderer(new DefaultListRenderer(createColorStringValue())); combo.getStringValueRegistry().setStringValue(StringValues.TO_STRING, 0); assertEquals(StringValues.TO_STRING.getString(combo.getItemAt(0)), combo.getStringAt(0)); } /** * Issue #1382-swingx: use StringValueRegistry and supply getStringAt. * * Here: test getStringAt of ComponentAdapter use provider * (sanity, trying to pull the rag failed during re-enable) */ @Test public void testStringAtComponentAdapterUseProvider() { JXComboBox combo = new JXComboBox(AncientSwingTeam.createNamedColorComboBoxModel()); combo.setRenderer(new DefaultListRenderer(createColorStringValue())); combo.getStringValueRegistry().setStringValue(StringValues.TO_STRING, 0); ComponentAdapter adapter = combo.getComponentAdapter(); assertEquals(StringValues.TO_STRING.getString(combo.getItemAt(0)), adapter.getStringAt(0, 0)); } }