Mercurial > hg > dml-open-vis
comparison src/DML/VendorAssetsBundle/Resources/assets/jasmine/2.1.3/lib/jasmine-2.1.3/jasmine-html.js @ 0:493bcb69166c
added public content
author | Daniel Wolff |
---|---|
date | Tue, 09 Feb 2016 20:54:02 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:493bcb69166c |
---|---|
1 /* | |
2 Copyright (c) 2008-2014 Pivotal Labs | |
3 | |
4 Permission is hereby granted, free of charge, to any person obtaining | |
5 a copy of this software and associated documentation files (the | |
6 "Software"), to deal in the Software without restriction, including | |
7 without limitation the rights to use, copy, modify, merge, publish, | |
8 distribute, sublicense, and/or sell copies of the Software, and to | |
9 permit persons to whom the Software is furnished to do so, subject to | |
10 the following conditions: | |
11 | |
12 The above copyright notice and this permission notice shall be | |
13 included in all copies or substantial portions of the Software. | |
14 | |
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
16 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
18 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
19 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
20 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
21 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
22 */ | |
23 jasmineRequire.html = function(j$) { | |
24 j$.ResultsNode = jasmineRequire.ResultsNode(); | |
25 j$.HtmlReporter = jasmineRequire.HtmlReporter(j$); | |
26 j$.QueryString = jasmineRequire.QueryString(); | |
27 j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); | |
28 }; | |
29 | |
30 jasmineRequire.HtmlReporter = function(j$) { | |
31 | |
32 var noopTimer = { | |
33 start: function() {}, | |
34 elapsed: function() { return 0; } | |
35 }; | |
36 | |
37 function HtmlReporter(options) { | |
38 var env = options.env || {}, | |
39 getContainer = options.getContainer, | |
40 createElement = options.createElement, | |
41 createTextNode = options.createTextNode, | |
42 onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {}, | |
43 timer = options.timer || noopTimer, | |
44 results = [], | |
45 specsExecuted = 0, | |
46 failureCount = 0, | |
47 pendingSpecCount = 0, | |
48 htmlReporterMain, | |
49 symbols, | |
50 failedSuites = []; | |
51 | |
52 this.initialize = function() { | |
53 clearPrior(); | |
54 htmlReporterMain = createDom('div', {className: 'jasmine_html-reporter'}, | |
55 createDom('div', {className: 'banner'}, | |
56 createDom('a', {className: 'title', href: 'http://jasmine.github.io/', target: '_blank'}), | |
57 createDom('span', {className: 'version'}, j$.version) | |
58 ), | |
59 createDom('ul', {className: 'symbol-summary'}), | |
60 createDom('div', {className: 'alert'}), | |
61 createDom('div', {className: 'results'}, | |
62 createDom('div', {className: 'failures'}) | |
63 ) | |
64 ); | |
65 getContainer().appendChild(htmlReporterMain); | |
66 | |
67 symbols = find('.symbol-summary'); | |
68 }; | |
69 | |
70 var totalSpecsDefined; | |
71 this.jasmineStarted = function(options) { | |
72 totalSpecsDefined = options.totalSpecsDefined || 0; | |
73 timer.start(); | |
74 }; | |
75 | |
76 var summary = createDom('div', {className: 'summary'}); | |
77 | |
78 var topResults = new j$.ResultsNode({}, '', null), | |
79 currentParent = topResults; | |
80 | |
81 this.suiteStarted = function(result) { | |
82 currentParent.addChild(result, 'suite'); | |
83 currentParent = currentParent.last(); | |
84 }; | |
85 | |
86 this.suiteDone = function(result) { | |
87 if (result.status == 'failed') { | |
88 failedSuites.push(result); | |
89 } | |
90 | |
91 if (currentParent == topResults) { | |
92 return; | |
93 } | |
94 | |
95 currentParent = currentParent.parent; | |
96 }; | |
97 | |
98 this.specStarted = function(result) { | |
99 currentParent.addChild(result, 'spec'); | |
100 }; | |
101 | |
102 var failures = []; | |
103 this.specDone = function(result) { | |
104 if(noExpectations(result) && typeof console !== 'undefined' && typeof console.error !== 'undefined') { | |
105 console.error('Spec \'' + result.fullName + '\' has no expectations.'); | |
106 } | |
107 | |
108 if (result.status != 'disabled') { | |
109 specsExecuted++; | |
110 } | |
111 | |
112 symbols.appendChild(createDom('li', { | |
113 className: noExpectations(result) ? 'empty' : result.status, | |
114 id: 'spec_' + result.id, | |
115 title: result.fullName | |
116 } | |
117 )); | |
118 | |
119 if (result.status == 'failed') { | |
120 failureCount++; | |
121 | |
122 var failure = | |
123 createDom('div', {className: 'spec-detail failed'}, | |
124 createDom('div', {className: 'description'}, | |
125 createDom('a', {title: result.fullName, href: specHref(result)}, result.fullName) | |
126 ), | |
127 createDom('div', {className: 'messages'}) | |
128 ); | |
129 var messages = failure.childNodes[1]; | |
130 | |
131 for (var i = 0; i < result.failedExpectations.length; i++) { | |
132 var expectation = result.failedExpectations[i]; | |
133 messages.appendChild(createDom('div', {className: 'result-message'}, expectation.message)); | |
134 messages.appendChild(createDom('div', {className: 'stack-trace'}, expectation.stack)); | |
135 } | |
136 | |
137 failures.push(failure); | |
138 } | |
139 | |
140 if (result.status == 'pending') { | |
141 pendingSpecCount++; | |
142 } | |
143 }; | |
144 | |
145 this.jasmineDone = function() { | |
146 var banner = find('.banner'); | |
147 banner.appendChild(createDom('span', {className: 'duration'}, 'finished in ' + timer.elapsed() / 1000 + 's')); | |
148 | |
149 var alert = find('.alert'); | |
150 | |
151 alert.appendChild(createDom('span', { className: 'exceptions' }, | |
152 createDom('label', { className: 'label', 'for': 'raise-exceptions' }, 'raise exceptions'), | |
153 createDom('input', { | |
154 className: 'raise', | |
155 id: 'raise-exceptions', | |
156 type: 'checkbox' | |
157 }) | |
158 )); | |
159 var checkbox = find('#raise-exceptions'); | |
160 | |
161 checkbox.checked = !env.catchingExceptions(); | |
162 checkbox.onclick = onRaiseExceptionsClick; | |
163 | |
164 if (specsExecuted < totalSpecsDefined) { | |
165 var skippedMessage = 'Ran ' + specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all'; | |
166 alert.appendChild( | |
167 createDom('span', {className: 'bar skipped'}, | |
168 createDom('a', {href: '?', title: 'Run all specs'}, skippedMessage) | |
169 ) | |
170 ); | |
171 } | |
172 var statusBarMessage = ''; | |
173 var statusBarClassName = 'bar '; | |
174 | |
175 if (totalSpecsDefined > 0) { | |
176 statusBarMessage += pluralize('spec', specsExecuted) + ', ' + pluralize('failure', failureCount); | |
177 if (pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', pendingSpecCount); } | |
178 statusBarClassName += (failureCount > 0) ? 'failed' : 'passed'; | |
179 } else { | |
180 statusBarClassName += 'skipped'; | |
181 statusBarMessage += 'No specs found'; | |
182 } | |
183 | |
184 alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage)); | |
185 | |
186 for(i = 0; i < failedSuites.length; i++) { | |
187 var failedSuite = failedSuites[i]; | |
188 for(var j = 0; j < failedSuite.failedExpectations.length; j++) { | |
189 var errorBarMessage = 'AfterAll ' + failedSuite.failedExpectations[j].message; | |
190 var errorBarClassName = 'bar errored'; | |
191 alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessage)); | |
192 } | |
193 } | |
194 | |
195 var results = find('.results'); | |
196 results.appendChild(summary); | |
197 | |
198 summaryList(topResults, summary); | |
199 | |
200 function summaryList(resultsTree, domParent) { | |
201 var specListNode; | |
202 for (var i = 0; i < resultsTree.children.length; i++) { | |
203 var resultNode = resultsTree.children[i]; | |
204 if (resultNode.type == 'suite') { | |
205 var suiteListNode = createDom('ul', {className: 'suite', id: 'suite-' + resultNode.result.id}, | |
206 createDom('li', {className: 'suite-detail'}, | |
207 createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description) | |
208 ) | |
209 ); | |
210 | |
211 summaryList(resultNode, suiteListNode); | |
212 domParent.appendChild(suiteListNode); | |
213 } | |
214 if (resultNode.type == 'spec') { | |
215 if (domParent.getAttribute('class') != 'specs') { | |
216 specListNode = createDom('ul', {className: 'specs'}); | |
217 domParent.appendChild(specListNode); | |
218 } | |
219 var specDescription = resultNode.result.description; | |
220 if(noExpectations(resultNode.result)) { | |
221 specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; | |
222 } | |
223 specListNode.appendChild( | |
224 createDom('li', { | |
225 className: resultNode.result.status, | |
226 id: 'spec-' + resultNode.result.id | |
227 }, | |
228 createDom('a', {href: specHref(resultNode.result)}, specDescription) | |
229 ) | |
230 ); | |
231 } | |
232 } | |
233 } | |
234 | |
235 if (failures.length) { | |
236 alert.appendChild( | |
237 createDom('span', {className: 'menu bar spec-list'}, | |
238 createDom('span', {}, 'Spec List | '), | |
239 createDom('a', {className: 'failures-menu', href: '#'}, 'Failures'))); | |
240 alert.appendChild( | |
241 createDom('span', {className: 'menu bar failure-list'}, | |
242 createDom('a', {className: 'spec-list-menu', href: '#'}, 'Spec List'), | |
243 createDom('span', {}, ' | Failures '))); | |
244 | |
245 find('.failures-menu').onclick = function() { | |
246 setMenuModeTo('failure-list'); | |
247 }; | |
248 find('.spec-list-menu').onclick = function() { | |
249 setMenuModeTo('spec-list'); | |
250 }; | |
251 | |
252 setMenuModeTo('failure-list'); | |
253 | |
254 var failureNode = find('.failures'); | |
255 for (var i = 0; i < failures.length; i++) { | |
256 failureNode.appendChild(failures[i]); | |
257 } | |
258 } | |
259 }; | |
260 | |
261 return this; | |
262 | |
263 function find(selector) { | |
264 return getContainer().querySelector('.jasmine_html-reporter ' + selector); | |
265 } | |
266 | |
267 function clearPrior() { | |
268 // return the reporter | |
269 var oldReporter = find(''); | |
270 | |
271 if(oldReporter) { | |
272 getContainer().removeChild(oldReporter); | |
273 } | |
274 } | |
275 | |
276 function createDom(type, attrs, childrenVarArgs) { | |
277 var el = createElement(type); | |
278 | |
279 for (var i = 2; i < arguments.length; i++) { | |
280 var child = arguments[i]; | |
281 | |
282 if (typeof child === 'string') { | |
283 el.appendChild(createTextNode(child)); | |
284 } else { | |
285 if (child) { | |
286 el.appendChild(child); | |
287 } | |
288 } | |
289 } | |
290 | |
291 for (var attr in attrs) { | |
292 if (attr == 'className') { | |
293 el[attr] = attrs[attr]; | |
294 } else { | |
295 el.setAttribute(attr, attrs[attr]); | |
296 } | |
297 } | |
298 | |
299 return el; | |
300 } | |
301 | |
302 function pluralize(singular, count) { | |
303 var word = (count == 1 ? singular : singular + 's'); | |
304 | |
305 return '' + count + ' ' + word; | |
306 } | |
307 | |
308 function specHref(result) { | |
309 return '?spec=' + encodeURIComponent(result.fullName); | |
310 } | |
311 | |
312 function specHref(result) { | |
313 return '?jasmine=' + encodeURIComponent(result.fullName); | |
314 } | |
315 | |
316 function setMenuModeTo(mode) { | |
317 htmlReporterMain.setAttribute('class', 'jasmine_html-reporter ' + mode); | |
318 } | |
319 | |
320 function noExpectations(result) { | |
321 return (result.failedExpectations.length + result.passedExpectations.length) === 0 && | |
322 result.status === 'passed'; | |
323 } | |
324 } | |
325 | |
326 return HtmlReporter; | |
327 }; | |
328 | |
329 jasmineRequire.HtmlSpecFilter = function() { | |
330 function HtmlSpecFilter(options) { | |
331 var filterString = options && options.filterString() && options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); | |
332 var filterPattern = new RegExp(filterString); | |
333 | |
334 this.matches = function(specName) { | |
335 return filterPattern.test(specName); | |
336 }; | |
337 } | |
338 | |
339 return HtmlSpecFilter; | |
340 }; | |
341 | |
342 jasmineRequire.ResultsNode = function() { | |
343 function ResultsNode(result, type, parent) { | |
344 this.result = result; | |
345 this.type = type; | |
346 this.parent = parent; | |
347 | |
348 this.children = []; | |
349 | |
350 this.addChild = function(result, type) { | |
351 this.children.push(new ResultsNode(result, type, this)); | |
352 }; | |
353 | |
354 this.last = function() { | |
355 return this.children[this.children.length - 1]; | |
356 }; | |
357 } | |
358 | |
359 return ResultsNode; | |
360 }; | |
361 | |
362 jasmineRequire.QueryString = function() { | |
363 function QueryString(options) { | |
364 | |
365 this.setParam = function(key, value) { | |
366 var paramMap = queryStringToParamMap(); | |
367 paramMap[key] = value; | |
368 options.getWindowLocation().search = toQueryString(paramMap); | |
369 }; | |
370 | |
371 this.getParam = function(key) { | |
372 return queryStringToParamMap()[key]; | |
373 }; | |
374 | |
375 return this; | |
376 | |
377 function toQueryString(paramMap) { | |
378 var qStrPairs = []; | |
379 for (var prop in paramMap) { | |
380 qStrPairs.push(encodeURIComponent(prop) + '=' + encodeURIComponent(paramMap[prop])); | |
381 } | |
382 return '?' + qStrPairs.join('&'); | |
383 } | |
384 | |
385 function queryStringToParamMap() { | |
386 var paramStr = options.getWindowLocation().search.substring(1), | |
387 params = [], | |
388 paramMap = {}; | |
389 | |
390 if (paramStr.length > 0) { | |
391 params = paramStr.split('&'); | |
392 for (var i = 0; i < params.length; i++) { | |
393 var p = params[i].split('='); | |
394 var value = decodeURIComponent(p[1]); | |
395 if (value === 'true' || value === 'false') { | |
396 value = JSON.parse(value); | |
397 } | |
398 paramMap[decodeURIComponent(p[0])] = value; | |
399 } | |
400 } | |
401 | |
402 return paramMap; | |
403 } | |
404 | |
405 } | |
406 | |
407 return QueryString; | |
408 }; |