]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.tests.modelled.ui/src/org/simantics/tests/modelled/ui/STSTestRunnerView.java
Sync git svn branch with SVN repository r33290.
[simantics/platform.git] / bundles / org.simantics.tests.modelled.ui / src / org / simantics / tests / modelled / ui / STSTestRunnerView.java
1 package org.simantics.tests.modelled.ui;\r
2 \r
3 import java.util.List;\r
4 import java.util.concurrent.Executors;\r
5 \r
6 import javax.annotation.PostConstruct;\r
7 import javax.annotation.PreDestroy;\r
8 \r
9 import org.eclipse.e4.ui.di.Focus;\r
10 import org.eclipse.jface.layout.TreeColumnLayout;\r
11 import org.eclipse.jface.viewers.CellLabelProvider;\r
12 import org.eclipse.jface.viewers.ColumnWeightData;\r
13 import org.eclipse.jface.viewers.ISelection;\r
14 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
15 import org.eclipse.jface.viewers.OwnerDrawLabelProvider;\r
16 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
17 import org.eclipse.jface.viewers.TreeSelection;\r
18 import org.eclipse.jface.viewers.TreeViewer;\r
19 import org.eclipse.jface.viewers.TreeViewerColumn;\r
20 import org.eclipse.jface.viewers.ViewerCell;\r
21 import org.eclipse.swt.SWT;\r
22 import org.eclipse.swt.custom.CTabFolder;\r
23 import org.eclipse.swt.custom.CTabItem;\r
24 import org.eclipse.swt.custom.SashForm;\r
25 import org.eclipse.swt.custom.StyledText;\r
26 import org.eclipse.swt.custom.ViewForm;\r
27 import org.eclipse.swt.graphics.Point;\r
28 import org.eclipse.swt.layout.FormAttachment;\r
29 import org.eclipse.swt.layout.FormData;\r
30 import org.eclipse.swt.layout.GridData;\r
31 import org.eclipse.swt.layout.GridLayout;\r
32 import org.eclipse.swt.widgets.Composite;\r
33 import org.eclipse.swt.widgets.Event;\r
34 import org.eclipse.swt.widgets.Layout;\r
35 import org.eclipse.swt.widgets.Tree;\r
36 import org.eclipse.swt.widgets.TreeColumn;\r
37 import org.eclipse.ui.part.PageBook;\r
38 import org.simantics.db.Resource;\r
39 import org.simantics.scl.compiler.module.coverage.Coverage;\r
40 \r
41 public class STSTestRunnerView {\r
42     \r
43     public static final String ID = "org.simantics.tests.modelled.ui.stsTestRunnerView";\r
44 \r
45     private Resource test;\r
46     private SashForm sashForm;\r
47     private PageBook viewerbook;\r
48     private TreeViewer treeViewer;\r
49 //    private ITreeContentProvider treeContentProvider;\r
50     private STSTestSuiteProvider provider;\r
51     private StyledText output;\r
52     private STSCounterPanel counterPanel;\r
53     private STSProgressBar progressBar;\r
54     private Composite counterComposite;\r
55 \r
56     @PostConstruct\r
57     void createView(Composite parent) {\r
58         \r
59         GridLayout gridLayout= new GridLayout();\r
60         gridLayout.marginWidth= 0;\r
61         gridLayout.marginHeight= 0;\r
62         parent.setLayout(gridLayout);\r
63         \r
64         counterComposite= createProgressCountPanel(parent);\r
65         counterComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));\r
66         counterComposite.pack();\r
67         \r
68         SashForm sashForm = createSashForm(parent);\r
69         sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));\r
70     }\r
71     \r
72     private SashForm createSashForm(Composite parent) {\r
73         sashForm = new SashForm(parent, SWT.VERTICAL);\r
74 \r
75         ViewForm top = new ViewForm(sashForm, SWT.NONE);\r
76 \r
77         Composite empty = new Composite(top, SWT.NONE);\r
78         empty.setLayout(new Layout() {\r
79             @Override\r
80             protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {\r
81                 return new Point(1, 1); // (0, 0) does not work with super-intelligent ViewForm\r
82             }\r
83             @Override\r
84             protected void layout(Composite composite, boolean flushCache) {\r
85             }\r
86         });\r
87         top.setTopLeft(empty); // makes ViewForm draw the horizontal separator line ...\r
88 //        fTestViewer= new TestViewer(top, fClipboard, this);\r
89         createTestViewers(top);\r
90         top.setContent(viewerbook);\r
91         treeViewer.setInput(test);\r
92 \r
93         ViewForm bottom = new ViewForm(sashForm, SWT.NONE);\r
94 \r
95         CTabFolder folder = new CTabFolder(bottom, SWT.BORDER);\r
96         folder.setLayoutData(new GridData(GridData.FILL_BOTH));\r
97         \r
98         CTabItem item1 = new CTabItem(folder, SWT.NONE);\r
99         item1.setText("Execution");\r
100 //        PageBook fViewerbook2= new PageBook(bottom, SWT.NULL);\r
101         // Upper\r
102         output = new StyledText(folder, SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL);\r
103 //        output.setFont(textFont);\r
104         {\r
105             FormData formData = new FormData();\r
106             formData.top = new FormAttachment(0);      \r
107 //            formData.bottom = new FormAttachment(sash);\r
108             formData.left = new FormAttachment(0);\r
109             formData.right = new FormAttachment(100);\r
110             output.setLayoutData(formData);\r
111         }\r
112         item1.setControl(output);\r
113 //        fViewerbook2.showPage(output);\r
114         bottom.setContent(folder);\r
115         folder.setSelection(0);\r
116 \r
117         CTabItem item2 = new CTabItem(folder, SWT.NONE);\r
118         item2.setText("Coverage");\r
119         \r
120         Composite treeComposite = new Composite(folder, SWT.NONE);\r
121         \r
122         TreeViewer viewer = createCoverageViewer(treeComposite);\r
123         item2.setControl(treeComposite);\r
124         \r
125         treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
126             \r
127             @Override\r
128             public void selectionChanged(SelectionChangedEvent event) {\r
129                 ISelection selection = event.getSelection();\r
130                 TreeSelection sel = (TreeSelection) selection;\r
131                 List<String> testOutput = provider.getModel().getOutput(sel.getFirstElement());\r
132                 \r
133                 viewer.setInput(sel.getFirstElement());\r
134                 \r
135                 StringBuilder sb = new StringBuilder();\r
136                 for (String o : testOutput) {\r
137                     sb.append(o);\r
138                 }\r
139                 output.setText(sb.toString());\r
140             }\r
141         });\r
142         \r
143         sashForm.setWeights(new int[] {50, 50});\r
144         return sashForm;\r
145     }\r
146     \r
147     protected static final int COLUMN_ELEMENT = 0;\r
148     protected static final int COLUMN_RATIO = 1;\r
149     protected static final int COLUMN_COVERED = 2;\r
150     protected static final int COLUMN_MISSED = 3;\r
151     protected static final int COLUMN_TOTAL = 4;\r
152     \r
153     private TreeViewer createCoverageViewer(Composite parent) {\r
154         // Composite treeViewerComposite = new Composite(parent, SWT.NONE);\r
155 \r
156         TreeColumnLayout layout = new TreeColumnLayout();\r
157         parent.setLayout(layout);\r
158         \r
159         Tree tree = new Tree(parent, SWT.MULTI | SWT.FULL_SELECTION);\r
160         tree.setHeaderVisible(true);\r
161         tree.setLinesVisible(true);\r
162         \r
163         STSCoverageProvider provider = new STSCoverageProvider();\r
164 \r
165         TreeViewer viewer = new TreeViewer(tree);\r
166         \r
167         CoverageViewSorter sorter = new CoverageViewSorter(viewer);\r
168         \r
169         final TreeViewerColumn column0 = new TreeViewerColumn(viewer, SWT.LEFT);\r
170         \r
171         column0.setLabelProvider(new CellLabelProvider() {\r
172 \r
173             \r
174             @Override\r
175             public void update(ViewerCell cell) {\r
176                 cell.setText(provider.getText(cell.getElement()));\r
177                 cell.setImage(provider.getImage(cell.getElement()));\r
178             }\r
179         });\r
180          sorter.addColumn(column0, COLUMN_ELEMENT);\r
181 \r
182         final TreeViewerColumn column1 = new TreeViewerColumn(viewer, SWT.RIGHT);\r
183         column1.setLabelProvider(new OwnerDrawLabelProvider() {\r
184 \r
185             @Override\r
186             public void update(ViewerCell cell) {\r
187                 cell.setText(provider.getRatio(cell.getElement()));\r
188             }\r
189 \r
190             @Override\r
191             protected void erase(Event event, Object element) {\r
192             }\r
193 \r
194             @Override\r
195             protected void measure(Event event, Object element) {\r
196             }\r
197 \r
198             @Override\r
199             protected void paint(Event event, Object element) {\r
200                 final Coverage coverage = (Coverage) element;\r
201                 if (coverage != null) {\r
202                     RedGreenBar.draw(event, column1.getColumn().getWidth(), coverage);\r
203                 }\r
204             }\r
205         });\r
206         sorter.addColumn(column1, COLUMN_RATIO);\r
207 \r
208         final TreeViewerColumn column2 = new TreeViewerColumn(viewer, SWT.RIGHT);\r
209         column2.setLabelProvider(new CellLabelProvider() {\r
210 \r
211             @Override\r
212             public void update(ViewerCell cell) {\r
213                 cell.setText(provider.getCovered(cell.getElement()));\r
214             }\r
215         });\r
216         sorter.addColumn(column2, COLUMN_COVERED);\r
217 \r
218         final TreeViewerColumn column3 = new TreeViewerColumn(viewer, SWT.RIGHT);\r
219         column3.setLabelProvider(new CellLabelProvider() {\r
220 \r
221             @Override\r
222             public void update(ViewerCell cell) {\r
223                 cell.setText(provider.getMissed(cell.getElement()));\r
224             }\r
225         });\r
226         sorter.addColumn(column3, COLUMN_MISSED);\r
227 \r
228         final TreeViewerColumn column4 = new TreeViewerColumn(viewer, SWT.RIGHT);\r
229         column4.setLabelProvider(new CellLabelProvider() {\r
230 \r
231             @Override\r
232             public void update(ViewerCell cell) {\r
233                 cell.setText(provider.getTotal(cell.getElement()));\r
234             }\r
235         });\r
236         sorter.addColumn(column4, COLUMN_TOTAL);\r
237 \r
238 //        viewer.addFilter(new ViewerFilter() {\r
239 //            public boolean select(Viewer viewer, Object parentElement, Object element) {\r
240 //                if (element == LOADING_ELEMENT) {\r
241 //                    return true;\r
242 //                } else {\r
243 //                    final ICoverageNode c = CoverageTools.getCoverageInfo(element);\r
244 //                    if (c == null) {\r
245 //                        return false;\r
246 //                    }\r
247 //                    final ICounter instructions = c.getInstructionCounter();\r
248 //                    if (instructions.getTotalCount() == 0) {\r
249 //                        return false;\r
250 //                    }\r
251 //                    if (settings.getHideUnusedElements() && instructions.getCoveredCount() == 0) {\r
252 //                        return false;\r
253 //                    }\r
254 //                    return true;\r
255 //                }\r
256 //            }\r
257 //        });\r
258         viewer.setComparator(sorter);\r
259         \r
260         layout.setColumnData(column0.getColumn(), new ColumnWeightData(0, 50, false));\r
261         layout.setColumnData(column1.getColumn(), new ColumnWeightData(0, 50, false));\r
262         layout.setColumnData(column2.getColumn(), new ColumnWeightData(0, 50, false));\r
263         layout.setColumnData(column3.getColumn(), new ColumnWeightData(0, 50, false));\r
264         layout.setColumnData(column4.getColumn(), new ColumnWeightData(0, 50, false));\r
265         \r
266         String[] columns = new String[] {"Module", "Coverage", "Covered Instructions", "Missed Instructions", "Total Instructions"};\r
267         TreeColumn[] columns2 = viewer.getTree().getColumns();\r
268         for (int i = 0; i < columns2.length; i++) {\r
269             columns2[i].setText(columns[i]);\r
270         }\r
271         restoreColumnWidth(viewer);\r
272         viewer.setContentProvider(provider);\r
273         return viewer;\r
274 \r
275 //        viewer.addOpenListener(new IOpenListener() {\r
276 //            public void open(OpenEvent event) {\r
277 //                openAction.run((IStructuredSelection) event.getSelection());\r
278 //            }\r
279 //        });\r
280 \r
281 //        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$\r
282 //        menuMgr.setRemoveAllWhenShown(true);\r
283 //        tree.setMenu(menuMgr.createContextMenu(tree));\r
284 //        getSite().registerContextMenu(menuMgr, viewer);\r
285 //\r
286 //        CoverageTools.getSessionManager().addSessionListener(descriptionUpdater);\r
287 //        CoverageTools.addJavaCoverageListener(coverageListener);\r
288     }\r
289     \r
290     private static final int[] DEFAULT_COLUMNWIDTH = new int[] { 200, 100, 120,\r
291             120, 120 };\r
292     \r
293     public void restoreColumnWidth(TreeViewer viewer) {\r
294         final TreeColumn[] columns = viewer.getTree().getColumns();\r
295         for (int i = 0; i < DEFAULT_COLUMNWIDTH.length; i++) {\r
296           columns[i].setWidth(DEFAULT_COLUMNWIDTH[i]);\r
297         }\r
298       }\r
299 \r
300     protected Composite createProgressCountPanel(Composite parent) {\r
301         Composite composite= new Composite(parent, SWT.NONE);\r
302         GridLayout layout= new GridLayout();\r
303         composite.setLayout(layout);\r
304         layout.numColumns = 1;\r
305 \r
306         counterPanel = new STSCounterPanel(composite);\r
307         counterPanel.setLayoutData(\r
308             new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));\r
309         progressBar = new STSProgressBar(composite);\r
310         progressBar.setLayoutData(\r
311                 new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));\r
312         return composite;\r
313     }\r
314     \r
315     private void createTestViewers(Composite parent) {\r
316         viewerbook = new PageBook(parent, SWT.NULL);\r
317 \r
318         treeViewer = new TreeViewer(viewerbook, SWT.V_SCROLL | SWT.SINGLE);\r
319         treeViewer.setUseHashlookup(true);\r
320         \r
321         STSTestSuiteModel model = new STSTestSuiteModel();\r
322         model.addListener(new STSExecutionListener() {\r
323             \r
324             @Override\r
325             public void testExecuted() {\r
326                 treeViewer.getControl().getDisplay().syncExec(() -> {\r
327                     refreshCounters();\r
328                     treeViewer.refresh();\r
329                 });\r
330             }\r
331         });\r
332         \r
333         provider = new STSTestSuiteProvider(model);\r
334         \r
335         treeViewer.setContentProvider(provider);\r
336         treeViewer.setLabelProvider(provider);\r
337 \r
338 \r
339         viewerbook.showPage(treeViewer.getTree());\r
340         \r
341     }\r
342     \r
343 \r
344     @Focus\r
345     void setFocus() {\r
346         sashForm.setFocus();\r
347     }\r
348 \r
349     public void currentTest(Resource test) {\r
350         treeViewer.setInput(test);\r
351         refreshCounters();\r
352     }\r
353     \r
354     private void refreshCounters() {\r
355         // TODO: Inefficient. Either\r
356        // - keep a boolean fHasTestRun and update only on changes, or\r
357        // - improve components to only redraw on changes (once!).\r
358 \r
359        int startedCount;\r
360        int ignoredCount;\r
361        int totalCount;\r
362        int errorCount;\r
363        int failureCount;\r
364        int assumptionFailureCount;\r
365        boolean hasErrorsOrFailures;\r
366        boolean stopped;\r
367 \r
368        STSTestSuiteModel model = provider.getModel();\r
369        if (model != null) {\r
370            startedCount= model.getStartedCount();\r
371            ignoredCount= model.getIgnoredCount();\r
372            totalCount= model.getTotalCount();\r
373            errorCount= model.getErrorCount();\r
374            failureCount= model.getFailureCount();\r
375            assumptionFailureCount = model.getAssumptionFailureCount();\r
376            hasErrorsOrFailures= errorCount + failureCount > 0;\r
377            stopped= model.isStopped();\r
378        } else {\r
379            startedCount= 0;\r
380            ignoredCount= 0;\r
381            totalCount= 0;\r
382            errorCount= 0;\r
383            failureCount= 0;\r
384            assumptionFailureCount = 0;\r
385            hasErrorsOrFailures= false;\r
386            stopped= false;\r
387        }\r
388 \r
389        counterPanel.setTotal(totalCount);\r
390        counterPanel.setRunValue(startedCount, ignoredCount, assumptionFailureCount);\r
391        counterPanel.setErrorValue(errorCount);\r
392        counterPanel.setFailureValue(failureCount);\r
393 \r
394        int ticksDone;\r
395        if (startedCount == 0)\r
396            ticksDone= 0;\r
397        else if (startedCount == totalCount &&  model.isStopped())\r
398            ticksDone= totalCount;\r
399        else\r
400            ticksDone= startedCount - 1;\r
401 \r
402        progressBar.reset(hasErrorsOrFailures, stopped, ticksDone, totalCount);\r
403    }\r
404 \r
405     public void execute() {\r
406         Executors.newSingleThreadExecutor().submit(new Runnable() {\r
407 \r
408             @Override\r
409             public void run() {\r
410                 provider.getModel().execute();\r
411             }\r
412         });\r
413     }\r
414     \r
415     @PreDestroy\r
416     public void destroy() {\r
417         provider.dispose();\r
418     }\r
419 }\r