]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.tests.modelled.ui/src/org/simantics/tests/modelled/ui/STSTestSuiteModel.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.tests.modelled.ui / src / org / simantics / tests / modelled / ui / STSTestSuiteModel.java
index ad1e2953157a023bc41085f61e85d846cc9dba8f..569f6fbdc7a6d8df1d11fb63876624cf79f97175 100644 (file)
-package org.simantics.tests.modelled.ui;\r
-\r
-import java.io.BufferedReader;\r
-import java.io.StringReader;\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Collections;\r
-import java.util.List;\r
-import java.util.regex.Pattern;\r
-import java.util.regex.PatternSyntaxException;\r
-\r
-import org.eclipse.swt.graphics.Image;\r
-import org.simantics.Simantics;\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.common.request.ReadRequest;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.scl.compiler.commands.CommandSession;\r
-import org.simantics.scl.compiler.commands.TestScriptExecutor;\r
-import org.simantics.scl.compiler.module.Module;\r
-import org.simantics.scl.compiler.module.coverage.CombinedCoverage;\r
-import org.simantics.scl.compiler.module.coverage.CoverageBuilder;\r
-import org.simantics.scl.compiler.module.coverage.CoverageUtils;\r
-import org.simantics.scl.compiler.module.options.ModuleCompilationOptions;\r
-import org.simantics.scl.compiler.module.options.ModuleCompilationOptionsAdvisor;\r
-import org.simantics.scl.compiler.module.repository.ModuleRepository;\r
-import org.simantics.scl.compiler.runtime.RuntimeModule;\r
-import org.simantics.scl.osgi.SCLOsgi;\r
-import org.simantics.scl.runtime.reporting.AbstractSCLReportingHandler;\r
-import org.simantics.tests.modelled.ontology.TestsResource;\r
-import org.simantics.utils.strings.AlphanumComparator;\r
-\r
-public class STSTestSuiteModel {\r
-\r
-    static class STSTest {\r
-        \r
-        private final Resource test;\r
-        private final STSSuite parent;\r
-        private final String definition;\r
-        private final String name;\r
-        private boolean executed = false;\r
-        private long duration;\r
-        private boolean failed = false;\r
-        private boolean isRunning = false;\r
-        private List<String> output = new ArrayList<>();\r
-        private CombinedCoverage coverage;\r
-        private int priority;\r
-        \r
-        public STSTest(Resource test, STSSuite parent, String definition, String name, int executionPrioprity) {\r
-            this.test = test;\r
-            this.parent = parent;\r
-            this.definition = definition;\r
-            this.name = name;\r
-            this.priority = executionPrioprity;\r
-        }\r
-        \r
-        public String getName() {\r
-            return name;\r
-        }\r
-        \r
-        public String getLabel() {\r
-            StringBuilder sb = new StringBuilder();\r
-            sb.append(name);\r
-            if (executed || failed)\r
-                sb.append(" (").append(duration).append(" ms)");\r
-            return sb.toString();\r
-        }\r
-        \r
-        public String getDefinition() {\r
-            return definition;\r
-        }\r
-\r
-        public STSSuite getParent() {\r
-            return parent;\r
-        }\r
-\r
-        public void execute(CommandSession session) {\r
-            isRunning = true;\r
-            \r
-            TestScriptExecutor executor = new TestScriptExecutor(session, new BufferedReader(new StringReader(definition)), new AbstractSCLReportingHandler() {\r
-                \r
-                @Override\r
-                public void print(String text) {\r
-                    appendOutput(text + "\n");\r
-                }\r
-                \r
-                @Override\r
-                public void printCommand(String command) {\r
-                    appendOutput("> " + command + "\n");\r
-                }\r
-                \r
-                @Override\r
-                public void printError(String error) {\r
-                    appendOutput(error + "\n");\r
-                }\r
-            });\r
-            long start = System.currentTimeMillis();\r
-            try {\r
-                if (parent != null)\r
-                    parent.startedCount++;\r
-                executor.execute();\r
-                executed = true;\r
-            } catch (Throwable t) {\r
-                t.printStackTrace();\r
-                if (parent != null)\r
-                    parent.failureCount++;\r
-                failed = true;\r
-            } finally {\r
-                isRunning = false;\r
-                long end = System.currentTimeMillis();\r
-                duration = end - start;\r
-            }\r
-\r
-        }\r
-\r
-        protected void appendOutput(String text) {\r
-            output.add(text);\r
-        }\r
-\r
-        public List<String> getOutput() {\r
-            return output;\r
-        }\r
-\r
-        public void setCoverage(CombinedCoverage coverage) {\r
-            this.coverage = coverage;\r
-        }\r
-        \r
-        public CombinedCoverage getCoverage() {\r
-            return coverage;\r
-        }\r
-        \r
-        @Override\r
-        public String toString() {\r
-            return name + " [priority=" + priority + ", executed=" + executed + ", duration=" + duration + "]";\r
-        }\r
-    }\r
-\r
-    static class STSSuite {\r
-        \r
-        private List<Pattern> moduleNameFilterPatterns = new ArrayList<>();\r
-        private final Resource suite;\r
-        private final String name;\r
-        private STSTest[] children;\r
-        private int startedCount;\r
-        private int errorCount;\r
-        private int failureCount;\r
-        private CoverageBuilder coverageBuilder;\r
-        \r
-        public STSSuite(Resource suite, String name, String moduleNameFilter) {\r
-            this.suite = suite;\r
-            this.name = name;\r
-            for (String s : moduleNameFilter.split(",")) {\r
-                try {\r
-                    s = s.trim().replaceAll("\\*", "\\\\w*").toLowerCase();\r
-                    moduleNameFilterPatterns.add(Pattern.compile(s));\r
-                } catch (PatternSyntaxException e) {\r
-                    e.printStackTrace();\r
-                }\r
-            }\r
-        }\r
-\r
-        public void children(STSTest[] children) {\r
-            this.children = children;\r
-        }\r
-\r
-        public STSTest[] getChildren() {\r
-            return children;\r
-        }\r
-\r
-        public String getName() {\r
-            return name;\r
-        }\r
-\r
-        public String getLabel() {\r
-            StringBuilder sb = new StringBuilder();\r
-            sb.append(name);\r
-            long totalTime = 0; \r
-            if (children != null) {\r
-                for (STSTest test : children) {\r
-                    if (test.executed || test.failed) {\r
-                        totalTime += test.duration;\r
-                    }\r
-                }\r
-            }\r
-            if (totalTime != 0)\r
-                sb.append(" (").append(totalTime).append(" ms)");\r
-            return sb.toString();\r
-        }\r
-\r
-        public boolean isRunning() {\r
-            boolean running = false;\r
-            if (children != null) {\r
-                for (STSTest test: children) {\r
-                    if (test.isRunning) {\r
-                        running = true;\r
-                        break;\r
-                    }\r
-                }\r
-            }\r
-            return running;\r
-        }\r
-\r
-        public boolean executed() {\r
-            boolean executed = true;\r
-            if (children != null) {\r
-                for (STSTest test: children) {\r
-                    if (!test.executed) {\r
-                        executed = false;\r
-                        break;\r
-                    }\r
-                }\r
-            }\r
-            return executed;\r
-        }\r
-\r
-        public boolean failed() {\r
-            boolean failed = false;\r
-            if (children != null) {\r
-                for (STSTest test: children) {\r
-                    if (test.failed) {\r
-                        failed = true;\r
-                        break;\r
-                    }\r
-                }\r
-            }\r
-            return failed;\r
-        }\r
-        \r
-        public void addCoverage(List<Module> modules) {\r
-            if (coverageBuilder == null) {\r
-                coverageBuilder = new CoverageBuilder();\r
-            }\r
-            for (Module module : modules)\r
-                coverageBuilder.addCoverage(module, true);\r
-        }\r
-\r
-        public CombinedCoverage getCoverage() {\r
-            if (coverageBuilder == null)\r
-                return null;\r
-            return coverageBuilder.getCoverage();\r
-        }\r
-    }\r
-\r
-    \r
-    private STSSuite suite;\r
-    private STSTest test;\r
-    private final List<STSExecutionListener> listeners = new ArrayList<>();\r
-    \r
-    public STSTestSuiteModel() {\r
-    }\r
-    \r
-    public void addListener(STSExecutionListener listener) {\r
-        listeners.add(listener);\r
-    }\r
-    \r
-    public void removeListener(STSExecutionListener listener) {\r
-        listeners.remove(listener);\r
-    }\r
-\r
-    public Object[] getElements() {\r
-        if (suite != null)\r
-            return new Object[] {suite};\r
-        else if (test != null)\r
-            return new Object[] {test};\r
-        else return null;\r
-    }\r
-\r
-    public void execute() {\r
-        \r
-        ModuleRepository repo = new ModuleRepository(SCLOsgi.SOURCE_REPOSITORY);\r
-        if (suite != null) {\r
-            repo.setAdvisor(new ModuleCompilationOptionsAdvisor() {\r
-                \r
-                @Override\r
-                public ModuleCompilationOptions getOptions(String moduleName) {\r
-                    boolean coverage = false;\r
-                    for (Pattern p : suite.moduleNameFilterPatterns) {\r
-                        if (p.matcher(moduleName.toLowerCase()).find()) {\r
-                            coverage = true;\r
-                            break;\r
-                        }\r
-                    }\r
-                    return new ModuleCompilationOptions(coverage);\r
-                }\r
-            });\r
-        }\r
-        CommandSession session = new CommandSession(repo, null);\r
-        if (suite != null) {\r
-            executeSuite(session);\r
-        } else if (test != null) {\r
-            executeTest(session);\r
-        }\r
-    }\r
-    \r
-    private void testExecuted() {\r
-        listeners.forEach(listener -> {\r
-            listener.testExecuted();\r
-        });\r
-    }\r
-    \r
-    private void executeSuite(CommandSession session) {\r
-        \r
-        for (STSTest test : suite.getChildren()) {\r
-            test.execute(session);\r
-            \r
-            Collection<RuntimeModule> runtimeModules = session.getRuntimeEnvironment().getRuntimeModules();\r
-            List<Module> modules = new ArrayList<>(runtimeModules.size());\r
-            for (RuntimeModule module : runtimeModules) {\r
-                for (Pattern p : suite.moduleNameFilterPatterns) {\r
-                    if (p.matcher(module.getModule().getName().toLowerCase()).find()) {\r
-                        modules.add(module.getModule());\r
-                    }\r
-                }\r
-            }\r
-            test.setCoverage(CoverageUtils.getCoverage(modules));\r
-            suite.addCoverage(modules);\r
-            \r
-            CoverageUtils.resetCoverage(modules);\r
-            \r
-            testExecuted();\r
-        }\r
-\r
-    }\r
-    \r
-    private void executeTest(CommandSession session) {\r
-        \r
-        test.execute(session);\r
-        testExecuted();\r
-        \r
-        Collection<RuntimeModule> runtimeModules = session.getRuntimeEnvironment().getRuntimeModules();\r
-        List<Module> modules = new ArrayList<>(runtimeModules.size());\r
-        for (RuntimeModule module : runtimeModules) {\r
-            modules.add(module.getModule());\r
-        }\r
-        test.setCoverage(CoverageUtils.getCoverage(modules));\r
-        \r
-        CoverageUtils.resetCoverage(modules);\r
-\r
-    }\r
-    \r
-\r
-    public boolean hasChildren(Object element) {\r
-        if (element instanceof STSTest) {\r
-            return false;\r
-        } else if (element instanceof STSSuite) {\r
-            STSSuite suite = (STSSuite) element;\r
-            return (suite.getChildren() != null ? suite.getChildren().length > 0 : false);\r
-        } else {\r
-            throw new IllegalArgumentException(element.toString());\r
-        }\r
-    }\r
-\r
-    public Object getParent(Object element) {\r
-        if (element instanceof STSTest) {\r
-            return ((STSTest) element).getParent();\r
-        } else if (element instanceof STSSuite) {\r
-            return null;\r
-        } else {\r
-            throw new IllegalArgumentException(element.toString());\r
-        }\r
-    }\r
-\r
-    public Object[] getChildren(Object parentElement) {\r
-        if (parentElement instanceof STSTest) {\r
-            return null;\r
-        } else if (parentElement instanceof STSSuite) {\r
-            STSSuite suite = (STSSuite) parentElement;\r
-            return suite.getChildren();\r
-        } else {\r
-            throw new IllegalArgumentException(parentElement.toString());\r
-        }\r
-    }\r
-\r
-    public String getText(Object element) {\r
-        if (element instanceof STSTest)\r
-            return ((STSTest)element).getLabel();\r
-        else if (element instanceof STSSuite)\r
-            return ((STSSuite)element).getLabel();\r
-        else\r
-            throw new IllegalArgumentException(element.toString());\r
-    }\r
-\r
-    public Image getImage(Object element) {\r
-        if (element instanceof STSSuite) {\r
-            STSSuite suite = (STSSuite) element;\r
-            if (suite.isRunning())\r
-                return STSTestSuiteProvider.suiteRunningIcon;\r
-            else if (suite.executed())\r
-                return STSTestSuiteProvider.suiteOkIcon;\r
-            else if (suite.failed())\r
-                return STSTestSuiteProvider.suiteFailIcon;\r
-            else\r
-                return STSTestSuiteProvider.suiteIcon;\r
-        } else if (element instanceof STSTest) {\r
-            STSTest test = (STSTest) element;\r
-            if (test.isRunning)\r
-                return STSTestSuiteProvider.testRunningIcon;\r
-            else if (test.executed)\r
-                return STSTestSuiteProvider.testOkIcon;\r
-            else if (test.failed)\r
-                return STSTestSuiteProvider.testFailIcon;\r
-            else\r
-                return STSTestSuiteProvider.testIcon;\r
-        }\r
-        return null;\r
-    }\r
-\r
-    public void updateInput(Resource root) {\r
-        suite = null;\r
-        test = null;\r
-        try {\r
-            Simantics.getSession().syncRequest(new ReadRequest() {\r
-                \r
-                @Override\r
-                public void run(ReadGraph graph) throws DatabaseException {\r
-                    Layer0 L0 = Layer0.getInstance(graph);\r
-                    TestsResource TESTS = TestsResource.getInstance(graph);\r
-                    if (graph.isInstanceOf(root, TESTS.STSTest)) {\r
-                        String testName = graph.getRelatedValue2(root, L0.HasName, Bindings.STRING);\r
-                        String definition = graph.getRelatedValue2(root, TESTS.STSTest_definition, Bindings.STRING);\r
-                        Integer executionPrioprity = graph.getRelatedValue2(root, TESTS.STSTest_executionPriority, Bindings.INTEGER);\r
-                        test = new STSTest(root, null, definition, testName, executionPrioprity);\r
-                    } else if (graph.isInstanceOf(root, TESTS.STSSuite)) {\r
-                        String suiteName = graph.getRelatedValue2(root, L0.HasName, Bindings.STRING);\r
-                        String moduleNameFilter = graph.getPossibleRelatedValue2(root, TESTS.STSSuite_moduleNameFilter, Bindings.STRING);\r
-                        suite = new STSSuite(root, suiteName, moduleNameFilter);\r
-                        List<STSTest> tests = new ArrayList<>();\r
-                        for (Resource test : graph.getObjects(root, L0.ConsistsOf)) {\r
-                            String testName = graph.getRelatedValue2(test, L0.HasName, Bindings.STRING);\r
-                            String definition = graph.getRelatedValue2(test, TESTS.STSTest_definition, Bindings.STRING);\r
-                            Integer executionPrioprity = graph.getRelatedValue2(test, TESTS.STSTest_executionPriority, Bindings.INTEGER);\r
-                            tests.add(new STSTest(test, suite, definition, testName, executionPrioprity));\r
-                        }\r
-                        Collections.sort(tests, (o1, o2) -> {\r
-                            if (o1.priority < o2.priority)\r
-                                return -1;\r
-                            else if (o1.priority > o2.priority)\r
-                                return 1;\r
-                            else return AlphanumComparator.COMPARATOR.compare(o1.name, o2.name);\r
-                        });\r
-                        suite.children(tests.toArray(new STSTest[tests.size()]));\r
-                    } else {\r
-                        throw new IllegalArgumentException(root.toString());\r
-                    }\r
-                }\r
-            });\r
-        } catch (DatabaseException e) {\r
-            e.printStackTrace();\r
-        }\r
-    }\r
-\r
-    public List<String> getOutput(Object element) {\r
-        if (element instanceof STSTest) {\r
-            STSTest test = (STSTest) element;\r
-            return test.getOutput();\r
-        }\r
-        return Collections.emptyList();\r
-    }\r
-\r
-    public int getStartedCount() {\r
-        if (suite != null)\r
-            return suite.startedCount;\r
-        else\r
-            return 0;\r
-    }\r
-\r
-    public int getIgnoredCount() {\r
-        return 0;\r
-    }\r
-\r
-    public int getTotalCount() {\r
-        if (suite != null && suite.getChildren() != null)\r
-            return suite.getChildren().length;\r
-        else if (test != null)\r
-            return 1;\r
-        else\r
-            return 0;\r
-    }\r
-\r
-    public int getErrorCount() {\r
-        if (suite != null)\r
-            return suite.errorCount;\r
-        return 0;\r
-    }\r
-\r
-    public int getFailureCount() {\r
-        if (suite != null)\r
-            return suite.failureCount;\r
-        return 0;\r
-    }\r
-\r
-    public int getAssumptionFailureCount() {\r
-        return 0;\r
-    }\r
-\r
-    public boolean isStopped() {\r
-        if (suite != null)\r
-            return !suite.isRunning();\r
-        else\r
-            return test.isRunning;\r
-    }\r
-}\r
-\r
+package org.simantics.tests.modelled.ui;
+
+import java.io.BufferedReader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import org.eclipse.swt.graphics.Image;
+import org.simantics.Simantics;
+import org.simantics.databoard.Bindings;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.common.request.ReadRequest;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.layer0.Layer0;
+import org.simantics.scl.compiler.commands.CommandSession;
+import org.simantics.scl.compiler.commands.TestScriptExecutor;
+import org.simantics.scl.compiler.module.Module;
+import org.simantics.scl.compiler.module.coverage.CombinedCoverage;
+import org.simantics.scl.compiler.module.coverage.CoverageBuilder;
+import org.simantics.scl.compiler.module.coverage.CoverageUtils;
+import org.simantics.scl.compiler.module.options.ModuleCompilationOptions;
+import org.simantics.scl.compiler.module.options.ModuleCompilationOptionsAdvisor;
+import org.simantics.scl.compiler.module.repository.ModuleRepository;
+import org.simantics.scl.compiler.runtime.RuntimeModule;
+import org.simantics.scl.osgi.SCLOsgi;
+import org.simantics.scl.runtime.reporting.AbstractSCLReportingHandler;
+import org.simantics.tests.modelled.ontology.TestsResource;
+import org.simantics.utils.strings.AlphanumComparator;
+
+public class STSTestSuiteModel {
+
+    static class STSTest {
+        
+        private final Resource test;
+        private final STSSuite parent;
+        private final String definition;
+        private final String name;
+        private boolean executed = false;
+        private long duration;
+        private boolean failed = false;
+        private boolean isRunning = false;
+        private List<String> output = new ArrayList<>();
+        private CombinedCoverage coverage;
+        private int priority;
+        
+        public STSTest(Resource test, STSSuite parent, String definition, String name, int executionPrioprity) {
+            this.test = test;
+            this.parent = parent;
+            this.definition = definition;
+            this.name = name;
+            this.priority = executionPrioprity;
+        }
+        
+        public String getName() {
+            return name;
+        }
+        
+        public String getLabel() {
+            StringBuilder sb = new StringBuilder();
+            sb.append(name);
+            if (executed || failed)
+                sb.append(" (").append(duration).append(" ms)");
+            return sb.toString();
+        }
+        
+        public String getDefinition() {
+            return definition;
+        }
+
+        public STSSuite getParent() {
+            return parent;
+        }
+
+        public void execute(CommandSession session) {
+            isRunning = true;
+            
+            TestScriptExecutor executor = new TestScriptExecutor(session, new BufferedReader(new StringReader(definition)), new AbstractSCLReportingHandler() {
+                
+                @Override
+                public void print(String text) {
+                    appendOutput(text + "\n");
+                }
+                
+                @Override
+                public void printCommand(String command) {
+                    appendOutput("> " + command + "\n");
+                }
+                
+                @Override
+                public void printError(String error) {
+                    appendOutput(error + "\n");
+                }
+            });
+            long start = System.currentTimeMillis();
+            try {
+                if (parent != null)
+                    parent.startedCount++;
+                executor.execute();
+                executed = true;
+            } catch (Throwable t) {
+                t.printStackTrace();
+                if (parent != null)
+                    parent.failureCount++;
+                failed = true;
+            } finally {
+                isRunning = false;
+                long end = System.currentTimeMillis();
+                duration = end - start;
+            }
+
+        }
+
+        protected void appendOutput(String text) {
+            output.add(text);
+        }
+
+        public List<String> getOutput() {
+            return output;
+        }
+
+        public void setCoverage(CombinedCoverage coverage) {
+            this.coverage = coverage;
+        }
+        
+        public CombinedCoverage getCoverage() {
+            return coverage;
+        }
+        
+        @Override
+        public String toString() {
+            return name + " [priority=" + priority + ", executed=" + executed + ", duration=" + duration + "]";
+        }
+    }
+
+    static class STSSuite {
+        
+        private List<Pattern> moduleNameFilterPatterns = new ArrayList<>();
+        private final Resource suite;
+        private final String name;
+        private STSTest[] children;
+        private int startedCount;
+        private int errorCount;
+        private int failureCount;
+        private CoverageBuilder coverageBuilder;
+        
+        public STSSuite(Resource suite, String name, String moduleNameFilter) {
+            this.suite = suite;
+            this.name = name;
+            for (String s : moduleNameFilter.split(",")) {
+                try {
+                    s = s.trim().replaceAll("\\*", "\\\\w*").toLowerCase();
+                    moduleNameFilterPatterns.add(Pattern.compile(s));
+                } catch (PatternSyntaxException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        public void children(STSTest[] children) {
+            this.children = children;
+        }
+
+        public STSTest[] getChildren() {
+            return children;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String getLabel() {
+            StringBuilder sb = new StringBuilder();
+            sb.append(name);
+            long totalTime = 0; 
+            if (children != null) {
+                for (STSTest test : children) {
+                    if (test.executed || test.failed) {
+                        totalTime += test.duration;
+                    }
+                }
+            }
+            if (totalTime != 0)
+                sb.append(" (").append(totalTime).append(" ms)");
+            return sb.toString();
+        }
+
+        public boolean isRunning() {
+            boolean running = false;
+            if (children != null) {
+                for (STSTest test: children) {
+                    if (test.isRunning) {
+                        running = true;
+                        break;
+                    }
+                }
+            }
+            return running;
+        }
+
+        public boolean executed() {
+            boolean executed = true;
+            if (children != null) {
+                for (STSTest test: children) {
+                    if (!test.executed) {
+                        executed = false;
+                        break;
+                    }
+                }
+            }
+            return executed;
+        }
+
+        public boolean failed() {
+            boolean failed = false;
+            if (children != null) {
+                for (STSTest test: children) {
+                    if (test.failed) {
+                        failed = true;
+                        break;
+                    }
+                }
+            }
+            return failed;
+        }
+        
+        public void addCoverage(List<Module> modules) {
+            if (coverageBuilder == null) {
+                coverageBuilder = new CoverageBuilder();
+            }
+            for (Module module : modules)
+                coverageBuilder.addCoverage(module, true);
+        }
+
+        public CombinedCoverage getCoverage() {
+            if (coverageBuilder == null)
+                return null;
+            return coverageBuilder.getCoverage();
+        }
+    }
+
+    
+    private STSSuite suite;
+    private STSTest test;
+    private final List<STSExecutionListener> listeners = new ArrayList<>();
+    
+    public STSTestSuiteModel() {
+    }
+    
+    public void addListener(STSExecutionListener listener) {
+        listeners.add(listener);
+    }
+    
+    public void removeListener(STSExecutionListener listener) {
+        listeners.remove(listener);
+    }
+
+    public Object[] getElements() {
+        if (suite != null)
+            return new Object[] {suite};
+        else if (test != null)
+            return new Object[] {test};
+        else return null;
+    }
+
+    public void execute() {
+        
+        ModuleRepository repo = new ModuleRepository(SCLOsgi.SOURCE_REPOSITORY);
+        if (suite != null) {
+            repo.setAdvisor(new ModuleCompilationOptionsAdvisor() {
+                
+                @Override
+                public ModuleCompilationOptions getOptions(String moduleName) {
+                    boolean coverage = false;
+                    for (Pattern p : suite.moduleNameFilterPatterns) {
+                        if (p.matcher(moduleName.toLowerCase()).find()) {
+                            coverage = true;
+                            break;
+                        }
+                    }
+                    return new ModuleCompilationOptions(coverage);
+                }
+            });
+        }
+        CommandSession session = new CommandSession(repo, null);
+        if (suite != null) {
+            executeSuite(session);
+        } else if (test != null) {
+            executeTest(session);
+        }
+    }
+    
+    private void testExecuted() {
+        listeners.forEach(listener -> {
+            listener.testExecuted();
+        });
+    }
+    
+    private void executeSuite(CommandSession session) {
+        
+        for (STSTest test : suite.getChildren()) {
+            test.execute(session);
+            
+            Collection<RuntimeModule> runtimeModules = session.getRuntimeEnvironment().getRuntimeModules();
+            List<Module> modules = new ArrayList<>(runtimeModules.size());
+            for (RuntimeModule module : runtimeModules) {
+                for (Pattern p : suite.moduleNameFilterPatterns) {
+                    if (p.matcher(module.getModule().getName().toLowerCase()).find()) {
+                        modules.add(module.getModule());
+                    }
+                }
+            }
+            test.setCoverage(CoverageUtils.getCoverage(modules));
+            suite.addCoverage(modules);
+            
+            CoverageUtils.resetCoverage(modules);
+            
+            testExecuted();
+        }
+
+    }
+    
+    private void executeTest(CommandSession session) {
+        
+        test.execute(session);
+        testExecuted();
+        
+        Collection<RuntimeModule> runtimeModules = session.getRuntimeEnvironment().getRuntimeModules();
+        List<Module> modules = new ArrayList<>(runtimeModules.size());
+        for (RuntimeModule module : runtimeModules) {
+            modules.add(module.getModule());
+        }
+        test.setCoverage(CoverageUtils.getCoverage(modules));
+        
+        CoverageUtils.resetCoverage(modules);
+
+    }
+    
+
+    public boolean hasChildren(Object element) {
+        if (element instanceof STSTest) {
+            return false;
+        } else if (element instanceof STSSuite) {
+            STSSuite suite = (STSSuite) element;
+            return (suite.getChildren() != null ? suite.getChildren().length > 0 : false);
+        } else {
+            throw new IllegalArgumentException(element.toString());
+        }
+    }
+
+    public Object getParent(Object element) {
+        if (element instanceof STSTest) {
+            return ((STSTest) element).getParent();
+        } else if (element instanceof STSSuite) {
+            return null;
+        } else {
+            throw new IllegalArgumentException(element.toString());
+        }
+    }
+
+    public Object[] getChildren(Object parentElement) {
+        if (parentElement instanceof STSTest) {
+            return null;
+        } else if (parentElement instanceof STSSuite) {
+            STSSuite suite = (STSSuite) parentElement;
+            return suite.getChildren();
+        } else {
+            throw new IllegalArgumentException(parentElement.toString());
+        }
+    }
+
+    public String getText(Object element) {
+        if (element instanceof STSTest)
+            return ((STSTest)element).getLabel();
+        else if (element instanceof STSSuite)
+            return ((STSSuite)element).getLabel();
+        else
+            throw new IllegalArgumentException(element.toString());
+    }
+
+    public Image getImage(Object element) {
+        if (element instanceof STSSuite) {
+            STSSuite suite = (STSSuite) element;
+            if (suite.isRunning())
+                return STSTestSuiteProvider.suiteRunningIcon;
+            else if (suite.executed())
+                return STSTestSuiteProvider.suiteOkIcon;
+            else if (suite.failed())
+                return STSTestSuiteProvider.suiteFailIcon;
+            else
+                return STSTestSuiteProvider.suiteIcon;
+        } else if (element instanceof STSTest) {
+            STSTest test = (STSTest) element;
+            if (test.isRunning)
+                return STSTestSuiteProvider.testRunningIcon;
+            else if (test.executed)
+                return STSTestSuiteProvider.testOkIcon;
+            else if (test.failed)
+                return STSTestSuiteProvider.testFailIcon;
+            else
+                return STSTestSuiteProvider.testIcon;
+        }
+        return null;
+    }
+
+    public void updateInput(Resource root) {
+        suite = null;
+        test = null;
+        try {
+            Simantics.getSession().syncRequest(new ReadRequest() {
+                
+                @Override
+                public void run(ReadGraph graph) throws DatabaseException {
+                    Layer0 L0 = Layer0.getInstance(graph);
+                    TestsResource TESTS = TestsResource.getInstance(graph);
+                    if (graph.isInstanceOf(root, TESTS.STSTest)) {
+                        String testName = graph.getRelatedValue2(root, L0.HasName, Bindings.STRING);
+                        String definition = graph.getRelatedValue2(root, TESTS.STSTest_definition, Bindings.STRING);
+                        Integer executionPrioprity = graph.getRelatedValue2(root, TESTS.STSTest_executionPriority, Bindings.INTEGER);
+                        test = new STSTest(root, null, definition, testName, executionPrioprity);
+                    } else if (graph.isInstanceOf(root, TESTS.STSSuite)) {
+                        String suiteName = graph.getRelatedValue2(root, L0.HasName, Bindings.STRING);
+                        String moduleNameFilter = graph.getPossibleRelatedValue2(root, TESTS.STSSuite_moduleNameFilter, Bindings.STRING);
+                        suite = new STSSuite(root, suiteName, moduleNameFilter);
+                        List<STSTest> tests = new ArrayList<>();
+                        for (Resource test : graph.getObjects(root, L0.ConsistsOf)) {
+                            String testName = graph.getRelatedValue2(test, L0.HasName, Bindings.STRING);
+                            String definition = graph.getRelatedValue2(test, TESTS.STSTest_definition, Bindings.STRING);
+                            Integer executionPrioprity = graph.getRelatedValue2(test, TESTS.STSTest_executionPriority, Bindings.INTEGER);
+                            tests.add(new STSTest(test, suite, definition, testName, executionPrioprity));
+                        }
+                        Collections.sort(tests, (o1, o2) -> {
+                            if (o1.priority < o2.priority)
+                                return -1;
+                            else if (o1.priority > o2.priority)
+                                return 1;
+                            else return AlphanumComparator.COMPARATOR.compare(o1.name, o2.name);
+                        });
+                        suite.children(tests.toArray(new STSTest[tests.size()]));
+                    } else {
+                        throw new IllegalArgumentException(root.toString());
+                    }
+                }
+            });
+        } catch (DatabaseException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public List<String> getOutput(Object element) {
+        if (element instanceof STSTest) {
+            STSTest test = (STSTest) element;
+            return test.getOutput();
+        }
+        return Collections.emptyList();
+    }
+
+    public int getStartedCount() {
+        if (suite != null)
+            return suite.startedCount;
+        else
+            return 0;
+    }
+
+    public int getIgnoredCount() {
+        return 0;
+    }
+
+    public int getTotalCount() {
+        if (suite != null && suite.getChildren() != null)
+            return suite.getChildren().length;
+        else if (test != null)
+            return 1;
+        else
+            return 0;
+    }
+
+    public int getErrorCount() {
+        if (suite != null)
+            return suite.errorCount;
+        return 0;
+    }
+
+    public int getFailureCount() {
+        if (suite != null)
+            return suite.failureCount;
+        return 0;
+    }
+
+    public int getAssumptionFailureCount() {
+        return 0;
+    }
+
+    public boolean isStopped() {
+        if (suite != null)
+            return !suite.isRunning();
+        else
+            return test.isRunning;
+    }
+}
+