Package com.ponysdk.test

Source Code of com.ponysdk.test.UiBuilderTest

package com.ponysdk.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

import junit.framework.Assert;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.Select;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ponysdk.core.event.BusinessEvent;
import com.ponysdk.core.event.EventHandler;
import com.ponysdk.core.main.Main;
import com.ponysdk.test.UiBuilderTestEntryPoint.RequestHandler;
import com.ponysdk.ui.server.basic.PAnchor;
import com.ponysdk.ui.server.basic.PButton;
import com.ponysdk.ui.server.basic.PCheckBox;
import com.ponysdk.ui.server.basic.PCommand;
import com.ponysdk.ui.server.basic.PComplexPanel;
import com.ponysdk.ui.server.basic.PDateBox;
import com.ponysdk.ui.server.basic.PDialogBox;
import com.ponysdk.ui.server.basic.PDisclosurePanel;
import com.ponysdk.ui.server.basic.PElement;
import com.ponysdk.ui.server.basic.PFlexTable;
import com.ponysdk.ui.server.basic.PFlowPanel;
import com.ponysdk.ui.server.basic.PFocusPanel;
import com.ponysdk.ui.server.basic.PGrid;
import com.ponysdk.ui.server.basic.PHTML;
import com.ponysdk.ui.server.basic.PHorizontalPanel;
import com.ponysdk.ui.server.basic.PLabel;
import com.ponysdk.ui.server.basic.PListBox;
import com.ponysdk.ui.server.basic.PMenuBar;
import com.ponysdk.ui.server.basic.PRadioButton;
import com.ponysdk.ui.server.basic.PRootPanel;
import com.ponysdk.ui.server.basic.PScheduler;
import com.ponysdk.ui.server.basic.PScheduler.RepeatingCommand;
import com.ponysdk.ui.server.basic.PScript;
import com.ponysdk.ui.server.basic.PScript.ExecutionCallback;
import com.ponysdk.ui.server.basic.PSuggestBox;
import com.ponysdk.ui.server.basic.PSuggestOracle.PSuggestion;
import com.ponysdk.ui.server.basic.PTabPanel;
import com.ponysdk.ui.server.basic.PVerticalPanel;
import com.ponysdk.ui.server.basic.PWidget;
import com.ponysdk.ui.server.basic.event.PBeforeSelectionEvent;
import com.ponysdk.ui.server.basic.event.PBlurEvent;
import com.ponysdk.ui.server.basic.event.PChangeEvent;
import com.ponysdk.ui.server.basic.event.PClickEvent;
import com.ponysdk.ui.server.basic.event.PClickHandler;
import com.ponysdk.ui.server.basic.event.PCloseEvent;
import com.ponysdk.ui.server.basic.event.PFocusEvent;
import com.ponysdk.ui.server.basic.event.PKeyPressEvent;
import com.ponysdk.ui.server.basic.event.PKeyUpEvent;
import com.ponysdk.ui.server.basic.event.PMouseOverEvent;
import com.ponysdk.ui.server.basic.event.POpenEvent;
import com.ponysdk.ui.server.basic.event.PSelectionEvent;
import com.ponysdk.ui.server.basic.event.PValueChangeEvent;
import com.ponysdk.ui.terminal.basic.PHorizontalAlignment;
import com.ponysdk.ui.terminal.basic.PVerticalAlignment;

public class UiBuilderTest {

    @SuppressWarnings("rawtypes")
    private class PTestEvent extends BusinessEvent {

        public PTestEvent(final Object sourceComponent, final String msg) {
            super(sourceComponent);
            setBusinessMessage(msg);
        }

        @Override
        public Type getAssociatedType() {
            return null;
        }

        @Override
        protected void dispatch(final EventHandler handler) {}

    }

    private class PTestCommand implements PCommand {

        private final String msg;
        private final PEventsListener listener;

        public PTestCommand(final PEventsListener listenr, final String msg) {
            this.listener = listenr;
            this.msg = msg;
        }

        @Override
        public void execute() {
            listener.stackCommandResult(new PTestEvent(this, msg));
        }

    }

    private static final Logger log = LoggerFactory.getLogger(UiBuilderTest.class);

    private static WebDriver webDriver;
    private static PEventsListener eventsListener;

    private final Map<String, PWidget> widgetByDebugID = new HashMap<String, PWidget>();

    @Rule
    public TestName name = new TestName();

    @BeforeClass
    public static void runBeforeClass() throws Throwable {

        log.info("Starting jetty webserver");
        final Main main = new Main();
        main.setApplicationContextName("test");
        main.setPort(5000);
        main.setWar("src-core/test/resources/war");
        main.start();

        final Properties testProperties = loadProperties();

        try {
            webDriver = buildWebDriver(testProperties);
            webDriver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
            webDriver.manage().deleteAllCookies();
            webDriver.navigate().to("http://localhost:5000/test");
        } catch (final Throwable e) {
            log.error("", e);
            throw e;
        }
    }

    private static Properties loadProperties() {
        final Properties testProperties = new Properties();
        try {
            final String homeDirectory = System.getProperty("user.home");
            final File propsFile = new File(homeDirectory, "ponysdk-test.properties");
            final InputStream is = new FileInputStream(propsFile);
            testProperties.load(is);

            // webdriver.firefox.bin=C:/Program Files (x86)/Mozilla Firefox 9/firefox.exe
            // webdriver.chrome.driver=C:/Program Files (x86)/Google//Chrome/Application/chrome.exe
            System.getProperties().putAll(testProperties);

        } catch (final Throwable e) {
            log.info("Failed to load properties from #user.home/ponysdk-test.properties");
        }
        return testProperties;
    }

    private static WebDriver buildWebDriver(final Properties testProperties) {
        final String webdriverType = System.getProperty("uitest.webdriver", "firefox");

        WebDriver driver;
        if (webdriverType.equals("chrome")) {
            driver = new ChromeDriver();
        } else if (webdriverType.equals("firefox")) {
            driver = new FirefoxDriver();
        } else {
            driver = new InternetExplorerDriver();
        }
        return driver;
    }

    @AfterClass
    public static void runAfterClass() throws Exception {
        log.info("Closing browser");
        webDriver.quit();

        log.info("Stopping jetty webserver");
        // webServer.stop();
    }

    @Before
    public void beforeTest() {
        log.info("Running #" + name.getMethodName());
        eventsListener = new PEventsListener();
    }

    @After
    public void afterTest() {
        widgetByDebugID.clear();
        sleep(5);
    }

    @Test
    public void testPAnchor() {

        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PAnchor anchor = new PAnchor("An anchor");
                anchor.ensureDebugId("anchor1");
                PRootPanel.get().add(anchor);

                register(anchor);
            }
        });

        WebElement element = findElementById("anchor1");
        Assert.assertEquals("An anchor", element.getText());

        // update text
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PAnchor anchor = get("anchor1");
                anchor.setText("New text of the anchor");
            }
        });

        element = findElementById("anchor1");
        Assert.assertEquals("New text of the anchor", element.getText());

        // update html
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PAnchor anchor = get("anchor1");
                anchor.setHTML("Anchor <font color='red'>with pure html</font>");
            }
        });

        element = findElementById("anchor1");
        Assert.assertEquals("Anchor with pure html", element.getText());

        final WebElement font = element.findElement(By.tagName("font"));
        final String color = font.getAttribute("color");
        Assert.assertEquals("red", color);

        // check server fields
        final PAnchor anchor = get("anchor1");
        Assert.assertEquals("New text of the anchor", anchor.getText());
        Assert.assertEquals("Anchor <font color='red'>with pure html</font>", anchor.getHTML());
    }

    @Test
    public void testPButtonBase() {

        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PButton button1 = new PButton("A button");
                button1.ensureDebugId("button1");
                PRootPanel.get().add(button1);

                register(button1);
            }
        });

        WebElement element = findElementById("button1");
        Assert.assertEquals("A button", element.getText());

        // update text
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PButton button1 = get("button1");
                button1.setText("New text of the button");
            }
        });

        element = findElementById("button1");
        Assert.assertEquals("New text of the button", element.getText());

        // update html
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PButton button1 = get("button1");
                button1.setHTML("Button <font color='red'>with pure html</font>");
            }
        });

        element = findElementById("button1");
        Assert.assertEquals("Button with pure html", element.getText());

        final WebElement font = element.findElement(By.tagName("font"));
        final String color = font.getAttribute("color");
        Assert.assertEquals("red", color);

        // check server fields
        final PButton anchor = get("button1");
        Assert.assertEquals("New text of the button", anchor.getText());
        Assert.assertEquals("Button <font color='red'>with pure html</font>", anchor.getHTML());
    }

    @Test
    @SuppressWarnings("unchecked")
    public void testPCheckBox() {

        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PCheckBox checkbox1 = new PCheckBox("A checkbox");
                checkbox1.ensureDebugId("checkbox1");
                PRootPanel.get().add(checkbox1);
                checkbox1.addValueChangeHandler(eventsListener);
                register(checkbox1);
            }
        });

        WebElement element = findElementById("checkbox1-label");
        Assert.assertEquals("A checkbox", element.getText());
        element = findElementById("checkbox1-input");
        element.click();

        // check event
        final PValueChangeEvent<Boolean> e1 = eventsListener.poll();
        Assert.assertEquals(Boolean.TRUE, e1.getValue());

        // check server-side value
        final PCheckBox checkbox1 = get("checkbox1");
        Assert.assertEquals(Boolean.TRUE, checkbox1.getValue());

        // toggle
        element.click();

        // check event
        final PValueChangeEvent<Boolean> e2 = eventsListener.poll();
        Assert.assertEquals(Boolean.FALSE, e2.getValue());

        // check server-side value
        Assert.assertEquals(Boolean.FALSE, checkbox1.getValue());
    }

    @Test
    public void testPComplexPanel() {

        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PComplexPanel complexPanel1 = new PVerticalPanel();
                complexPanel1.ensureDebugId("complexPanel1");
                PRootPanel.get().add(complexPanel1);
                register(complexPanel1);
            }
        });

        WebElement element = findElementById("complexPanel1");
        final PComplexPanel complexPanel1 = get("complexPanel1");

        // add child
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PComplexPanel complexPanel1 = get("complexPanel1");
                complexPanel1.add(new PAnchor("child1"));
                complexPanel1.add(new PAnchor("child3"));
            }
        });

        element = findElementById("complexPanel1");
        List<WebElement> anchors = element.findElements(By.tagName("a"));
        Assert.assertEquals(2, anchors.size());
        Assert.assertEquals(2, complexPanel1.getWidgetCount());

        // insert child
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PVerticalPanel complexPanel1 = get("complexPanel1");
                final PAnchor child2 = new PAnchor("child2");
                child2.ensureDebugId("child2");
                complexPanel1.insert(child2, 1);
                register(child2);
            }
        });

        element = findElementById("complexPanel1");
        anchors = element.findElements(By.tagName("a"));
        Assert.assertEquals(3, anchors.size());
        Assert.assertEquals("child1", anchors.get(0).getText());
        Assert.assertEquals("child2", anchors.get(1).getText());
        Assert.assertEquals("child3", anchors.get(2).getText());

        Assert.assertEquals(3, complexPanel1.getWidgetCount());
        Assert.assertEquals("child1", ((PAnchor) complexPanel1.getWidget(0)).getText());
        Assert.assertEquals("child2", ((PAnchor) complexPanel1.getWidget(1)).getText());
        Assert.assertEquals("child3", ((PAnchor) complexPanel1.getWidget(2)).getText());

        // remove child
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PComplexPanel complexPanel1 = get("complexPanel1");
                final PAnchor child2 = get("child2");
                complexPanel1.remove(child2);
            }
        });

        element = findElementById("complexPanel1");
        anchors = element.findElements(By.tagName("a"));
        Assert.assertEquals(2, anchors.size());
        Assert.assertEquals("child1", anchors.get(0).getText());
        Assert.assertEquals("child3", anchors.get(1).getText());

        Assert.assertEquals(2, complexPanel1.getWidgetCount());
        Assert.assertEquals("child1", ((PAnchor) complexPanel1.getWidget(0)).getText());
        Assert.assertEquals("child3", ((PAnchor) complexPanel1.getWidget(1)).getText());
    }

    // TODO PCookies

    @Test
    public void testPDateBox() {

        final String datePattern = "yyyy-MM-dd";
        final SimpleDateFormat dateFormat = new SimpleDateFormat(datePattern);
        final Calendar calendar = new GregorianCalendar(2012, 10, 27);
        final Date date = calendar.getTime();
        final String dateAsString = dateFormat.format(date);

        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PLabel label1 = new PLabel("Date test");
                label1.ensureDebugId("label1");
                PRootPanel.get().add(label1);
                register(label1);

                final PDateBox dateBox1 = new PDateBox(new SimpleDateFormat(datePattern));
                dateBox1.ensureDebugId("dateBox1");
                PRootPanel.get().add(dateBox1);
                register(dateBox1);
            }
        });

        WebElement element = findElementById("dateBox1");
        final PDateBox dateBox1 = get("dateBox1");
        Assert.assertEquals(datePattern, dateBox1.getDateFormat().toPattern());

        // update date
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PDateBox dateBox1 = get("dateBox1");
                dateBox1.setValue(date);
            }
        });

        element = findElementById("dateBox1");
        Assert.assertEquals(dateAsString, element.getAttribute("value"));
        Assert.assertEquals(dateAsString, dateBox1.getDisplayedValue());

        // add value change handler
        updateUI(new RequestHandler() {

            @SuppressWarnings("unchecked")
            @Override
            public void onRequest() {
                final PDateBox dateBox1 = get("dateBox1");
                dateBox1.addValueChangeHandler(eventsListener);
            }
        });

        element = findElementById("dateBox1");
        element.clear();
        final PValueChangeEvent<Date> e1 = eventsListener.poll();
        Assert.assertNull(e1.getValue());

        element.click();
        element.sendKeys("");
        element.sendKeys(new String("2012-10-30"));

        element = findElementById("label1");

        final Actions actions = new Actions(webDriver);
        actions.moveToElement(element).build().perform();
        actions.click().build().perform();

        final PValueChangeEvent<Date> e2 = eventsListener.poll();
        Assert.assertEquals("2012-10-30", dateFormat.format(e2.getValue()));
        Assert.assertEquals("2012-10-30", dateBox1.getDisplayedValue());
    }

    @Test
    public void testPDialogBox() {

        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PDialogBox dialogBox1 = new PDialogBox();
                dialogBox1.ensureDebugId("dialogBox1");
                dialogBox1.show();
                register(dialogBox1);
            }
        });

        findElementById("dialogBox1");

        // set caption
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PDialogBox dialogBox1 = get("dialogBox1");
                dialogBox1.setCaption("The Caption");
            }
        });

        final WebElement caption = findElementById("dialogBox1-caption");
        Assert.assertEquals("The Caption", caption.getText());

        // add close button
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PDialogBox dialogBox1 = get("dialogBox1");
                final PButton close1 = new PButton("Close");
                close1.ensureDebugId("close1");
                dialogBox1.setWidget(close1);
                dialogBox1.addCloseHandler(eventsListener);
                close1.addClickHandler(new PClickHandler() {

                    @Override
                    public void onClick(final PClickEvent event) {
                        dialogBox1.hide();
                    }
                });
                register(close1);
            }
        });

        final WebElement close1 = findElementById("close1");
        close1.click();

        // check that we received close event
        final PCloseEvent e1 = eventsListener.poll();
        Assert.assertNotNull(e1);
    }

    @Test
    public void testPDisclosurePanel() {

        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PDisclosurePanel disclosurePanel1 = new PDisclosurePanel("A disclosure panel");
                disclosurePanel1.ensureDebugId("disclosurePanel1");
                PRootPanel.get().add(disclosurePanel1);
                register(disclosurePanel1);
            }
        });

        WebElement disclosure = findElementById("disclosurePanel1");
        Assert.assertTrue(disclosure.getAttribute("class").contains("gwt-DisclosurePanel-closed"));
        final PDisclosurePanel disclosurePanel1 = get("disclosurePanel1");
        Assert.assertEquals(false, disclosurePanel1.isOpen());

        WebElement disclosureHeader = findElementById("disclosurePanel1-header");
        Assert.assertEquals("A disclosure panel", disclosureHeader.getText());

        // set content
        // open / close
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PDisclosurePanel disclosurePanel1 = get("disclosurePanel1");
                final PLabel label = new PLabel("Text");
                label.ensureDebugId("label1");
                disclosurePanel1.setContent(label);
                disclosurePanel1.addOpenHandler(eventsListener);
                disclosurePanel1.addCloseHandler(eventsListener);
                register(disclosurePanel1);
            }
        });

        disclosureHeader = findElementById("disclosurePanel1-header");
        disclosureHeader.click();
        final POpenEvent e2 = eventsListener.poll();
        Assert.assertNotNull(e2);
        Assert.assertTrue(disclosurePanel1.isOpen());

        disclosure = findElementById("disclosurePanel1");
        final WebElement content = findElementById(disclosure, "label1");
        Assert.assertEquals("Text", content.getText());

        disclosureHeader.click();
        final PCloseEvent e1 = eventsListener.poll();
        Assert.assertNotNull(e1);
        Assert.assertTrue(!disclosurePanel1.isOpen());

        // server side open
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PDisclosurePanel disclosurePanel1 = get("disclosurePanel1");
                disclosurePanel1.setOpen(true);
            }
        });

        disclosure = findElementById("disclosurePanel1");
        Assert.assertTrue(disclosure.getAttribute("class").contains("gwt-DisclosurePanel-open"));

        // server side close
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PDisclosurePanel disclosurePanel1 = get("disclosurePanel1");
                disclosurePanel1.setOpen(false);
            }
        });

        disclosure = findElementById("disclosurePanel1");
        Assert.assertTrue(disclosure.getAttribute("class").contains("gwt-DisclosurePanel-closed"));

    }

    @Test
    public void testPElement() {
        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PElement ul1 = new PElement("ul");
                ul1.ensureDebugId("ul1");
                final PElement li1 = new PElement("li");
                li1.setInnerText("1rst element");
                final PElement li2 = new PElement("li");
                li2.setInnerHTML("<font color='red'>2d</font> element");
                final PLabel label1 = new PLabel("A widget");
                ul1.add(li1);
                ul1.add(li2);
                ul1.add(label1);
                PRootPanel.get().add(ul1);
                register(ul1);
            }
        });

        final WebElement ul1 = findElementById("ul1");
        final List<WebElement> liElements = ul1.findElements(By.tagName("li"));
        Assert.assertEquals(2, liElements.size());
        Assert.assertEquals("1rst element", liElements.get(0).getText());
        Assert.assertEquals("2d element", liElements.get(1).getText());

        final WebElement font = liElements.get(1).findElement(By.tagName("font"));
        final String color = font.getAttribute("color");
        Assert.assertEquals("red", color);

        final List<WebElement> divElements = ul1.findElements(By.tagName("div"));
        Assert.assertEquals(1, divElements.size());
    }

    public void testPFlexTable() {

        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PFlexTable flexTable1 = new PFlexTable();
                flexTable1.ensureDebugId("flexTable1");
                final PLabel cell11 = new PLabel("Cell_1_1");
                cell11.ensureDebugId("cell11");
                flexTable1.setWidget(0, 0, new PLabel("Cell_0_0"));
                flexTable1.setWidget(0, 1, new PLabel("Cell_0_1"));
                flexTable1.setWidget(1, 0, new PLabel("Cell_1_0"));
                flexTable1.setWidget(1, 1, cell11);
                flexTable1.setBorderWidth(1);
                flexTable1.setCellPadding(2);
                flexTable1.setCellSpacing(3);
                PRootPanel.get().add(flexTable1);
                register(flexTable1);
                register(cell11);
            }
        });

        WebElement flexTable1 = findElementById("flexTable1");
        Assert.assertEquals(flexTable1.getAttribute("border"), "1");
        Assert.assertEquals(flexTable1.getAttribute("cellPadding"), "2");
        Assert.assertEquals(flexTable1.getAttribute("cellSpacing"), "3");

        List<WebElement> rows = flexTable1.findElements(By.tagName("tr"));
        Assert.assertEquals(rows.size(), 2);
        List<WebElement> cells = flexTable1.findElements(By.tagName("td"));
        Assert.assertEquals(cells.size(), 4);
        Assert.assertEquals(cells.get(0).getText(), "Cell_0_0");

        final PFlexTable pFlexTable1 = get("flexTable1");
        Assert.assertEquals(2, pFlexTable1.getRowCount());
        Assert.assertEquals(2, pFlexTable1.getCellCount(0));

        // clear cell, insert new elements
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PFlexTable flexTable1 = get("flexTable1");
                final PLabel cell11 = get("cell11");
                flexTable1.remove(cell11);
                flexTable1.insertRow(0);
                flexTable1.setWidget(0, 0, new PLabel("Cell_2_0"));
                flexTable1.setWidget(0, 1, new PLabel("Cell_2_1"));
                flexTable1.setWidget(3, 0, new PLabel("Cell_3_0"));
                flexTable1.setWidget(3, 1, new PLabel("Cell_3_1"));
            }
        });

        flexTable1 = findElementById("flexTable1");
        rows = flexTable1.findElements(By.tagName("tr"));
        Assert.assertEquals(rows.size(), 4);

        cells = flexTable1.findElements(By.tagName("td"));
        Assert.assertEquals(cells.size(), 8);
        Assert.assertEquals(cells.get(0).getText(), "Cell_2_0");
        Assert.assertEquals(cells.get(1).getText(), "Cell_2_1");
        Assert.assertEquals(cells.get(2).getText(), "Cell_0_0");
        Assert.assertEquals(cells.get(3).getText(), "Cell_0_1");
        Assert.assertEquals(cells.get(4).getText(), "Cell_1_0");
        Assert.assertEquals(cells.get(5).getText(), "");
        Assert.assertEquals(cells.get(6).getText(), "Cell_3_0");
        Assert.assertEquals(cells.get(7).getText(), "Cell_3_1");

        Assert.assertEquals(4, pFlexTable1.getRowCount());
        Assert.assertEquals(2, pFlexTable1.getCellCount(0));

        // remove row, add/remove row style, add/remove column style, add/remove cell style
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PFlexTable flexTable1 = get("flexTable1");
                flexTable1.removeRow(2);

                flexTable1.getRowFormatter().addStyleName(1, "row1");
                flexTable1.getRowFormatter().addStyleName(2, "row2");
                flexTable1.getRowFormatter().addStyleName(2, "row2bis");
                flexTable1.getRowFormatter().addStyleName(2, "row2ter");
                flexTable1.getRowFormatter().removeStyleName(2, "row2bis");

                flexTable1.getColumnFormatter().addStyleName(0, "col0");
                flexTable1.getColumnFormatter().addStyleName(1, "col1");
                flexTable1.getColumnFormatter().addStyleName(1, "col1bis");
                flexTable1.getColumnFormatter().addStyleName(1, "col1ter");
                flexTable1.getColumnFormatter().removeStyleName(1, "col1bis");

                flexTable1.getCellFormatter().addStyleName(1, 1, "cell11");
                flexTable1.getCellFormatter().addStyleName(2, 0, "cell20");
                flexTable1.getCellFormatter().addStyleName(2, 0, "cell20bis");
                flexTable1.getCellFormatter().addStyleName(2, 0, "cell20ter");
                flexTable1.getCellFormatter().removeStyleName(2, 0, "cell20bis");
            }
        });

        flexTable1 = findElementById("flexTable1");
        rows = flexTable1.findElements(By.tagName("tr"));
        cells = flexTable1.findElements(By.tagName("td"));
        final List<WebElement> cols = flexTable1.findElements(By.tagName("col"));

        Assert.assertEquals(3, rows.size());
        Assert.assertEquals(6, cells.size());
        Assert.assertEquals(2, cols.size());
        Assert.assertTrue(rows.get(1).getAttribute("class").contains("row1"));
        Assert.assertTrue(rows.get(2).getAttribute("class").contains("row2"));
        Assert.assertTrue(rows.get(2).getAttribute("class").contains("row2ter"));
        Assert.assertTrue(!rows.get(2).getAttribute("class").contains("row2bis"));

        Assert.assertTrue(cols.get(0).getAttribute("class").contains("col0"));
        Assert.assertTrue(cols.get(1).getAttribute("class").contains("col1"));
        Assert.assertTrue(cols.get(1).getAttribute("class").contains("col1ter"));
        Assert.assertTrue(!cols.get(1).getAttribute("class").contains("col1bis"));

        Assert.assertTrue(cells.get(3).getAttribute("class").contains("cell11"));
        Assert.assertTrue(cells.get(4).getAttribute("class").contains("cell20"));
        Assert.assertTrue(cells.get(4).getAttribute("class").contains("cell20ter"));
        Assert.assertTrue(!cells.get(4).getAttribute("class").contains("cell20bis"));

        final PLabel cell00 = (PLabel) pFlexTable1.getWidget(0, 0);
        final PLabel cell31 = (PLabel) pFlexTable1.getWidget(2, 1);
        Assert.assertEquals("Cell_2_0", cell00.getText());
        Assert.assertEquals("Cell_3_1", cell31.getText());

        // colspan / rowspan
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PFlexTable flexTable1 = get("flexTable1");

                flexTable1.setWidget(3, 0, new PLabel("Cell_4_0"));
                flexTable1.setWidget(4, 0, new PLabel("Cell_5_0"));
                flexTable1.setWidget(4, 1, new PLabel("Cell_5_1"));
                flexTable1.setWidget(5, 0, new PLabel("Cell_6_0"));

                flexTable1.getFlexCellFormatter().setColSpan(3, 0, 2);
                flexTable1.getFlexCellFormatter().setRowSpan(4, 1, 2);
            }
        });

        flexTable1 = findElementById("flexTable1");
        rows = flexTable1.findElements(By.tagName("tr"));
        cells = flexTable1.findElements(By.tagName("td"));

        Assert.assertEquals(6, rows.size());
        Assert.assertEquals(10, cells.size());
        Assert.assertEquals("2", cells.get(6).getAttribute("colSpan"));
        Assert.assertEquals("2", cells.get(8).getAttribute("rowSpan"));

    }

    @Test
    public void testPFlowPanel() {

        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PFlowPanel flowPanel1 = new PFlowPanel();
                flowPanel1.ensureDebugId("flowPanel1");
                flowPanel1.add(new PHTML("text1"));
                flowPanel1.add(new PHTML("text2"));
                flowPanel1.add(new PHTML("text3"));
                flowPanel1.add(new PHTML("text4"));
                PRootPanel.get().add(flowPanel1);
                register(flowPanel1);
            }
        });

        WebElement flowPanel1 = findElementById("flowPanel1");
        List<WebElement> divs = flowPanel1.findElements(By.tagName("div"));
        Assert.assertEquals(4, divs.size());

        final PFlowPanel pFlowPanel = get("flowPanel1");
        Assert.assertEquals(4, pFlowPanel.getWidgetCount());

        // remove
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PFlowPanel flowPanel1 = get("flowPanel1");
                flowPanel1.remove(2);
            }
        });

        flowPanel1 = findElementById("flowPanel1");
        divs = flowPanel1.findElements(By.tagName("div"));
        Assert.assertEquals(3, divs.size());
        Assert.assertEquals(3, pFlowPanel.getWidgetCount());
    }

    @Test
    public void testPFocusPanel() {

        final WebElement e = findElementById("startingpoint");
        final Actions actions = new Actions(webDriver);
        actions.moveToElement(e).build().perform();

        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {

                final PLabel focusTest = new PLabel("Focus top label");
                focusTest.ensureDebugId("focusTopLabel");
                final PLabel focusTest2 = new PLabel("Focus bottom label");
                focusTest2.ensureDebugId("focusBottomLabel");

                final PFocusPanel focusPanel1 = new PFocusPanel();
                focusPanel1.setHeight("30px");
                focusPanel1.setWidth("300px");
                focusPanel1.setStyleProperty("border", "1px solid blue");
                focusPanel1.ensureDebugId("focusPanel1");
                focusPanel1.setWidget(new PLabel("A focusable widget"));
                focusPanel1.addMouseOverHandler(eventsListener);
                focusPanel1.addFocusHandler(eventsListener);
                focusPanel1.addKeyPressHandler(eventsListener);
                focusPanel1.addKeyUpHandler(eventsListener);
                focusPanel1.addBlurHandler(eventsListener);

                PRootPanel.get().add(focusTest);
                PRootPanel.get().add(focusPanel1);
                PRootPanel.get().add(focusTest2);
                register(focusPanel1);
            }
        });

        final WebElement focusTopLabel = findElementById("focusTopLabel");
        actions.moveToElement(focusTopLabel).click().build().perform();

        // Mouse over
        final WebElement focusPanel1 = findElementById("focusPanel1");
        actions.moveToElement(focusPanel1).build().perform();
        final PMouseOverEvent e1 = eventsListener.poll();
        Assert.assertNotNull(e1);

        // Focus
        actions.click().build().perform();
        final PFocusEvent e2 = eventsListener.poll();
        Assert.assertNotNull(e2);

        // Key press/ Key up
        actions.sendKeys("a").build().perform();
        final PKeyPressEvent e3 = eventsListener.poll();
        final PKeyUpEvent e4 = eventsListener.poll();
        Assert.assertNotNull(e3);
        Assert.assertEquals(65, e4.getKeyCode());

        final WebElement focusBottomLabel = findElementById("focusBottomLabel");
        actions.moveToElement(focusBottomLabel).click().build().perform();
        final PBlurEvent e5 = eventsListener.poll();
        Assert.assertNotNull(e5);
    }

    @Test
    public void testPGrid() {
        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PGrid grid1 = new PGrid(3, 4);
                grid1.ensureDebugId("grid1");
                PRootPanel.get().add(grid1);
                register(grid1);
            }
        });

        final WebElement grid1 = findElementById("grid1");
        final List<WebElement> rows = grid1.findElements(By.tagName("tr"));
        Assert.assertEquals(3, rows.size());
        final List<WebElement> cells = grid1.findElements(By.tagName("td"));
        Assert.assertEquals(12, cells.size());
    }

    // TODO PHistory

    @Test
    public void testPHorizontalPanel() {
        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PHorizontalPanel horizontal1 = new PHorizontalPanel();
                horizontal1.ensureDebugId("horizontal1");
                horizontal1.add(new PLabel("cell1"));
                horizontal1.add(new PLabel("cell2"));
                horizontal1.add(new PLabel("cell3"));
                horizontal1.add(new PLabel("cell4"));
                horizontal1.setBorderWidth(2);
                horizontal1.setSpacing(3);
                PRootPanel.get().add(horizontal1);
                register(horizontal1);
            }
        });

        WebElement grid1 = findElementById("horizontal1");
        List<WebElement> rows = grid1.findElements(By.tagName("tr"));
        Assert.assertEquals(1, rows.size());
        List<WebElement> cells = grid1.findElements(By.tagName("td"));
        Assert.assertEquals(4, cells.size());

        Assert.assertEquals(grid1.getAttribute("border"), "2");
        Assert.assertEquals(grid1.getAttribute("cellSpacing"), "3");

        // update cell size/alignement
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PHorizontalPanel horizontal1 = get("horizontal1");
                final PWidget cell1 = horizontal1.getWidget(1);
                horizontal1.setCellHeight(cell1, "30px");
                horizontal1.setCellWidth(cell1, "100px");
                horizontal1.setCellHorizontalAlignment(cell1, PHorizontalAlignment.ALIGN_RIGHT);
                horizontal1.setCellVerticalAlignment(cell1, PVerticalAlignment.ALIGN_BOTTOM);
            }
        });

        grid1 = findElementById("horizontal1");
        rows = grid1.findElements(By.tagName("tr"));
        cells = rows.get(0).findElements(By.tagName("td"));

        final WebElement cell1 = cells.get(1);
        Assert.assertEquals("100px", cell1.getAttribute("width"));
        Assert.assertEquals("30px", cell1.getAttribute("height"));
        Assert.assertEquals("right", cell1.getAttribute("align"));
        Assert.assertTrue(cell1.getAttribute("style").contains("vertical-align: bottom"));
    }

    @Test
    public void testPHtml() {
        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PHTML html1 = new PHTML();
                html1.ensureDebugId("html1");
                html1.setHTML("Pure <b>HTML</b>");
                PRootPanel.get().add(html1);
                register(html1);
            }
        });

        final WebElement html1 = findElementById("html1");
        Assert.assertEquals("Pure HTML", html1.getText());
        Assert.assertEquals(1, html1.findElements(By.tagName("b")).size());

        final PHTML pHtml = get("html1");
        Assert.assertEquals("Pure <b>HTML</b>", pHtml.getHTML());
        Assert.assertEquals(false, pHtml.isWordWrap());
    }

    @Test
    public void testPLabel() {
        // creation
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PLabel label2 = new PLabel();
                label2.ensureDebugId("label2");
                label2.setText("A label");
                PRootPanel.get().add(label2);
                register(label2);
            }
        });

        final WebElement label2 = findElementById("label2");
        final PLabel plabel2 = get("label2");
        Assert.assertEquals("A label", label2.getText());
        Assert.assertEquals("A label", plabel2.getText());
    }

    @Test
    public void testPListBox() {
        // creation / insert / update
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PListBox listBox1 = new PListBox();
                listBox1.ensureDebugId("listBox1");
                listBox1.addItem("Item 1");
                listBox1.addItem("Item 2");
                listBox1.addItem("Item 4");
                listBox1.insertItem("Item 3", 2);
                listBox1.addItem("Item A");
                listBox1.addItem("Item 6");
                listBox1.setItemText(4, "Item 5");
                listBox1.addChangeHandler(eventsListener);
                PRootPanel.get().add(listBox1);
                register(listBox1);
            }
        });

        final WebElement listBox1 = findElementById("listBox1");
        List<WebElement> options = listBox1.findElements(By.tagName("option"));
        final PListBox plistBox1 = get("listBox1");

        Assert.assertEquals(false, plistBox1.isEmptySelection());
        Assert.assertEquals(false, plistBox1.isMultipleSelect());

        Assert.assertEquals(6, options.size());
        Assert.assertEquals("Item 1", options.get(0).getText());
        Assert.assertEquals("Item 2", options.get(1).getText());
        Assert.assertEquals("Item 3", options.get(2).getText());
        Assert.assertEquals("Item 4", options.get(3).getText());
        Assert.assertEquals("Item 5", options.get(4).getText());
        Assert.assertEquals("Item 6", options.get(5).getText());

        Assert.assertEquals("Item 1", plistBox1.getItem(0));
        Assert.assertEquals("Item 2", plistBox1.getItem(1));
        Assert.assertEquals("Item 3", plistBox1.getItem(2));
        Assert.assertEquals("Item 4", plistBox1.getItem(3));
        Assert.assertEquals("Item 5", plistBox1.getItem(4));
        Assert.assertEquals("Item 6", plistBox1.getItem(5));

        options.get(4).click();

        final PChangeEvent e1 = eventsListener.poll();
        Assert.assertNotNull(e1);

        Assert.assertEquals(4, plistBox1.getSelectedIndex());
        Assert.assertEquals("Item 5", plistBox1.getSelectedItem());

        // remove
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PListBox listBox1 = get("listBox1");
                listBox1.removeItem("Item 2");
                listBox1.removeItem(2);
            }
        });

        options = listBox1.findElements(By.tagName("option"));

        Assert.assertEquals(4, options.size());
        Assert.assertEquals("Item 1", options.get(0).getText());
        Assert.assertEquals("Item 3", options.get(1).getText());
        Assert.assertEquals("Item 5", options.get(2).getText());
        Assert.assertEquals("Item 6", options.get(3).getText());

        Assert.assertEquals(4, plistBox1.getItemCount());
        Assert.assertEquals("Item 1", plistBox1.getItem(0));
        Assert.assertEquals("Item 3", plistBox1.getItem(1));
        Assert.assertEquals("Item 5", plistBox1.getItem(2));
        Assert.assertEquals("Item 6", plistBox1.getItem(3));

        // server-side selection
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PListBox listBox1 = get("listBox1");
                listBox1.setSelectedItem("Item 5");
            }
        });

        Select select = new Select(listBox1);
        final WebElement selectedOption = select.getFirstSelectedOption();
        Assert.assertEquals("Item 5", selectedOption.getText());
        Assert.assertEquals("Item 5", plistBox1.getSelectedItem());

        // clear
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PListBox listBox1 = get("listBox1");
                listBox1.clear();
            }
        });

        select = new Select(listBox1);
        Assert.assertEquals(0, select.getOptions().size());
        Assert.assertEquals(0, plistBox1.getItemCount());
        Assert.assertEquals(-1, plistBox1.getSelectedIndex());

    }

    @Test
    public void testPListBoxMulti() {
        // creation / insert / update
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PListBox listBox2 = new PListBox(false, true);
                listBox2.ensureDebugId("listBox2");
                listBox2.addItem("Item 1", new Long(1));
                listBox2.addItem("Item 2", new Long(2));
                listBox2.addItem("Item 4", new Long(4));
                listBox2.insertItem("Item 3", new Long(3), 2);
                listBox2.addItem("Item A", new Long(5));
                listBox2.addItem("Item 6", new Long(6));
                listBox2.setItemText(4, "Item 5");
                listBox2.addChangeHandler(eventsListener);
                PRootPanel.get().add(listBox2);
                register(listBox2);
            }
        });

        final WebElement listBox2 = findElementById("listBox2");
        List<WebElement> options2 = listBox2.findElements(By.tagName("option"));
        final PListBox plistBox2 = get("listBox2");

        Assert.assertEquals(false, plistBox2.isEmptySelection());
        Assert.assertEquals(true, plistBox2.isMultipleSelect());

        Assert.assertEquals(6, options2.size());
        Assert.assertEquals("Item 1", options2.get(0).getText());
        Assert.assertEquals("Item 2", options2.get(1).getText());
        Assert.assertEquals("Item 3", options2.get(2).getText());
        Assert.assertEquals("Item 4", options2.get(3).getText());
        Assert.assertEquals("Item 5", options2.get(4).getText());
        Assert.assertEquals("Item 6", options2.get(5).getText());

        Assert.assertEquals("Item 1", plistBox2.getItem(0));
        Assert.assertEquals("Item 2", plistBox2.getItem(1));
        Assert.assertEquals("Item 3", plistBox2.getItem(2));
        Assert.assertEquals("Item 4", plistBox2.getItem(3));
        Assert.assertEquals("Item 5", plistBox2.getItem(4));
        Assert.assertEquals("Item 6", plistBox2.getItem(5));
        Assert.assertEquals(new Long(1), plistBox2.getValue(0));
        Assert.assertEquals(new Long(2), plistBox2.getValue(1));
        Assert.assertEquals(new Long(3), plistBox2.getValue(2));
        Assert.assertEquals(new Long(4), plistBox2.getValue(3));
        Assert.assertEquals(new Long(5), plistBox2.getValue(4));
        Assert.assertEquals(new Long(6), plistBox2.getValue(5));

        final Select select2 = new Select(listBox2);
        select2.selectByIndex(4); // select item5

        final PChangeEvent e2 = eventsListener.poll();
        Assert.assertNotNull(e2);

        Assert.assertEquals(4, plistBox2.getSelectedIndex());
        Assert.assertEquals("Item 5", plistBox2.getSelectedItem());
        Assert.assertEquals(new Long(5), plistBox2.getSelectedValue());

        // remove
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PListBox listBox2 = get("listBox2");
                listBox2.removeItem("Item 2");
                listBox2.removeItem(2);
                listBox2.removeValue(new Long(6));
            }
        });

        options2 = listBox2.findElements(By.tagName("option"));

        Assert.assertEquals(3, options2.size());
        Assert.assertEquals("Item 1", options2.get(0).getText());
        Assert.assertEquals("Item 3", options2.get(1).getText());
        Assert.assertEquals("Item 5", options2.get(2).getText());

        Assert.assertEquals(3, plistBox2.getItemCount());
        Assert.assertEquals("Item 1", plistBox2.getItem(0));
        Assert.assertEquals("Item 3", plistBox2.getItem(1));
        Assert.assertEquals("Item 5", plistBox2.getItem(2));
        Assert.assertEquals(new Long(1), plistBox2.getValue(0));
        Assert.assertEquals(new Long(3), plistBox2.getValue(1));
        Assert.assertEquals(new Long(5), plistBox2.getValue(2));

        // server-side selection
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PListBox listBox2 = get("listBox2");
                listBox2.setSelectedValue(new Long(3)); // select item3
            }
        });

        final WebElement selectedOption2 = select2.getFirstSelectedOption();
        Assert.assertEquals("Item 3", selectedOption2.getText());
        Assert.assertEquals("Item 3", plistBox2.getSelectedItem());
        Assert.assertEquals(new Long(3), plistBox2.getSelectedValue());

        // TODO
        // multiple selection on client
        // options2 = select2.getOptions();
        // final Actions action = new Actions(webDriver);
        // action.click(options2.get(0)); // select item1
        // action.build().perform();
        //
        // action.keyDown(Keys.CONTROL);
        // action.click(options2.get(2)); // select item5
        // action.release();
        // action.build().perform();
        //
        // final PChangeEvent sel1 = eventsListener.poll();
        // final PChangeEvent sel2 = eventsListener.poll();
        // Assert.assertNotNull(sel1);
        // Assert.assertNotNull(sel2);
        //
        // final List<Integer> selectedItems = plistBox2.getSelectedItems();
        // Assert.assertEquals(2, selectedItems.size());
        // Assert.assertEquals(0, selectedItems.get(0).intValue());
        // Assert.assertEquals(2, selectedItems.get(1).intValue());
    }

    @Test
    public void testPMenuBar() {
        // creation / insert / update
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {

                final PMenuBar subMenuBar = new PMenuBar();
                subMenuBar.addItem("SubItem1");
                subMenuBar.addItem("SubItem2");
                subMenuBar.addItem("SubItem3", new PTestCommand(eventsListener, "Click on SubItem3"));
                subMenuBar.ensureDebugId("subMenuBar1");

                final PMenuBar menuBar1 = new PMenuBar();
                menuBar1.ensureDebugId("menuBar1");
                menuBar1.addItem("Item 1");
                menuBar1.addItem("Item 2", new PTestCommand(eventsListener, "Click on command 2"));
                menuBar1.addItem("Item 3 with <font color='red'>html</font>", true, new PTestCommand(eventsListener, "Click on command 3"));
                menuBar1.addItem("SubMenu", subMenuBar);

                PRootPanel.get().add(menuBar1);
                register(menuBar1);
                register(subMenuBar);
            }
        });

        WebElement menuBar = findElementById("menuBar1");

        List<WebElement> elements = menuBar.findElements(By.tagName("td"));
        Assert.assertEquals(4, elements.size());
        Assert.assertEquals("Item 1", elements.get(0).getText());
        Assert.assertEquals("Item 2", elements.get(1).getText());
        Assert.assertEquals("Item 3 with html", elements.get(2).getText());
        Assert.assertEquals("SubMenu", elements.get(3).getText());

        final WebElement font = elements.get(2).findElement(By.tagName("font"));
        Assert.assertEquals("red", font.getAttribute("color"));

        elements.get(1).click();
        PTestEvent e1 = eventsListener.poll();
        Assert.assertEquals("Click on command 2", e1.getBusinessMessage());

        elements.get(2).click();
        e1 = eventsListener.poll();
        Assert.assertEquals("Click on command 3", e1.getBusinessMessage());

        elements.get(3).click();

        WebElement subMenuBar1 = findElementById("subMenuBar1");
        elements = subMenuBar1.findElements(By.tagName("td"));
        Assert.assertEquals(3, elements.size());

        elements.get(2).click();
        e1 = eventsListener.poll();
        Assert.assertEquals("Click on SubItem3", e1.getBusinessMessage());

        // clear
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PMenuBar subMenuBar = get("subMenuBar1");
                subMenuBar.clearItems();
                subMenuBar.addItem("SubItem4");
            }
        });

        // open sub menubar
        menuBar = findElementById("menuBar1");
        elements = menuBar.findElements(By.tagName("td"));
        elements.get(3).click();

        // check clear / insert
        subMenuBar1 = findElementById("subMenuBar1");
        elements = subMenuBar1.findElements(By.tagName("td"));
        Assert.assertEquals(1, elements.size());
        Assert.assertEquals("SubItem4", elements.get(0).getText());
    }

    @Test
    public void testPRadioButton() {

        // creation
        updateUI(new RequestHandler() {

            @SuppressWarnings("unchecked")
            @Override
            public void onRequest() {
                final PRadioButton radio1 = new PRadioButton("group1", "Text 1");
                radio1.ensureDebugId("radio1");
                final PRadioButton radio2 = new PRadioButton("group1", "Text 2");
                radio2.ensureDebugId("radio2");
                final PRadioButton radio3 = new PRadioButton("group1", "Text 3");
                radio3.ensureDebugId("radio3");
                PRootPanel.get().add(radio1);
                PRootPanel.get().add(radio2);
                PRootPanel.get().add(radio3);

                radio1.addValueChangeHandler(eventsListener);
                radio2.addValueChangeHandler(eventsListener);
                radio3.addValueChangeHandler(eventsListener);

                register(radio1);
                register(radio2);
                register(radio3);
            }
        });

        final WebElement label1 = findElementById("radio1-label");
        final PRadioButton radio1 = get("radio1");
        Assert.assertEquals("Text 1", label1.getText());
        Assert.assertEquals("Text 1", radio1.getText());

        // select item
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PRadioButton radio1 = get("radio1");
                radio1.setValue(true);
            }
        });

        final WebElement input1 = findElementById("radio1-input");
        final WebElement input2 = findElementById("radio2-input");
        final WebElement input3 = findElementById("radio3-input");
        Assert.assertTrue(input1.isSelected());
        Assert.assertFalse(input2.isSelected());
        Assert.assertFalse(input3.isSelected());

        input3.click();

        final PValueChangeEvent<Boolean> e1 = eventsListener.poll();
        Assert.assertEquals(Boolean.TRUE, e1.getValue());
    }

    @Test
    public void testPScheduler() {

        // execute once
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                PScheduler.get().scheduleFixedDelay(new RepeatingCommand() {

                    @Override
                    public boolean execute() {
                        eventsListener.stackCommandResult(new PTestEvent(this, "Timer execution 1"));
                        return false;
                    }
                }, 50);
            }
        });

        final PTestEvent e1 = eventsListener.poll();
        Assert.assertEquals("Timer execution 1", e1.getBusinessMessage());

        // execute 3 times
        final AtomicInteger count = new AtomicInteger(0);
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                PScheduler.get().scheduleFixedDelay(new RepeatingCommand() {

                    @Override
                    public boolean execute() {
                        final int ct = count.incrementAndGet();
                        eventsListener.stackCommandResult(new PTestEvent(this, "Repeating timer execution " + ct));
                        return ct < 3;
                    }
                }, 50);
            }
        });

        final PTestEvent e2 = eventsListener.poll();
        final PTestEvent e3 = eventsListener.poll();
        final PTestEvent e4 = eventsListener.poll();
        Assert.assertEquals("Repeating timer execution 1", e2.getBusinessMessage());
        Assert.assertEquals("Repeating timer execution 2", e3.getBusinessMessage());
        Assert.assertEquals("Repeating timer execution 3", e4.getBusinessMessage());
    }

    @Test
    public void testPScript() {

        // execute OK
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                PScript.get().execute("var i = 5; i + 2;", new ExecutionCallback() {

                    @Override
                    public void onSuccess(final String msg) {
                        eventsListener.stackCommandResult(new PTestEvent(this, "JS result: 7"));
                    }

                    @Override
                    public void onFailure(final String msg) {
                        log.error(msg);
                    }
                });
            }
        });

        final PTestEvent e1 = eventsListener.poll();
        Assert.assertEquals("JS result: 7", e1.getBusinessMessage());

        // execute KO
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                PScript.get().execute("j + 2;", new ExecutionCallback() {

                    @Override
                    public void onSuccess(final String msg) {
                        log.error(msg);
                    }

                    @Override
                    public void onFailure(final String msg) {
                        eventsListener.stackCommandResult(new PTestEvent(this, "JS result: failed"));
                    }
                });
            }
        });

        final PTestEvent e2 = eventsListener.poll();
        Assert.assertEquals("JS result: failed", e2.getBusinessMessage());
    }

    @Test
    public void testPSuggestBox() {

        // creation
        updateUI(new RequestHandler() {

            @SuppressWarnings("unchecked")
            @Override
            public void onRequest() {
                final PSuggestBox suggestBox1 = new PSuggestBox();
                suggestBox1.getSuggestOracle().add("Suggest 1");
                suggestBox1.getSuggestOracle().add("Suggest 2");
                suggestBox1.getSuggestOracle().add("Suggest 3");
                suggestBox1.getSuggestOracle().add("Suggest 4");
                suggestBox1.ensureDebugId("suggestBox1");
                suggestBox1.addSelectionHandler(eventsListener);
                PRootPanel.get().add(suggestBox1);
                register(suggestBox1);
            }
        });

        WebElement element = findElementById("suggestBox1");
        final PSuggestBox pSuggestBox1 = get("suggestBox1");
        element.sendKeys("su");

        final WebElement popup = findElementById("suggestBox1-popup");
        final List<WebElement> items = popup.findElements(By.className("item"));
        Assert.assertEquals(4, items.size());
        Assert.assertEquals("Suggest 1", items.get(0).getText());
        Assert.assertEquals("Suggest 2", items.get(1).getText());
        Assert.assertEquals("Suggest 3", items.get(2).getText());
        Assert.assertEquals("Suggest 4", items.get(3).getText());

        items.get(2).click();

        final PSelectionEvent<PSuggestion> selection1 = eventsListener.poll();
        Assert.assertEquals("Suggest 3", selection1.getSelectedItem().getReplacementString());
        Assert.assertEquals("Suggest 3", pSuggestBox1.getText());
        Assert.assertEquals("Suggest 3", pSuggestBox1.getTextBox().getText());

        // set text
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PSuggestBox suggestBox1 = get("suggestBox1");
                suggestBox1.setText("Custom text");
            }
        });

        element = findElementById("suggestBox1");
        Assert.assertEquals("Custom text", element.getAttribute("value"));
        Assert.assertEquals(true, element.isEnabled());

        // disable
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PSuggestBox suggestBox1 = get("suggestBox1");
                suggestBox1.getTextBox().setEnabled(false);
            }
        });

        element = findElementById("suggestBox1");
        Assert.assertEquals(false, element.isEnabled());

        // TODO test display / replacement
    }

    @Test
    public void testPTabPanel() {

        // creation
        updateUI(new RequestHandler() {

            @SuppressWarnings("unchecked")
            @Override
            public void onRequest() {
                final PLabel tab2Label = new PLabel("tab 2");
                tab2Label.ensureDebugId("tab2Label");
                final PHTML tab3Label = new PHTML("tab <font color='red'>3</font>");

                final PTabPanel tabPanel1 = new PTabPanel();
                tabPanel1.add(new PLabel("content 1"), "tab 1");
                tabPanel1.add(new PLabel("content 2"), tab2Label);
                tabPanel1.add(new PLabel("content 3"), tab3Label);
                tabPanel1.addBeforeSelectionHandler(eventsListener);
                tabPanel1.addSelectionHandler(eventsListener);
                tabPanel1.ensureDebugId("tabPanel1");
                PRootPanel.get().add(tabPanel1);
                register(tabPanel1);
            }
        });

        WebElement tabPanel1Bar = findElementById("tabPanel1-bar");
        List<WebElement> tabBarElements = tabPanel1Bar.findElements(By.tagName("td"));
        Assert.assertEquals(5, tabBarElements.size()); // 3 +(start+end);
        Assert.assertEquals("tab 1", tabBarElements.get(1).getText());
        Assert.assertEquals("tab 2", tabBarElements.get(2).getText());
        Assert.assertEquals("tab 3", tabBarElements.get(3).getText());

        final WebElement fontElement = tabBarElements.get(3).findElement(By.tagName("font"));
        Assert.assertEquals("red", fontElement.getAttribute("color"));

        final PTabPanel ptabPanel1 = get("tabPanel1");
        Assert.assertEquals(3, ptabPanel1.getWidgetCount());

        final PSelectionEvent<Integer> sa = eventsListener.poll();
        Assert.assertEquals(new Integer(0), sa.getSelectedItem());

        // add / remove
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PTabPanel tabPanel1 = get("tabPanel1");
                tabPanel1.remove(2);
                tabPanel1.insert(new PLabel("content 1.5"), "tab 1.5", 1);
            }
        });

        tabPanel1Bar = findElementById("tabPanel1-bar");
        tabBarElements = tabPanel1Bar.findElements(By.tagName("td"));
        Assert.assertEquals(5, tabBarElements.size()); // 3 +(start+end);
        Assert.assertEquals(5, tabBarElements.size()); // 3 +(start+end);
        Assert.assertEquals("tab 1", tabBarElements.get(1).getText());
        Assert.assertEquals("tab 1.5", tabBarElements.get(2).getText());
        Assert.assertEquals("tab 2", tabBarElements.get(3).getText());

        Assert.assertEquals(null, ptabPanel1.getSelectedItemIndex());

        final WebElement tab2Label = findElementById("tab2Label");
        tab2Label.click();

        final PBeforeSelectionEvent<Integer> s0 = eventsListener.poll();
        Assert.assertEquals(new Integer(2), s0.getSelectedItem());

        final PSelectionEvent<Integer> s1 = eventsListener.poll();
        Assert.assertEquals(new Integer(2), s1.getSelectedItem());

        // server-side selection
        updateUI(new RequestHandler() {

            @Override
            public void onRequest() {
                final PTabPanel tabPanel1 = get("tabPanel1");
                tabPanel1.selectTab(1);
            }
        });

        tabPanel1Bar = findElementById("tabPanel1-bar");
        Assert.assertEquals(new Integer(1), ptabPanel1.getSelectedItemIndex());
    }

    protected void register(final PWidget widget) {
        widgetByDebugID.put(widget.getDebugID(), widget);
    }

    @SuppressWarnings("unchecked")
    protected <T> T get(final String debugID) {
        return (T) widgetByDebugID.get(debugID);
    }

    private static WebElement findElementById(final String id) {
        return webDriver.findElement(By.id("gwt-debug-" + id));
    }

    private static WebElement findElementById(final WebElement element, final String id) {
        return element.findElement(By.id("gwt-debug-" + id));
    }

    private static void updateUI(final RequestHandler handler) {
        UiBuilderTestEntryPoint.setRequestHandler(handler);
        final WebElement element = findElementById("startingpoint");
        element.click();
    }

    private static void sleep(final long ms) {
        try {
            Thread.sleep(ms);
        } catch (final InterruptedException e) {}
    }
}
TOP

Related Classes of com.ponysdk.test.UiBuilderTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.