/*
* 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.design;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.util.Locale;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.DocumentType;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.junit.Before;
import org.junit.Test;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.declarative.Design;
import com.vaadin.ui.declarative.DesignContext;
/**
* Tests the handling of the locale property in parsing and html generation.
*
* @since
* @author Vaadin Ltd
*/
public class LocaleTest {
DesignContext ctx;
@Before
public void setUp() {
ctx = new DesignContext();
}
/*
* Checks that when the html corresponding to a component hierarchy is
* constructed, the result only contains locale attributes for a component
* if its locale differs from that of its parent.
*/
@Test
public void testHtmlGeneration() {
// create a component hierarchy
VerticalLayout vLayout = new VerticalLayout();
vLayout.setLocale(Locale.US);
HorizontalLayout hLayout = new HorizontalLayout();
hLayout.setLocale(Locale.ITALY);
vLayout.addComponent(hLayout);
Button b1 = new Button();
b1.setLocale(Locale.ITALY);
Button b2 = new Button();
b2.setLocale(Locale.US);
hLayout.addComponent(b1);
hLayout.addComponent(b2);
HorizontalLayout hlayout2 = new HorizontalLayout();
hlayout2.setLocale(Locale.US);
vLayout.addComponent(hlayout2);
Label l = new Label();
l.setLocale(Locale.US);
hlayout2.addComponent(l);
Label l2 = new Label();
l2.setLocale(Locale.CANADA);
hlayout2.addComponent(l2);
ctx.setRootComponent(vLayout);
// create the html tree corresponding to the component hierarchy
Document doc = componentToDoc(ctx);
// check the created html
Element body = doc.body();
Element evLayout = body.child(0);
assertEquals("Wrong locale information.", "en_US",
evLayout.attr("locale"));
Element ehLayout = evLayout.child(0);
assertEquals("Wrong locale information.", "it_IT",
ehLayout.attr("locale"));
Element eb1 = ehLayout.child(0);
assertTrue(
"The element should not have a locale specification, found locale "
+ eb1.attr("locale"),
"".equals(eb1.attr("locale")));
Element eb2 = ehLayout.child(1);
assertEquals("Wrong locale information.", "en_US", eb2.attr("locale"));
Element ehLayout2 = evLayout.child(1);
assertTrue(
"The element should not have a locale specification, found locale "
+ ehLayout2.attr("locale"),
"".equals(ehLayout2.attr("locale")));
Element el1 = ehLayout2.child(0);
assertTrue(
"The element should not have a locale specification, found locale "
+ el1.attr("locale"),
"".equals(el1.attr("locale")));
Element el2 = ehLayout2.child(1);
assertEquals("Wrong locale information.", "en_CA", el2.attr("locale"));
}
private Document componentToDoc(DesignContext dc) {
// Create the html tree skeleton.
Document doc = new Document("");
DocumentType docType = new DocumentType("html", "", "", "");
doc.appendChild(docType);
Element html = doc.createElement("html");
doc.appendChild(html);
html.appendChild(doc.createElement("head"));
Element body = doc.createElement("body");
html.appendChild(body);
dc.writePackageMappings(doc);
// Append the design under <body> in the html tree. createNode
// creates the entire component hierarchy rooted at the
// given root node.
Component root = dc.getRootComponent();
Node rootNode = dc.createElement(root);
body.appendChild(rootNode);
return doc;
}
/*
* Checks that the locale of a component is set when the html element
* corresponding to the component specifies a locale.
*/
@Test
public void testParsing() {
// create an html document
Document doc = new Document("");
DocumentType docType = new DocumentType("html", "", "", "");
doc.appendChild(docType);
Element html = doc.createElement("html");
doc.appendChild(html);
html.appendChild(doc.createElement("head"));
Element body = doc.createElement("body");
html.appendChild(body);
Element evLayout = doc.createElement("vaadin-vertical-layout");
evLayout.attr("locale", "en_US");
body.appendChild(evLayout);
Element ehLayout = doc.createElement("vaadin-horizontal-layout");
evLayout.appendChild(ehLayout);
Element eb1 = doc.createElement("vaadin-button");
eb1.attr("locale", "en_US");
ehLayout.appendChild(eb1);
Element eb2 = doc.createElement("vaadin-button");
eb2.attr("locale", "en_GB");
ehLayout.appendChild(eb2);
Element eb3 = doc.createElement("vaadin-button");
ehLayout.appendChild(eb3);
// parse the created document and check the constructed component
// hierarchy
String string = doc.html();
VerticalLayout vLayout = (VerticalLayout) Design
.read(new ByteArrayInputStream(string.getBytes()));
assertEquals("Wrong locale.", new Locale("en", "US"),
vLayout.getLocale());
HorizontalLayout hLayout = (HorizontalLayout) vLayout.getComponent(0);
assertEquals("The element should have the same locale as its parent.",
vLayout.getLocale(), hLayout.getLocale());
Button b1 = (Button) hLayout.getComponent(0);
assertEquals("Wrong locale.", new Locale("en", "US"), b1.getLocale());
Button b2 = (Button) hLayout.getComponent(1);
assertEquals("Wrong locale.", new Locale("en", "GB"), b2.getLocale());
Button b3 = (Button) hLayout.getComponent(2);
assertEquals("The component should have the same locale as its parent.",
hLayout.getLocale(), b3.getLocale());
}
}