blob: a3a33152b216d586a4bd0834fd9522804240d3ea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2014 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Thibault Le Ouay <thibaultleouay@gmail.com> - Bug 443094
*******************************************************************************/
package org.eclipse.e4.ui.tests.css.swt;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Field;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.junit.Test;
/**
* Test gradient capabilities.
* We use CTabFolder because we can retrieve the gradient values from it.
* Other usage of gradients is drawn by GradientBackgroundListener which is harder
* to test it's doing the right thing.
*/
public class GradientTest extends CSSSWTTestCase {
static final RGB RED = new RGB(255, 0, 0);
static final RGB GREEN = new RGB(0, 255, 0);
static final RGB BLUE = new RGB(0, 0, 255);
static final RGB WHITE = new RGB(255, 255, 255);
protected CTabFolder createTestCTabFolder(String styleSheet) {
engine = createEngine(styleSheet, display);
// Create widgets
Shell shell = new Shell(display, SWT.SHELL_TRIM);
FillLayout layout = new FillLayout();
shell.setLayout(layout);
Composite panel = new Composite(shell, SWT.NONE);
panel.setLayout(new FillLayout());
CTabFolder folderToTest = new CTabFolder(panel, SWT.NONE);
CTabItem tab1 = new CTabItem(folderToTest, SWT.NONE);
tab1.setText("A TAB ITEM");
engine.applyStyles(folderToTest, true);
shell.pack();
return folderToTest;
}
@Test
public void testGradients() {
CTabFolder folderToTest = createTestCTabFolder(
"CTabItem:selected { background-color: #FF0000 #0000FF}");
assertEquals(RED, getSelectionBackgroundBegin(folderToTest).getRGB()); //gradient begin
assertEquals(BLUE, folderToTest.getSelectionBackground().getRGB()); //gradient end
}
@Test
public void testDefaultPercents() {
CTabFolder folderToTest = createTestCTabFolder(
"CTabItem:selected { background-color: #FF0000 #0000FF}");
assertEquals(RED, getSelectionBackgroundBegin(folderToTest).getRGB()); //gradient begin
assertEquals(BLUE, folderToTest.getSelectionBackground().getRGB()); //gradient end
assertArrayEquals(new int[] { 100 }, getSelectionGradientPercents(folderToTest)); // default
// percent
}
@Test
public void testDefaultManyPercents() {
CTabFolder folderToTest = createTestCTabFolder(
"CTabItem:selected { background-color: red green blue yellow}");
assertArrayEquals(new int[] { 33, 67, 100 }, getSelectionGradientPercents(folderToTest)); // default
// percent
}
@Test
public void testSpecifiedPercents() {
CTabFolder folderToTest = createTestCTabFolder(
"CTabItem:selected { background-color: #FF0000 #0000FF 53%}");
assertArrayEquals(new int[] { 53 }, getSelectionGradientPercents(folderToTest));
}
@Test
public void testManyColorsAndSpecifiedManyPercents() {
CTabFolder folderToTest = createTestCTabFolder(
"CTabItem:selected { background-color: #FF0000 #00FF00 #0000FF 22% 44%}");
assertEquals(RED, getSelectionBackgroundBegin(folderToTest).getRGB()); //gradient begin
assertEquals(GREEN, getSelectionBackground(folderToTest, 1).getRGB()); //2nd gradient
assertEquals(BLUE, folderToTest.getSelectionBackground().getRGB()); //gradient end
assertArrayEquals(new int[] { 22, 44 }, getSelectionGradientPercents(folderToTest));
}
/*
* Tests handling when # of percents isn't one less than number of colors
*/
@Test
public void testBadPercents() {
//There should be either zero or three percent declarations, otherwise it acts as default
CTabFolder folderToTest = createTestCTabFolder(
"CTabItem:selected { background-color: red green blue yellow 10%}");
assertArrayEquals(new int[] { 33, 67, 100 }, getSelectionGradientPercents(folderToTest)); // default
// percent
}
/*
* Test to ensure that one bad apple doesn't spoil it for everyone
* (non-existent color name is ignored)
*/
@Test
public void testBadColors() {
CTabFolder folderToTest = createTestCTabFolder(
"CTabItem:selected { background-color: #FF0000 notAColor #0000FF}");
assertEquals(RED, getSelectionBackgroundBegin(folderToTest).getRGB()); //gradient begin
assertEquals(BLUE, folderToTest.getSelectionBackground().getRGB()); //gradient end
assertArrayEquals(new int[] { 100 }, getSelectionGradientPercents(folderToTest)); // default
// percent
}
/*
* Test to ensure that a percent > 100 triggers default
*/
@Test
public void testAboveRangePercents() {
CTabFolder folderToTest = createTestCTabFolder(
"CTabItem:selected { background-color: #FF0000 #00FF00 #0000FF 20% 110%}");
assertEquals(RED, getSelectionBackgroundBegin(folderToTest).getRGB()); //gradient begin
assertEquals(BLUE, folderToTest.getSelectionBackground().getRGB()); //gradient end
assertArrayEquals(new int[] { 50, 100 }, getSelectionGradientPercents(folderToTest)); // default
// percent
}
/*
* Test to ensure that a percent < 0 triggers default
*/
@Test
public void testBelowRangePercents() {
CTabFolder folderToTest = createTestCTabFolder(
"CTabItem:selected { background-color: #FF0000 #00FF00 #0000FF -20% 50%}");
assertEquals(RED, getSelectionBackgroundBegin(folderToTest).getRGB()); //gradient begin
assertEquals(BLUE, folderToTest.getSelectionBackground().getRGB()); //gradient end
assertArrayEquals(new int[] { 50, 100 }, getSelectionGradientPercents(folderToTest)); // default
// percent
}
/*
* Test to ensure we properly parse something like:
* background-color: gradient,
* rgb(140,140,140),
* rgb(48,48,48),
* 100%;
*/
@Test
public void testAltSyntax() {
CTabFolder folderToTest = createTestCTabFolder(
"CTabItem:selected { background-color: gradient, rgb(140,140,140), rgb(48,48,48), 100%;");
assertEquals(new RGB(140,140,140), getSelectionBackgroundBegin(folderToTest).getRGB()); //gradient begin
assertEquals(new RGB(48,48,48), folderToTest.getSelectionBackground().getRGB()); //gradient end
assertArrayEquals(new int[] { 100 }, getSelectionGradientPercents(folderToTest)); // default
// percent
}
//CTabFolder doesn't provide getter for these so we need to dig via reflection
Color getSelectionBackgroundBegin(CTabFolder folder) {
return getSelectionBackground(folder, 0);
}
Color getSelectionBackground(CTabFolder folder, int i) {
try {
Field field = folder.getClass().getDeclaredField("selectionGradientColors");
field.setAccessible(true);
return ((Color[]) field.get(folder))[i];
} catch (NoSuchFieldException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
int[] getSelectionGradientPercents(CTabFolder folder) {
//CTabFolder doesn't provide a getter for this so we need to dig via reflection
try {
Field field = folder.getClass().getDeclaredField("selectionGradientPercents");
field.setAccessible(true);
return (int[]) field.get(folder);
} catch (NoSuchFieldException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}