]> source.dussan.org Git - vaadin-framework.git/commitdiff
Application that shows all basic component tests
authorArtur Signell <artur.signell@itmill.com>
Mon, 3 Jan 2011 15:35:23 +0000 (15:35 +0000)
committerArtur Signell <artur.signell@itmill.com>
Mon, 3 Jan 2011 15:35:23 +0000 (15:35 +0000)
svn changeset:16766/svn branch:6.5

WebContent/VAADIN/themes/tests-components/styles.css
tests/src/com/vaadin/tests/Components.java [new file with mode: 0644]
tests/src/com/vaadin/tests/VaadinClasses.java

index 5b6d7b67c65c3ca0065533589b84e3e8f016ead9..3e59aaec7a6f8cf85ab6b770704ad38db022ee36 100644 (file)
@@ -1,5 +1,10 @@
 @import url(../reindeer/styles.css);\r
 \r
+.missing {\r
+       color: red;\r
+       font-weight: bold;\r
+}\r
+\r
 .v-tree-node-caption-red {\r
        color: red;\r
 }\r
diff --git a/tests/src/com/vaadin/tests/Components.java b/tests/src/com/vaadin/tests/Components.java
new file mode 100644 (file)
index 0000000..d815486
--- /dev/null
@@ -0,0 +1,266 @@
+package com.vaadin.tests;\r
+\r
+import java.lang.reflect.Modifier;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import com.vaadin.Application;\r
+import com.vaadin.data.Item;\r
+import com.vaadin.data.util.DefaultItemSorter;\r
+import com.vaadin.data.util.HierarchicalContainer;\r
+import com.vaadin.event.ItemClickEvent;\r
+import com.vaadin.event.ItemClickEvent.ItemClickListener;\r
+import com.vaadin.terminal.ExternalResource;\r
+import com.vaadin.terminal.Sizeable;\r
+import com.vaadin.tests.components.AbstractComponentTest;\r
+import com.vaadin.ui.AbstractComponent;\r
+import com.vaadin.ui.Component;\r
+import com.vaadin.ui.ComponentContainer;\r
+import com.vaadin.ui.Embedded;\r
+import com.vaadin.ui.HorizontalSplitPanel;\r
+import com.vaadin.ui.Label;\r
+import com.vaadin.ui.Tree;\r
+import com.vaadin.ui.Tree.ItemStyleGenerator;\r
+import com.vaadin.ui.VerticalLayout;\r
+import com.vaadin.ui.Window;\r
+\r
+public class Components extends Application {\r
+\r
+    private static final Object CAPTION = "c";\r
+    private Map<Class<? extends AbstractComponentTest<?>>, String> tests = new HashMap<Class<? extends AbstractComponentTest<?>>, String>();\r
+    private Tree naviTree;\r
+    private HorizontalSplitPanel sp;\r
+    private Window mainWindow;\r
+    private final Embedded applicationEmbedder = new Embedded();\r
+    private String baseUrl;\r
+    private List<Class<? extends Component>> componentsWithoutTests = new ArrayList<Class<? extends Component>>();\r
+\r
+    {\r
+        for (Class<? extends AbstractComponentTest<?>> c : VaadinClasses\r
+                .getBasicComponentTests()) {\r
+            String testClass = c.getSimpleName();\r
+            tests.put(c, testClass);\r
+        }\r
+\r
+        List<Class<? extends Component>> componentsWithoutTest = VaadinClasses\r
+                .getComponents();\r
+        Set<String> availableTests = new HashSet<String>();\r
+        for (String testName : tests.values()) {\r
+            availableTests.add(testName);\r
+        }\r
+\r
+        for (Class<? extends Component> component : componentsWithoutTest) {\r
+            String baseName = component.getSimpleName();\r
+            if (availableTests.contains(baseName + "es")) {\r
+                continue;\r
+            }\r
+            if (availableTests.contains(baseName + "es2")) {\r
+                continue;\r
+            }\r
+            if (availableTests.contains(baseName + "s2")) {\r
+                continue;\r
+            }\r
+            if (availableTests.contains(baseName + "s")) {\r
+                continue;\r
+            }\r
+            if (availableTests.contains(baseName + "Test")) {\r
+                continue;\r
+            }\r
+\r
+            componentsWithoutTests.add(component);\r
+        }\r
+\r
+    }\r
+\r
+    class MissingTest extends AbstractComponentTest<AbstractComponent> {\r
+        @Override\r
+        protected Class<AbstractComponent> getTestClass() {\r
+            return null;\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void init() {\r
+        mainWindow = new Window();\r
+        setTheme("tests-components");\r
+        mainWindow.getContent().setSizeFull();\r
+        setMainWindow(mainWindow);\r
+        sp = new HorizontalSplitPanel();\r
+        sp.setSizeFull();\r
+        VerticalLayout naviLayout = new VerticalLayout();\r
+        naviLayout\r
+                .addComponent(new Label(\r
+                        "Click to open a test case.<br/>Right click to open test in a new window<br/><br/>",\r
+                        Label.CONTENT_XHTML));\r
+        naviLayout.addComponent(createMenu());\r
+        naviLayout.addComponent(createMissingTestsList());\r
+\r
+        sp.setFirstComponent(naviLayout);\r
+        sp.setSplitPosition(250, Sizeable.UNITS_PIXELS);\r
+        VerticalLayout embeddingLayout = new VerticalLayout();\r
+        embeddingLayout.setSizeFull();\r
+        embeddingLayout\r
+                .addComponent(new Label(\r
+                        "<b>Do not use the embedded version for creating automated tests. Open the test in a new window before recording.</b><br/>",\r
+                        Label.CONTENT_XHTML));\r
+        applicationEmbedder.setSizeFull();\r
+        embeddingLayout.addComponent(applicationEmbedder);\r
+        embeddingLayout.setExpandRatio(applicationEmbedder, 1);\r
+        sp.setSecondComponent(embeddingLayout);\r
+        mainWindow.addComponent(sp);\r
+\r
+        applicationEmbedder.setType(Embedded.TYPE_BROWSER);\r
+        baseUrl = getURL().toString().replace(getClass().getName(), "")\r
+                .replaceAll("//$", "/");\r
+    }\r
+\r
+    private Component createMissingTestsList() {\r
+        String missingTests = "";\r
+        for (Class<? extends Component> component : componentsWithoutTests) {\r
+            String cls = "missing";\r
+            if (component.getAnnotation(Deprecated.class) != null) {\r
+                cls = "missing-deprecated";\r
+            }\r
+            missingTests += "<font class=\"" + cls + "\">"\r
+                    + component.getSimpleName() + "</font><br/>";\r
+        }\r
+        return new Label("<b>Components without a test:</B><br/>"\r
+                + missingTests, Label.CONTENT_XHTML);\r
+    }\r
+\r
+    private Component createMenu() {\r
+        naviTree = new Tree();\r
+        naviTree.setItemStyleGenerator(new ItemStyleGenerator() {\r
+\r
+            public String getStyle(Object itemId) {\r
+                Class<? extends AbstractComponentTest<?>> cls = (Class<? extends AbstractComponentTest<?>>) itemId;\r
+                if (!isAbstract(cls)) {\r
+                    return "blue";\r
+                }\r
+                return null;\r
+            }\r
+        });\r
+        HierarchicalContainer hc = new HierarchicalContainer();\r
+        naviTree.setContainerDataSource(hc);\r
+        DefaultItemSorter sorter = new DefaultItemSorter() {\r
+            @Override\r
+            public int compare(Object o1, Object o2) {\r
+                if (o1 instanceof Class && o2 instanceof Class && o1 != null\r
+                        && o2 != null) {\r
+                    Class c1 = (Class) o1;\r
+                    Class c2 = (Class) o2;\r
+                    boolean a1 = isAbstract(c1);\r
+                    boolean a2 = isAbstract(c2);\r
+\r
+                    if (a1 && !a2) {\r
+                        return 1;\r
+                    } else if (!a1 && a2) {\r
+                        return -1;\r
+                    }\r
+\r
+                }\r
+                return super.compare(o1, o2);\r
+            }\r
+        };\r
+        hc.setItemSorter(sorter);\r
+        naviTree.addContainerProperty(CAPTION, String.class, "");\r
+        naviTree.setItemCaptionPropertyId(CAPTION);\r
+        for (Class<? extends AbstractComponentTest<?>> cls : tests.keySet()) {\r
+            addTreeItem(cls);\r
+        }\r
+        hc.sort(new Object[] { CAPTION }, new boolean[] { true });\r
+        naviTree.setSelectable(false);\r
+        for (Object o : naviTree.rootItemIds()) {\r
+            expandAndSetChildrenAllowed(o);\r
+        }\r
+\r
+        naviTree.addListener(new ItemClickListener() {\r
+\r
+            public void itemClick(ItemClickEvent event) {\r
+                Class<? extends AbstractComponentTest<?>> cls = (Class<? extends AbstractComponentTest<?>>) event\r
+                        .getItemId();\r
+                if (!isAbstract(cls)) {\r
+                    String url = baseUrl + cls.getName()\r
+                            + "?restartApplication";\r
+                    if (event.getButton() == ItemClickEvent.BUTTON_LEFT) {\r
+                        openEmbedded(url);\r
+                        naviTree.setValue(event.getItemId());\r
+                    } else if (event.getButton() == ItemClickEvent.BUTTON_RIGHT) {\r
+                        openInNewTab(url);\r
+                    }\r
+                }\r
+            }\r
+\r
+        });\r
+        return naviTree;\r
+    }\r
+\r
+    protected void openInNewTab(String url) {\r
+        getMainWindow().open(new ExternalResource(url), "_blank");\r
+    }\r
+\r
+    protected void openEmbedded(String url) {\r
+        applicationEmbedder.setSource(new ExternalResource(url));\r
+    }\r
+\r
+    private void expandAndSetChildrenAllowed(Object o) {\r
+        Collection<?> children = naviTree.getChildren(o);\r
+        if (children == null || children.size() == 0) {\r
+            naviTree.setChildrenAllowed(o, false);\r
+        } else {\r
+            naviTree.expandItem(o);\r
+            for (Object c : children) {\r
+                expandAndSetChildrenAllowed(c);\r
+            }\r
+        }\r
+\r
+    }\r
+\r
+    protected boolean isAbstract(Class<? extends AbstractComponentTest<?>> cls) {\r
+        return Modifier.isAbstract(cls.getModifiers());\r
+    }\r
+\r
+    private void addTreeItem(Class<? extends AbstractComponentTest<?>> cls) {\r
+        String name = tests.get(cls);\r
+        if (name == null) {\r
+            name = cls.getSimpleName();\r
+        }\r
+\r
+        Class<? extends AbstractComponentTest<?>> superClass = (Class<? extends AbstractComponentTest<?>>) cls\r
+                .getSuperclass();\r
+        if (cls != AbstractComponentTest.class) {\r
+            addTreeItem(superClass);\r
+        }\r
+        if (naviTree.containsId(cls)) {\r
+            return;\r
+        }\r
+\r
+        Item i = naviTree.addItem(cls);\r
+        i.getItemProperty(CAPTION).setValue(name);\r
+        naviTree.setParent(cls, superClass);\r
+    }\r
+\r
+    protected Component createTestComponent(\r
+            Class<? extends AbstractComponentTest<?>> cls) {\r
+        try {\r
+            AbstractComponentTest t = cls.newInstance();\r
+            t.init();\r
+            ComponentContainer c = t.getMainWindow().getContent();\r
+            t.getMainWindow().setContent(null);\r
+            return c;\r
+        } catch (InstantiationException e) {\r
+            // TODO Auto-generated catch block\r
+            e.printStackTrace();\r
+        } catch (IllegalAccessException e) {\r
+            // TODO Auto-generated catch block\r
+            e.printStackTrace();\r
+        }\r
+        return null;\r
+    }\r
+\r
+}\r
index 5bafa645b60381e677ca8690871983e09b5bbec6..b876a66c634c6ced87de6e1fba11374004e9134e 100644 (file)
@@ -15,6 +15,7 @@ import java.util.List;
 import java.util.jar.JarEntry;
 
 import com.vaadin.Application;
+import com.vaadin.tests.components.AbstractComponentTest;
 import com.vaadin.ui.Component;
 import com.vaadin.ui.ComponentContainer;
 
@@ -34,7 +35,7 @@ public class VaadinClasses {
         }
     }
 
-    private static List<Class<? extends Component>> getComponents() {
+    public static List<Class<? extends Component>> getComponents() {
         try {
             return findClasses(Component.class, "com.vaadin.ui");
         } catch (IOException e) {
@@ -52,6 +53,18 @@ public class VaadinClasses {
         }
     }
 
+    @SuppressWarnings("unchecked")
+    public static List<Class<? extends AbstractComponentTest<?>>> getBasicComponentTests() {
+        try {
+            return (List) findClasses(AbstractComponentTest.class,
+                    "com.vaadin.tests.components");
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+
     private static <T> List<Class<? extends T>> findClasses(Class<T> baseClass,
             String basePackage) throws IOException {
         List<Class<? extends T>> componentContainers = new ArrayList<Class<? extends T>>();