--- /dev/null
+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