]> source.dussan.org Git - vaadin-framework.git/commitdiff
Test cases for IndexedContainer and HierarchicalContainer
authorArtur Signell <artur.signell@itmill.com>
Mon, 22 Feb 2010 15:21:22 +0000 (15:21 +0000)
committerArtur Signell <artur.signell@itmill.com>
Mon, 22 Feb 2010 15:21:22 +0000 (15:21 +0000)
svn changeset:11465/svn branch:6.3

tests/src/com/vaadin/tests/server/container/AbstractContainerTest.java [new file with mode: 0644]
tests/src/com/vaadin/tests/server/container/AbstractHierarchicalContainerTest.java [new file with mode: 0644]
tests/src/com/vaadin/tests/server/container/TestHierarchicalContainer.java [new file with mode: 0644]
tests/src/com/vaadin/tests/server/container/TestIndexedContainer.java [new file with mode: 0644]

diff --git a/tests/src/com/vaadin/tests/server/container/AbstractContainerTest.java b/tests/src/com/vaadin/tests/server/container/AbstractContainerTest.java
new file mode 100644 (file)
index 0000000..1fad034
--- /dev/null
@@ -0,0 +1,421 @@
+package com.vaadin.tests.server.container;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import junit.framework.TestCase;\r
+\r
+import com.vaadin.data.Container;\r
+import com.vaadin.data.Item;\r
+import com.vaadin.data.Container.Filterable;\r
+import com.vaadin.data.Container.Sortable;\r
+\r
+public abstract class AbstractContainerTest extends TestCase {\r
+\r
+    protected void validateContainer(Container container,\r
+            Object expectedFirstItemId, Object expectedLastItemId,\r
+            Object itemIdInSet, Object itemIdNotInSet, int expectedSize) {\r
+        Container.Indexed indexed = null;\r
+        if (container instanceof Container.Indexed) {\r
+            indexed = (Container.Indexed) container;\r
+        }\r
+\r
+        List<Object> itemIdList = new ArrayList<Object>(container.getItemIds());\r
+\r
+        // size()\r
+        assertEquals(expectedSize, container.size());\r
+        assertEquals(expectedSize, itemIdList.size());\r
+\r
+        // first item, last item\r
+        Object first = itemIdList.get(0);\r
+        Object last = itemIdList.get(itemIdList.size() - 1);\r
+\r
+        assertEquals(expectedFirstItemId, first);\r
+        assertEquals(expectedLastItemId, last);\r
+\r
+        // containsId\r
+        assertFalse(container.containsId(itemIdNotInSet));\r
+        assertTrue(container.containsId(itemIdInSet));\r
+\r
+        // getItem\r
+        assertNull(container.getItem(itemIdNotInSet));\r
+        assertNotNull(container.getItem(itemIdInSet));\r
+\r
+        // getContainerProperty\r
+        for (Object propId : container.getContainerPropertyIds()) {\r
+            assertNull(container.getContainerProperty(itemIdNotInSet, propId));\r
+            assertNotNull(container.getContainerProperty(itemIdInSet, propId));\r
+        }\r
+\r
+        if (indexed != null) {\r
+            // firstItemId\r
+            assertEquals(first, indexed.firstItemId());\r
+\r
+            // lastItemId\r
+            assertEquals(last, indexed.lastItemId());\r
+\r
+            // nextItemId\r
+            assertEquals(itemIdList.get(1), indexed.nextItemId(first));\r
+\r
+            // prevItemId\r
+            assertEquals(itemIdList.get(itemIdList.size() - 2), indexed\r
+                    .prevItemId(last));\r
+\r
+            // isFirstId\r
+            assertTrue(indexed.isFirstId(first));\r
+            assertFalse(indexed.isFirstId(last));\r
+\r
+            // isLastId\r
+            assertTrue(indexed.isLastId(last));\r
+            assertFalse(indexed.isLastId(first));\r
+\r
+            // indexOfId\r
+            assertEquals(0, indexed.indexOfId(first));\r
+            assertEquals(expectedSize - 1, indexed.indexOfId(last));\r
+\r
+            // getIdByIndex\r
+            assertEquals(indexed.getIdByIndex(0), first);\r
+            assertEquals(indexed.getIdByIndex(expectedSize - 1), last);\r
+\r
+        }\r
+\r
+    }\r
+\r
+    protected static final Object PROP1 = "PROP1";\r
+    protected static final Object PROP2 = "PROP2";\r
+    protected static final Object PROP3 = "PROP3";\r
+\r
+    protected void testBasicContainerOperations(Container.Filterable container) {\r
+        initializeContainer(container);\r
+\r
+        // Basic container\r
+        validateContainer(container, sampleData[0],\r
+                sampleData[sampleData.length - 1], sampleData[10], "abc",\r
+                sampleData.length);\r
+    }\r
+\r
+    protected void testContainerFiltering(Container.Filterable container) {\r
+        initializeContainer(container);\r
+\r
+        // Filter by "contains ab"\r
+        container.addContainerFilter(PROP1, "ab", false, false);\r
+\r
+        validateContainer(container, "com.vaadin.data.BufferedValidatable",\r
+                "com.vaadin.ui.TabSheet",\r
+                "com.vaadin.terminal.gwt.client.Focusable",\r
+                "com.vaadin.data.Buffered", 20);\r
+\r
+        // Filter by "contains da" (reversed as ad here)\r
+        container.removeAllContainerFilters();\r
+        container.addContainerFilter(PROP2, "ad", false, false);\r
+\r
+        validateContainer(container, "com.vaadin.data.Buffered",\r
+                "com.vaadin.terminal.gwt.server.ComponentSizeValidator",\r
+                "com.vaadin.data.util.IndexedContainer",\r
+                "com.vaadin.terminal.gwt.client.ui.VUriFragmentUtility", 37);\r
+    }\r
+\r
+    protected void testContainerSortingAndFiltering(Container.Sortable sortable) {\r
+        Filterable filterable = (Filterable) sortable;\r
+\r
+        initializeContainer(sortable);\r
+\r
+        // Filter by "contains ab"\r
+        filterable.addContainerFilter(PROP1, "ab", false, false);\r
+\r
+        // Must be able to sort based on PROP1 for this test\r
+        assertTrue(sortable.getSortableContainerPropertyIds().contains(PROP1));\r
+\r
+        sortable.sort(new Object[] { PROP1 }, new boolean[] { true });\r
+\r
+        validateContainer(sortable, "com.vaadin.data.BufferedValidatable",\r
+                "com.vaadin.ui.TableFieldFactory",\r
+                "com.vaadin.ui.TableFieldFactory",\r
+                "com.vaadin.data.util.BeanItem", 20);\r
+    }\r
+\r
+    protected void testContainerSorting(Container.Filterable container) {\r
+        Container.Sortable sortable = (Sortable) container;\r
+\r
+        initializeContainer(container);\r
+\r
+        // Must be able to sort based on PROP1 for this test\r
+        assertTrue(sortable.getSortableContainerPropertyIds().contains(PROP1));\r
+        assertTrue(sortable.getSortableContainerPropertyIds().contains(PROP2));\r
+\r
+        sortable.sort(new Object[] { PROP1 }, new boolean[] { true });\r
+\r
+        validateContainer(container, "com.vaadin.Application",\r
+                "com.vaadin.util.SerializerHelper",\r
+                "com.vaadin.terminal.ApplicationResource", "blah",\r
+                sampleData.length);\r
+\r
+        sortable.sort(new Object[] { PROP2 }, new boolean[] { true });\r
+\r
+        validateContainer(container,\r
+                "com.vaadin.terminal.gwt.server.ApplicationPortlet2",\r
+                "com.vaadin.data.util.ObjectProperty",\r
+                "com.vaadin.ui.BaseFieldFactory", "blah", sampleData.length);\r
+\r
+    }\r
+\r
+    protected void initializeContainer(Container container) {\r
+        container.removeAllItems();\r
+        Object[] propertyIds = container.getContainerPropertyIds().toArray();\r
+        for (Object propertyId : propertyIds) {\r
+            container.removeContainerProperty(propertyId);\r
+        }\r
+\r
+        container.addContainerProperty(PROP1, String.class, "");\r
+        container.addContainerProperty(PROP2, String.class, null);\r
+        container.addContainerProperty(PROP3, Integer.class, null);\r
+\r
+        for (int i = 0; i < sampleData.length; i++) {\r
+            String id = sampleData[i];\r
+            Item item = container.addItem(id);\r
+\r
+            item.getItemProperty(PROP1).setValue(sampleData[i]);\r
+            item.getItemProperty(PROP2).setValue(reverse(sampleData[i]));\r
+            item.getItemProperty(PROP3).setValue(i);\r
+        }\r
+    }\r
+\r
+    protected static String reverse(String string) {\r
+        return new StringBuilder(string).reverse().toString();\r
+    }\r
+\r
+    protected final String[] sampleData = {\r
+            "com.vaadin.annotations.AutoGenerated", "com.vaadin.Application",\r
+            "com.vaadin.data.Buffered", "com.vaadin.data.BufferedValidatable",\r
+            "com.vaadin.data.Container", "com.vaadin.data.Item",\r
+            "com.vaadin.data.Property", "com.vaadin.data.util.BeanItem",\r
+            "com.vaadin.data.util.BeanItemContainer",\r
+            "com.vaadin.data.util.ContainerHierarchicalWrapper",\r
+            "com.vaadin.data.util.ContainerOrderedWrapper",\r
+            "com.vaadin.data.util.DefaultItemSorter",\r
+            "com.vaadin.data.util.FilesystemContainer",\r
+            "com.vaadin.data.util.Filter",\r
+            "com.vaadin.data.util.HierarchicalContainer",\r
+            "com.vaadin.data.util.IndexedContainer",\r
+            "com.vaadin.data.util.ItemSorter",\r
+            "com.vaadin.data.util.MethodProperty",\r
+            "com.vaadin.data.util.ObjectProperty",\r
+            "com.vaadin.data.util.PropertyFormatter",\r
+            "com.vaadin.data.util.PropertysetItem",\r
+            "com.vaadin.data.util.QueryContainer",\r
+            "com.vaadin.data.util.TextFileProperty",\r
+            "com.vaadin.data.Validatable",\r
+            "com.vaadin.data.validator.AbstractStringValidator",\r
+            "com.vaadin.data.validator.AbstractValidator",\r
+            "com.vaadin.data.validator.CompositeValidator",\r
+            "com.vaadin.data.validator.DoubleValidator",\r
+            "com.vaadin.data.validator.EmailValidator",\r
+            "com.vaadin.data.validator.IntegerValidator",\r
+            "com.vaadin.data.validator.NullValidator",\r
+            "com.vaadin.data.validator.RegexpValidator",\r
+            "com.vaadin.data.validator.StringLengthValidator",\r
+            "com.vaadin.data.Validator", "com.vaadin.event.Action",\r
+            "com.vaadin.event.ComponentEventListener",\r
+            "com.vaadin.event.EventRouter", "com.vaadin.event.FieldEvents",\r
+            "com.vaadin.event.ItemClickEvent", "com.vaadin.event.LayoutEvents",\r
+            "com.vaadin.event.ListenerMethod",\r
+            "com.vaadin.event.MethodEventSource",\r
+            "com.vaadin.event.MouseEvents", "com.vaadin.event.ShortcutAction",\r
+            "com.vaadin.launcher.DemoLauncher",\r
+            "com.vaadin.launcher.DevelopmentServerLauncher",\r
+            "com.vaadin.launcher.util.BrowserLauncher",\r
+            "com.vaadin.service.ApplicationContext",\r
+            "com.vaadin.service.FileTypeResolver",\r
+            "com.vaadin.terminal.ApplicationResource",\r
+            "com.vaadin.terminal.ClassResource",\r
+            "com.vaadin.terminal.CompositeErrorMessage",\r
+            "com.vaadin.terminal.DownloadStream",\r
+            "com.vaadin.terminal.ErrorMessage",\r
+            "com.vaadin.terminal.ExternalResource",\r
+            "com.vaadin.terminal.FileResource",\r
+            "com.vaadin.terminal.gwt.client.ApplicationConfiguration",\r
+            "com.vaadin.terminal.gwt.client.ApplicationConnection",\r
+            "com.vaadin.terminal.gwt.client.BrowserInfo",\r
+            "com.vaadin.terminal.gwt.client.ClientExceptionHandler",\r
+            "com.vaadin.terminal.gwt.client.ComponentDetail",\r
+            "com.vaadin.terminal.gwt.client.ComponentDetailMap",\r
+            "com.vaadin.terminal.gwt.client.ComponentLocator",\r
+            "com.vaadin.terminal.gwt.client.Console",\r
+            "com.vaadin.terminal.gwt.client.Container",\r
+            "com.vaadin.terminal.gwt.client.ContainerResizedListener",\r
+            "com.vaadin.terminal.gwt.client.CSSRule",\r
+            "com.vaadin.terminal.gwt.client.DateTimeService",\r
+            "com.vaadin.terminal.gwt.client.DefaultWidgetSet",\r
+            "com.vaadin.terminal.gwt.client.Focusable",\r
+            "com.vaadin.terminal.gwt.client.HistoryImplIEVaadin",\r
+            "com.vaadin.terminal.gwt.client.LocaleNotLoadedException",\r
+            "com.vaadin.terminal.gwt.client.LocaleService",\r
+            "com.vaadin.terminal.gwt.client.MouseEventDetails",\r
+            "com.vaadin.terminal.gwt.client.NullConsole",\r
+            "com.vaadin.terminal.gwt.client.Paintable",\r
+            "com.vaadin.terminal.gwt.client.RenderInformation",\r
+            "com.vaadin.terminal.gwt.client.RenderSpace",\r
+            "com.vaadin.terminal.gwt.client.StyleConstants",\r
+            "com.vaadin.terminal.gwt.client.TooltipInfo",\r
+            "com.vaadin.terminal.gwt.client.ui.Action",\r
+            "com.vaadin.terminal.gwt.client.ui.ActionOwner",\r
+            "com.vaadin.terminal.gwt.client.ui.AlignmentInfo",\r
+            "com.vaadin.terminal.gwt.client.ui.CalendarEntry",\r
+            "com.vaadin.terminal.gwt.client.ui.ClickEventHandler",\r
+            "com.vaadin.terminal.gwt.client.ui.Field",\r
+            "com.vaadin.terminal.gwt.client.ui.Icon",\r
+            "com.vaadin.terminal.gwt.client.ui.layout.CellBasedLayout",\r
+            "com.vaadin.terminal.gwt.client.ui.layout.ChildComponentContainer",\r
+            "com.vaadin.terminal.gwt.client.ui.layout.Margins",\r
+            "com.vaadin.terminal.gwt.client.ui.LayoutClickEventHandler",\r
+            "com.vaadin.terminal.gwt.client.ui.MenuBar",\r
+            "com.vaadin.terminal.gwt.client.ui.MenuItem",\r
+            "com.vaadin.terminal.gwt.client.ui.richtextarea.VRichTextArea",\r
+            "com.vaadin.terminal.gwt.client.ui.richtextarea.VRichTextToolbar",\r
+            "com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler",\r
+            "com.vaadin.terminal.gwt.client.ui.SubPartAware",\r
+            "com.vaadin.terminal.gwt.client.ui.Table",\r
+            "com.vaadin.terminal.gwt.client.ui.TreeAction",\r
+            "com.vaadin.terminal.gwt.client.ui.TreeImages",\r
+            "com.vaadin.terminal.gwt.client.ui.VAbsoluteLayout",\r
+            "com.vaadin.terminal.gwt.client.ui.VAccordion",\r
+            "com.vaadin.terminal.gwt.client.ui.VButton",\r
+            "com.vaadin.terminal.gwt.client.ui.VCalendarPanel",\r
+            "com.vaadin.terminal.gwt.client.ui.VCheckBox",\r
+            "com.vaadin.terminal.gwt.client.ui.VContextMenu",\r
+            "com.vaadin.terminal.gwt.client.ui.VCssLayout",\r
+            "com.vaadin.terminal.gwt.client.ui.VCustomComponent",\r
+            "com.vaadin.terminal.gwt.client.ui.VCustomLayout",\r
+            "com.vaadin.terminal.gwt.client.ui.VDateField",\r
+            "com.vaadin.terminal.gwt.client.ui.VDateFieldCalendar",\r
+            "com.vaadin.terminal.gwt.client.ui.VEmbedded",\r
+            "com.vaadin.terminal.gwt.client.ui.VFilterSelect",\r
+            "com.vaadin.terminal.gwt.client.ui.VForm",\r
+            "com.vaadin.terminal.gwt.client.ui.VFormLayout",\r
+            "com.vaadin.terminal.gwt.client.ui.VGridLayout",\r
+            "com.vaadin.terminal.gwt.client.ui.VHorizontalLayout",\r
+            "com.vaadin.terminal.gwt.client.ui.VLabel",\r
+            "com.vaadin.terminal.gwt.client.ui.VLink",\r
+            "com.vaadin.terminal.gwt.client.ui.VListSelect",\r
+            "com.vaadin.terminal.gwt.client.ui.VMarginInfo",\r
+            "com.vaadin.terminal.gwt.client.ui.VMenuBar",\r
+            "com.vaadin.terminal.gwt.client.ui.VNativeButton",\r
+            "com.vaadin.terminal.gwt.client.ui.VNativeSelect",\r
+            "com.vaadin.terminal.gwt.client.ui.VNotification",\r
+            "com.vaadin.terminal.gwt.client.ui.VOptionGroup",\r
+            "com.vaadin.terminal.gwt.client.ui.VOptionGroupBase",\r
+            "com.vaadin.terminal.gwt.client.ui.VOrderedLayout",\r
+            "com.vaadin.terminal.gwt.client.ui.VOverlay",\r
+            "com.vaadin.terminal.gwt.client.ui.VPanel",\r
+            "com.vaadin.terminal.gwt.client.ui.VPasswordField",\r
+            "com.vaadin.terminal.gwt.client.ui.VPopupCalendar",\r
+            "com.vaadin.terminal.gwt.client.ui.VPopupView",\r
+            "com.vaadin.terminal.gwt.client.ui.VProgressIndicator",\r
+            "com.vaadin.terminal.gwt.client.ui.VScrollTable",\r
+            "com.vaadin.terminal.gwt.client.ui.VSlider",\r
+            "com.vaadin.terminal.gwt.client.ui.VSplitPanel",\r
+            "com.vaadin.terminal.gwt.client.ui.VSplitPanelHorizontal",\r
+            "com.vaadin.terminal.gwt.client.ui.VSplitPanelVertical",\r
+            "com.vaadin.terminal.gwt.client.ui.VTablePaging",\r
+            "com.vaadin.terminal.gwt.client.ui.VTabsheet",\r
+            "com.vaadin.terminal.gwt.client.ui.VTabsheetBase",\r
+            "com.vaadin.terminal.gwt.client.ui.VTabsheetPanel",\r
+            "com.vaadin.terminal.gwt.client.ui.VTextArea",\r
+            "com.vaadin.terminal.gwt.client.ui.VTextField",\r
+            "com.vaadin.terminal.gwt.client.ui.VTextualDate",\r
+            "com.vaadin.terminal.gwt.client.ui.VTime",\r
+            "com.vaadin.terminal.gwt.client.ui.VTree",\r
+            "com.vaadin.terminal.gwt.client.ui.VTwinColSelect",\r
+            "com.vaadin.terminal.gwt.client.ui.VUnknownComponent",\r
+            "com.vaadin.terminal.gwt.client.ui.VUpload",\r
+            "com.vaadin.terminal.gwt.client.ui.VUriFragmentUtility",\r
+            "com.vaadin.terminal.gwt.client.ui.VVerticalLayout",\r
+            "com.vaadin.terminal.gwt.client.ui.VView",\r
+            "com.vaadin.terminal.gwt.client.ui.VWindow",\r
+            "com.vaadin.terminal.gwt.client.UIDL",\r
+            "com.vaadin.terminal.gwt.client.Util",\r
+            "com.vaadin.terminal.gwt.client.ValueMap",\r
+            "com.vaadin.terminal.gwt.client.VCaption",\r
+            "com.vaadin.terminal.gwt.client.VCaptionWrapper",\r
+            "com.vaadin.terminal.gwt.client.VDebugConsole",\r
+            "com.vaadin.terminal.gwt.client.VErrorMessage",\r
+            "com.vaadin.terminal.gwt.client.VTooltip",\r
+            "com.vaadin.terminal.gwt.client.VUIDLBrowser",\r
+            "com.vaadin.terminal.gwt.client.WidgetMap",\r
+            "com.vaadin.terminal.gwt.client.WidgetSet",\r
+            "com.vaadin.terminal.gwt.server.AbstractApplicationPortlet",\r
+            "com.vaadin.terminal.gwt.server.AbstractApplicationServlet",\r
+            "com.vaadin.terminal.gwt.server.AbstractCommunicationManager",\r
+            "com.vaadin.terminal.gwt.server.AbstractWebApplicationContext",\r
+            "com.vaadin.terminal.gwt.server.ApplicationPortlet",\r
+            "com.vaadin.terminal.gwt.server.ApplicationPortlet2",\r
+            "com.vaadin.terminal.gwt.server.ApplicationRunnerServlet",\r
+            "com.vaadin.terminal.gwt.server.ApplicationServlet",\r
+            "com.vaadin.terminal.gwt.server.ChangeVariablesErrorEvent",\r
+            "com.vaadin.terminal.gwt.server.CommunicationManager",\r
+            "com.vaadin.terminal.gwt.server.ComponentSizeValidator",\r
+            "com.vaadin.terminal.gwt.server.Constants",\r
+            "com.vaadin.terminal.gwt.server.GAEApplicationServlet",\r
+            "com.vaadin.terminal.gwt.server.HttpServletRequestListener",\r
+            "com.vaadin.terminal.gwt.server.HttpUploadStream",\r
+            "com.vaadin.terminal.gwt.server.JsonPaintTarget",\r
+            "com.vaadin.terminal.gwt.server.PortletApplicationContext",\r
+            "com.vaadin.terminal.gwt.server.PortletApplicationContext2",\r
+            "com.vaadin.terminal.gwt.server.PortletCommunicationManager",\r
+            "com.vaadin.terminal.gwt.server.PortletRequestListener",\r
+            "com.vaadin.terminal.gwt.server.RestrictedRenderResponse",\r
+            "com.vaadin.terminal.gwt.server.SessionExpiredException",\r
+            "com.vaadin.terminal.gwt.server.SystemMessageException",\r
+            "com.vaadin.terminal.gwt.server.WebApplicationContext",\r
+            "com.vaadin.terminal.gwt.server.WebBrowser",\r
+            "com.vaadin.terminal.gwt.widgetsetutils.ClassPathExplorer",\r
+            "com.vaadin.terminal.gwt.widgetsetutils.WidgetMapGenerator",\r
+            "com.vaadin.terminal.gwt.widgetsetutils.WidgetSetBuilder",\r
+            "com.vaadin.terminal.KeyMapper", "com.vaadin.terminal.Paintable",\r
+            "com.vaadin.terminal.PaintException",\r
+            "com.vaadin.terminal.PaintTarget",\r
+            "com.vaadin.terminal.ParameterHandler",\r
+            "com.vaadin.terminal.Resource", "com.vaadin.terminal.Scrollable",\r
+            "com.vaadin.terminal.Sizeable",\r
+            "com.vaadin.terminal.StreamResource",\r
+            "com.vaadin.terminal.SystemError", "com.vaadin.terminal.Terminal",\r
+            "com.vaadin.terminal.ThemeResource",\r
+            "com.vaadin.terminal.UploadStream",\r
+            "com.vaadin.terminal.URIHandler", "com.vaadin.terminal.UserError",\r
+            "com.vaadin.terminal.VariableOwner",\r
+            "com.vaadin.tools.ReflectTools",\r
+            "com.vaadin.tools.WidgetsetCompiler",\r
+            "com.vaadin.ui.AbsoluteLayout", "com.vaadin.ui.AbstractComponent",\r
+            "com.vaadin.ui.AbstractComponentContainer",\r
+            "com.vaadin.ui.AbstractField", "com.vaadin.ui.AbstractLayout",\r
+            "com.vaadin.ui.AbstractOrderedLayout",\r
+            "com.vaadin.ui.AbstractSelect", "com.vaadin.ui.Accordion",\r
+            "com.vaadin.ui.Alignment", "com.vaadin.ui.AlignmentUtils",\r
+            "com.vaadin.ui.BaseFieldFactory", "com.vaadin.ui.Button",\r
+            "com.vaadin.ui.CheckBox", "com.vaadin.ui.ClientWidget",\r
+            "com.vaadin.ui.ComboBox", "com.vaadin.ui.Component",\r
+            "com.vaadin.ui.ComponentContainer", "com.vaadin.ui.CssLayout",\r
+            "com.vaadin.ui.CustomComponent", "com.vaadin.ui.CustomLayout",\r
+            "com.vaadin.ui.DateField", "com.vaadin.ui.DefaultFieldFactory",\r
+            "com.vaadin.ui.Embedded", "com.vaadin.ui.ExpandLayout",\r
+            "com.vaadin.ui.Field", "com.vaadin.ui.FieldFactory",\r
+            "com.vaadin.ui.Form", "com.vaadin.ui.FormFieldFactory",\r
+            "com.vaadin.ui.FormLayout", "com.vaadin.ui.GridLayout",\r
+            "com.vaadin.ui.HorizontalLayout", "com.vaadin.ui.InlineDateField",\r
+            "com.vaadin.ui.Label", "com.vaadin.ui.Layout",\r
+            "com.vaadin.ui.Link", "com.vaadin.ui.ListSelect",\r
+            "com.vaadin.ui.LoginForm", "com.vaadin.ui.MenuBar",\r
+            "com.vaadin.ui.NativeButton", "com.vaadin.ui.NativeSelect",\r
+            "com.vaadin.ui.OptionGroup", "com.vaadin.ui.OrderedLayout",\r
+            "com.vaadin.ui.Panel", "com.vaadin.ui.PopupDateField",\r
+            "com.vaadin.ui.PopupView", "com.vaadin.ui.ProgressIndicator",\r
+            "com.vaadin.ui.RichTextArea", "com.vaadin.ui.Select",\r
+            "com.vaadin.ui.Slider", "com.vaadin.ui.SplitPanel",\r
+            "com.vaadin.ui.Table", "com.vaadin.ui.TableFieldFactory",\r
+            "com.vaadin.ui.TabSheet", "com.vaadin.ui.TextField",\r
+            "com.vaadin.ui.Tree", "com.vaadin.ui.TwinColSelect",\r
+            "com.vaadin.ui.Upload", "com.vaadin.ui.UriFragmentUtility",\r
+            "com.vaadin.ui.VerticalLayout", "com.vaadin.ui.Window",\r
+            "com.vaadin.util.SerializerHelper" };\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/server/container/AbstractHierarchicalContainerTest.java b/tests/src/com/vaadin/tests/server/container/AbstractHierarchicalContainerTest.java
new file mode 100644 (file)
index 0000000..d1386aa
--- /dev/null
@@ -0,0 +1,256 @@
+package com.vaadin.tests.server.container;\r
+\r
+import java.util.Collection;\r
+\r
+import com.vaadin.data.Container;\r
+import com.vaadin.data.Item;\r
+import com.vaadin.data.Container.Hierarchical;\r
+import com.vaadin.data.Container.Sortable;\r
+\r
+public class AbstractHierarchicalContainerTest extends AbstractContainerTest {\r
+    private void validateHierarchicalContainer(Hierarchical container,\r
+            Object expectedFirstItemId, Object expectedLastItemId,\r
+            Object itemIdInSet, Object itemIdNotInSet, int expectedSize,\r
+            int expectedRootSize) {\r
+\r
+        validateContainer(container, expectedFirstItemId, expectedLastItemId,\r
+                itemIdInSet, itemIdNotInSet, expectedSize);\r
+\r
+        // rootItemIds\r
+        Collection<?> rootIds = container.rootItemIds();\r
+        assertEquals(expectedRootSize, rootIds.size());\r
+\r
+        for (Object rootId : rootIds) {\r
+            // All roots must be in container\r
+            assertTrue(container.containsId(rootId));\r
+\r
+            // All roots must have no parent\r
+            assertNull(container.getParent(rootId));\r
+\r
+            // all roots must be roots\r
+            assertTrue(container.isRoot(rootId));\r
+\r
+            // all roots have children allowed in this case\r
+            assertTrue(container.areChildrenAllowed(rootId));\r
+\r
+            // all roots have children in this case\r
+            Collection<?> children = container.getChildren(rootId);\r
+            assertNotNull(rootId + " should have children", children);\r
+            assertTrue(rootId + " should have children", (children.size() > 0));\r
+\r
+            // getParent\r
+            for (Object childId : children) {\r
+                assertEquals(container.getParent(childId), rootId);\r
+            }\r
+        }\r
+\r
+        // isRoot should return false for unknown items (#4215)\r
+        assertFalse(container.isRoot(itemIdNotInSet));\r
+\r
+        // hasChildren should return false for unknown items\r
+        assertFalse(container.hasChildren(itemIdNotInSet));\r
+\r
+        // areChildrenAllowed should return false for unknown items (#4216)\r
+        assertFalse(container.areChildrenAllowed(itemIdNotInSet));\r
+\r
+        // removeItem of unknown items should return false\r
+        assertFalse(container.removeItem(itemIdNotInSet));\r
+\r
+        assertEquals(countNodes(container), expectedSize);\r
+\r
+        validateHierarchy(container);\r
+    }\r
+\r
+    private int countNodes(Hierarchical container) {\r
+        int totalNodes = 0;\r
+        for (Object rootId : container.rootItemIds()) {\r
+            totalNodes += countNodes(container, rootId);\r
+        }\r
+\r
+        return totalNodes;\r
+    }\r
+\r
+    private int countNodes(Hierarchical container, Object itemId) {\r
+        int nodes = 1; // This\r
+        Collection<?> children = container.getChildren(itemId);\r
+        if (children != null) {\r
+            for (Object id : children) {\r
+                nodes += countNodes(container, id);\r
+            }\r
+        }\r
+\r
+        return nodes;\r
+    }\r
+\r
+    private void validateHierarchy(Hierarchical container) {\r
+        for (Object rootId : container.rootItemIds()) {\r
+            validateHierarchy(container, rootId, null);\r
+        }\r
+    }\r
+\r
+    private void validateHierarchy(Hierarchical container, Object itemId,\r
+            Object parentId) {\r
+        Collection<?> children = container.getChildren(itemId);\r
+\r
+        // getParent\r
+        assertEquals(container.getParent(itemId), parentId);\r
+\r
+        if (!container.areChildrenAllowed(itemId)) {\r
+            // If no children is allowed the item should have no children\r
+            assertFalse(container.hasChildren(itemId));\r
+            assertTrue(children == null || children.size() == 0);\r
+\r
+            return;\r
+        }\r
+        if (children != null) {\r
+            for (Object id : children) {\r
+                validateHierarchy(container, id, itemId);\r
+            }\r
+        }\r
+    }\r
+\r
+    protected void testHierarchicalContainer(Container.Hierarchical container) {\r
+        initializeContainer(container);\r
+\r
+        int packages = 21;\r
+        validateHierarchicalContainer(container, "com",\r
+                "com.vaadin.util.SerializerHelper",\r
+                "com.vaadin.terminal.ApplicationResource", "blah",\r
+                sampleData.length + packages, 1);\r
+\r
+    }\r
+\r
+    protected void testHierarchicalSorting(Container.Hierarchical container) {\r
+        Container.Sortable sortable = (Sortable) container;\r
+\r
+        initializeContainer(container);\r
+\r
+        // Must be able to sort based on PROP1 and PROP2 for this test\r
+        assertTrue(sortable.getSortableContainerPropertyIds().contains(PROP1));\r
+        assertTrue(sortable.getSortableContainerPropertyIds().contains(PROP2));\r
+\r
+        sortable.sort(new Object[] { PROP1 }, new boolean[] { true });\r
+\r
+        int packages = 21;\r
+        validateHierarchicalContainer(container, "com",\r
+                "com.vaadin.util.SerializerHelper",\r
+                "com.vaadin.terminal.ApplicationResource", "blah",\r
+                sampleData.length + packages, 1);\r
+\r
+        sortable.sort(new Object[] { PROP2 }, new boolean[] { true });\r
+\r
+        validateHierarchicalContainer(container,\r
+                "com.vaadin.terminal.gwt.server.ApplicationPortlet2",\r
+                "com.vaadin.data.util.ObjectProperty",\r
+                "com.vaadin.terminal.ApplicationResource", "blah",\r
+                sampleData.length + packages, 1);\r
+\r
+    }\r
+\r
+    protected void testHierarchicalFiltering(Container.Hierarchical container) {\r
+        Container.Filterable filterable = (Container.Filterable) container;\r
+\r
+        initializeContainer(container);\r
+\r
+        // Filter by "contains ab"\r
+        filterable.addContainerFilter(PROP1, "ab", false, false);\r
+\r
+        validateHierarchicalContainer(container,\r
+                "com.vaadin.data.BufferedValidatable",\r
+                "com.vaadin.ui.TabSheet",\r
+                "com.vaadin.terminal.gwt.client.Focusable",\r
+                "com.vaadin.data.Buffered", 20, 0);\r
+\r
+        // filter out every second item except hierarchy items\r
+        filterable.removeAllContainerFilters();\r
+        filterable.addContainerFilter(PROP3, "1", false, false);\r
+\r
+        int packages = 21;\r
+        int other = sampleData.length / 2;\r
+        validateHierarchicalContainer(container, "com", "com.vaadin.util",\r
+                "com.vaadin.data.util.IndexedContainer",\r
+                "com.vaadin.data.util.ObjectProperty", packages + other, 0);\r
+\r
+        // Additionally remove all without 'm'. Hierarchy is now one root only.\r
+        filterable.addContainerFilter(PROP1, "m", false, false);\r
+\r
+        validateHierarchicalContainer(container, "com.vaadin.data.Buffered",\r
+                "com.vaadin.terminal.gwt.server.ComponentSizeValidator",\r
+                "com.vaadin.data.util.IndexedContainer",\r
+                "com.vaadin.terminal.gwt.client.ui.VUriFragmentUtility",\r
+                packages + other, 0);\r
+        //\r
+        // int packages = 21;\r
+        // validateHierarchicalContainer(container, "com",\r
+        // "com.vaadin.util.SerializerHelper",\r
+        // "com.vaadin.terminal.ApplicationResource", "blah",\r
+        // sampleData.length + packages, 1);\r
+        //\r
+        // sortable.sort(new Object[] { PROP2 }, new boolean[] { true });\r
+        //\r
+        // validateHierarchicalContainer(container,\r
+        // "com.vaadin.terminal.gwt.server.ApplicationPortlet2",\r
+        // "com.vaadin.data.util.ObjectProperty",\r
+        // "com.vaadin.terminal.ApplicationResource", "blah",\r
+        // sampleData.length + packages, 1);\r
+\r
+    }\r
+\r
+    protected void initializeContainer(Container.Hierarchical container) {\r
+        container.removeAllItems();\r
+        Object[] propertyIds = container.getContainerPropertyIds().toArray();\r
+        for (Object propertyId : propertyIds) {\r
+            container.removeContainerProperty(propertyId);\r
+        }\r
+\r
+        container.addContainerProperty(PROP1, String.class, "");\r
+        container.addContainerProperty(PROP2, String.class, null);\r
+        container.addContainerProperty(PROP3, Integer.class, null);\r
+\r
+        for (int i = 0; i < sampleData.length; i++) {\r
+            String id = sampleData[i];\r
+\r
+            // Add path as parent\r
+            String paths[] = id.split("\\.");\r
+            String path = paths[0];\r
+            // Adds "com" and other items multiple times so should return null\r
+            // for all but the first time\r
+            if (container.addItem(path) != null) {\r
+                assertTrue(container.setChildrenAllowed(path, false));\r
+                Item item = container.getItem(path);\r
+                item.getItemProperty(PROP1).setValue(path);\r
+                item.getItemProperty(PROP2).setValue(reverse(path));\r
+                item.getItemProperty(PROP3).setValue(1);\r
+            }\r
+            for (int j = 1; j < paths.length; j++) {\r
+                String parent = path;\r
+                path = path + "." + paths[j];\r
+\r
+                // Adds "com" and other items multiple times so should return\r
+                // null for all but the first time\r
+                if (container.addItem(path) != null) {\r
+                    assertTrue(container.setChildrenAllowed(path, false));\r
+\r
+                    Item item = container.getItem(path);\r
+                    item.getItemProperty(PROP1).setValue(path);\r
+                    item.getItemProperty(PROP2).setValue(reverse(path));\r
+                    item.getItemProperty(PROP3).setValue(1);\r
+\r
+                }\r
+                assertTrue(container.setChildrenAllowed(parent, true));\r
+                assertTrue(\r
+                        "Failed to set " + parent + " as parent for " + path,\r
+                        container.setParent(path, parent));\r
+            }\r
+\r
+            Item item = container.getItem(id);\r
+            assertNotNull(item);\r
+            String parent = id.substring(0, id.lastIndexOf('.'));\r
+            assertTrue(container.setParent(id, parent));\r
+            item.getItemProperty(PROP1).setValue(sampleData[i]);\r
+            item.getItemProperty(PROP2).setValue(reverse(sampleData[i]));\r
+            item.getItemProperty(PROP3).setValue(i % 2);\r
+        }\r
+    }\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/server/container/TestHierarchicalContainer.java b/tests/src/com/vaadin/tests/server/container/TestHierarchicalContainer.java
new file mode 100644 (file)
index 0000000..79f1cf6
--- /dev/null
@@ -0,0 +1,36 @@
+package com.vaadin.tests.server.container;\r
+\r
+import com.vaadin.data.util.HierarchicalContainer;\r
+\r
+public class TestHierarchicalContainer extends\r
+        AbstractHierarchicalContainerTest {\r
+\r
+    public void testBasicOperations() {\r
+        testBasicContainerOperations(new HierarchicalContainer());\r
+    }\r
+\r
+    public void testFiltering() {\r
+        testContainerFiltering(new HierarchicalContainer());\r
+    }\r
+\r
+    public void testHierarchicalFiltering() {\r
+        testHierarchicalFiltering(new HierarchicalContainer());\r
+    }\r
+\r
+    public void testSorting() {\r
+        testContainerSorting(new HierarchicalContainer());\r
+    }\r
+\r
+    public void testHierarchicalSorting() {\r
+        testHierarchicalSorting(new HierarchicalContainer());\r
+    }\r
+\r
+    public void testSortingAndFiltering() {\r
+        testContainerSortingAndFiltering(new HierarchicalContainer());\r
+    }\r
+\r
+    // public void testHierarchicalSortingAndFiltering() {\r
+    // testHierarchicalSortingAndFiltering(new HierarchicalContainer());\r
+    // }\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/server/container/TestIndexedContainer.java b/tests/src/com/vaadin/tests/server/container/TestIndexedContainer.java
new file mode 100644 (file)
index 0000000..dffa995
--- /dev/null
@@ -0,0 +1,23 @@
+package com.vaadin.tests.server.container;\r
+\r
+import com.vaadin.data.util.IndexedContainer;\r
+\r
+public class TestIndexedContainer extends AbstractContainerTest {\r
+\r
+    public void testBasicOperations() {\r
+        testBasicContainerOperations(new IndexedContainer());\r
+    }\r
+\r
+    public void testFiltering() {\r
+        testContainerFiltering(new IndexedContainer());\r
+    }\r
+\r
+    public void testSorting() {\r
+        testContainerSorting(new IndexedContainer());\r
+    }\r
+\r
+    public void testSortingAndFiltering() {\r
+        testContainerSortingAndFiltering(new IndexedContainer());\r
+    }\r
+\r
+}\r