blob: a0ceb685cd10945e7eadf6e05c583e8b349e2e39 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.tests.themes;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.internal.themes.ThemeElementHelper;
import org.eclipse.ui.internal.util.PrefUtil;
import org.eclipse.ui.themes.ITheme;
import org.eclipse.ui.themes.IThemeManager;
/**
* Tests the theme API.
*
* @since 3.0
*/
public class ThemeAPITest extends ThemeTest {
/**
*
*/
private static final String EXTENDED_THEME3 = "extendedTheme3";
/**
*
*/
private static final String EXTENDED_THEME2 = "extendedTheme2";
/**
*
*/
private static final String EXTENDED_THEME1 = "extendedTheme1";
/**
*
*/
private static final String PLATFORMFONT = "platformfont";
/**
*
*/
private static final String PLATFORMCOLOR = "platformcolor";
/**
*
*/
private static final String NOOVERRIDEFONT = "nooverridefont";
/**
*
*/
private static final String NOVALFONT = "novalfont";
/**
*
*/
private static final String DEFAULTEDFONT3 = "defaultedfont3";
/**
*
*/
private static final String DEFAULTEDFONT2 = "defaultedfont2";
/**
*
*/
private static final String DEFAULTEDFONT = "defaultedfont";
/**
*
*/
private static final String VALFONT = "valfont";
/**
*
*/
private static final String DEFAULTEDCOLOR3 = "defaultedcolor3";
/**
*
*/
private static final String DEFAULTEDCOLOR2 = "adefaultedcolor2";
/**
*
*/
private static final String VALUE2 = "value2";
/**
*
*/
private static final String OVERRIDE1 = "override1";
/**
*
*/
private static final String NOOVERRIDECOLOR = "nooverridecolor";
/**
*
*/
private static final String DEFAULTEDCOLOR = "defaultedcolor";
/**
*
*/
private static final String SWTCOLOR = "swtcolor";
/**
*
*/
private static final String FACTORYCOLOR = "factorycolor";
/**
*
*/
private static final String RGBCOLOR = "rgbcolor";
/**
*
*/
private static final String BOOL1 = "bool1";
/**
*
*/
private static final String BOGUSKEY = "BOGUSKEY";
/**
*
*/
private static final String INT1 = "int1";
/**
*
*/
private static final String DATA2 = "data2";
/**
*
*/
private static final String DATA1 = "data1";
/**
*
*/
private static final String BAD_COLOR1 = "badColor1";
/**
*
*/
private static final String BAD_COLOR2 = "badColor2";
/**
*
*/
private static final String BAD_COLOR3 = "badColor3";
/**
* @param testName
*/
public ThemeAPITest(String testName) {
super(testName);
}
private void checkEvents(ThemePropertyListener listener, Object source,
Object oldObject, Object newObject) {
boolean array = oldObject instanceof Object[];
List events = listener.getEvents();
assertEquals(2, events.size());
PropertyChangeEvent event = (PropertyChangeEvent) events.get(0);
assertEquals(source, event.getSource());
if (array) {
assertArrayEquals((Object[]) oldObject, (Object[]) event
.getOldValue());
assertArrayEquals((Object[]) newObject, (Object[]) event
.getNewValue());
} else {
assertEquals(oldObject, event.getOldValue());
assertEquals(newObject, event.getNewValue());
}
event = (PropertyChangeEvent) events.get(1);
assertEquals(source, event.getSource());
if (array) {
assertArrayEquals((Object[]) oldObject, (Object[]) event
.getNewValue());
assertArrayEquals((Object[]) newObject, (Object[]) event
.getOldValue());
} else {
assertEquals(oldObject, event.getNewValue());
assertEquals(newObject, event.getOldValue());
}
}
public void testBooleanDataConversion() {
ITheme defaultTheme = getDefaultTheme();
assertEquals(false, defaultTheme.getBoolean(DATA1));
assertEquals(false, defaultTheme.getBoolean(DATA2));
assertEquals(false, defaultTheme.getBoolean(INT1));
assertEquals(false, defaultTheme.getBoolean(BOGUSKEY));
assertEquals(true, defaultTheme.getBoolean(BOOL1));
}
public void testColorCascadeEvents() {
ITheme currentTheme = fManager.getCurrentTheme();
assertNotNull(currentTheme);
ThemePropertyListener managerListener = new ThemePropertyListener();
ThemePropertyListener themeListener = new ThemePropertyListener();
fManager.addPropertyChangeListener(managerListener);
currentTheme.addPropertyChangeListener(themeListener);
ColorRegistry colorRegistry = currentTheme.getColorRegistry();
RGB oldColor = colorRegistry.getRGB(RGBCOLOR);
RGB newColor = new RGB(121, 9, 121);
colorRegistry.put(RGBCOLOR, newColor);
colorRegistry.put(RGBCOLOR, oldColor);
checkEvents(managerListener, colorRegistry, oldColor, newColor);
checkEvents(themeListener, colorRegistry, oldColor, newColor);
fManager.removePropertyChangeListener(managerListener);
currentTheme.removePropertyChangeListener(themeListener);
}
public void testColorFactory() {
ITheme defaultTheme = getDefaultTheme();
assertEquals(TestColorFactory.RGB, defaultTheme.getColorRegistry()
.getRGB(FACTORYCOLOR));
}
public void testColorPreferenceListener_def_swtcolor() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme defaultTheme = getDefaultTheme();
testOverrideColorPreference(defaultTheme, store, SWTCOLOR);
}
public void testColorPreferenceListener_def_rgbcolor() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme defaultTheme = getDefaultTheme();
testOverrideColorPreference(defaultTheme, store, RGBCOLOR);
}
public void testColorPreferenceListener_def_defaultedcolor() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme defaultTheme = getDefaultTheme();
testOverrideColorPreference(defaultTheme, store, DEFAULTEDCOLOR);
}
public void testColorPreferenceListener_def_nooverridecolor() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme defaultTheme = getDefaultTheme();
testOverrideColorPreference(defaultTheme, store, NOOVERRIDECOLOR);
}
public void testColorPreferenceListener_th1_swtcolor() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme theme1 = getTheme1();
testOverrideColorPreference(theme1, store, SWTCOLOR);
}
public void testColorPreferenceListener_th1_rgbcolor() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme theme1 = getTheme1();
testOverrideColorPreference(theme1, store, RGBCOLOR);
}
public void testColorPreferenceListener_th1_defaultedcolor() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme theme1 = getTheme1();
testOverrideColorPreference(theme1, store, DEFAULTEDCOLOR);
}
public void testColorPreferenceListener_th1_nooverridecolor() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme theme1 = getTheme1();
testOverrideColorPreference(theme1, store, NOOVERRIDECOLOR);
}
public void testDataKeySet_data1() {
ITheme defaultTheme = getDefaultTheme();
Set themeKeys = defaultTheme.keySet();
assertTrue(themeKeys.contains(DATA1));
}
public void testDataKeySet_data2() {
ITheme defaultTheme = getDefaultTheme();
Set themeKeys = defaultTheme.keySet();
assertTrue(themeKeys.contains(DATA2));
}
public void testDataKeySet_int1() {
ITheme defaultTheme = getDefaultTheme();
Set themeKeys = defaultTheme.keySet();
assertTrue(themeKeys.contains(INT1));
}
public void testDataKeySet_bool1() {
ITheme defaultTheme = getDefaultTheme();
Set themeKeys = defaultTheme.keySet();
assertTrue(themeKeys.contains(BOOL1));
}
public void testDataKeySet_BOGUSKEY() {
ITheme defaultTheme = getDefaultTheme();
Set themeKeys = defaultTheme.keySet();
assertFalse(themeKeys.contains(BOGUSKEY));
}
public void testDataOverride_data1() {
ITheme theme1 = getTheme1();
assertEquals(OVERRIDE1, theme1.getString(DATA1));
}
public void testDataOverride_data2() {
ITheme theme1 = getTheme1();
assertEquals(VALUE2, theme1.getString(DATA2));
}
public void testDefaultedColor_rgbcolor() {
ITheme defaultTheme = getDefaultTheme();
assertEquals(defaultTheme.getColorRegistry().getRGB(RGBCOLOR),
defaultTheme.getColorRegistry().getRGB(DEFAULTEDCOLOR));
}
public void testDefaultedColor_defaultedcolor() {
ITheme defaultTheme = getDefaultTheme();
assertEquals(defaultTheme.getColorRegistry().getRGB(DEFAULTEDCOLOR),
defaultTheme.getColorRegistry().getRGB(DEFAULTEDCOLOR2));
}
public void testDefaultedColor_defaultedcolor2() {
ITheme defaultTheme = getDefaultTheme();
assertEquals(defaultTheme.getColorRegistry().getRGB(DEFAULTEDCOLOR2),
defaultTheme.getColorRegistry().getRGB(DEFAULTEDCOLOR3));
}
public void testDefaultedFont_valfont() {
ITheme defaultTheme = getDefaultTheme();
assertArrayEquals(
defaultTheme.getFontRegistry().getFontData(VALFONT),
defaultTheme.getFontRegistry().getFontData(DEFAULTEDFONT));
}
public void testDefaultedFont_defaultedfont() {
ITheme defaultTheme = getDefaultTheme();
assertArrayEquals(defaultTheme.getFontRegistry().getFontData(
DEFAULTEDFONT), defaultTheme.getFontRegistry().getFontData(
DEFAULTEDFONT2));
}
public void testDefaultedFont_defaultedfont2() {
ITheme defaultTheme = getDefaultTheme();
assertArrayEquals(defaultTheme.getFontRegistry().getFontData(
DEFAULTEDFONT2), defaultTheme.getFontRegistry().getFontData(
DEFAULTEDFONT3));
}
public void testDefaultedFontOverride_valfont() {
ITheme theme1 = getTheme1();
assertArrayEquals(theme1.getFontRegistry().getFontData(VALFONT),
theme1.getFontRegistry().getFontData(DEFAULTEDFONT));
}
public void testDefaultedFontOverride_defaultedfont2() {
ITheme theme1 = getTheme1();
assertArrayEquals(new FontData[] { new FontData("Courier", 16,
SWT.NORMAL) }, theme1.getFontRegistry().getFontData(
DEFAULTEDFONT2));
}
public void testDefaultedFontOverride_defaultedfont3() {
ITheme theme1 = getTheme1();
assertArrayEquals(theme1.getFontRegistry()
.getFontData(DEFAULTEDFONT2), theme1.getFontRegistry()
.getFontData(DEFAULTEDFONT3));
}
public void testDefaultedOverrideColor_rgbcolor() {
ITheme theme1 = getTheme1();
assertEquals(theme1.getColorRegistry().getRGB(RGBCOLOR), theme1
.getColorRegistry().getRGB(DEFAULTEDCOLOR));
}
public void testDefaultedOverrideColor_defaultedcolor2() {
ITheme theme1 = getTheme1();
assertEquals(new RGB(9, 9, 9), theme1.getColorRegistry().getRGB(
DEFAULTEDCOLOR2));
}
public void testDefaultedOverrideColor_defaultedcolor3() {
ITheme theme1 = getTheme1();
assertEquals(theme1.getColorRegistry().getRGB(DEFAULTEDCOLOR2),
theme1.getColorRegistry().getRGB(DEFAULTEDCOLOR3));
}
public void testFontCascadeEvents() {
ITheme currentTheme = fManager.getCurrentTheme();
assertNotNull(currentTheme);
ThemePropertyListener managerListener = new ThemePropertyListener();
ThemePropertyListener themeListener = new ThemePropertyListener();
fManager.addPropertyChangeListener(managerListener);
currentTheme.addPropertyChangeListener(themeListener);
FontRegistry fontRegistry = currentTheme.getFontRegistry();
FontData[] oldFont = fontRegistry.getFontData(VALFONT);
FontData[] newFont = new FontData[] { new FontData("Courier", 30,
SWT.ITALIC) };
fontRegistry.put(VALFONT, newFont);
fontRegistry.put(VALFONT, oldFont);
checkEvents(managerListener, fontRegistry, oldFont, newFont);
checkEvents(themeListener, fontRegistry, oldFont, newFont);
fManager.removePropertyChangeListener(managerListener);
currentTheme.removePropertyChangeListener(themeListener);
}
public void testFontPreferenceListener_def_novalfont() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme defaultTheme = getDefaultTheme();
testOverrideFontPreference(defaultTheme, store, NOVALFONT);
}
public void testFontPreferenceListener_def_valfont() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme defaultTheme = getDefaultTheme();
testOverrideFontPreference(defaultTheme, store, VALFONT);
}
public void testFontPreferenceListener_def_defaultedfont() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme defaultTheme = getDefaultTheme();
testOverrideFontPreference(defaultTheme, store, DEFAULTEDFONT);
}
public void testFontPreferenceListener_def_nooverridefont() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme defaultTheme = getDefaultTheme();
testOverrideFontPreference(defaultTheme, store, NOOVERRIDEFONT);
}
public void testFontPreferenceListener_th1_valfont() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme theme1 = getTheme1();
testOverrideFontPreference(theme1, store, VALFONT);
}
public void testFontPreferenceListener_th1_novalfont() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme theme1 = getTheme1();
testOverrideFontPreference(theme1, store, NOVALFONT);
}
public void testFontPreferenceListener_th1_defaultedfont() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme theme1 = getTheme1();
testOverrideFontPreference(theme1, store, DEFAULTEDFONT);
}
public void testFontPreferenceListener_th1_nooverridefont() {
IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
ITheme theme1 = getTheme1();
testOverrideFontPreference(theme1, store, NOOVERRIDEFONT);
}
public void testGetBadTheme() {
ITheme badTheme = fManager.getTheme(BOGUSID);
assertNull(badTheme);
}
public void testIntDataConversion() {
ITheme defaultTheme = getDefaultTheme();
assertEquals(0, defaultTheme.getInt(DATA1));
assertEquals(0, defaultTheme.getInt(DATA2));
assertEquals(0, defaultTheme.getInt(BOOL1));
assertEquals(0, defaultTheme.getInt(BOGUSKEY));
assertEquals(3133, defaultTheme.getInt(INT1));
}
public void testNoValFont() {
ITheme defaultTheme = getDefaultTheme();
assertArrayEquals(defaultTheme.getFontRegistry().defaultFont()
.getFontData(), defaultTheme.getFontRegistry().getFontData(
NOVALFONT));
}
public void testNoValFontOverride() {
ITheme theme1 = getTheme1();
assertArrayEquals(new FontData[] { new FontData("Courier", 10,
SWT.ITALIC) }, theme1.getFontRegistry()
.getFontData(NOVALFONT));
}
private void testOverrideColorPreference(ITheme theme,
IPreferenceStore store, String color) {
RGB oldRGB = theme.getColorRegistry().getRGB(color);
RGB newRGB = new RGB(75, 21, 68);
store.setValue(ThemeElementHelper.createPreferenceKey(theme, color),
StringConverter.asString(newRGB));
assertEquals(newRGB, theme.getColorRegistry().getRGB(color));
store
.setToDefault(ThemeElementHelper.createPreferenceKey(theme,
color));
assertEquals(oldRGB, theme.getColorRegistry().getRGB(color));
}
private void testOverrideFontPreference(ITheme theme,
IPreferenceStore store, String font) {
FontData[] oldFont = theme.getFontRegistry().getFontData(font);
FontData[] newFont = new FontData[] { new FontData("Courier", 30,
SWT.ITALIC) };
store.setValue(ThemeElementHelper.createPreferenceKey(theme, font),
PreferenceConverter.getStoredRepresentation(newFont));
assertArrayEquals(newFont, theme.getFontRegistry().getFontData(font));
store.setToDefault(ThemeElementHelper.createPreferenceKey(theme, font));
assertArrayEquals(oldFont, theme.getFontRegistry().getFontData(font));
}
public void testPlatformColor() {
ITheme defaultTheme = getDefaultTheme();
RGB rgb = null;
// test for two specific platforms and one general
if (Platform.getWS().equals("win32")
&& Platform.getOS().equals("win32"))
rgb = new RGB(50, 50, 50);
else if (Platform.getWS().equals("gtk")
&& Platform.getOS().equals("linux"))
rgb = new RGB(25, 25, 25);
else if (Platform.getOS().equals("linux"))
rgb = new RGB(75, 75, 75);
else
rgb = new RGB(0, 0, 0);
assertEquals(rgb, defaultTheme.getColorRegistry().getRGB(
PLATFORMCOLOR));
}
public void testPlatformFont() {
ITheme defaultTheme = getDefaultTheme();
FontData[] data = null;
if (Platform.getWS().equals("win32")
&& Platform.getOS().equals("win32"))
data = new FontData[] { new FontData("Courier New", 12, SWT.NORMAL) };
else
data = new FontData[] { new FontData("Sans", 15, SWT.BOLD) };
assertArrayEquals(data, defaultTheme.getFontRegistry().getFontData(
PLATFORMFONT));
}
public void testRGBColor() {
ITheme defaultTheme = getDefaultTheme();
assertEquals(new RGB(1, 1, 2), defaultTheme.getColorRegistry().getRGB(
RGBCOLOR));
}
public void testRGBColorOverride() {
ITheme theme1 = getTheme1();
assertEquals(new RGB(2, 1, 1), theme1.getColorRegistry().getRGB(
RGBCOLOR));
}
public void testSetTheme() {
ThemePropertyListener listener = new ThemePropertyListener();
fManager.addPropertyChangeListener(listener);
ITheme currentTheme = fManager.getCurrentTheme();
fManager.setCurrentTheme(BOGUSID);
assertEquals(currentTheme, fManager.getCurrentTheme());
fManager.setCurrentTheme(THEME1);
assertNotSame(currentTheme, fManager.getCurrentTheme());
ITheme newCurrentTheme = fManager.getCurrentTheme();
ITheme theme1 = getTheme1();
assertEquals(theme1, newCurrentTheme);
List events = listener.getEvents();
assertEquals(1, events.size());
PropertyChangeEvent event = ((PropertyChangeEvent) events.get(0));
assertEquals(IThemeManager.CHANGE_CURRENT_THEME, event.getProperty());
assertEquals(currentTheme, event.getOldValue());
assertEquals(newCurrentTheme, event.getNewValue());
fManager.removePropertyChangeListener(listener);
}
public void testStringData() {
ITheme defaultTheme = getDefaultTheme();
assertEquals("value1", defaultTheme.getString(DATA1));
assertEquals(VALUE2, defaultTheme.getString(DATA2));
assertEquals("3133", defaultTheme.getString(INT1));
assertEquals("true", defaultTheme.getString(BOOL1));
assertEquals(null, defaultTheme.getString(BOGUSKEY));
}
public void testSWTColor() {
ITheme defaultTheme = getDefaultTheme();
assertEquals(Display.getDefault().getSystemColor(SWT.COLOR_DARK_BLUE)
.getRGB(), defaultTheme.getColorRegistry().getRGB(SWTCOLOR));
}
public void testSWTColorOverride() {
ITheme theme1 = getTheme1();
assertEquals(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN)
.getRGB(), theme1.getColorRegistry().getRGB(SWTCOLOR));
}
public void testThemeDescription_default() {
ITheme defaultTheme = getDefaultTheme();
assertEquals(IThemeManager.DEFAULT_THEME, defaultTheme.getId());
// don't bother testing against the actual value
assertNotNull(defaultTheme.getLabel());
}
public void testThemeDescription_theme1() {
ITheme theme1 = getTheme1();
assertEquals(THEME1, theme1.getId());
assertEquals("test theme 1", theme1.getLabel());
}
public void testValFont() {
ITheme defaultTheme = getDefaultTheme();
assertArrayEquals(
new FontData[] { new FontData("Tahoma", 20, SWT.BOLD) },
defaultTheme.getFontRegistry().getFontData(VALFONT));
}
/*
* The following tests check to ensure that support for multiple extensions
* contributing to the same theeme work. They also check to ensure that the
* first value encountered for a given font/colour is the only one used.
*/
public void testThemeExtensionName() {
ITheme ext1 = fManager.getTheme(EXTENDED_THEME1);
ITheme ext2 = fManager.getTheme(EXTENDED_THEME2);
ITheme ext3 = fManager.getTheme(EXTENDED_THEME3);
assertEquals("Extended Theme 1", ext1.getLabel());
assertEquals("Extended Theme 2", ext2.getLabel());
assertEquals("Extended Theme 3", ext3.getLabel());
}
public void testThemeExtensionData() {
ITheme ext1 = fManager.getTheme(EXTENDED_THEME1);
assertNotNull(ext1.getString("d1"));
assertEquals("d1", ext1.getString("d1"));
assertNotNull(ext1.getString("d2"));
}
public void testThemeExtensionColor() {
ITheme ext1 = fManager.getTheme(EXTENDED_THEME1);
assertEquals(Display.getDefault().getSystemColor(SWT.COLOR_RED)
.getRGB(), ext1.getColorRegistry().getRGB(SWTCOLOR));
assertEquals(Display.getDefault().getSystemColor(SWT.COLOR_RED)
.getRGB(), ext1.getColorRegistry().getRGB(RGBCOLOR));
}
public void testThemeExtensionFont() {
ITheme ext1 = fManager.getTheme(EXTENDED_THEME1);
FontData[] fd = new FontData[] { new FontData("Sans", 10,
SWT.NORMAL) };
assertArrayEquals(fd, ext1.getFontRegistry()
.getFontData(VALFONT));
assertArrayEquals(fd, ext1.getFontRegistry()
.getFontData(NOVALFONT));
}
/**
* Tests to ensure that a color with a bogus value doesn't take down the
* workbench.
*/
public void testBadColor1() {
ITheme defaultTheme = getDefaultTheme();
assertEquals(new RGB(0,0,0), defaultTheme.getColorRegistry().getRGB(BAD_COLOR1)); // doesn't look like an RGB
}
/**
* Tests to ensure that a color with extra spaces doesn't take down the workbench.
*/
public void testBadColor2() {
assertEquals(new RGB(0,0,1), getDefaultTheme().getColorRegistry().getRGB(BAD_COLOR2)); // rgb with extra spaces
}
/**
* Tests to ensure that a color with extra spaces doesn't take down the workbench.
*/
public void testBadColor3() {
assertEquals(new RGB(0,0,0), getDefaultTheme().getColorRegistry().getRGB(BAD_COLOR3)); // rgb with extra characters
}
}