spectacular
Version:
Advanced BDD framework for CoffeeScript and JavaScript
91 lines (63 loc) • 2.93 kB
text/coffeescript
class spectacular.widgets.ExampleViewer
init: (, ) ->
= buildHTML spectacular.templates.viewer()
= .querySelector 'div'
= .querySelector 'button'
.container.appendChild
.onclick = ->
toggleClass document.querySelector('body'), 'view-expanded'
displayCard: (example) ->
.innerHTML = example
addClass(, 'card-visible') unless hasClass(, 'card-visible')
= .querySelector '.stack'
= .querySelector '.expectation-message'
= .querySelectorAll '.expectation'
if .length > 0
, (node, i) =>
index = node.attributes['data-expectation'].value
expectation = example.result.expectations[index]
node.onclick = => node, expectation
node, expectation if i is 0
else
if example.result.expectations.length is 0 and example.examplePromise.reason
example.examplePromise.reason.stack
displayExpectationDetails: (node, expectation) ->
, (el) -> removeClass el, 'active'
.innerHTML = expectation.message
.setAttribute 'class', if expectation.success then 'expectation-message success' else 'expectation-message failure'
if expectation.trace?
addClass node, 'active'
clearStack: -> .innerHTML = ''
displayStack: (stack) ->
parser = new spectacular.errors.ErrorParser(stack)
parser.lines.forEach (stackLine, i) =>
{file, line, column, method} = parser.details stackLine
div = tag 'div', -> tag 'a', escapeHTML stackLine
div.onclick = =>
if hasClass div, 'has-source'
else
div, file, line, column
.appendChild div
div, file, line, column if i is 0
hideSource: (div) ->
div.removeChild(div.children[1])
removeClass div, 'has-source'
displayLineSource: (div, file, line, column) ->
f = new spectacular.formatters.console.ErrorSourceFormatter .options, file, line, column
w = (s,c) -> "<span class='#{c}'>#{s}</span>"
f.format()
.then (result) ->
div.appendChild tag 'pre', ->
lines = result.replace(/^\n|\n$/g, '').split('\n')
lines = lines.map (line) ->
line = line.replace(/^\s+(\d+\s)*\|/gm, w '$&', 'line-number')
tag('span', line).outerHTML
lines.join('\n')
addClass div, 'has-source'
each: (nodes, block) -> Array::forEach.call nodes, block
getCard: (example) -> spectacular.templates.card({example})
onStart:(event) ->
onResult:(event) ->
onEnd:(event) ->