/* * Copyright 2000-2016 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.server.component.abstractcomponent; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.File; import java.nio.charset.StandardCharsets; import java.util.Locale; import org.jsoup.nodes.Attributes; import org.jsoup.nodes.Element; import org.jsoup.parser.Tag; import org.junit.Before; import org.junit.Test; import com.vaadin.server.ErrorMessage.ErrorLevel; import com.vaadin.shared.ui.ContentMode; import com.vaadin.server.ExternalResource; import com.vaadin.server.FileResource; import com.vaadin.server.Responsive; import com.vaadin.server.ThemeResource; import com.vaadin.server.UserError; import com.vaadin.tests.design.DeclarativeTestBase; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.Button; import com.vaadin.ui.HorizontalSplitPanel; import com.vaadin.ui.Label; import com.vaadin.ui.Panel; import com.vaadin.ui.declarative.Design; import com.vaadin.ui.declarative.DesignContext; /** * Test cases for reading and writing the properties of AbstractComponent. * * @since * @author Vaadin Ltd */ public class AbstractComponentDeclarativeTest extends DeclarativeTestBase<AbstractComponent> { private AbstractComponent component; @Before public void setUp() { Label l = new Label(); l.setContentMode(ContentMode.HTML); component = l; } @Test public void testEmptyDesign() { String design = "<vaadin-label>"; testRead(design, component); testWrite(design, component); } @Test public void testProperties() { String design = "<vaadin-label id=\"testId\" primary-style-name=\"test-style\" " + "caption=\"test-caption\" locale=\"fi_FI\" description=\"test-description\" " + "error=\"<div>test-error</div>\" />"; component.setId("testId"); component.setPrimaryStyleName("test-style"); component.setCaption("test-caption"); component.setLocale(new Locale("fi", "FI")); component.setDescription("test-description"); component.setComponentError(new UserError("<div>test-error</div>", com.vaadin.server.AbstractErrorMessage.ContentMode.HTML, ErrorLevel.ERROR)); testRead(design, component); testWrite(design, component); } @Test public void testReadImmediate() { // Additional tests for the immediate property, including // explicit immediate values String[] design = { "<vaadin-label/>", "<vaadin-label immediate=\"false\"/>", "<vaadin-label immediate=\"true\"/>", "<vaadin-label immediate />" }; Boolean[] explicitImmediate = { null, Boolean.FALSE, Boolean.TRUE, Boolean.TRUE }; boolean[] immediate = { true, false, true, true }; for (String design1 : design) { component = (AbstractComponent) Design .read(new ByteArrayInputStream( design1.getBytes(StandardCharsets.UTF_8))); } } @Test public void testExternalIcon() { String design = "<vaadin-label icon=\"http://example.com/example.gif\"/>"; component.setIcon( new ExternalResource("http://example.com/example.gif")); testRead(design, component); testWrite(design, component); } @Test public void testThemeIcon() { String design = "<vaadin-label icon=\"theme://example.gif\"/>"; component.setIcon(new ThemeResource("example.gif")); testRead(design, component); testWrite(design, component); } @Test public void testFileResourceIcon() { String design = "<vaadin-label icon=\"img/example.gif\"/>"; component.setIcon(new FileResource(new File("img/example.gif"))); testRead(design, component); testWrite(design, component); } @Test public void testWidthAndHeight() { String design = "<vaadin-label width=\"70%\" height=\"12px\"/>"; component.setWidth("70%"); component.setHeight("12px"); testRead(design, component); testWrite(design, component); } @Test public void testSizeFull() { String design = "<vaadin-label size-full />"; component.setSizeFull(); testRead(design, component); testWrite(design, component); } @Test public void testSizeAuto() { component = new Panel(); String design = "<vaadin-panel size-auto />"; component.setSizeUndefined(); testRead(design, component); testWrite(design, component); } @Test public void testHeightFull() { String design = "<vaadin-label height-full width=\"20px\"/>"; component.setHeight("100%"); component.setWidth("20px"); testRead(design, component); testWrite(design, component); } @Test public void testHeightAuto() { String design = "<vaadin-horizontal-split-panel height-auto width=\"20px\" >"; // we need to have default height of 100% -> use split panel AbstractComponent component = new HorizontalSplitPanel(); component.setHeight(null); component.setWidth("20px"); testRead(design, component); testWrite(design, component); } @Test public void testWidthFull() { String design = "<vaadin-button width-full height=\"20px\">Foo</vaadin-button>"; AbstractComponent component = new Button(); component.setCaptionAsHtml(true); component.setCaption("Foo"); component.setHeight("20px"); component.setWidth("100%"); testRead(design, component); testWrite(design, component); } @Test public void testWidthAuto() { component = new Panel(); String design = "<vaadin-panel height=\"20px\"/ width-auto />"; component.setCaptionAsHtml(false); component.setHeight("20px"); component.setWidth(null); testRead(design, component); testWrite(design, component); } @Test public void testResponsive() { String design = "<vaadin-label responsive />"; Responsive.makeResponsive(component); testRead(design, component); testWrite(design, component); } @Test public void testResponsiveFalse() { String design = "<vaadin-label responsive =\"false\"/>"; // Only test read as the attribute responsive=false would not be written testRead(design, component); } @Test public void testReadAlreadyResponsive() { AbstractComponent component = new Label(); Responsive.makeResponsive(component); Element design = createDesign(true); component.readDesign(design, new DesignContext()); assertEquals("Component should have only one extension", 1, component.getExtensions().size()); } @Test public void testUnknownProperties() { String design = "<vaadin-label foo=\"bar\"/>"; DesignContext context = readAndReturnContext(design); Label label = (Label) context.getRootComponent(); assertTrue("Custom attribute was preserved in custom attributes", context.getCustomAttributes(label).containsKey("foo")); testWrite(label, design, context); } private Element createDesign(boolean responsive) { Attributes attributes = new Attributes(); attributes.put("responsive", responsive); Element node = new Element(Tag.valueOf("vaadin-label"), "", attributes); return node; } }