aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/itmill/toolkit/tests/TestBench.java206
1 files changed, 206 insertions, 0 deletions
diff --git a/src/com/itmill/toolkit/tests/TestBench.java b/src/com/itmill/toolkit/tests/TestBench.java
new file mode 100644
index 0000000000..a215bed177
--- /dev/null
+++ b/src/com/itmill/toolkit/tests/TestBench.java
@@ -0,0 +1,206 @@
+package com.itmill.toolkit.tests;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+
+import com.itmill.toolkit.Application;
+import com.itmill.toolkit.data.Property;
+import com.itmill.toolkit.data.util.HierarchicalContainer;
+import com.itmill.toolkit.ui.*;
+
+/**
+ * TestBench finds out testable classes within given java packages and adds them
+ * to menu from where they can be executed. Class is considered testable if it
+ * is of class Application or CustomComponent.
+ *
+ * Note: edit TestBench.testablePackages array
+ *
+ * @author IT Mill Ltd.
+ *
+ */
+public class TestBench extends com.itmill.toolkit.Application implements
+ Property.ValueChangeListener {
+
+ private Random seededRandom = new Random(1);
+
+ // Add here packages which are used for finding testable classes
+ String[] testablePackages = { "com.itmill.toolkit.tests",
+ "com.itmill.toolkit.demo", "com.itmill.toolkit.demo.colorpicker",
+ "com.itmill.toolkit.demo.reservation",
+ "com.itmill.toolkit.demo.features" };
+
+ HierarchicalContainer testables = new HierarchicalContainer();
+
+ Window mainWindow = new Window("TestBench window");
+
+ // Main layout consists of tree menu and body layout
+ SplitPanel mainLayout = new SplitPanel(SplitPanel.ORIENTATION_HORIZONTAL);
+
+ Tree menu;
+
+ Panel bodyLayout = new Panel();
+
+ HashMap itemCaptions = new HashMap();
+
+ public void init() {
+
+ // Add testable classes to hierarchical container
+ for (int p = 0; p < testablePackages.length; p++) {
+ testables.addItem(testablePackages[p]);
+ try {
+ List testableClasses = this
+ .getTestableClassesForPackage(testablePackages[p]);
+ for (Iterator it = testableClasses.iterator(); it.hasNext();) {
+ Class t = (Class) it.next();
+ System.out.println(t);
+ // ignore TestBench itself
+ if (t.equals(TestBench.class))
+ continue;
+ try {
+ testables.addItem(t);
+ itemCaptions.put(t, t.getSimpleName());
+ testables.setParent(t, testablePackages[p]);
+ continue;
+ } catch (Exception e) {
+ try {
+ testables.addItem(t);
+ itemCaptions.put(t, t.getSimpleName());
+ testables.setParent(t, testablePackages[p]);
+ continue;
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ }
+ System.out.println(" Skipped " + t);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ menu = new Tree("Testables", testables);
+ // simplify captions
+ for (Iterator i = itemCaptions.keySet().iterator(); i.hasNext();) {
+ Class testable = (Class) i.next();
+ menu.setItemCaption(testable, testable.getSimpleName());
+ }
+ menu.setStyle("menu");
+ menu.addListener(this);
+ menu.setImmediate(true);
+
+ mainLayout.setHeight(700);
+ mainLayout.setHeightUnits(SplitPanel.UNITS_PIXELS);
+ mainLayout.addComponent(menu);
+ mainLayout.addComponent(bodyLayout);
+
+ mainWindow.addComponent(mainLayout);
+
+ setMainWindow(mainWindow);
+ }
+
+ private Component createTestable(Class c) {
+ try {
+ Application app = (Application) c.newInstance();
+ System.out.println("Creating application " + c);
+ app.init();
+ return app.getMainWindow().getLayout();
+ } catch (Exception e) {
+ try {
+ CustomComponent cc = (CustomComponent) c.newInstance();
+ System.out.println("Creating component " + c);
+ return cc;
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ return new Label(
+ "Cannot create application / custom component: "
+ + e1.toString());
+ }
+ }
+ }
+
+ // Handle menu selection and update body
+ public void valueChange(Property.ValueChangeEvent event) {
+ bodyLayout.removeAllComponents();
+ bodyLayout.setCaption(null);
+
+ String title = ((Class) menu.getValue()).getSimpleName();
+ bodyLayout.setCaption(title);
+ bodyLayout.addComponent(createTestable((Class) menu.getValue()));
+ }
+
+ /**
+ * Return all testable classes within given package. Class is considered
+ * testable if it's superclass is Application or CustomComponent.
+ *
+ * @param packageName
+ * @return
+ * @throws ClassNotFoundException
+ */
+ public static List getTestableClassesForPackage(String packageName)
+ throws Exception {
+ ArrayList directories = new ArrayList();
+ try {
+ ClassLoader cld = Thread.currentThread().getContextClassLoader();
+ if (cld == null)
+ throw new ClassNotFoundException("Can't get class loader.");
+ String path = packageName.replace('.', '/');
+ // Ask for all resources for the path
+ Enumeration resources = cld.getResources(path);
+ while (resources.hasMoreElements()) {
+ URL url = (URL) resources.nextElement();
+ directories.add(new File(url.getFile()));
+ }
+ } catch (Exception x) {
+ throw new Exception(packageName
+ + " does not appear to be a valid package.");
+ }
+
+ ArrayList classes = new ArrayList();
+ // For every directory identified capture all the .class files
+ for (Iterator it = directories.iterator(); it.hasNext();) {
+ File directory = (File) it.next();
+ if (directory.exists()) {
+ // Get the list of the files contained in the package
+ String[] files = directory.list();
+ for (int j = 0; j < files.length; j++) {
+ // we are only interested in .class files
+ if (files[j].endsWith(".class")) {
+ // removes the .class extension
+ String p = packageName + '.'
+ + files[j].substring(0, files[j].length() - 6);
+ Class c = Class.forName(p);
+ if (c.getSuperclass() != null)
+ if ((c.getSuperclass()
+ .equals(com.itmill.toolkit.Application.class))) {
+ classes.add(c);
+ } else if ((c.getSuperclass()
+ .equals(com.itmill.toolkit.ui.CustomComponent.class))) {
+ classes.add(c);
+ }
+
+ // for (int i = 0; i < c.getInterfaces().length; i++) {
+ // Class cc = c.getInterfaces()[i];
+ // if (c.getInterfaces()[i].equals(Testable.class)) {
+ // // Class is testable
+ // classes.add(c);
+ // }
+ // }
+ }
+ }
+ } else {
+ throw new ClassNotFoundException(packageName + " ("
+ + directory.getPath()
+ + ") does not appear to be a valid package");
+ }
+ }
+
+ return classes;
+ }
+
+}