/*
 * Copyright 2000-2014 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.layoutparser;

import java.util.Locale;

import junit.framework.TestCase;

import org.apache.commons.lang3.LocaleUtils;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.DocumentType;
import org.jsoup.nodes.Element;

import com.vaadin.ui.Button;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.declarative.DesignContext;
import com.vaadin.ui.declarative.LayoutHandler;

/**
 * Tests the handling of the locale property in parsing and html generation.
 * 
 * @since
 * @author Vaadin Ltd
 */
public class TestLocale extends TestCase {
    DesignContext ctx;

    @Override
    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.
     */
    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.setComponentRoot(vLayout);
        // create the html tree corresponding to the component hierarchy
        Document doc = LayoutHandler.createHtml(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"));
    }

    /*
     * Checks that the locale of a component is set when the html element
     * corresponding to the component specifies a locale.
     */
    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("v-vertical-layout");
        evLayout.attr("locale", "en_US");
        body.appendChild(evLayout);
        Element ehLayout = doc.createElement("v-horizontal-layout");
        evLayout.appendChild(ehLayout);
        Element eb1 = doc.createElement("v-button");
        eb1.attr("locale", "en_US");
        ehLayout.appendChild(eb1);
        Element eb2 = doc.createElement("v-button");
        eb2.attr("locale", "en_GB");
        ehLayout.appendChild(eb2);
        Element eb3 = doc.createElement("v-button");
        ehLayout.appendChild(eb3);

        // parse the created document and check the constructed component
        // hierarchy
        VerticalLayout vLayout = (VerticalLayout) LayoutHandler.parse(
                doc.toString()).getComponentRoot();
        assertEquals("Wrong locale.", LocaleUtils.toLocale("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.", LocaleUtils.toLocale("en_US"),
                b1.getLocale());
        Button b2 = (Button) hLayout.getComponent(1);
        assertEquals("Wrong locale.", LocaleUtils.toLocale("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());
    }
}
@@ -696,53 +696,8 @@
 e;%0A%0A
-import org.apache.commons.lang3.LocaleUtils;%0A
 impo
@@ -5272,38 +5272,28 @@
 g locale.%22, 
-LocaleUtils.to
+new 
 Locale(%22en_U
@@ -5282,33 +5282,36 @@
 , new Locale(%22en
-_
+%22, %22
 US%22),%0A          
@@ -5643,38 +5643,28 @@
 g locale.%22, 
-LocaleUtils.to
+new 
 Locale(%22en_U
@@ -5665,30 +5665,17 @@
 (%22en
-_
+%22, %22
 US%22),
-%0A               
  b1.
@@ -5784,22 +5784,12 @@
 .%22, 
-LocaleUtils.to
+new 
 Loca
@@ -5798,30 +5798,17 @@
 (%22en
-_
+%22, %22
 GB%22),
-%0A               
  b2.

Change a test not to use LocaleUtils.