1 package org.simantics.tests.modelled.ui;
\r
3 import java.io.BufferedReader;
\r
4 import java.io.StringReader;
\r
5 import java.util.ArrayList;
\r
6 import java.util.Collection;
\r
7 import java.util.Collections;
\r
8 import java.util.List;
\r
9 import java.util.regex.Pattern;
\r
10 import java.util.regex.PatternSyntaxException;
\r
12 import org.eclipse.swt.graphics.Image;
\r
13 import org.simantics.Simantics;
\r
14 import org.simantics.databoard.Bindings;
\r
15 import org.simantics.db.ReadGraph;
\r
16 import org.simantics.db.Resource;
\r
17 import org.simantics.db.common.request.ReadRequest;
\r
18 import org.simantics.db.exception.DatabaseException;
\r
19 import org.simantics.layer0.Layer0;
\r
20 import org.simantics.scl.compiler.commands.CommandSession;
\r
21 import org.simantics.scl.compiler.commands.TestScriptExecutor;
\r
22 import org.simantics.scl.compiler.module.Module;
\r
23 import org.simantics.scl.compiler.module.coverage.CombinedCoverage;
\r
24 import org.simantics.scl.compiler.module.coverage.CoverageBuilder;
\r
25 import org.simantics.scl.compiler.module.coverage.CoverageUtils;
\r
26 import org.simantics.scl.compiler.module.options.ModuleCompilationOptions;
\r
27 import org.simantics.scl.compiler.module.options.ModuleCompilationOptionsAdvisor;
\r
28 import org.simantics.scl.compiler.module.repository.ModuleRepository;
\r
29 import org.simantics.scl.compiler.runtime.RuntimeModule;
\r
30 import org.simantics.scl.osgi.SCLOsgi;
\r
31 import org.simantics.scl.runtime.reporting.AbstractSCLReportingHandler;
\r
32 import org.simantics.tests.modelled.ontology.TestsResource;
\r
33 import org.simantics.utils.strings.AlphanumComparator;
\r
35 public class STSTestSuiteModel {
\r
37 static class STSTest {
\r
39 private final Resource test;
\r
40 private final STSSuite parent;
\r
41 private final String definition;
\r
42 private final String name;
\r
43 private boolean executed = false;
\r
44 private long duration;
\r
45 private boolean failed = false;
\r
46 private boolean isRunning = false;
\r
47 private List<String> output = new ArrayList<>();
\r
48 private CombinedCoverage coverage;
\r
49 private int priority;
\r
51 public STSTest(Resource test, STSSuite parent, String definition, String name, int executionPrioprity) {
\r
53 this.parent = parent;
\r
54 this.definition = definition;
\r
56 this.priority = executionPrioprity;
\r
59 public String getName() {
\r
63 public String getLabel() {
\r
64 StringBuilder sb = new StringBuilder();
\r
66 if (executed || failed)
\r
67 sb.append(" (").append(duration).append(" ms)");
\r
68 return sb.toString();
\r
71 public String getDefinition() {
\r
75 public STSSuite getParent() {
\r
79 public void execute(CommandSession session) {
\r
82 TestScriptExecutor executor = new TestScriptExecutor(session, new BufferedReader(new StringReader(definition)), new AbstractSCLReportingHandler() {
\r
85 public void print(String text) {
\r
86 appendOutput(text + "\n");
\r
90 public void printCommand(String command) {
\r
91 appendOutput("> " + command + "\n");
\r
95 public void printError(String error) {
\r
96 appendOutput(error + "\n");
\r
99 long start = System.currentTimeMillis();
\r
101 if (parent != null)
\r
102 parent.startedCount++;
\r
103 executor.execute();
\r
105 } catch (Throwable t) {
\r
106 t.printStackTrace();
\r
107 if (parent != null)
\r
108 parent.failureCount++;
\r
112 long end = System.currentTimeMillis();
\r
113 duration = end - start;
\r
118 protected void appendOutput(String text) {
\r
122 public List<String> getOutput() {
\r
126 public void setCoverage(CombinedCoverage coverage) {
\r
127 this.coverage = coverage;
\r
130 public CombinedCoverage getCoverage() {
\r
135 public String toString() {
\r
136 return name + " [priority=" + priority + ", executed=" + executed + ", duration=" + duration + "]";
\r
140 static class STSSuite {
\r
142 private List<Pattern> moduleNameFilterPatterns = new ArrayList<>();
\r
143 private final Resource suite;
\r
144 private final String name;
\r
145 private STSTest[] children;
\r
146 private int startedCount;
\r
147 private int errorCount;
\r
148 private int failureCount;
\r
149 private CoverageBuilder coverageBuilder;
\r
151 public STSSuite(Resource suite, String name, String moduleNameFilter) {
\r
152 this.suite = suite;
\r
154 for (String s : moduleNameFilter.split(",")) {
\r
156 s = s.trim().replaceAll("\\*", "\\\\w*").toLowerCase();
\r
157 moduleNameFilterPatterns.add(Pattern.compile(s));
\r
158 } catch (PatternSyntaxException e) {
\r
159 e.printStackTrace();
\r
164 public void children(STSTest[] children) {
\r
165 this.children = children;
\r
168 public STSTest[] getChildren() {
\r
172 public String getName() {
\r
176 public String getLabel() {
\r
177 StringBuilder sb = new StringBuilder();
\r
179 long totalTime = 0;
\r
180 if (children != null) {
\r
181 for (STSTest test : children) {
\r
182 if (test.executed || test.failed) {
\r
183 totalTime += test.duration;
\r
187 if (totalTime != 0)
\r
188 sb.append(" (").append(totalTime).append(" ms)");
\r
189 return sb.toString();
\r
192 public boolean isRunning() {
\r
193 boolean running = false;
\r
194 if (children != null) {
\r
195 for (STSTest test: children) {
\r
196 if (test.isRunning) {
\r
205 public boolean executed() {
\r
206 boolean executed = true;
\r
207 if (children != null) {
\r
208 for (STSTest test: children) {
\r
209 if (!test.executed) {
\r
218 public boolean failed() {
\r
219 boolean failed = false;
\r
220 if (children != null) {
\r
221 for (STSTest test: children) {
\r
231 public void addCoverage(List<Module> modules) {
\r
232 if (coverageBuilder == null) {
\r
233 coverageBuilder = new CoverageBuilder();
\r
235 for (Module module : modules)
\r
236 coverageBuilder.addCoverage(module, true);
\r
239 public CombinedCoverage getCoverage() {
\r
240 if (coverageBuilder == null)
\r
242 return coverageBuilder.getCoverage();
\r
247 private STSSuite suite;
\r
248 private STSTest test;
\r
249 private final List<STSExecutionListener> listeners = new ArrayList<>();
\r
251 public STSTestSuiteModel() {
\r
254 public void addListener(STSExecutionListener listener) {
\r
255 listeners.add(listener);
\r
258 public void removeListener(STSExecutionListener listener) {
\r
259 listeners.remove(listener);
\r
262 public Object[] getElements() {
\r
264 return new Object[] {suite};
\r
265 else if (test != null)
\r
266 return new Object[] {test};
\r
270 public void execute() {
\r
272 ModuleRepository repo = new ModuleRepository(SCLOsgi.SOURCE_REPOSITORY);
\r
273 if (suite != null) {
\r
274 repo.setAdvisor(new ModuleCompilationOptionsAdvisor() {
\r
277 public ModuleCompilationOptions getOptions(String moduleName) {
\r
278 boolean coverage = false;
\r
279 for (Pattern p : suite.moduleNameFilterPatterns) {
\r
280 if (p.matcher(moduleName.toLowerCase()).find()) {
\r
285 return new ModuleCompilationOptions(coverage);
\r
289 CommandSession session = new CommandSession(repo, null);
\r
290 if (suite != null) {
\r
291 executeSuite(session);
\r
292 } else if (test != null) {
\r
293 executeTest(session);
\r
297 private void testExecuted() {
\r
298 listeners.forEach(listener -> {
\r
299 listener.testExecuted();
\r
303 private void executeSuite(CommandSession session) {
\r
305 for (STSTest test : suite.getChildren()) {
\r
306 test.execute(session);
\r
308 Collection<RuntimeModule> runtimeModules = session.getRuntimeEnvironment().getRuntimeModules();
\r
309 List<Module> modules = new ArrayList<>(runtimeModules.size());
\r
310 for (RuntimeModule module : runtimeModules) {
\r
311 for (Pattern p : suite.moduleNameFilterPatterns) {
\r
312 if (p.matcher(module.getModule().getName().toLowerCase()).find()) {
\r
313 modules.add(module.getModule());
\r
317 test.setCoverage(CoverageUtils.getCoverage(modules));
\r
318 suite.addCoverage(modules);
\r
320 CoverageUtils.resetCoverage(modules);
\r
327 private void executeTest(CommandSession session) {
\r
329 test.execute(session);
\r
332 Collection<RuntimeModule> runtimeModules = session.getRuntimeEnvironment().getRuntimeModules();
\r
333 List<Module> modules = new ArrayList<>(runtimeModules.size());
\r
334 for (RuntimeModule module : runtimeModules) {
\r
335 modules.add(module.getModule());
\r
337 test.setCoverage(CoverageUtils.getCoverage(modules));
\r
339 CoverageUtils.resetCoverage(modules);
\r
344 public boolean hasChildren(Object element) {
\r
345 if (element instanceof STSTest) {
\r
347 } else if (element instanceof STSSuite) {
\r
348 STSSuite suite = (STSSuite) element;
\r
349 return (suite.getChildren() != null ? suite.getChildren().length > 0 : false);
\r
351 throw new IllegalArgumentException(element.toString());
\r
355 public Object getParent(Object element) {
\r
356 if (element instanceof STSTest) {
\r
357 return ((STSTest) element).getParent();
\r
358 } else if (element instanceof STSSuite) {
\r
361 throw new IllegalArgumentException(element.toString());
\r
365 public Object[] getChildren(Object parentElement) {
\r
366 if (parentElement instanceof STSTest) {
\r
368 } else if (parentElement instanceof STSSuite) {
\r
369 STSSuite suite = (STSSuite) parentElement;
\r
370 return suite.getChildren();
\r
372 throw new IllegalArgumentException(parentElement.toString());
\r
376 public String getText(Object element) {
\r
377 if (element instanceof STSTest)
\r
378 return ((STSTest)element).getLabel();
\r
379 else if (element instanceof STSSuite)
\r
380 return ((STSSuite)element).getLabel();
\r
382 throw new IllegalArgumentException(element.toString());
\r
385 public Image getImage(Object element) {
\r
386 if (element instanceof STSSuite) {
\r
387 STSSuite suite = (STSSuite) element;
\r
388 if (suite.isRunning())
\r
389 return STSTestSuiteProvider.suiteRunningIcon;
\r
390 else if (suite.executed())
\r
391 return STSTestSuiteProvider.suiteOkIcon;
\r
392 else if (suite.failed())
\r
393 return STSTestSuiteProvider.suiteFailIcon;
\r
395 return STSTestSuiteProvider.suiteIcon;
\r
396 } else if (element instanceof STSTest) {
\r
397 STSTest test = (STSTest) element;
\r
398 if (test.isRunning)
\r
399 return STSTestSuiteProvider.testRunningIcon;
\r
400 else if (test.executed)
\r
401 return STSTestSuiteProvider.testOkIcon;
\r
402 else if (test.failed)
\r
403 return STSTestSuiteProvider.testFailIcon;
\r
405 return STSTestSuiteProvider.testIcon;
\r
410 public void updateInput(Resource root) {
\r
414 Simantics.getSession().syncRequest(new ReadRequest() {
\r
417 public void run(ReadGraph graph) throws DatabaseException {
\r
418 Layer0 L0 = Layer0.getInstance(graph);
\r
419 TestsResource TESTS = TestsResource.getInstance(graph);
\r
420 if (graph.isInstanceOf(root, TESTS.STSTest)) {
\r
421 String testName = graph.getRelatedValue2(root, L0.HasName, Bindings.STRING);
\r
422 String definition = graph.getRelatedValue2(root, TESTS.STSTest_definition, Bindings.STRING);
\r
423 Integer executionPrioprity = graph.getRelatedValue2(root, TESTS.STSTest_executionPriority, Bindings.INTEGER);
\r
424 test = new STSTest(root, null, definition, testName, executionPrioprity);
\r
425 } else if (graph.isInstanceOf(root, TESTS.STSSuite)) {
\r
426 String suiteName = graph.getRelatedValue2(root, L0.HasName, Bindings.STRING);
\r
427 String moduleNameFilter = graph.getPossibleRelatedValue2(root, TESTS.STSSuite_moduleNameFilter, Bindings.STRING);
\r
428 suite = new STSSuite(root, suiteName, moduleNameFilter);
\r
429 List<STSTest> tests = new ArrayList<>();
\r
430 for (Resource test : graph.getObjects(root, L0.ConsistsOf)) {
\r
431 String testName = graph.getRelatedValue2(test, L0.HasName, Bindings.STRING);
\r
432 String definition = graph.getRelatedValue2(test, TESTS.STSTest_definition, Bindings.STRING);
\r
433 Integer executionPrioprity = graph.getRelatedValue2(test, TESTS.STSTest_executionPriority, Bindings.INTEGER);
\r
434 tests.add(new STSTest(test, suite, definition, testName, executionPrioprity));
\r
436 Collections.sort(tests, (o1, o2) -> {
\r
437 if (o1.priority < o2.priority)
\r
439 else if (o1.priority > o2.priority)
\r
441 else return AlphanumComparator.COMPARATOR.compare(o1.name, o2.name);
\r
443 suite.children(tests.toArray(new STSTest[tests.size()]));
\r
445 throw new IllegalArgumentException(root.toString());
\r
449 } catch (DatabaseException e) {
\r
450 e.printStackTrace();
\r
454 public List<String> getOutput(Object element) {
\r
455 if (element instanceof STSTest) {
\r
456 STSTest test = (STSTest) element;
\r
457 return test.getOutput();
\r
459 return Collections.emptyList();
\r
462 public int getStartedCount() {
\r
464 return suite.startedCount;
\r
469 public int getIgnoredCount() {
\r
473 public int getTotalCount() {
\r
474 if (suite != null && suite.getChildren() != null)
\r
475 return suite.getChildren().length;
\r
476 else if (test != null)
\r
482 public int getErrorCount() {
\r
484 return suite.errorCount;
\r
488 public int getFailureCount() {
\r
490 return suite.failureCount;
\r
494 public int getAssumptionFailureCount() {
\r
498 public boolean isStopped() {
\r
500 return !suite.isRunning();
\r
502 return test.isRunning;
\r