/*******************************************************************************
* Copyright (c) 2008, 2015 Innoopract Informationssysteme GmbH 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:
* Innoopract Informationssysteme GmbH - initial API and implementation
* EclipseSource - ongoing development
******************************************************************************/
package org.eclipse.rap.rwt.internal.theme;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.eclipse.rap.rwt.internal.theme.css.ConditionalValue;
import org.eclipse.rap.rwt.internal.theme.css.CssFileReader;
import org.eclipse.rap.rwt.internal.theme.css.StyleSheet;
import org.junit.Before;
import org.junit.Test;
public class CssValuesMap_Test {
private ThemeableWidget[] themeableWidgets;
@Before
public void setUp() {
themeableWidgets = new ThemeableWidget[] {
themeableWidget(
cssElement( "Button" ).addProperty( "color" ).addStyle( "BORDER" ).addState( "disabled" ) ),
themeableWidget(
cssElement( "Label" ).addProperty( "color" ).addProperty( "font" ),
cssElement( "Label-Separator" ).addProperty( "background-color" ) )
};
}
@Test
public void testGetValues() {
StyleSheet styleSheet = styleSheet( "Button { color: black }" );
CssValuesMap valuesMap = new CssValuesMap( styleSheet, themeableWidgets );
ConditionalValue[] values = valuesMap.getValues( "Button", "color" );
assertArrayEquals( new Object[] {
new ConditionalValue( CssColor.valueOf( "black" ) )
}, values );
}
@Test
public void testGetValues_includesKnownStatesAndStyles() {
StyleSheet styleSheet = styleSheet( "Button { color: black }",
"Button[BORDER] { color: blue }",
"Button[BORDER]:disabled { color: gray }" );
CssValuesMap valuesMap = new CssValuesMap( styleSheet, themeableWidgets );
ConditionalValue[] values = valuesMap.getValues( "Button", "color" );
assertArrayEquals( new Object[] {
new ConditionalValue( CssColor.valueOf( "gray" ), ":disabled", "[BORDER" ),
new ConditionalValue( CssColor.valueOf( "blue" ), "[BORDER" ),
new ConditionalValue( CssColor.valueOf( "black" ) )
}, values );
}
@Test
public void testGetValues_ignoresUnknownStatesAndStyles() {
StyleSheet styleSheet = styleSheet( "Button { color: black }",
"Button[UNKNOWN] { color: blue }",
"Button[BORDER]:unknown { color: gray }" );
CssValuesMap valuesMap = new CssValuesMap( styleSheet, themeableWidgets );
ConditionalValue[] values = valuesMap.getValues( "Button", "color" );
assertArrayEquals( new Object[] {
new ConditionalValue( CssColor.valueOf( "black" ) )
}, values );
}
@Test
public void testGetValues_includesVariants() {
StyleSheet styleSheet = styleSheet( "Button { color: black }",
"Button.special { color: red }" );
CssValuesMap valuesMap = new CssValuesMap( styleSheet, themeableWidgets );
ConditionalValue[] values = valuesMap.getValues( "Button", "color" );
assertArrayEquals( new Object[] {
new ConditionalValue( CssColor.valueOf( "red" ), ".special" ),
new ConditionalValue( CssColor.valueOf( "black" ) )
}, values );
}
@Test
public void testGetValues_resortsToWildcardProperties() {
StyleSheet styleSheet = styleSheet( "* { color: black }",
"Button[BORDER] { color: blue }" );
CssValuesMap valuesMap = new CssValuesMap( styleSheet, themeableWidgets );
ConditionalValue[] values = valuesMap.getValues( "Button", "color" );
assertArrayEquals( new Object[] {
new ConditionalValue( CssColor.valueOf( "blue" ), "[BORDER" ),
new ConditionalValue( CssColor.valueOf( "black" ) )
}, values );
}
@Test
public void testGetAllValues_includesValuesForAllElements() {
StyleSheet styleSheet = styleSheet( "Button { color: black }",
"Label { color: blue }",
"Label-Separator { background-color: gray }" );
CssValuesMap valuesMap = new CssValuesMap( styleSheet, themeableWidgets );
CssValue[] values = valuesMap.getAllValues();
assertTrue( asList( values ).contains( CssColor.valueOf( "black" ) ) );
assertTrue( asList( values ).contains( CssColor.valueOf( "blue" ) ) );
assertTrue( asList( values ).contains( CssColor.valueOf( "gray" ) ) );
}
@Test
public void testGetAllValues_includesValuesForAllStatesAndStyles() {
StyleSheet styleSheet = styleSheet( "Button { color: black }",
"Button[BORDER] { color: blue }",
"Button[BORDER]:disabled { color: gray }" );
CssValuesMap valuesMap = new CssValuesMap( styleSheet, themeableWidgets );
CssValue[] values = valuesMap.getAllValues();
assertTrue( asList( values ).contains( CssColor.valueOf( "black" ) ) );
assertTrue( asList( values ).contains( CssColor.valueOf( "blue" ) ) );
assertTrue( asList( values ).contains( CssColor.valueOf( "gray" ) ) );
}
@Test
public void testGetAllValues_includesValuesForAllProperties() {
StyleSheet styleSheet = styleSheet( "Label { color: black; font: 12px Times }" );
CssValuesMap valuesMap = new CssValuesMap( styleSheet, themeableWidgets );
CssValue[] values = valuesMap.getAllValues();
assertTrue( asList( values ).contains( CssColor.valueOf( "black" ) ) );
assertTrue( asList( values ).contains( CssFont.valueOf( "12px Times" ) ) );
}
@Test
public void testGetAllValues_includesValuesForVariants() {
StyleSheet styleSheet = styleSheet( "Button { color: black }",
"Button.special { color: red }" );
CssValuesMap valuesMap = new CssValuesMap( styleSheet, themeableWidgets );
CssValue[] values = valuesMap.getAllValues();
assertTrue( asList( values ).contains( CssColor.valueOf( "red" ) ) );
}
@Test
public void testGetAllValues_includesValuesForWildcard() {
StyleSheet styleSheet = styleSheet( "Button { color: black }",
"* { color: blue }" );
CssValuesMap valuesMap = new CssValuesMap( styleSheet, themeableWidgets );
CssValue[] values = valuesMap.getAllValues();
assertTrue( asList( values ).contains( CssColor.valueOf( "blue" ) ) );
}
private static ThemeableWidget themeableWidget( CssElementImpl... elements ) {
ThemeableWidget themeableWidget = new ThemeableWidget( null, null );
themeableWidget.elements = elements;
return themeableWidget;
}
private static CssElementImpl cssElement( String name ) {
return new CssElementImpl( name );
}
private static StyleSheet styleSheet( String... lines ) {
StringBuilder builder = new StringBuilder();
for( String line : lines ) {
builder.append( line );
builder.append( '\n' );
}
String string = builder.toString();
try {
ByteArrayInputStream inputStream = new ByteArrayInputStream( string.getBytes( "UTF-8" ) );
return CssFileReader.readStyleSheet( inputStream, "string", null );
} catch( IOException exception ) {
throw new RuntimeException( "Failed to parse stylesheet", exception );
}
}
}