UNPKG

siesta-lite

Version:

Stress-free JavaScript unit testing and functional testing tool, works in NodeJS and browsers

444 lines (369 loc) 18.1 kB
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>The source code</title> <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" /> <script type="text/javascript" src="../resources/prettify/prettify.js"></script> <style type="text/css"> .highlight { display: block; background-color: #ddd; } </style> <script type="text/javascript"> function highlight() { document.getElementById(location.hash.replace(/#/, "")).className = "highlight"; } </script> </head> <body onload="prettyPrint(); highlight();"> <pre class="prettyprint lang-js">/* Siesta 5.6.1 Copyright(c) 2009-2022 Bryntum AB https://bryntum.com/contact https://bryntum.com/products/siesta/license */ Ext.define(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, { extend : &#39;Ext.Container&#39;, alias : &#39;widget.coveragereport&#39;, requires : [ &#39;Ext.tree.Panel&#39;, &#39;Siesta.Project.Browser.UI.TreeFilterField&#39;, &#39;Siesta.Project.Browser.UI.CoverageChart&#39;, &#39;Siesta.Project.Browser.Model.FilterableTreeStore&#39;, &#39;Siesta.Project.Browser.UI.FilterableTreeView&#39;, &#39;Siesta.Project.Browser.Model.CoverageUnit&#39;, &#39;Ext.layout.container.Border&#39; ], cls : &#39;st-cov-report-panel&#39;, layout : &#39;border&#39;, htmlReport : null, treePanel : null, treeStore : null, chart : null, sourcePanel : null, contentContainer : null, toggleButtons : null, standalone : false, dataUrl : null, project : null, // Number of levels in the coverage class/file tree to expand by default expandLevels : 2, initComponent : function () { var me = this var standalone = this.standalone var store = this.treeStore = new Siesta.Project.Browser.Model.FilterableTreeStore({ model : &#39;Siesta.Project.Browser.Model.CoverageUnit&#39;, proxy : &#39;memory&#39;, rootVisible : true }) Ext.apply(this, { border : !this.standalone, items : [ { xtype : &#39;treepanel&#39;, border : false, region : &#39;west&#39;, enableColumnHide : false, enableColumnMove : false, enableColumnResize : false, sortableColumns : false, rowLines : false, tbar : { cls : &#39;siesta-toolbar&#39;, height : 45, border : false, items : [ standalone ? null : { text : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;closeText&#39;), scale : &#39;medium&#39;, style : &#39;margin:0 10px 0 0;&#39;, handler : this.onBackToMainUI, scope : this }, { xtype : &#39;treefilter&#39;, cls : &#39;filterfield&#39;, hasAndCheck : function () { var states = Ext.pluck(me.toggleButtons, &#39;pressed&#39;) return !states[0] || !states[1] || !states[2] }, andChecker : this.levelFilter, andCheckerScope : this, margin : &#39;3 0 0 0&#39;, store : store, filterField : &#39;text&#39;, width : 180 }, &#39;-&gt;&#39;, { xtype : &#39;label&#39;, text : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;showText&#39;), margin : &#39;0 5 0 0&#39; }, { text : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;highText&#39;), level : &#39;high&#39;, enableToggle : true, pressed : true, scale : &#39;medium&#39;, cls : &#39;st-cov-level-high&#39;, toggleHandler : this.toggleLevels, scope : this, margin : &#39;0 5 0 0&#39; }, { text : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;mediumText&#39;), level : &#39;med&#39;, enableToggle : true, scale : &#39;medium&#39;, pressed : true, cls : &#39;st-cov-level-medium&#39;, toggleHandler : this.toggleLevels, scope : this, margin : &#39;0 5 0 0&#39; }, { text : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;lowText&#39;), level : &#39;low&#39;, enableToggle : true, scale : &#39;medium&#39;, pressed : true, cls : &#39;st-cov-level-low&#39;, toggleHandler : this.toggleLevels, scope : this, style : &#39;margin:0 5px 0 0&#39; } ] }, viewType : &#39;filterabletreeview&#39;, viewConfig : { store : store.nodeStore, trackOver : false, rootVisible : true }, cls : &#39;st-cov-report-tree-panel&#39;, flex : 1, split : true, rootVisible : true, columns : [ { xtype : &#39;treecolumn&#39;, dataIndex : &#39;text&#39;, menuDisabled : true, flex : 3 }, { text : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;statementsText&#39;), flex : 1, menuDisabled : true, tdCls : &#39;cov-result-cell&#39;, renderer : this.getMetricsRenderer(&#39;statements&#39;) }, { text : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;branchesText&#39;), flex : 1, menuDisabled : true, tdCls : &#39;cov-result-cell&#39;, renderer : this.getMetricsRenderer(&#39;branches&#39;) }, { text : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;functionsText&#39;), flex : 1, menuDisabled : true, tdCls : &#39;cov-result-cell&#39;, renderer : this.getMetricsRenderer(&#39;functions&#39;) }, { text : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;linesText&#39;), flex : 1, menuDisabled : true, tdCls : &#39;cov-result-cell&#39;, renderer : this.getMetricsRenderer(&#39;lines&#39;) } ], store : store, listeners : { selectionchange : this.onClassSelected, scope : this } }, { xtype : &#39;container&#39;, cls : &#39;coveragechart-container&#39;, slot : &#39;contentContainer&#39;, region : &#39;center&#39;, layout : { type : &#39;card&#39;, deferredRendering : true }, items : [ { xtype : &#39;coveragechart&#39; }, { xtype : &#39;panel&#39;, slot : &#39;sourcePanel&#39;, flex : 1, autoScroll : true, bodyPadding : &#39;4 0 4 10&#39;, border : false, cls : &#39;st-cov-report-source-panel&#39; } ] } ] }) this.callParent() this.contentContainer = this.down(&#39;[slot=contentContainer]&#39;) this.chart = this.down(&#39;chart&#39;) this.sourcePanel = this.down(&#39;[slot=sourcePanel]&#39;) this.toggleButtons = this.query(&#39;button[level]&#39;) this.treePanel = this.down(&#39;treepanel&#39;) if (standalone) { // `loadingMask.show()` throws exception when called with non-rendered target this.on(&#39;afterrender&#39;, function () { var loadingMask = new Ext.LoadMask({ target : this, msg : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;loadingText&#39;) }); loadingMask.show() // use this code for testing // setTimeout(function () { // loadingMask.hide() // // me.loadHtmlReport(me.htmlReport) // }, 2000) Ext.Ajax.request({ url : this.dataUrl, success : function (response) { loadingMask.hide() me.loadHtmlReport(Ext.JSON.decode(response.responseText)) }, failure : function () { loadingMask.hide() Ext.Msg.show({ title : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;loadingErrorText&#39;), msg : Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;loadingErrorMessageText&#39;) + me.dataUrl, buttons : Ext.MessageBox.OK, icon : Ext.MessageBox.ERROR }) } }) }, this, { single : true }) } else if (this.htmlReport) { this.loadHtmlReport(this.htmlReport); } // Refresh data is user reruns a test with coverage panel open if (this.project) { this.project.on(&#39;testsuiteend&#39;, this.onTestSuiteEnd, this) } }, onTestSuiteEnd : function (descriptors) { if (this.project &amp;&amp; this.isVisible()) { // Load new data into coverage report this.loadHtmlReport(this.project.generateCoverageHtmlReport(false)); } }, loadHtmlReport : function (report) { this.htmlReport = report var treeStore = this.treeStore var isFile = report.coverageUnit == &#39;file&#39; var treeFilter = this.down(&#39;treefilter&#39;) var selModel = this.treePanel.getSelectionModel(); var selected = selModel.getSelected(); var oldSelectedId = selected.length &gt; 0 ? selected.first().getId() : null; treeStore.setRootNode(this.generateFilesTree(report.htmlReport.root)) if (oldSelectedId &amp;&amp; treeStore.getNodeById(oldSelectedId)){ selModel.select(treeStore.getNodeById(oldSelectedId)); } this.down(&#39;treecolumn&#39;).setText(isFile ? &#39;File name&#39; : &#39;Class name&#39;) treeFilter.emptyText = isFile ? &#39;Filter files&#39; : &#39;Filter classes&#39; treeFilter.applyEmptyText(); this.loadChartData(treeStore.getRootNode()); }, levelFilter : function (node) { var coverage = node.getStatementCoverage(); if (coverage === undefined) return false; return this.toggleButtons[coverage &gt;= 80 ? 0 : coverage &gt;= 50 ? 1 : 2].pressed }, toggleLevels : function () { this.down(&#39;treefilter&#39;).refreshFilter() }, getCoverageLevelClass : function (coveragePct) { if (typeof coveragePct == &#39;number&#39;) return &#39;st-cov-level-&#39; + (coveragePct &gt;= 80 ? &#39;high&#39; : coveragePct &gt;= 50 ? &#39;medium&#39; : &#39;low&#39;); else return &#39;&#39; }, getMetricsRenderer : function (property) { var me = this return function (value, metaData, preloadFile) { var reportNode = preloadFile.get(&#39;reportNode&#39;) if (!reportNode) return &#39;&#39; var metrics = reportNode.metrics[property] metaData.tdCls = me.getCoverageLevelClass(metrics.pct) return &#39;&lt;span class=&quot;st-cov-stat-pct-&#39; + property + &#39;&quot;&gt;&#39; + Math.round(metrics.pct) + &#39;%&lt;/span&gt; &#39; + &#39;&lt;span class=&quot;st-cov-stat-abs-&#39; + property + &#39;&quot;&gt;(&#39; + metrics.covered + &#39;/&#39; + metrics.total + &#39;)&lt;/span&gt;&#39; } }, generateFilesTree : function (node, depth) { var me = this depth = depth || 0; // in this method &quot;node&quot; should be treated as a raw JSON object and not an instance of Node from Istanbul // (even that in UI usage scenario it will be a Node) // since for the standalone report we load a JSON blob with the tree report // so we should not call any methods on &quot;node&quot; if (node.kind === &#39;dir&#39;) { var text = node.relativeName || node.fullName return { id : node.fullName, url : node.fullName, leaf : false, expanded : depth &lt; this.expandLevels, text : text == &#39;/&#39; &amp;&amp; this.htmlReport.coverageUnit == &#39;extjs_class&#39; ? Siesta.Resource(&#39;Siesta.Project.Browser.UI.CoverageReport&#39;, &#39;globalNamespaceText&#39;) : text, reportNode : node, children : Ext.Array.map(node.children, function (childNode) { return me.generateFilesTree(childNode, depth + 1) }).sort(this.treeSorterFn) } } else { return { id : node.fullName, url : node.fullName, leaf : true, text : node.relativeName, reportNode : node } } }, treeSorterFn : function (node1, node2) { if (!node1.leaf &amp;&amp; node2.leaf) return -1; if (node1.leaf &amp;&amp; !node2.leaf) return 1; if (node1.leaf === node2.leaf) return node1.text &lt; node2.text ? -1 : 1; }, onClassSelected : function (view, records) { var record = records[0]; if (!record) return; if (record.isLeaf() &amp;&amp; !this.htmlReport.coverageNoSource) { this.sourcePanel.update(record.get(&#39;reportNode&#39;).html) prettyPrint() this.contentContainer.getLayout().setActiveItem(1) } else { this.loadChartData(record) this.contentContainer.getLayout().setActiveItem(0) } }, onBackToMainUI : function () { this.fireEvent(&#39;backtomainui&#39;, this) }, loadChartData : function (node) { this.chart.store.loadData([ { name : &#39;Statements&#39;, value : Math.round(node.getStatementCoverage()) }, { name : &#39;Branches&#39;, value : Math.round(node.getBranchCoverage()) }, { name : &#39;Functions&#39;, value : Math.round(node.getFunctionCoverage()) }, { name : &#39;Lines&#39;, value : Math.round(node.getLineCoverage()) } ]) } }); </pre> </body> </html>