1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
/*
* Copyright 2000-2018 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"),
eb1.attr("locale").isEmpty());
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"),
ehLayout2.attr("locale").isEmpty());
Element el1 = ehLayout2.child(0);
assertTrue(
"The element should not have a locale specification, found locale "
+ el1.attr("locale"),
el1.attr("locale").isEmpty());
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());
}
}
|