/*
* Copyright 2000-2013 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.themes;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import com.vaadin.testbench.elements.ComboBoxElement;
import com.vaadin.testbench.elements.TableElement;
import com.vaadin.testbench.elements.ButtonElement;
import com.vaadin.testbench.elements.EmbeddedElement;
import com.vaadin.testbench.elements.MenuBarElement;
import com.vaadin.testbench.parallel.Browser;
import com.vaadin.testbench.parallel.BrowserUtil;
import com.vaadin.tests.tb3.MultiBrowserTest;
public class LegacyComponentThemeChangeTest extends MultiBrowserTest {
@Override
public List<DesiredCapabilities> getBrowsersToTest() {
// Seems like stylesheet onload is not fired on PhantomJS
// https://github.com/ariya/phantomjs/issues/12332
List<DesiredCapabilities> l = getBrowsersExcludingPhantomJS();
// For some reason, IE times out when trying to open the combobox,
// #18341
l.remove(Browser.IE11.getDesiredCapabilities());
return l;
}
@Test
public void legacyComponentThemeResourceChange() {
openTestURL();
String theme = "reindeer";
assertMenubarTheme(theme);
assertCombobBoxTheme(theme);
assertTableTheme(theme);
assertEmbeddedTheme(theme);
theme = "runo";
changeTheme(theme);
assertMenubarTheme(theme);
assertCombobBoxTheme(theme);
assertTableTheme(theme);
assertEmbeddedTheme(theme);
theme = "reindeer";
changeTheme(theme);
assertMenubarTheme(theme);
assertCombobBoxTheme(theme);
assertTableTheme(theme);
assertEmbeddedTheme(theme);
}
private void assertEmbeddedTheme(String theme) {
if (BrowserUtil.isChrome(getDesiredCapabilities())) {
// Chrome 47 won't initialize the dummy flash properly
return;
}
EmbeddedElement e = $(EmbeddedElement.class).first();
WebElement movieParam = e
.findElement(By.xpath(".//param[@name='movie']"));
WebElement embed = e.findElement(By.xpath(".//embed"));
assertAttributePrefix(movieParam, "value", theme);
assertAttributePrefix(embed, "src", theme);
assertAttributePrefix(embed, "movie", theme);
}
private void assertTableTheme(String theme) {
TableElement t = $(TableElement.class).first();
t.getRow(0).contextClick();
WebElement popup = findElement(By.className("v-contextmenu"));
WebElement actionImage = popup.findElement(By.xpath(".//img"));
assertAttributePrefix(actionImage, "src", theme);
}
private void assertCombobBoxTheme(String theme) {
ComboBoxElement cb = $(ComboBoxElement.class).first();
WebElement selectedImage = cb.findElement(By.xpath("./img"));
assertAttributePrefix(selectedImage, "src", theme);
cb.openPopup();
WebElement popup = findElement(
By.className("v-filterselect-suggestpopup"));
WebElement itemImage = popup.findElement(By.xpath(".//img"));
assertAttributePrefix(itemImage, "src", theme);
}
private void assertMenubarTheme(String theme) {
// The runoImage must always come from Runo
WebElement runoImage = $(MenuBarElement.class).first()
.findElement(By.xpath(".//span[text()='runo']/img"));
String runoImageSrc = runoImage.getAttribute("src");
// Something in Selenium normalizes the image so it becomes
// "/themes/runo/icons/16/ok.png" here although it is
// "/themes/<currenttheme>/../runo/icons/16/ok.png" in the browser
Assert.assertEquals(getThemeURL("runo") + "icons/16/ok.png",
runoImageSrc);
// The other image should change with the theme
WebElement themeImage = $(MenuBarElement.class).first()
.findElement(By.xpath(".//span[text()='selectedtheme']/img"));
assertAttributePrefix(themeImage, "src", theme);
WebElement subMenuItem = $(MenuBarElement.class).first()
.findElement(By.xpath(".//span[text()='sub menu']"));
subMenuItem.click();
WebElement subMenu = findElement(By.className("v-menubar-popup"));
WebElement subMenuRuno = subMenu
.findElement(By.xpath(".//span[text()='runo']/img"));
String subMenuRunoImageSrc = subMenuRuno.getAttribute("src");
Assert.assertEquals(getThemeURL("runo") + "icons/16/ok.png",
subMenuRunoImageSrc);
WebElement subMenuThemeImage = subMenu
.findElement(By.xpath(".//span[text()='selectedtheme']/img"));
assertAttributePrefix(subMenuThemeImage, "src", theme);
}
private void assertAttributePrefix(WebElement element, String attribute,
String theme) {
String value = element.getAttribute(attribute);
String expectedPrefix = getThemeURL(theme);
Assert.assertTrue(
"Attribute " + attribute + "='" + value
+ "' does not start with " + expectedPrefix,
value.startsWith(expectedPrefix));
}
private String getThemeURL(String theme) {
return getBaseURL() + "/VAADIN/themes/" + theme + "/";
}
private void changeTheme(String theme) {
$(ButtonElement.class).id(theme).click();
waitForThemeToChange(theme);
}
}