]> source.dussan.org Git - vaadin-framework.git/commitdiff
Merged test updates from 6.4
authorArtur Signell <artur.signell@itmill.com>
Mon, 18 Oct 2010 05:44:13 +0000 (05:44 +0000)
committerArtur Signell <artur.signell@itmill.com>
Mon, 18 Oct 2010 05:44:13 +0000 (05:44 +0000)
svn changeset:15590/svn branch:6.5

15 files changed:
tests/src/com/vaadin/tests/components/AbstractComponentTestCase.java
tests/src/com/vaadin/tests/components/MenuBasedComponentTestCase.java
tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldTestCase.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/button/Buttons2.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/checkbox/CheckBoxes2.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/combobox/ComboBoxes2.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/datefield/DateFieldTestCase.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/datefield/InlineDateFields2.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/datefield/PopupDateFields2.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/listselect/ListSelects.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/optiongroup/OptionGroups.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/select/AbstractSelectTestCase.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/table/Tables.java
tests/src/com/vaadin/tests/components/tree/Trees.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/twincolselect/TwinColSelects.java [new file with mode: 0644]

index fdd3a3fce7314fdf05de23c535543e9b898d37c0..aa7da25e7e130adb546dc722877c1195df1a1cfc 100644 (file)
@@ -1,8 +1,12 @@
 package com.vaadin.tests.components;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Locale;
 
+import com.vaadin.terminal.Resource;
+import com.vaadin.terminal.ThemeResource;
 import com.vaadin.terminal.UserError;
 import com.vaadin.tests.util.Log;
 import com.vaadin.ui.AbstractComponent;
@@ -12,10 +16,27 @@ import com.vaadin.ui.Layout.SpacingHandler;
 public abstract class AbstractComponentTestCase<T extends AbstractComponent>
         extends TestBase {
 
+    protected static final ThemeResource ICON_16_USER_PNG_CACHEABLE = cacheableThemeResource("../runo/icons/16/user.png");
+    protected static final ThemeResource ICON_16_USER_PNG_UNCACHEABLE = uncacheableThemeResource("../runo/icons/16/user.png");
+    protected static final ThemeResource ICON_32_ATTENTION_PNG_CACHEABLE = cacheableThemeResource("../runo/icons/32/attention.png");
+    protected static final ThemeResource ICON_32_ATTENTION_PNG_UNCACHEABLE = uncacheableThemeResource("../runo/icons/32/attention.png");
+    protected static final ThemeResource ICON_64_EMAIL_REPLY_PNG_CACHEABLE = cacheableThemeResource("../runo/icons/64/email-reply.png");
+    protected static final ThemeResource ICON_64_EMAIL_REPLY_PNG_UNCACHEABLE = uncacheableThemeResource("../runo/icons/64/email-reply.png");
+
     private List<T> testComponents = new ArrayList<T>();
 
     abstract protected Class<T> getTestClass();
 
+    protected static ThemeResource uncacheableThemeResource(
+            String resourceLocation) {
+        return new ThemeResource(resourceLocation + "?" + new Date().getTime());
+    }
+
+    protected static ThemeResource cacheableThemeResource(
+            String resourceLocation) {
+        return new ThemeResource(resourceLocation);
+    }
+
     abstract protected void initializeComponents();
 
     private Log log = null;
@@ -75,6 +96,32 @@ public abstract class AbstractComponentTestCase<T extends AbstractComponent>
         }
     };
 
+    protected Command<T, Boolean> errorIndicatorCommand = new Command<T, Boolean>() {
+
+        public void execute(T c, Boolean enabled, Object data) {
+            if (enabled) {
+                c.setComponentError(new UserError(errorMessage));
+            } else {
+                c.setComponentError(null);
+
+            }
+        }
+    };
+    private String errorMessage = null;
+
+    protected Command<T, String> errorMessageCommand = new Command<T, String>() {
+
+        public void execute(T c, String value, Object data) {
+            errorMessage = value;
+            if (c.getComponentError() != null) {
+                errorIndicatorCommand.execute(c, true, null);
+            }
+
+        }
+
+    };
+
+    // TODO Move to AbstractFieldTestCase
     protected Command<T, Boolean> requiredCommand = new Command<T, Boolean>() {
 
         public void execute(T c, Boolean enabled, Object data) {
@@ -86,16 +133,17 @@ public abstract class AbstractComponentTestCase<T extends AbstractComponent>
             }
         }
     };
+    protected Command<T, String> requiredErrorMessageCommand = new Command<T, String>() {
 
-    protected Command<T, Boolean> errorIndicatorCommand = new Command<T, Boolean>() {
+        public void execute(T c, String value, Object data) {
+            ((Field) c).setRequiredError(value);
+        }
 
-        public void execute(T c, Boolean enabled, Object data) {
-            if (enabled) {
-                c.setComponentError(new UserError("It failed!"));
-            } else {
-                c.setComponentError(null);
+    };
 
-            }
+    protected Command<T, String> descriptionCommand = new Command<T, String>() {
+        public void execute(T c, String value, Object data) {
+            c.setDescription(value);
         }
     };
 
@@ -106,6 +154,36 @@ public abstract class AbstractComponentTestCase<T extends AbstractComponent>
         }
     };
 
+    protected Command<T, Boolean> visibleCommand = new Command<T, Boolean>() {
+
+        public void execute(T c, Boolean enabled, Object data) {
+            c.setVisible(enabled);
+        }
+    };
+
+    protected Command<T, Resource> iconCommand = new Command<T, Resource>() {
+
+        public void execute(T c, Resource value, Object data) {
+            c.setIcon(value);
+        }
+
+    };
+    protected Command<T, String> captionCommand = new Command<T, String>() {
+
+        public void execute(T c, String value, Object data) {
+            c.setCaption(value);
+        }
+
+    };
+
+    protected Command<T, Locale> localeCommand = new Command<T, Locale>() {
+
+        public void execute(T c, Locale value, Object data) {
+            c.setLocale(value);
+        }
+
+    };
+
     protected <VALUET> void doCommand(Command<T, VALUET> command, VALUET value) {
         doCommand(command, value, null);
     }
index 88129ecedc6e37de461cf23348dac928f35ca1ba..d3675b0b3f134c1a530262edfe032b781270dba4 100644 (file)
@@ -1,24 +1,31 @@
 package com.vaadin.tests.components;\r
 \r
+import java.util.HashMap;\r
 import java.util.HashSet;\r
 import java.util.LinkedHashMap;\r
 import java.util.List;\r
+import java.util.Locale;\r
+import java.util.Map;\r
 import java.util.Set;\r
 \r
-import com.vaadin.data.Container;\r
-import com.vaadin.data.Item;\r
-import com.vaadin.data.util.IndexedContainer;\r
 import com.vaadin.terminal.Resource;\r
 import com.vaadin.terminal.ThemeResource;\r
+import com.vaadin.tests.util.LoremIpsum;\r
 import com.vaadin.ui.AbstractComponent;\r
-import com.vaadin.ui.AbstractSelect;\r
-import com.vaadin.ui.Field;\r
 import com.vaadin.ui.MenuBar;\r
 import com.vaadin.ui.MenuBar.MenuItem;\r
 \r
+//TODO swap the inheritance order so AbstractComponentTestCase refers to AbstractComponent and this is the base class. Can only be done when all old tests are converted to use this.\r
 public abstract class MenuBasedComponentTestCase<T extends AbstractComponent>\r
         extends AbstractComponentTestCase<T> {\r
 \r
+    protected static final String TEXT_SHORT = "Short";\r
+    protected static final String TEXT_MEDIUM = "This is a semi-long text that might wrap.";\r
+    protected static final String TEXT_LONG = "This is a long text. "\r
+            + LoremIpsum.get(500);\r
+    protected static final String TEXT_VERY_LONG = "This is a very, very long text. "\r
+            + LoremIpsum.get(5000);\r
+\r
     private static final Resource SELECTED_ICON = new ThemeResource(\r
             "../runo/icons/16/ok.png");\r
 \r
@@ -31,18 +38,29 @@ public abstract class MenuBasedComponentTestCase<T extends AbstractComponent>
     // Used to determine if a menuItem should be selected and the other\r
     // unselected on click\r
     private Set<MenuItem> parentOfSelectableMenuItem = new HashSet<MenuItem>();\r
+    private MenuItem windowMenu;\r
+\r
+    /**\r
+     * Maps the category name to a menu item\r
+     */\r
+    private Map<String, MenuItem> categoryToMenuItem = new HashMap<String, MenuItem>();\r
 \r
     protected static final String CATEGORY_STATE = "State";\r
     protected static final String CATEGORY_SIZE = "Size";\r
     protected static final String CATEGORY_SELECTION = "Selection";\r
-    protected static final String CATEGORY_CONTENT = "Contents";\r
     protected static final String CATEGORY_LISTENERS = "Listeners";\r
+    protected static final String CATEGORY_FEATURES = "Features";\r
+    protected static final String CATEGORY_DECORATIONS = "Decorations";\r
 \r
     @Override\r
     protected final void setup() {\r
+        setTheme("tests-components");\r
+\r
         // Create menu here so it appears before the components\r
         menu = new MenuBar();\r
-        mainMenu = menu.addItem("Settings", null);\r
+        menu.setDebugId("menu");\r
+        mainMenu = menu.addItem("Component", null);\r
+        windowMenu = menu.addItem("Test", null);\r
         addComponent(menu);\r
 \r
         getLayout().setSizeFull();\r
@@ -50,7 +68,7 @@ public abstract class MenuBasedComponentTestCase<T extends AbstractComponent>
         super.setup();\r
 \r
         // Create menu actions and trigger default actions\r
-        populateMenu();\r
+        createActions();\r
 \r
         // Clear initialization log messages\r
         clearLog();\r
@@ -63,6 +81,7 @@ public abstract class MenuBasedComponentTestCase<T extends AbstractComponent>
     @Override\r
     protected void initializeComponents() {\r
         component = constructComponent();\r
+        component.setDebugId("testComponent");\r
         addTestComponent(component);\r
     }\r
 \r
@@ -94,96 +113,68 @@ public abstract class MenuBasedComponentTestCase<T extends AbstractComponent>
         }\r
     }\r
 \r
-    private void populateMenu() {\r
-        createDefaultActions();\r
-        createCustomActions();\r
-    }\r
-\r
-    private void createDefaultActions() {\r
+    /**\r
+     * Create actions for the component. Remember to call super.createActions()\r
+     * when overriding.\r
+     */\r
+    protected void createActions() {\r
         createBooleanAction("Immediate", CATEGORY_STATE, true, immediateCommand);\r
         createBooleanAction("Enabled", CATEGORY_STATE, true, enabledCommand);\r
         createBooleanAction("Readonly", CATEGORY_STATE, false, readonlyCommand);\r
+        createBooleanAction("Visible", CATEGORY_STATE, true, visibleCommand);\r
         createBooleanAction("Error indicator", CATEGORY_STATE, false,\r
                 errorIndicatorCommand);\r
+        createLocaleSelect(CATEGORY_STATE);\r
+        createErrorMessageSelect(CATEGORY_DECORATIONS);\r
+\r
+        createDescriptionSelect(CATEGORY_DECORATIONS);\r
+        createCaptionSelect(CATEGORY_DECORATIONS);\r
+        createIconSelect(CATEGORY_DECORATIONS);\r
 \r
-        if (component instanceof Field) {\r
-            createBooleanAction("Required", CATEGORY_STATE, false,\r
-                    requiredCommand);\r
-        }\r
         createWidthSelect(CATEGORY_SIZE);\r
         createHeightSelect(CATEGORY_SIZE);\r
 \r
-        if (component instanceof AbstractSelect) {\r
-            createNullSelectAllowedCheckbox(CATEGORY_SELECTION);\r
-            createItemsInContainerSelect(CATEGORY_CONTENT);\r
-            createColumnsInContainerSelect(CATEGORY_CONTENT);\r
-        }\r
-    }\r
+        // TODO Style name\r
 \r
-    @SuppressWarnings("unchecked")\r
-    protected void createItemsInContainerSelect(String category) {\r
-        LinkedHashMap<String, Integer> options = new LinkedHashMap<String, Integer>();\r
-        options.put("0", 0);\r
-        options.put("20", 20);\r
-        options.put("100", 100);\r
-        options.put("1000", 1000);\r
-        options.put("10000", 10000);\r
-        options.put("100000", 100000);\r
-\r
-        createSelectAction("Items in container", category, options, "20",\r
-                (Command) itemsInContainerCommand);\r
     }\r
 \r
-    @SuppressWarnings("unchecked")\r
-    protected void createColumnsInContainerSelect(String category) {\r
-        LinkedHashMap<String, Integer> options = new LinkedHashMap<String, Integer>();\r
-        options.put("0", 0);\r
-        options.put("5", 5);\r
-        options.put("10", 10);\r
-        options.put("50", 50);\r
-        options.put("100", 100);\r
-        options.put("1000", 1000);\r
-\r
-        createSelectAction("Columns in container", category, options, "10",\r
-                (Command) columnsInContainerCommand);\r
-    }\r
-\r
-    private Container createContainer(int properties, int items) {\r
-        IndexedContainer c = new IndexedContainer();\r
-        for (int i = 1; i <= properties; i++) {\r
-            c.addContainerProperty("Column " + i, String.class, "");\r
-        }\r
-        for (int i = 1; i <= items; i++) {\r
-            Item item = c.addItem("Item " + i);\r
-            for (int j = 1; j <= properties; j++) {\r
-                item.getItemProperty("Column " + j).setValue(\r
-                        "Item " + i + "," + j);\r
-            }\r
-        }\r
+    private void createErrorMessageSelect(String category) {\r
+        LinkedHashMap<String, String> options = new LinkedHashMap<String, String>();\r
+        options.put("-", null);\r
+        options.put(TEXT_SHORT, TEXT_SHORT);\r
+        options.put("Medium", TEXT_MEDIUM);\r
+        options.put("Long", TEXT_LONG);\r
+        options.put("Very long", TEXT_VERY_LONG);\r
+        createSelectAction("Error message", category, options, "-",\r
+                errorMessageCommand);\r
 \r
-        return c;\r
     }\r
 \r
-    @SuppressWarnings("unchecked")\r
-    protected void createNullSelectAllowedCheckbox(String category) {\r
-        createBooleanAction("Null Selection Allowed", category, false,\r
-                (Command) nullSelectionAllowedCommand);\r
+    private void createDescriptionSelect(String category) {\r
+        LinkedHashMap<String, String> options = new LinkedHashMap<String, String>();\r
+        options.put("-", null);\r
+        options.put(TEXT_SHORT, TEXT_SHORT);\r
+        options.put("Medium", TEXT_MEDIUM);\r
+        options.put("Long", TEXT_LONG);\r
+        options.put("Very long", TEXT_VERY_LONG);\r
+        createSelectAction("Description / tooltip", category, options, "-",\r
+                descriptionCommand);\r
 \r
     }\r
 \r
-    @SuppressWarnings("unchecked")\r
-    protected void createNullSelectItemId(String category) {\r
-        LinkedHashMap<String, Object> options = new LinkedHashMap<String, Object>();\r
-        options.put("- None -", null);\r
-        for (Object id : ((AbstractSelect) component).getContainerDataSource()\r
-                .getContainerPropertyIds()) {\r
-            options.put(id.toString(), id);\r
-        }\r
-        createSelectAction("Null Selection Item Id", category, options,\r
-                "- None -", (Command) nullSelectItemIdCommand);\r
+    private void createCaptionSelect(String category) {\r
+        LinkedHashMap<String, String> options = new LinkedHashMap<String, String>();\r
+        options.put("-", null);\r
+        options.put("Short", TEXT_SHORT);\r
+        options.put("Medium", TEXT_MEDIUM);\r
+        options.put("Long", TEXT_LONG);\r
+        options.put("Very long", TEXT_VERY_LONG);\r
+        createSelectAction("Caption", category, options, "Short",\r
+                captionCommand);\r
+\r
     }\r
 \r
-    protected void createWidthSelect(String category) {\r
+    private void createWidthSelect(String category) {\r
         LinkedHashMap<String, String> options = new LinkedHashMap<String, String>();\r
         options.put("Undefined", null);\r
         options.put("50%", "50%");\r
@@ -196,7 +187,29 @@ public abstract class MenuBasedComponentTestCase<T extends AbstractComponent>
                 widthCommand, null);\r
     }\r
 \r
-    protected void createHeightSelect(String category) {\r
+    private void createIconSelect(String category) {\r
+        LinkedHashMap<String, Resource> options = new LinkedHashMap<String, Resource>();\r
+        options.put("-", null);\r
+        options.put("16x16", ICON_16_USER_PNG_CACHEABLE);\r
+        options.put("32x32", ICON_32_ATTENTION_PNG_CACHEABLE);\r
+        options.put("64x64", ICON_64_EMAIL_REPLY_PNG_CACHEABLE);\r
+\r
+        createSelectAction("Icon", category, options, "-", iconCommand, null);\r
+    }\r
+\r
+    private void createLocaleSelect(String category) {\r
+        LinkedHashMap<String, Locale> options = new LinkedHashMap<String, Locale>();\r
+        options.put("-", null);\r
+        options.put("fi_FI", new Locale("fi", "FI"));\r
+        options.put("en_US", Locale.US);\r
+        options.put("zh_CN", Locale.SIMPLIFIED_CHINESE);\r
+        options.put("fr_FR", Locale.FRANCE);\r
+\r
+        createSelectAction("Locale", category, options, "-", localeCommand,\r
+                null);\r
+    }\r
+\r
+    private void createHeightSelect(String category) {\r
         LinkedHashMap<String, String> options = new LinkedHashMap<String, String>();\r
         options.put("Undefined", null);\r
         options.put("50%", "50%");\r
@@ -224,25 +237,53 @@ public abstract class MenuBasedComponentTestCase<T extends AbstractComponent>
         doCommand(caption, command, initialState, data);\r
     }\r
 \r
+    protected <DATATYPE> void createClickAction(String caption,\r
+            String category, final Command<T, DATATYPE> command, DATATYPE value) {\r
+        createClickAction(caption, category, command, value, null);\r
+    }\r
+\r
+    protected <DATATYPE> void createClickAction(String caption,\r
+            String category, final Command<T, DATATYPE> command,\r
+            DATATYPE value, Object data) {\r
+        MenuItem categoryItem = getCategoryMenuItem(category);\r
+        categoryItem.addItem(caption, menuClickCommand(command, value, data));\r
+        doCommand(caption, command, value, data);\r
+    }\r
+\r
     private MenuItem getCategoryMenuItem(String category) {\r
         if (category == null) {\r
             return getCategoryMenuItem("Misc");\r
         }\r
 \r
-        if (mainMenu.getChildren() != null) {\r
-            for (MenuItem i : mainMenu.getChildren()) {\r
-                if (i.getText().equals(category)) {\r
-                    return i;\r
-                }\r
-            }\r
+        MenuItem item = categoryToMenuItem.get(category);\r
+        if (item != null) {\r
+            return item;\r
         }\r
-        return mainMenu.addItem(category, null);\r
+\r
+        return createCategory(category, null);\r
     }\r
 \r
     /**\r
-     * Provide custom actions for the test case by creating them in this method.\r
+     * Creates category "category" in parent category "parentCategory". Each\r
+     * category name must be globally unique.\r
+     * \r
+     * @param category\r
+     * @param parentCategory\r
+     * @return\r
      */\r
-    protected abstract void createCustomActions();\r
+    protected MenuItem createCategory(String category, String parentCategory) {\r
+        if (categoryToMenuItem.containsKey(category)) {\r
+            return categoryToMenuItem.get(category);\r
+        }\r
+        MenuItem item;\r
+        if (parentCategory == null) {\r
+            item = mainMenu.addItem(category, null);\r
+        } else {\r
+            item = getCategoryMenuItem(parentCategory).addItem(category, null);\r
+        }\r
+        categoryToMenuItem.put(category, item);\r
+        return item;\r
+    }\r
 \r
     private MenuBar.Command menuBooleanCommand(\r
             final com.vaadin.tests.components.ComponentTestCase.Command<T, Boolean> booleanCommand,\r
@@ -258,6 +299,18 @@ public abstract class MenuBasedComponentTestCase<T extends AbstractComponent>
         };\r
     }\r
 \r
+    private <DATATYPE> MenuBar.Command menuClickCommand(\r
+            final com.vaadin.tests.components.ComponentTestCase.Command<T, DATATYPE> command,\r
+            final DATATYPE value, final Object data) {\r
+\r
+        return new MenuBar.Command() {\r
+            public void menuSelected(MenuItem selectedItem) {\r
+                doCommand(getText(selectedItem), command, value, data);\r
+            }\r
+\r
+        };\r
+    }\r
+\r
     protected void setSelected(MenuItem item, boolean selected) {\r
         if (selected) {\r
             item.setIcon(SELECTED_ICON);\r
@@ -327,59 +380,76 @@ public abstract class MenuBasedComponentTestCase<T extends AbstractComponent>
 \r
     }\r
 \r
-    protected <TYPE> void createSelectAction(\r
+    protected <TYPE> void createMultiClickAction(\r
             String caption,\r
             String category,\r
             LinkedHashMap<String, TYPE> options,\r
-            String initialValue,\r
             com.vaadin.tests.components.ComponentTestCase.Command<T, TYPE> command,\r
             Object data) {\r
 \r
-        MenuItem parentItem = getCategoryMenuItem(category);\r
-        MenuItem mainItem = parentItem.addItem(caption, null);\r
+        MenuItem categoryItem = getCategoryMenuItem(category);\r
+        MenuItem mainItem = categoryItem.addItem(caption, null);\r
 \r
-        parentOfSelectableMenuItem.add(mainItem);\r
         for (String option : options.keySet()) {\r
-            MenuBar.Command cmd = singleSelectMenuCommand(command,\r
+            MenuBar.Command cmd = menuClickCommand(command,\r
                     options.get(option), data);\r
-            MenuItem item = mainItem.addItem(option, cmd);\r
-            if (option.equals(initialValue)) {\r
-                cmd.menuSelected(item);\r
-            }\r
+            mainItem.addItem(option, cmd);\r
         }\r
     }\r
 \r
-    /* COMMANDS */\r
+    protected <TYPE> void createMultiToggleAction(\r
+            String caption,\r
+            String category,\r
+            LinkedHashMap<String, TYPE> options,\r
+            com.vaadin.tests.components.ComponentTestCase.Command<T, Boolean> command,\r
+            boolean defaultValue) {\r
 \r
-    protected Command<AbstractSelect, Boolean> nullSelectionAllowedCommand = new Command<AbstractSelect, Boolean>() {\r
+        LinkedHashMap<String, Boolean> defaultValues = new LinkedHashMap<String, Boolean>();\r
 \r
-        public void execute(AbstractSelect c, Boolean value, Object data) {\r
-            (c).setNullSelectionAllowed(value);\r
+        for (String option : options.keySet()) {\r
+            defaultValues.put(option, defaultValue);\r
         }\r
-    };\r
 \r
-    protected Command<AbstractSelect, Object> nullSelectItemIdCommand = new Command<AbstractSelect, Object>() {\r
+        createMultiToggleAction(caption, category, options, command,\r
+                defaultValues);\r
+    }\r
 \r
-        public void execute(AbstractSelect c, Object value, Object data) {\r
-            c.setNullSelectionItemId(value);\r
-        }\r
-    };\r
+    protected <TYPE> void createMultiToggleAction(\r
+            String caption,\r
+            String category,\r
+            LinkedHashMap<String, TYPE> options,\r
+            com.vaadin.tests.components.ComponentTestCase.Command<T, Boolean> command,\r
+            LinkedHashMap<String, Boolean> defaultValues) {\r
 \r
-    protected Command<AbstractSelect, Integer> itemsInContainerCommand = new Command<AbstractSelect, Integer>() {\r
+        createCategory(caption, category);\r
+\r
+        for (String option : options.keySet()) {\r
+            createBooleanAction(option, caption, defaultValues.get(option),\r
+                    command, options.get(option));\r
 \r
-        public void execute(AbstractSelect t, Integer value, Object data) {\r
-            t.setContainerDataSource(createContainer(t.getContainerDataSource()\r
-                    .getContainerPropertyIds().size(), value));\r
         }\r
-    };\r
+    }\r
+\r
+    protected <TYPE> void createSelectAction(\r
+            String caption,\r
+            String category,\r
+            LinkedHashMap<String, TYPE> options,\r
+            String initialValue,\r
+            com.vaadin.tests.components.ComponentTestCase.Command<T, TYPE> command,\r
+            Object data) {\r
 \r
-    protected Command<AbstractSelect, Integer> columnsInContainerCommand = new Command<AbstractSelect, Integer>() {\r
+        MenuItem parentItem = getCategoryMenuItem(category);\r
+        MenuItem mainItem = parentItem.addItem(caption, null);\r
 \r
-        public void execute(AbstractSelect t, Integer value, Object data) {\r
-            t.setContainerDataSource(createContainer(value, t\r
-                    .getContainerDataSource().size()));\r
+        parentOfSelectableMenuItem.add(mainItem);\r
+        for (String option : options.keySet()) {\r
+            MenuBar.Command cmd = singleSelectMenuCommand(command,\r
+                    options.get(option), data);\r
+            MenuItem item = mainItem.addItem(option, cmd);\r
+            if (option.equals(initialValue)) {\r
+                cmd.menuSelected(item);\r
+            }\r
         }\r
-    };\r
+    }\r
 \r
-    /* COMMANDS END */\r
 }\r
diff --git a/tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldTestCase.java b/tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldTestCase.java
new file mode 100644 (file)
index 0000000..d13e164
--- /dev/null
@@ -0,0 +1,124 @@
+package com.vaadin.tests.components.abstractfield;\r
+\r
+import java.util.LinkedHashMap;\r
+\r
+import com.vaadin.data.Property.ReadOnlyStatusChangeEvent;\r
+import com.vaadin.data.Property.ReadOnlyStatusChangeListener;\r
+import com.vaadin.data.Property.ValueChangeListener;\r
+import com.vaadin.event.FieldEvents.BlurEvent;\r
+import com.vaadin.event.FieldEvents.BlurListener;\r
+import com.vaadin.event.FieldEvents.BlurNotifier;\r
+import com.vaadin.event.FieldEvents.FocusEvent;\r
+import com.vaadin.event.FieldEvents.FocusListener;\r
+import com.vaadin.event.FieldEvents.FocusNotifier;\r
+import com.vaadin.tests.components.MenuBasedComponentTestCase;\r
+import com.vaadin.ui.AbstractField;\r
+\r
+public abstract class AbstractFieldTestCase<T extends AbstractField> extends\r
+        MenuBasedComponentTestCase<T> implements ValueChangeListener,\r
+        ReadOnlyStatusChangeListener, FocusListener, BlurListener {\r
+\r
+    @Override\r
+    protected void createActions() {\r
+        super.createActions();\r
+        createBooleanAction("Required", CATEGORY_STATE, false, requiredCommand);\r
+        createRequiredErrorSelect(CATEGORY_DECORATIONS);\r
+\r
+        createValueChangeListener(CATEGORY_LISTENERS);\r
+        createReadOnlyStatusChangeListener(CATEGORY_LISTENERS);\r
+    }\r
+\r
+    private void createRequiredErrorSelect(String category) {\r
+        LinkedHashMap<String, String> options = new LinkedHashMap<String, String>();\r
+        options.put("-", null);\r
+        options.put(TEXT_SHORT, TEXT_SHORT);\r
+        options.put("Medium", TEXT_MEDIUM);\r
+        options.put("Long", TEXT_LONG);\r
+        options.put("Very long", TEXT_VERY_LONG);\r
+        createSelectAction("Required error message", category, options, "-",\r
+                requiredErrorMessageCommand);\r
+\r
+    }\r
+\r
+    private void createValueChangeListener(String category) {\r
+\r
+        createBooleanAction("Value change listener", category, false,\r
+                valueChangeListenerCommand);\r
+    }\r
+\r
+    private void createReadOnlyStatusChangeListener(String category) {\r
+\r
+        createBooleanAction("Read only status change listener", category,\r
+                false, readonlyStatusChangeListenerCommand);\r
+    }\r
+\r
+    protected void createFocusListener(String category) {\r
+        createBooleanAction("Focus listener", category, false,\r
+                focusListenerCommand);\r
+\r
+    }\r
+\r
+    protected void createBlurListener(String category) {\r
+        createBooleanAction("Blur listener", category, false,\r
+                blurListenerCommand);\r
+\r
+    }\r
+\r
+    protected Command<T, Boolean> valueChangeListenerCommand = new Command<T, Boolean>() {\r
+\r
+        public void execute(T c, Boolean value, Object data) {\r
+            if (value) {\r
+                c.addListener((ValueChangeListener) AbstractFieldTestCase.this);\r
+            } else {\r
+                c.removeListener((ValueChangeListener) AbstractFieldTestCase.this);\r
+            }\r
+        }\r
+    };\r
+    protected Command<T, Boolean> readonlyStatusChangeListenerCommand = new Command<T, Boolean>() {\r
+\r
+        public void execute(T c, Boolean value, Object data) {\r
+            if (value) {\r
+                c.addListener((ReadOnlyStatusChangeListener) AbstractFieldTestCase.this);\r
+            } else {\r
+                c.removeListener((ReadOnlyStatusChangeListener) AbstractFieldTestCase.this);\r
+            }\r
+        }\r
+    };\r
+    protected Command<T, Boolean> focusListenerCommand = new Command<T, Boolean>() {\r
+\r
+        public void execute(T c, Boolean value, Object data) {\r
+            if (value) {\r
+                ((FocusNotifier) c).addListener(AbstractFieldTestCase.this);\r
+            } else {\r
+                ((FocusNotifier) c).removeListener(AbstractFieldTestCase.this);\r
+            }\r
+        }\r
+    };\r
+    protected Command<T, Boolean> blurListenerCommand = new Command<T, Boolean>() {\r
+\r
+        public void execute(T c, Boolean value, Object data) {\r
+            if (value) {\r
+                ((BlurNotifier) c).addListener(AbstractFieldTestCase.this);\r
+            } else {\r
+                ((BlurNotifier) c).removeListener(AbstractFieldTestCase.this);\r
+            }\r
+        }\r
+    };\r
+\r
+    public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) {\r
+        log(event.getClass().getSimpleName() + ", new value: "\r
+                + event.getProperty().getValue());\r
+    };\r
+\r
+    public void readOnlyStatusChange(ReadOnlyStatusChangeEvent event) {\r
+        log(event.getClass().getSimpleName());\r
+    }\r
+\r
+    public void focus(FocusEvent event) {\r
+        log(event.getClass().getSimpleName());\r
+    }\r
+\r
+    public void blur(BlurEvent event) {\r
+        log(event.getClass().getSimpleName());\r
+    }\r
+}\r
diff --git a/tests/src/com/vaadin/tests/components/button/Buttons2.java b/tests/src/com/vaadin/tests/components/button/Buttons2.java
new file mode 100644 (file)
index 0000000..ecb5d34
--- /dev/null
@@ -0,0 +1,56 @@
+package com.vaadin.tests.components.button;\r
+\r
+import com.vaadin.tests.components.abstractfield.AbstractFieldTestCase;\r
+import com.vaadin.ui.Button;\r
+import com.vaadin.ui.Button.ClickEvent;\r
+import com.vaadin.ui.Button.ClickListener;\r
+\r
+public class Buttons2 extends AbstractFieldTestCase<Button> implements\r
+        ClickListener {\r
+\r
+    private Command<Button, Boolean> switchModeCommand = new Command<Button, Boolean>() {\r
+\r
+        public void execute(Button c, Boolean value, Object data) {\r
+            c.setSwitchMode(value);\r
+        }\r
+    };\r
+\r
+    private Command<Button, Boolean> clickListenerCommand = new Command<Button, Boolean>() {\r
+\r
+        public void execute(Button c, Boolean value, Object data) {\r
+            if (value) {\r
+                c.addListener((ClickListener) Buttons2.this);\r
+            } else {\r
+                c.removeListener((ClickListener) Buttons2.this);\r
+            }\r
+\r
+        }\r
+    };\r
+\r
+    @Override\r
+    protected Class<Button> getTestClass() {\r
+        return Button.class;\r
+    }\r
+\r
+    @Override\r
+    protected void createActions() {\r
+        super.createActions();\r
+\r
+        createFocusListener(CATEGORY_LISTENERS);\r
+        createBlurListener(CATEGORY_LISTENERS);\r
+\r
+        createBooleanAction("Switch mode", CATEGORY_FEATURES, false,\r
+                switchModeCommand);\r
+        addClickListener(CATEGORY_LISTENERS);\r
+    }\r
+\r
+    private void addClickListener(String category) {\r
+        createBooleanAction("Click listener", category, false,\r
+                clickListenerCommand);\r
+\r
+    }\r
+\r
+    public void buttonClick(ClickEvent event) {\r
+        log(event.getClass().getSimpleName());\r
+    }\r
+}\r
diff --git a/tests/src/com/vaadin/tests/components/checkbox/CheckBoxes2.java b/tests/src/com/vaadin/tests/components/checkbox/CheckBoxes2.java
new file mode 100644 (file)
index 0000000..38307b5
--- /dev/null
@@ -0,0 +1,57 @@
+package com.vaadin.tests.components.checkbox;\r
+\r
+import com.vaadin.tests.components.abstractfield.AbstractFieldTestCase;\r
+import com.vaadin.ui.Button.ClickEvent;\r
+import com.vaadin.ui.Button.ClickListener;\r
+import com.vaadin.ui.CheckBox;\r
+\r
+public class CheckBoxes2 extends AbstractFieldTestCase<CheckBox> implements\r
+        ClickListener {\r
+\r
+    // cannot extend Buttons2 because of Switch mode problems\r
+\r
+    @Override\r
+    protected Class<CheckBox> getTestClass() {\r
+        return CheckBox.class;\r
+    }\r
+\r
+    private Command<CheckBox, Boolean> switchModeCommand = new Command<CheckBox, Boolean>() {\r
+\r
+        public void execute(CheckBox c, Boolean value, Object data) {\r
+            c.setSwitchMode(value);\r
+        }\r
+    };\r
+\r
+    private Command<CheckBox, Boolean> clickListenerCommand = new Command<CheckBox, Boolean>() {\r
+\r
+        public void execute(CheckBox c, Boolean value, Object data) {\r
+            if (value) {\r
+                c.addListener((ClickListener) CheckBoxes2.this);\r
+            } else {\r
+                c.removeListener((ClickListener) CheckBoxes2.this);\r
+            }\r
+\r
+        }\r
+    };\r
+\r
+    @Override\r
+    protected void createActions() {\r
+        super.createActions();\r
+\r
+        createFocusListener(CATEGORY_LISTENERS);\r
+        createBlurListener(CATEGORY_LISTENERS);\r
+        createBooleanAction("Switch mode", CATEGORY_FEATURES, true,\r
+                switchModeCommand);\r
+        addClickListener(CATEGORY_LISTENERS);\r
+    }\r
+\r
+    private void addClickListener(String category) {\r
+        createBooleanAction("Click listener", category, false,\r
+                clickListenerCommand);\r
+\r
+    }\r
+\r
+    public void buttonClick(ClickEvent event) {\r
+        log(event.getClass().getSimpleName());\r
+    }\r
+}\r
diff --git a/tests/src/com/vaadin/tests/components/combobox/ComboBoxes2.java b/tests/src/com/vaadin/tests/components/combobox/ComboBoxes2.java
new file mode 100644 (file)
index 0000000..c3c3bd8
--- /dev/null
@@ -0,0 +1,45 @@
+package com.vaadin.tests.components.combobox;
+
+import java.util.LinkedHashMap;
+
+import com.vaadin.terminal.Resource;
+import com.vaadin.tests.components.select.AbstractSelectTestCase;
+import com.vaadin.ui.ComboBox;
+
+public class ComboBoxes2 extends AbstractSelectTestCase<ComboBox> {
+
+    @Override
+    protected Class<ComboBox> getTestClass() {
+        return ComboBox.class;
+    }
+
+    @Override
+    protected void createActions() {
+        super.createActions();
+        createItemIconSelect(CATEGORY_DATA_SOURCE);
+    }
+
+    private void createItemIconSelect(String category) {
+
+        LinkedHashMap<String, Resource> options = new LinkedHashMap<String, Resource>();
+        options.put("-", null);
+        options.put("16x16", ICON_16_USER_PNG_UNCACHEABLE);
+        options.put("32x32", ICON_32_ATTENTION_PNG_UNCACHEABLE);
+        options.put("64x64", ICON_64_EMAIL_REPLY_PNG_UNCACHEABLE);
+
+        createSelectAction("Icon", category, options, "-",
+                new Command<ComboBox, Resource>() {
+
+                    public void execute(ComboBox c, Resource value, Object data) {
+                        for (Object id : c.getItemIds()) {
+                            if (value == null) {
+                                c.setItemIcon(id, null);
+                            } else {
+                                c.setItemIcon(id, value);
+                            }
+                        }
+                    }
+                });
+    }
+
+}
diff --git a/tests/src/com/vaadin/tests/components/datefield/DateFieldTestCase.java b/tests/src/com/vaadin/tests/components/datefield/DateFieldTestCase.java
new file mode 100644 (file)
index 0000000..e8eeb97
--- /dev/null
@@ -0,0 +1,108 @@
+package com.vaadin.tests.components.datefield;\r
+\r
+import java.text.DateFormat;\r
+import java.text.SimpleDateFormat;\r
+import java.util.LinkedHashMap;\r
+import java.util.Locale;\r
+\r
+import com.vaadin.tests.components.abstractfield.AbstractFieldTestCase;\r
+import com.vaadin.ui.DateField;\r
+\r
+public abstract class DateFieldTestCase<T extends DateField> extends\r
+        AbstractFieldTestCase<T> {\r
+\r
+    @Override\r
+    protected void createActions() {\r
+        super.createActions();\r
+        createResolutionSelectAction(CATEGORY_FEATURES);\r
+        createBooleanAction("Lenient", CATEGORY_FEATURES, false, lenientCommand);\r
+        createBooleanAction("Show week numbers", CATEGORY_FEATURES, false,\r
+                weekNumberCommand);\r
+        createDateFormatSelectAction(CATEGORY_FEATURES);\r
+        createFocusListener(CATEGORY_LISTENERS);\r
+        createBlurListener(CATEGORY_LISTENERS);\r
+    };\r
+\r
+    private void createDateFormatSelectAction(String category) {\r
+        LinkedHashMap<String, String> options = new LinkedHashMap<String, String>();\r
+\r
+        options.put("-", null);\r
+        options.put("d M yyyy", "d M yyyy");\r
+        options.put("d MM yyyy", "d MM yyyy");\r
+        options.put("d MMM yyyy", "d MMM yyyy");\r
+        options.put("d MMMM yyyy", "d MMMM yyyy");\r
+        options.put("dd M yyyy", "dd M yyyy");\r
+        options.put("ddd M yyyy", "ddd M yyyy");\r
+        options.put("d M y", "d M y");\r
+        options.put("d M yy", "d M yy");\r
+        options.put("d M yyy", "d M yyy");\r
+        options.put("d M yyyy", "d M yyyy");\r
+        options.put("d M 'custom text' yyyy", "d M 'custom text' yyyy");\r
+        options.put("'day:'d', month:'M', year: 'yyyy",\r
+                "'day:'d', month:'M', year: 'yyyy");\r
+        options.put(getDatePattern(new Locale("fi", "FI"), DateFormat.LONG),\r
+                getDatePattern(new Locale("fi", "FI"), DateFormat.LONG));\r
+        options.put(getDatePattern(new Locale("fi", "FI"), DateFormat.MEDIUM),\r
+                getDatePattern(new Locale("fi", "FI"), DateFormat.MEDIUM));\r
+        options.put(getDatePattern(new Locale("fi", "FI"), DateFormat.SHORT),\r
+                getDatePattern(new Locale("fi", "FI"), DateFormat.SHORT));\r
+\r
+        createSelectAction("Date format", category, options, "-",\r
+                dateFormatCommand);\r
+\r
+    }\r
+\r
+    private String getDatePattern(Locale locale, int dateStyle) {\r
+        DateFormat dateFormat = DateFormat.getDateInstance(dateStyle, locale);\r
+\r
+        if (dateFormat instanceof SimpleDateFormat) {\r
+            String pattern = ((SimpleDateFormat) dateFormat).toPattern();\r
+            return pattern;\r
+        }\r
+        return null;\r
+\r
+    }\r
+\r
+    private void createResolutionSelectAction(String category) {\r
+        LinkedHashMap<String, Integer> options = new LinkedHashMap<String, Integer>();\r
+        options.put("Year", DateField.RESOLUTION_YEAR);\r
+        options.put("Month", DateField.RESOLUTION_MONTH);\r
+        options.put("Day", DateField.RESOLUTION_DAY);\r
+        options.put("Hour", DateField.RESOLUTION_HOUR);\r
+        options.put("Min", DateField.RESOLUTION_MIN);\r
+        options.put("Sec", DateField.RESOLUTION_SEC);\r
+        options.put("Msec", DateField.RESOLUTION_MSEC);\r
+\r
+        createSelectAction("Resolution", category, options, "Year",\r
+                resolutionCommand);\r
+    }\r
+\r
+    private Command<T, Integer> resolutionCommand = new Command<T, Integer>() {\r
+\r
+        public void execute(T c, Integer value, Object data) {\r
+            c.setResolution(value);\r
+\r
+        }\r
+    };\r
+    private Command<T, Boolean> lenientCommand = new Command<T, Boolean>() {\r
+\r
+        public void execute(T c, Boolean value, Object data) {\r
+            c.setLenient(false);\r
+\r
+        }\r
+    };\r
+    private Command<T, Boolean> weekNumberCommand = new Command<T, Boolean>() {\r
+\r
+        public void execute(T c, Boolean value, Object data) {\r
+            c.setShowISOWeekNumbers(value);\r
+\r
+        }\r
+    };\r
+    private Command<T, String> dateFormatCommand = new Command<T, String>() {\r
+\r
+        public void execute(T c, String value, Object data) {\r
+            c.setDateFormat(value);\r
+        }\r
+    };\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/components/datefield/InlineDateFields2.java b/tests/src/com/vaadin/tests/components/datefield/InlineDateFields2.java
new file mode 100644 (file)
index 0000000..773531c
--- /dev/null
@@ -0,0 +1,12 @@
+package com.vaadin.tests.components.datefield;\r
+\r
+import com.vaadin.ui.InlineDateField;\r
+\r
+public class InlineDateFields2 extends DateFieldTestCase<InlineDateField> {\r
+\r
+    @Override\r
+    protected Class<InlineDateField> getTestClass() {\r
+        return InlineDateField.class;\r
+    }\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/components/datefield/PopupDateFields2.java b/tests/src/com/vaadin/tests/components/datefield/PopupDateFields2.java
new file mode 100644 (file)
index 0000000..465ccc6
--- /dev/null
@@ -0,0 +1,38 @@
+package com.vaadin.tests.components.datefield;\r
+\r
+import java.util.LinkedHashMap;\r
+\r
+import com.vaadin.ui.PopupDateField;\r
+\r
+public class PopupDateFields2 extends DateFieldTestCase<PopupDateField> {\r
+\r
+    @Override\r
+    protected Class<PopupDateField> getTestClass() {\r
+        return PopupDateField.class;\r
+    }\r
+\r
+    @Override\r
+    protected void createActions() {\r
+        super.createActions();\r
+\r
+        createInputPromptSelectAction(CATEGORY_FEATURES);\r
+    }\r
+\r
+    private void createInputPromptSelectAction(String category) {\r
+        LinkedHashMap<String, String> options = new LinkedHashMap<String, String>();\r
+        options.put("<none>", null);\r
+        options.put("Please enter date", "Please enter date");\r
+        options.put("åäöÅÄÖ", "åäöÅÄÖ");\r
+\r
+        createSelectAction("Input prompt", category, options, "<none>",\r
+                new Command<PopupDateField, String>() {\r
+\r
+                    public void execute(PopupDateField c, String value,\r
+                            Object data) {\r
+                        c.setInputPrompt(value);\r
+\r
+                    }\r
+                });\r
+    }\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/components/listselect/ListSelects.java b/tests/src/com/vaadin/tests/components/listselect/ListSelects.java
new file mode 100644 (file)
index 0000000..45a8e46
--- /dev/null
@@ -0,0 +1,65 @@
+package com.vaadin.tests.components.listselect;\r
+\r
+import java.util.LinkedHashMap;\r
+\r
+import com.vaadin.tests.components.select.AbstractSelectTestCase;\r
+import com.vaadin.ui.ListSelect;\r
+\r
+public class ListSelects extends AbstractSelectTestCase<ListSelect> {\r
+\r
+    @Override\r
+    protected Class<ListSelect> getTestClass() {\r
+        return ListSelect.class;\r
+    }\r
+\r
+    @Override\r
+    protected void createActions() {\r
+        super.createActions();\r
+        createColumnSelectAction();\r
+        createRowSelectAction();\r
+    }\r
+\r
+    private void createColumnSelectAction() {\r
+        LinkedHashMap<String, Integer> options = new LinkedHashMap<String, Integer>();\r
+        options.put("-", 0);\r
+        for (int i = 1; i <= 10; i++) {\r
+            options.put(String.valueOf(i), i);\r
+        }\r
+        options.put("50", 50);\r
+        options.put("100", 100);\r
+        options.put("1000", 1000);\r
+\r
+        super.createSelectAction("Columns", CATEGORY_DATA_SOURCE, options, "-",\r
+                columnsAction);\r
+\r
+    }\r
+\r
+    private void createRowSelectAction() {\r
+        LinkedHashMap<String, Integer> options = new LinkedHashMap<String, Integer>();\r
+        options.put("-", 0);\r
+        for (int i = 1; i <= 10; i++) {\r
+            options.put(String.valueOf(i), i);\r
+        }\r
+        options.put("50", 50);\r
+        options.put("100", 100);\r
+        options.put("1000", 1000);\r
+\r
+        super.createSelectAction("Rows", CATEGORY_DATA_SOURCE, options, "-",\r
+                rowsAction);\r
+\r
+    }\r
+\r
+    private Command<ListSelect, Integer> columnsAction = new Command<ListSelect, Integer>() {\r
+\r
+        public void execute(ListSelect c, Integer value, Object data) {\r
+            c.setColumns(value);\r
+        }\r
+    };\r
+    private Command<ListSelect, Integer> rowsAction = new Command<ListSelect, Integer>() {\r
+\r
+        public void execute(ListSelect c, Integer value, Object data) {\r
+            c.setRows(value);\r
+        }\r
+    };\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/components/optiongroup/OptionGroups.java b/tests/src/com/vaadin/tests/components/optiongroup/OptionGroups.java
new file mode 100644 (file)
index 0000000..e8eaa28
--- /dev/null
@@ -0,0 +1,37 @@
+package com.vaadin.tests.components.optiongroup;\r
+\r
+import com.vaadin.tests.components.select.AbstractSelectTestCase;\r
+import com.vaadin.ui.OptionGroup;\r
+\r
+public class OptionGroups extends AbstractSelectTestCase<OptionGroup> {\r
+\r
+    @Override\r
+    protected Class<OptionGroup> getTestClass() {\r
+        return OptionGroup.class;\r
+    }\r
+\r
+    @Override\r
+    protected void createActions() {\r
+        super.createActions();\r
+        createFocusListener(CATEGORY_LISTENERS);\r
+        createBlurListener(CATEGORY_LISTENERS);\r
+\r
+        createDisabledItemsMultiToggle("Disabled items");\r
+    }\r
+\r
+    private void createDisabledItemsMultiToggle(String category) {\r
+        for (Object id : getComponent().getItemIds()) {\r
+            createBooleanAction(id.toString() + " - enabled", category, true,\r
+                    enabledItemCommand, id);\r
+        }\r
+    }\r
+\r
+    private Command<OptionGroup, Boolean> enabledItemCommand = new Command<OptionGroup, Boolean>() {\r
+\r
+        public void execute(OptionGroup c, Boolean value, Object data) {\r
+            c.setItemEnabled(data, value);\r
+\r
+        }\r
+    };\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/components/select/AbstractSelectTestCase.java b/tests/src/com/vaadin/tests/components/select/AbstractSelectTestCase.java
new file mode 100644 (file)
index 0000000..c5b97d4
--- /dev/null
@@ -0,0 +1,168 @@
+package com.vaadin.tests.components.select;\r
+\r
+import java.util.LinkedHashMap;\r
+\r
+import com.vaadin.data.Container;\r
+import com.vaadin.data.Item;\r
+import com.vaadin.data.util.IndexedContainer;\r
+import com.vaadin.event.ItemClickEvent;\r
+import com.vaadin.event.ItemClickEvent.ItemClickListener;\r
+import com.vaadin.event.ItemClickEvent.ItemClickSource;\r
+import com.vaadin.tests.components.abstractfield.AbstractFieldTestCase;\r
+import com.vaadin.ui.AbstractSelect;\r
+\r
+public abstract class AbstractSelectTestCase<T extends AbstractSelect> extends\r
+        AbstractFieldTestCase<T> implements ItemClickListener {\r
+\r
+    protected static final String CATEGORY_DATA_SOURCE = "Data source";\r
+\r
+    private int items = 0;\r
+    private int properties = 0;\r
+\r
+    @Override\r
+    protected void createActions() {\r
+        super.createActions();\r
+        createNullSelectAllowedCheckbox(CATEGORY_SELECTION);\r
+        createPropertiesInContainerSelect(CATEGORY_DATA_SOURCE);\r
+        createItemsInContainerSelect(CATEGORY_DATA_SOURCE);\r
+\r
+    }\r
+\r
+    protected void createNullSelectAllowedCheckbox(String category) {\r
+        createBooleanAction("Null Selection Allowed", category, false,\r
+                nullSelectionAllowedCommand);\r
+\r
+    }\r
+\r
+    protected void createNullSelectItemId(String category) {\r
+        LinkedHashMap<String, Object> options = new LinkedHashMap<String, Object>();\r
+        options.put("- None -", null);\r
+        for (Object id : (getComponent()).getContainerDataSource()\r
+                .getContainerPropertyIds()) {\r
+            options.put(id.toString(), id);\r
+        }\r
+        createSelectAction("Null Selection Item Id", category, options,\r
+                "- None -", nullSelectItemIdCommand);\r
+    }\r
+\r
+    protected Container createContainer(int properties, int items) {\r
+        return createIndexedContainer(properties, items);\r
+    }\r
+\r
+    private Container createIndexedContainer(int properties, int items) {\r
+        IndexedContainer c = new IndexedContainer();\r
+        populateContainer(c, properties, items);\r
+\r
+        return c;\r
+    }\r
+\r
+    protected void populateContainer(Container c, int properties, int items) {\r
+        c.removeAllItems();\r
+        for (int i = 1; i <= properties; i++) {\r
+            c.addContainerProperty("Property " + i, String.class, "");\r
+        }\r
+        for (int i = 1; i <= items; i++) {\r
+            Item item = c.addItem("Item " + i);\r
+            for (int j = 1; j <= properties; j++) {\r
+                item.getItemProperty("Property " + j).setValue(\r
+                        "Item " + i + "," + j);\r
+            }\r
+        }\r
+\r
+    }\r
+\r
+    protected void createItemsInContainerSelect(String category) {\r
+        LinkedHashMap<String, Integer> options = new LinkedHashMap<String, Integer>();\r
+        for (int i = 0; i <= 10; i++) {\r
+            options.put(String.valueOf(i), i);\r
+        }\r
+        options.put("20", 20);\r
+        options.put("100", 100);\r
+        options.put("1000", 1000);\r
+        options.put("10000", 10000);\r
+        options.put("100000", 100000);\r
+\r
+        createSelectAction("Items in container", category, options, "20",\r
+                itemsInContainerCommand);\r
+    }\r
+\r
+    protected void createPropertiesInContainerSelect(String category) {\r
+        LinkedHashMap<String, Integer> options = new LinkedHashMap<String, Integer>();\r
+        options.put("0", 0);\r
+        for (int i = 0; i <= 10; i++) {\r
+            options.put(String.valueOf(i), i);\r
+        }\r
+        options.put("50", 50);\r
+        options.put("100", 100);\r
+        options.put("1000", 1000);\r
+\r
+        createSelectAction("Properties in container", category, options, "10",\r
+                propertiesInContainerCommand);\r
+    }\r
+\r
+    protected void createItemClickListener(String category) {\r
+        createBooleanAction("Item click listener", category, false,\r
+                itemClickListenerCommand);\r
+    }\r
+\r
+    /* COMMANDS */\r
+\r
+    protected Command<T, Boolean> nullSelectionAllowedCommand = new Command<T, Boolean>() {\r
+\r
+        public void execute(T c, Boolean value, Object data) {\r
+            (c).setNullSelectionAllowed(value);\r
+        }\r
+    };\r
+\r
+    protected Command<T, Object> nullSelectItemIdCommand = new Command<T, Object>() {\r
+\r
+        public void execute(T c, Object value, Object data) {\r
+            c.setNullSelectionItemId(value);\r
+        }\r
+    };\r
+\r
+    protected Command<T, Integer> itemsInContainerCommand = new Command<T, Integer>() {\r
+\r
+        public void execute(T t, Integer value, Object data) {\r
+            items = value;\r
+            updateContainer();\r
+        }\r
+    };\r
+\r
+    protected Command<T, Integer> propertiesInContainerCommand = new Command<T, Integer>() {\r
+\r
+        public void execute(T t, Integer value, Object data) {\r
+            properties = value;\r
+            updateContainer();\r
+        }\r
+    };\r
+\r
+    protected Command<T, Boolean> itemClickListenerCommand = new Command<T, Boolean>() {\r
+\r
+        public void execute(T c, Boolean value, Object data) {\r
+            if (value) {\r
+                ((ItemClickSource) c).addListener(AbstractSelectTestCase.this);\r
+            } else {\r
+                ((ItemClickSource) c)\r
+                        .removeListener(AbstractSelectTestCase.this);\r
+            }\r
+\r
+        }\r
+    };\r
+\r
+    protected void setContainer(Container newContainer) {\r
+        getComponent().setContainerDataSource(newContainer);\r
+\r
+    }\r
+\r
+    protected void updateContainer() {\r
+        setContainer(createContainer(properties, items));\r
+    }\r
+\r
+    /* COMMANDS END */\r
+\r
+    public void itemClick(ItemClickEvent event) {\r
+        log("ItemClick on itemId: " + event.getItemId() + ", propertyId: "\r
+                + event.getPropertyId() + " using " + event.getButtonName());\r
+    }\r
+}\r
index 8a1f52f3a489b97d96cf3c8b25543be35e6a4458..c581091b251b9078956e7ae35e1eddfd2c527dc9 100644 (file)
@@ -5,9 +5,8 @@ import java.util.Arrays;
 import java.util.LinkedHashMap;\r
 import java.util.List;\r
 \r
-import com.vaadin.event.ItemClickEvent;\r
 import com.vaadin.event.ItemClickEvent.ItemClickListener;\r
-import com.vaadin.tests.components.MenuBasedComponentTestCase;\r
+import com.vaadin.tests.components.select.AbstractSelectTestCase;\r
 import com.vaadin.ui.AbstractSelect.MultiSelectMode;\r
 import com.vaadin.ui.Table;\r
 import com.vaadin.ui.Table.ColumnResizeEvent;\r
@@ -17,16 +16,20 @@ import com.vaadin.ui.Table.FooterClickListener;
 import com.vaadin.ui.Table.HeaderClickEvent;\r
 import com.vaadin.ui.Table.HeaderClickListener;\r
 \r
-public class Tables extends MenuBasedComponentTestCase<Table> implements\r
+public class Tables extends AbstractSelectTestCase<Table> implements\r
         ItemClickListener, HeaderClickListener, FooterClickListener,\r
         ColumnResizeListener {\r
 \r
     protected static final String CATEGORY_ROWS = "Rows";\r
     private static final String CATEGORY_HEADER = "Header";\r
     private static final String CATEGORY_FOOTER = "Footer";\r
-    private static final String CATEGORY_FEATURE_TOGGLES = "Features";\r
     private static final String CATEGORY_VISIBLE_COLUMNS = "Visible columns";\r
 \r
+    @Override\r
+    protected Class<Table> getTestClass() {\r
+        return Table.class;\r
+    }\r
+\r
     /* COMMANDS */\r
     private Command<Table, Boolean> visibleColumnCommand = new Command<Table, Boolean>() {\r
         public void execute(Table c, Boolean visible, Object propertyId) {\r
@@ -118,22 +121,19 @@ public class Tables extends MenuBasedComponentTestCase<Table> implements
     /* COMMANDS END */\r
 \r
     @Override\r
-    protected Class<Table> getTestClass() {\r
-        return Table.class;\r
-    }\r
+    protected void createActions() {\r
+        super.createActions();\r
 \r
-    @Override\r
-    protected void createCustomActions() {\r
         createPageLengthSelect(CATEGORY_SIZE);\r
 \r
         createSelectionModeSelect(CATEGORY_SELECTION);\r
 \r
-        createItemClickListenerCheckbox(CATEGORY_LISTENERS);\r
+        createItemClickListener(CATEGORY_LISTENERS);\r
         createColumnResizeListenerCheckbox(CATEGORY_LISTENERS);\r
         createHeaderClickListenerCheckbox(CATEGORY_LISTENERS);\r
         createFooterClickListenerCheckbox(CATEGORY_LISTENERS);\r
 \r
-        createRowHeaderModeSelect(CATEGORY_CONTENT);\r
+        createRowHeaderModeSelect(CATEGORY_DATA_SOURCE);\r
 \r
         createHeaderVisibilitySelect(CATEGORY_HEADER);\r
         createHeaderTextCheckbox(CATEGORY_HEADER);\r
@@ -141,8 +141,8 @@ public class Tables extends MenuBasedComponentTestCase<Table> implements
         createFooterVisibilityCheckbox(CATEGORY_FOOTER);\r
         createFooterTextSelect(CATEGORY_FOOTER);\r
 \r
-        createColumnReorderingAllowedCheckbox(CATEGORY_FEATURE_TOGGLES);\r
-        createColumnCollapsingAllowedCheckbox(CATEGORY_FEATURE_TOGGLES);\r
+        createColumnReorderingAllowedCheckbox(CATEGORY_FEATURES);\r
+        createColumnCollapsingAllowedCheckbox(CATEGORY_FEATURES);\r
 \r
         createVisibleColumnsMultiToggle(CATEGORY_VISIBLE_COLUMNS);\r
 \r
@@ -167,10 +167,13 @@ public class Tables extends MenuBasedComponentTestCase<Table> implements
     }\r
 \r
     private void createVisibleColumnsMultiToggle(String category) {\r
+        LinkedHashMap<String, Object> options = new LinkedHashMap<String, Object>();\r
         for (Object id : getComponent().getContainerPropertyIds()) {\r
-            createBooleanAction(id.toString() + " - visible", category, true,\r
-                    visibleColumnCommand, id);\r
+            options.put(id.toString(), id);\r
         }\r
+\r
+        createMultiToggleAction("Visible columns", category, options,\r
+                visibleColumnCommand, true);\r
     }\r
 \r
     private void createRowHeaderModeSelect(String category) {\r
@@ -228,22 +231,6 @@ public class Tables extends MenuBasedComponentTestCase<Table> implements
                 });\r
     }\r
 \r
-    private void createItemClickListenerCheckbox(String category) {\r
-        Command<Table, Boolean> itemClickListenerCommand = new Command<Table, Boolean>() {\r
-\r
-            public void execute(Table c, Boolean value, Object data) {\r
-                if (value) {\r
-                    c.addListener((ItemClickListener) Tables.this);\r
-                } else {\r
-                    c.removeListener((ItemClickListener) Tables.this);\r
-                }\r
-\r
-            }\r
-        };\r
-        createBooleanAction("Item click listener", category, false,\r
-                itemClickListenerCommand);\r
-    }\r
-\r
     private void createHeaderClickListenerCheckbox(String category) {\r
 \r
         createBooleanAction("Header click listener", category, false,\r
@@ -378,8 +365,4 @@ public class Tables extends MenuBasedComponentTestCase<Table> implements
                 + event.getButtonName());\r
     }\r
 \r
-    public void itemClick(ItemClickEvent event) {\r
-        log("ItemClick on " + event.getItemId() + "/" + event.getPropertyId()\r
-                + " using " + event.getButtonName());\r
-    }\r
 }\r
diff --git a/tests/src/com/vaadin/tests/components/tree/Trees.java b/tests/src/com/vaadin/tests/components/tree/Trees.java
new file mode 100644 (file)
index 0000000..83457d3
--- /dev/null
@@ -0,0 +1,353 @@
+package com.vaadin.tests.components.tree;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.LinkedHashMap;\r
+import java.util.List;\r
+\r
+import com.vaadin.data.Container;\r
+import com.vaadin.data.Container.Hierarchical;\r
+import com.vaadin.data.util.HierarchicalContainer;\r
+import com.vaadin.tests.components.select.AbstractSelectTestCase;\r
+import com.vaadin.ui.AbstractSelect.MultiSelectMode;\r
+import com.vaadin.ui.Tree;\r
+import com.vaadin.ui.Tree.CollapseEvent;\r
+import com.vaadin.ui.Tree.CollapseListener;\r
+import com.vaadin.ui.Tree.ExpandEvent;\r
+import com.vaadin.ui.Tree.ExpandListener;\r
+import com.vaadin.ui.Tree.ItemStyleGenerator;\r
+\r
+public class Trees extends AbstractSelectTestCase<Tree> implements\r
+        ExpandListener, CollapseListener {\r
+\r
+    private int rootItemIds = 3;\r
+\r
+    private ItemStyleGenerator rootGreenSecondLevelRed = new com.vaadin.ui.Tree.ItemStyleGenerator() {\r
+\r
+        public String getStyle(Object itemId) {\r
+            Hierarchical c = (Container.Hierarchical) getComponent()\r
+                    .getContainerDataSource();\r
+            if (c.isRoot(itemId)) {\r
+                return "green";\r
+            }\r
+\r
+            Object parent = c.getParent(itemId);\r
+            if (!c.isRoot(parent)) {\r
+                return "red";\r
+            }\r
+\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public String toString() {\r
+            return "Root green, second level red";\r
+        };\r
+\r
+    };\r
+\r
+    private ItemStyleGenerator evenItemsBold = new com.vaadin.ui.Tree.ItemStyleGenerator() {\r
+\r
+        public String getStyle(Object itemId) {\r
+            Hierarchical c = (Container.Hierarchical) getComponent()\r
+                    .getContainerDataSource();\r
+            int idx = 0;\r
+\r
+            for (Iterator<?> i = c.getItemIds().iterator(); i.hasNext();) {\r
+                Object id = i.next();\r
+                if (id == itemId) {\r
+                    if (idx % 2 == 1) {\r
+                        return "bold";\r
+                    } else {\r
+                        return null;\r
+                    }\r
+                }\r
+\r
+                idx++;\r
+            }\r
+\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public String toString() {\r
+            return "Even items bold";\r
+        };\r
+\r
+    };\r
+\r
+    @Override\r
+    protected Class<Tree> getTestClass() {\r
+        return Tree.class;\r
+    }\r
+\r
+    @Override\r
+    protected void createActions() {\r
+        super.createActions();\r
+\r
+        // Causes container changes so doing this first..\r
+        createRootItemSelectAction(CATEGORY_DATA_SOURCE);\r
+\r
+        createExpandCollapseActions(CATEGORY_FEATURES);\r
+        createSelectionModeSelect(CATEGORY_SELECTION);\r
+        createChildrenAllowedAction(CATEGORY_DATA_SOURCE);\r
+\r
+        createListeners(CATEGORY_LISTENERS);\r
+        createItemStyleGenerator(CATEGORY_FEATURES);\r
+\r
+        // TODO: DropHandler\r
+        // TODO: DragMode\r
+        // TODO: ActionHandler\r
+\r
+    }\r
+\r
+    private void createItemStyleGenerator(String category) {\r
+\r
+        LinkedHashMap<String, com.vaadin.ui.Tree.ItemStyleGenerator> options = new LinkedHashMap<String, com.vaadin.ui.Tree.ItemStyleGenerator>();\r
+\r
+        options.put("-", null);\r
+        options.put(rootGreenSecondLevelRed.toString(), rootGreenSecondLevelRed);\r
+        options.put(evenItemsBold.toString(), evenItemsBold);\r
+\r
+        createSelectAction("Item Style generator", category, options, "-",\r
+                itemStyleGeneratorCommand);\r
+\r
+    }\r
+\r
+    private void createListeners(String category) {\r
+        createBooleanAction("Expand listener", category, false,\r
+                expandListenerCommand);\r
+        createBooleanAction("Collapse listener", category, false,\r
+                collapseListenerCommand);\r
+        createBooleanAction("Item click listener", category, false,\r
+                itemClickListenerCommand);\r
+\r
+    }\r
+\r
+    private enum SelectMode {\r
+        NONE, SINGLE, MULTI_SIMPLE, MULTI;\r
+    }\r
+\r
+    protected void createSelectionModeSelect(String category) {\r
+        LinkedHashMap<String, SelectMode> options = new LinkedHashMap<String, SelectMode>();\r
+        options.put("None", SelectMode.NONE);\r
+        options.put("Single", SelectMode.SINGLE);\r
+        options.put("Multi - simple", SelectMode.MULTI_SIMPLE);\r
+        options.put("Multi - ctrl/shift", SelectMode.MULTI);\r
+\r
+        createSelectAction("Selection Mode", category, options,\r
+                "Multi - ctrl/shift", new Command<Tree, SelectMode>() {\r
+\r
+                    public void execute(Tree t, SelectMode value, Object data) {\r
+                        switch (value) {\r
+                        case NONE:\r
+                            t.setSelectable(false);\r
+                            break;\r
+                        case SINGLE:\r
+                            t.setMultiSelect(false);\r
+                            t.setSelectable(true);\r
+                            break;\r
+                        case MULTI_SIMPLE:\r
+                            t.setSelectable(true);\r
+                            t.setMultiSelect(true);\r
+                            t.setMultiselectMode(MultiSelectMode.SIMPLE);\r
+                            break;\r
+                        case MULTI:\r
+                            t.setSelectable(true);\r
+                            t.setMultiSelect(true);\r
+                            t.setMultiselectMode(MultiSelectMode.DEFAULT);\r
+                            break;\r
+                        }\r
+                    }\r
+                });\r
+    }\r
+\r
+    @Override\r
+    protected Container createContainer(int properties, int items) {\r
+        return createHierarchicalContainer(properties, items, rootItemIds);\r
+    }\r
+\r
+    private Container.Hierarchical createHierarchicalContainer(int properties,\r
+            int items, int roots) {\r
+        Container.Hierarchical c = new HierarchicalContainer();\r
+\r
+        populateContainer(c, properties, items);\r
+\r
+        if (items <= roots) {\r
+            return c;\r
+        }\r
+\r
+        // "roots" roots, each with\r
+        // "firstLevel" children, two with no children (one with childAllowed,\r
+        // one without)\r
+        // ("firstLevel"-2)*"secondLevel" children ("secondLevel"/2 with\r
+        // childAllowed, "secondLevel"/2 without)\r
+\r
+        // N*M+N*(M-2)*C = items\r
+        // items=N(M+MC-2C)\r
+\r
+        // Using secondLevel=firstLevel/2 =>\r
+        // items = roots*(firstLevel+firstLevel*firstLevel/2-2*firstLevel/2)\r
+        // =roots*(firstLevel+firstLevel^2/2-firstLevel)\r
+        // = roots*firstLevel^2/2\r
+        // => firstLevel = sqrt(items/roots*2)\r
+\r
+        int firstLevel = (int) Math.ceil(Math.sqrt(items / roots * 2.0));\r
+        int secondLevel = firstLevel / 2;\r
+\r
+        while (roots * (1 + 2 + (firstLevel - 2) * secondLevel) < items) {\r
+            // Increase something so we get enough items\r
+            secondLevel++;\r
+        }\r
+\r
+        List<Object> itemIds = new ArrayList<Object>(c.getItemIds());\r
+\r
+        int nextItemId = roots;\r
+        for (int rootIndex = 0; rootIndex < roots; rootIndex++) {\r
+            // roots use items 0..roots-1\r
+            Object rootItemId = itemIds.get(rootIndex);\r
+\r
+            // force roots to be roots even though they automatically should be\r
+            c.setParent(rootItemId, null);\r
+\r
+            for (int firstLevelIndex = 0; firstLevelIndex < firstLevel; firstLevelIndex++) {\r
+                if (nextItemId >= items) {\r
+                    break;\r
+                }\r
+                Object firstLevelItemId = itemIds.get(nextItemId++);\r
+                c.setParent(firstLevelItemId, rootItemId);\r
+\r
+                if (firstLevelIndex < 2) {\r
+                    continue;\r
+                }\r
+\r
+                // firstLevelChildren 2.. have child nodes\r
+                for (int secondLevelIndex = 0; secondLevelIndex < secondLevel; secondLevelIndex++) {\r
+                    if (nextItemId >= items) {\r
+                        break;\r
+                    }\r
+\r
+                    Object secondLevelItemId = itemIds.get(nextItemId++);\r
+                    c.setParent(secondLevelItemId, firstLevelItemId);\r
+                }\r
+            }\r
+        }\r
+\r
+        return c;\r
+    }\r
+\r
+    private void createRootItemSelectAction(String category) {\r
+        LinkedHashMap<String, Integer> options = new LinkedHashMap<String, Integer>();\r
+        for (int i = 1; i <= 10; i++) {\r
+            options.put(String.valueOf(i), i);\r
+        }\r
+        options.put("20", 20);\r
+        options.put("50", 50);\r
+        options.put("100", 100);\r
+\r
+        createSelectAction("Number of root items", category, options, "3",\r
+                rootItemIdsCommand);\r
+    }\r
+\r
+    private void createExpandCollapseActions(String category) {\r
+        LinkedHashMap<String, Object> options = new LinkedHashMap<String, Object>();\r
+\r
+        for (Object id : getComponent().getItemIds()) {\r
+            options.put(id.toString(), id);\r
+        }\r
+        createMultiClickAction("Expand", category, options, expandItemCommand,\r
+                null);\r
+        createMultiClickAction("Expand recursively", category, options,\r
+                expandItemRecursivelyCommand, null);\r
+        createMultiClickAction("Collapse", category, options,\r
+                collapseItemCommand, null);\r
+\r
+    }\r
+\r
+    private void createChildrenAllowedAction(String category) {\r
+        LinkedHashMap<String, Object> options = new LinkedHashMap<String, Object>();\r
+\r
+        for (Object id : getComponent().getItemIds()) {\r
+            options.put(id.toString(), id);\r
+        }\r
+        createMultiToggleAction("Children allowed", category, options,\r
+                setChildrenAllowedCommand, true);\r
+\r
+    }\r
+\r
+    /*\r
+     * COMMANDS\r
+     */\r
+    private Command<Tree, Integer> rootItemIdsCommand = new Command<Tree, Integer>() {\r
+\r
+        public void execute(Tree c, Integer value, Object data) {\r
+            rootItemIds = value;\r
+            updateContainer();\r
+        }\r
+    };\r
+\r
+    private Command<Tree, Object> expandItemCommand = new Command<Tree, Object>() {\r
+\r
+        public void execute(Tree c, Object itemId, Object data) {\r
+            c.expandItem(itemId);\r
+        }\r
+    };\r
+    private Command<Tree, Object> expandItemRecursivelyCommand = new Command<Tree, Object>() {\r
+\r
+        public void execute(Tree c, Object itemId, Object data) {\r
+            c.expandItemsRecursively(itemId);\r
+        }\r
+    };\r
+\r
+    private Command<Tree, Object> collapseItemCommand = new Command<Tree, Object>() {\r
+\r
+        public void execute(Tree c, Object itemId, Object data) {\r
+            c.collapseItem(itemId);\r
+        }\r
+    };\r
+\r
+    private Command<Tree, Boolean> setChildrenAllowedCommand = new Command<Tree, Boolean>() {\r
+\r
+        public void execute(Tree c, Boolean areChildrenAllowed, Object itemId) {\r
+            c.setChildrenAllowed(itemId, areChildrenAllowed);\r
+        }\r
+    };\r
+\r
+    private Command<Tree, Boolean> expandListenerCommand = new Command<Tree, Boolean>() {\r
+        public void execute(Tree c, Boolean value, Object data) {\r
+            if (value) {\r
+                c.addListener((ExpandListener) Trees.this);\r
+            } else {\r
+                c.removeListener((ExpandListener) Trees.this);\r
+            }\r
+        }\r
+    };\r
+\r
+    private Command<Tree, Boolean> collapseListenerCommand = new Command<Tree, Boolean>() {\r
+        public void execute(Tree c, Boolean value, Object data) {\r
+            if (value) {\r
+                c.addListener((CollapseListener) Trees.this);\r
+            } else {\r
+                c.removeListener((CollapseListener) Trees.this);\r
+            }\r
+        }\r
+    };\r
+\r
+    private Command<Tree, com.vaadin.ui.Tree.ItemStyleGenerator> itemStyleGeneratorCommand = new Command<Tree, com.vaadin.ui.Tree.ItemStyleGenerator>() {\r
+\r
+        public void execute(Tree c,\r
+                com.vaadin.ui.Tree.ItemStyleGenerator value, Object data) {\r
+            c.setItemStyleGenerator(value);\r
+\r
+        }\r
+    };\r
+\r
+    public void nodeCollapse(CollapseEvent event) {\r
+        log(event.getClass().getSimpleName() + ": " + event.getItemId());\r
+    }\r
+\r
+    public void nodeExpand(ExpandEvent event) {\r
+        log(event.getClass().getSimpleName() + ": " + event.getItemId());\r
+    }\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/components/twincolselect/TwinColSelects.java b/tests/src/com/vaadin/tests/components/twincolselect/TwinColSelects.java
new file mode 100644 (file)
index 0000000..ebbddc5
--- /dev/null
@@ -0,0 +1,64 @@
+package com.vaadin.tests.components.twincolselect;\r
+\r
+import java.util.LinkedHashMap;\r
+\r
+import com.vaadin.tests.components.select.AbstractSelectTestCase;\r
+import com.vaadin.ui.TwinColSelect;\r
+\r
+public class TwinColSelects extends AbstractSelectTestCase<TwinColSelect> {\r
+\r
+    @Override\r
+    protected Class<TwinColSelect> getTestClass() {\r
+        return TwinColSelect.class;\r
+    }\r
+\r
+    @Override\r
+    protected void createActions() {\r
+        super.createActions();\r
+        createColumnSelectAction();\r
+        createRowSelectAction();\r
+    }\r
+\r
+    private void createColumnSelectAction() {\r
+        LinkedHashMap<String, Integer> options = new LinkedHashMap<String, Integer>();\r
+        options.put("-", 0);\r
+        for (int i = 1; i <= 10; i++) {\r
+            options.put(String.valueOf(i), i);\r
+        }\r
+        options.put("50", 50);\r
+        options.put("100", 100);\r
+        options.put("1000", 1000);\r
+\r
+        super.createSelectAction("Columns", CATEGORY_DATA_SOURCE, options, "-",\r
+                columnsAction);\r
+\r
+    }\r
+\r
+    private void createRowSelectAction() {\r
+        LinkedHashMap<String, Integer> options = new LinkedHashMap<String, Integer>();\r
+        options.put("-", 0);\r
+        for (int i = 1; i <= 10; i++) {\r
+            options.put(String.valueOf(i), i);\r
+        }\r
+        options.put("50", 50);\r
+        options.put("100", 100);\r
+        options.put("1000", 1000);\r
+\r
+        super.createSelectAction("Rows", CATEGORY_DATA_SOURCE, options, "-",\r
+                rowsAction);\r
+\r
+    }\r
+\r
+    private Command<TwinColSelect, Integer> columnsAction = new Command<TwinColSelect, Integer>() {\r
+\r
+        public void execute(TwinColSelect c, Integer value, Object data) {\r
+            c.setColumns(value);\r
+        }\r
+    };\r
+    private Command<TwinColSelect, Integer> rowsAction = new Command<TwinColSelect, Integer>() {\r
+\r
+        public void execute(TwinColSelect c, Integer value, Object data) {\r
+            c.setRows(value);\r
+        }\r
+    };\r
+}\r