@danielkalen/simplybind
Version:
Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.
195 lines (117 loc) • 4.26 kB
text/coffeescript
Promise.config 'longStackTraces':false
do ($=jQuery)->
import 'testSuite-markup.coffee'
import 'testSuite-timeunits.coffee'
TestSuite = ({, , ='sync', , , , =1, =1, , })->
if isnt TestSuite
return new TestSuite(arguments[0])
= 0
= {}
= []
= {}
?= ()=> .setup.empty()
= .bind() or (()->).bind()
title$ = $('.testSuite_heading-title')
= title$.children('span')[0].textContent
= title$[0].textContent.replace(, '').replace(/\s+$/, '')
itemMarkup = markup.item
.replace '{{title}}', or ''
.replace '{{subtitle}}', or ''
.replace '{{nonSharedTest}}', if then 'nonSharedTest' else ''
.container = $(document.body).children('.testSuite')
if .container.children().length
.list = .container.children()
else
.list = $(markup.list).appendTo(.container)
setTimeout ()=> .list.append(markup.gap).append(markup.gap)
.item = $(itemMarkup).appendTo(.list).after(' ')
.button = .item.find('.__execute')
.results = .item.find('.__results')
.resultsTime = .results.find('.__results-time')
.resultsResult = .results.find('.__results-result')
.resultsAvg = .results.find('.__results-avg')
.setup = .item.find('.__setup')
.button.on 'click', ()=> ()
.item.data 'TestSuite', @
return @
TestSuite::setup = ()-> new Promise (resolve)=>
if
.call(, .setup)
resolve()
TestSuite::teardown = ()-> if
.call(, .setup)
TestSuite::storeResults = (force)-> if location.hostname and (.length >= 5 or force) and window.storeResults
postData =
'library':
'version':
'testName':
'testDesc':
'result':
'UA': navigator.userAgent
'nonSharedTest': or false
$.post('/set', postData)
TestSuite::run = ()-> unless
= true
+= 1
performIteration = (timesToRun)=> new Promise (resolve)=> switch
when 'sync'
totalTime = 0
iteration = 0
while iteration++ < timesToRun
if
{startTime, endTime} = ()
else
startTime = performance.now()
()
endTime = performance.now()
totalTime += endTime-startTime
if iteration is timesToRun
resolve(totalTime)
when 'async'
totalTime = 0
iteration = 0
while iteration++ < timesToRun
do (iteration)=> setTimeout ()=>
if
{startTime, endTime} = ()
else
startTime = performance.now()
()
endTime = performance.now()
totalTime += endTime-startTime
if iteration is timesToRun
resolve(totalTime)
warmUp = ()=> performIteration()
beginTest = ()=> performIteration()
()
.then(warmUp)
.then(beginTest)
.then (result)=>
formatTime = (time, returnTime)=>
if returnTime
split = time.toString().split '.'
if split.length > 1
return "#{split[0]}.#{split[1].slice(0,3)} ms"
else
return "#{time} ms"
else
time = time/
perSec = timeUnits.minute / time
humanize.numberFormat(perSec, 0)+' op/s'
if <= 2
average = '---------'
else
.push(result)
average = .reduce((a,b)->a+b) / .length
.resultsTime.html formatTime(result, true)
.resultsResult.html formatTime(result)
.resultsAvg.html = if <= 2 then average else formatTime(average)
.results.addClass 'hasResults'
()
(result > 10000)
= false
window.storeResults = true
$('#storeResults').on 'click', ()->
window.storeResults = !window.storeResults
$(@).toggleClass('enabled')
window.TestSuite = TestSuite