diff options
Diffstat (limited to 'src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/smartystreets/goconvey/web/client/resources/js/goconvey.js')
-rw-r--r-- | src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/smartystreets/goconvey/web/client/resources/js/goconvey.js | 1322 |
1 files changed, 0 insertions, 1322 deletions
diff --git a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/smartystreets/goconvey/web/client/resources/js/goconvey.js b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/smartystreets/goconvey/web/client/resources/js/goconvey.js deleted file mode 100644 index 3bc12c5a7cd..00000000000 --- a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/smartystreets/goconvey/web/client/resources/js/goconvey.js +++ /dev/null @@ -1,1322 +0,0 @@ -$(init); - -$(window).load(function() -{ - // Things may shift after all the elements (images/fonts) are loaded - // In Chrome, calling reframe() doesn't work (maybe a quirk); we need to trigger resize - $(window).resize(); -}); - -function init() -{ - log("Welcome to GoConvey!"); - log("Initializing interface"); - convey.overall = emptyOverall(); - loadTheme(); - $('body').show(); - initPoller(); - wireup(); - latest(); -} - -function loadTheme(thmID) -{ - var defaultTheme = "dark"; - var linkTagId = "themeRef"; - - if (!thmID) - thmID = get('theme') || defaultTheme; - - log("Initializing theme: " + thmID); - - if (!convey.config.themes[thmID]) - { - replacement = Object.keys(convey.config.themes)[0] || defaultTheme; - log("NOTICE: Could not find '" + thmID + "' theme; defaulting to '" + replacement + "'"); - thmID = replacement; - } - - convey.theme = thmID; - save('theme', convey.theme); - - var linkTag = $('#'+linkTagId); - var fullPath = convey.config.themePath - + convey.config.themes[convey.theme].filename; - - if (linkTag.length === 0) - { - $('head').append('<link rel="stylesheet" href="' - + fullPath + '" id="themeRef">'); - } - else - linkTag.attr('href', fullPath); - - colorizeCoverageBars(); -} - -function initPoller() -{ - $(convey.poller).on('serverstarting', function(event) - { - log("Server is starting..."); - convey.status = "starting"; - showServerDown("Server starting"); - $('#run-tests').addClass('spin-slowly disabled'); - }); - - $(convey.poller).on('pollsuccess', function(event, data) - { - if (convey.status !== "starting") - hideServerDown(); - - // These two if statements determine if the server is now busy - // (and wasn't before) or is not busy (regardless of whether it was before) - if ((!convey.status || convey.status === "idle") - && data.status && data.status !== "idle") - $('#run-tests').addClass('spin-slowly disabled'); - else if (convey.status !== "idle" && data.status === "idle") - { - $('#run-tests').removeClass('spin-slowly disabled'); - } - - switch (data.status) - { - case "executing": - $(convey.poller).trigger('serverexec', data); - break; - case "idle": - $(convey.poller).trigger('serveridle', data); - break; - } - - convey.status = data.status; - }); - - $(convey.poller).on('pollfail', function(event, data) - { - log("Poll failed; server down"); - convey.status = "down"; - showServerDown("Server down"); - }); - - $(convey.poller).on('serverexec', function(event, data) - { - log("Server status: executing"); - $('.favicon').attr('href', '/favicon.ico'); // indicates running tests - }); - - $(convey.poller).on('serveridle', function(event, data) - { - log("Server status: idle"); - log("Tests have finished executing"); - latest(); - }); - - convey.poller.start(); -} - -function wireup() -{ - log("Wireup"); - - customMarkupPipes(); - - var themes = []; - for (var k in convey.config.themes) - themes.push({ id: k, name: convey.config.themes[k].name }); - $('#theme').html(render('tpl-theme-enum', themes)); - - enumSel("theme", convey.theme); - - loadSettingsFromStorage(); - - $('#stories').on('click', '.toggle-all-pkg', function(event) - { - if ($(this).closest('.story-pkg').data('pkg-state') === "expanded") - collapseAll(); - else - expandAll(); - return suppress(event); - }); - - // Wireup the settings switches - $('.enum#theme').on('click', 'li:not(.sel)', function() - { - loadTheme($(this).data('theme')); - }); - $('.enum#pkg-expand-collapse').on('click', 'li:not(.sel)', function() - { - var newSetting = $(this).data('pkg-expand-collapse'); - convey.packageStates = {}; - save('pkg-expand-collapse', newSetting); - if (newSetting === "expanded") - expandAll(); - else - collapseAll(); - }); - $('.enum#show-debug-output').on('click', 'li:not(.sel)', function() - { - var newSetting = $(this).data('show-debug-output'); - save('show-debug-output', newSetting); - if (newSetting === "show") - $('.story-line-desc .message').show(); - else - $('.story-line-desc .message').hide(); - }); - $('.enum#ui-effects').on('click', 'li:not(.sel)', function() - { - var newSetting = $(this).data('ui-effects'); - convey.uiEffects = newSetting; - save('ui-effects', newSetting); - }); - // End settings wireup - - convey.layout.header = $('header').first(); - convey.layout.frame = $('.frame').first(); - convey.layout.footer = $('footer').last(); - - updateWatchPath(); - - $('#path').change(function() - { - // Updates the watched directory with the server and makes sure it exists - var tb = $(this); - var newpath = encodeURIComponent($.trim(tb.val())); - $.post('/watch?root='+newpath) - .done(function() { tb.removeClass('error'); }) - .fail(function() { tb.addClass('error'); }); - convey.framesOnSamePath = 1; - }); - - $('#run-tests').click(function() - { - var self = $(this); - if (self.hasClass('spin-slowly') || self.hasClass('disabled')) - return; - log("Test run invoked from web UI"); - $.get("/execute"); - }); - - $('#play-pause').click(function() - { - $.get('/pause'); - - if ($(this).hasClass(convey.layout.selClass)) - { - // Un-pausing - if (!$('footer .replay').is(':visible')) - $('footer .recording').show(); - $('footer .paused').hide(); - log("Resuming auto-execution of tests"); - } - else - { - // Pausing - $('footer .recording').hide(); - $('footer .paused').show(); - log("Pausing auto-execution of tests"); - } - - $(this).toggleClass("throb " + convey.layout.selClass); - }); - - $('#toggle-notif').click(function() - { - log("Turning notifications " + (notif() ? "off" : "on")); - $(this).toggleClass("fa-bell-o fa-bell " + convey.layout.selClass); - save('notifications', !notif()); - - if (notif() && 'Notification' in window) - { - if (Notification.permission !== 'denied') - { - Notification.requestPermission(function(per) - { - if (!('permission' in Notification)) - Notification.permission = per; - }); - } - else - log("Permission denied to show desktop notification"); - } - }); - - $('#show-history').click(function() - { - toggle($('.history'), $(this)); - }); - - $('#show-settings').click(function() - { - toggle($('.settings'), $(this)); - }); - - $('#show-gen').click(function() { - var writer = window.open("/composer.html"); - if (window.focus) - writer.focus(); - }); - - // Wire-up the tipsy tooltips - $('.controls li, .pkg-cover-name').tipsy({ live: true }); - $('footer .replay').tipsy({ live: true, gravity: 'e' }); - $('#path').tipsy({ delayIn: 500 }); - $('.ignore').tipsy({ live: true, gravity: $.fn.tipsy.autoNS }); - $('.disabled').tipsy({ live: true, gravity: $.fn.tipsy.autoNS }); - $('#logo').tipsy({ gravity: 'w' }); - - - $('.toggler').not('.narrow').prepend('<i class="fa fa-angle-up fa-lg"></i>'); - $('.toggler.narrow').prepend('<i class="fa fa-angle-down fa-lg"></i>'); - - $('.toggler').not('.narrow').click(function() - { - var target = $('#' + $(this).data('toggle')); - $('.fa-angle-down, .fa-angle-up', this).toggleClass('fa-angle-down fa-angle-up'); - target.toggle(); - }); - - $('.toggler.narrow').click(function() - { - var target = $('#' + $(this).data('toggle')); - $('.fa-angle-down, .fa-angle-up', this).toggleClass('fa-angle-down fa-angle-up'); - target.toggleClass('hide-narrow show-narrow'); - }); - - // Enumerations are horizontal lists where one item can be selected at a time - $('.enum').on('click', 'li', enumSel); - - // Start ticking time - convey.intervals.time = setInterval(convey.intervalFuncs.time, 1000); - convey.intervals.momentjs = setInterval(convey.intervalFuncs.momentjs, 5000); - convey.intervalFuncs.time(); - - // Ignore/un-ignore package - $('#stories').on('click', '.fa.ignore', function(event) - { - var pkg = $(this).data('pkg'); - if ($(this).hasClass('disabled')) - return; - else if ($(this).hasClass('unwatch')) - $.get("/ignore", { paths: pkg }); - else - $.get("/reinstate", { paths: pkg }); - $(this).toggleClass('watch unwatch fa-eye fa-eye-slash clr-red'); - return suppress(event); - }); - - // Show "All" link when hovering the toggler on packages in the stories - $('#stories').on({ - mouseenter: function() { $('.toggle-all-pkg', this).stop().show('fast'); }, - mouseleave: function() { $('.toggle-all-pkg', this).stop().hide('fast'); } - }, '.pkg-toggle-container'); - - // Toggle a package in the stories when clicked - $('#stories').on('click', '.story-pkg', function(event) - { - togglePackage(this, true); - return suppress(event); - }); - - // Select a story line when it is clicked - $('#stories').on('click', '.story-line', function() - { - $('.story-line-sel').not(this).removeClass('story-line-sel'); - $(this).toggleClass('story-line-sel'); - }); - - // Render a frame from the history when clicked - $('.history .container').on('click', '.item', function(event) - { - var frame = getFrame($(this).data("frameid")); - changeStatus(frame.overall.status, true); - renderFrame(frame); - $(this).addClass('selected'); - - // Update current status down in the footer - if ($(this).is(':first-child')) - { - // Now on current frame - $('footer .replay').hide(); - - if ($('#play-pause').hasClass(convey.layout.selClass)) // Was/is paused - $('footer .paused').show(); - else - $('footer .recording').show(); // Was/is recording - } - else - { - $('footer .recording, footer .replay').hide(); - $('footer .replay').show(); - } - return suppress(event); - }); - - $('footer').on('click', '.replay', function() - { - // Clicking "REPLAY" in the corner should bring them back to the current frame - // and hide, if visible, the history panel for convenience - $('.history .item:first-child').click(); - if ($('#show-history').hasClass('sel')) - $('#show-history').click(); - }); - - // Keyboard shortcuts! - $(document).keydown(function(e) - { - if (e.ctrlKey || e.metaKey || e.shiftKey) - return; - - switch (e.keyCode) - { - case 67: // c - $('#show-gen').click(); - break; - case 82: // r - $('#run-tests').click(); - break; - case 78: // n - $('#toggle-notif').click(); - break; - case 87: // w - $('#path').focus(); - break; - case 80: // p - $('#play-pause').click(); - break; - } - - return suppress(e); - }); - $('body').on('keydown', 'input, textarea, select', function(e) - { - // If user is typing something, don't let this event bubble - // up to the document to annoyingly fire keyboard shortcuts - e.stopPropagation(); - }); - - // Keep everything positioned and sized properly on window resize - reframe(); - $(window).resize(reframe); -} - -function expandAll() -{ - $('.story-pkg').each(function() { expandPackage($(this).data('pkg')); }); -} - -function collapseAll() -{ - $('.story-pkg').each(function() { collapsePackage($(this).data('pkg')); }); -} - -function expandPackage(pkgId) -{ - var pkg = $('.story-pkg.pkg-'+pkgId); - var rows = $('.story-line.pkg-'+pkgId); - - pkg.data('pkg-state', "expanded").addClass('expanded').removeClass('collapsed'); - - $('.pkg-toggle', pkg) - .addClass('fa-minus-square-o') - .removeClass('fa-plus-square-o'); - - rows.show(); -} - -function collapsePackage(pkgId) -{ - var pkg = $('.story-pkg.pkg-'+pkgId); - var rows = $('.story-line.pkg-'+pkgId); - - pkg.data('pkg-state', "collapsed").addClass('collapsed').removeClass('expanded'); - - $('.pkg-toggle', pkg) - .addClass('fa-plus-square-o') - .removeClass('fa-minus-square-o'); - - rows.hide(); -} - -function togglePackage(storyPkgElem) -{ - var pkgId = $(storyPkgElem).data('pkg'); - if ($(storyPkgElem).data('pkg-state') === "expanded") - { - collapsePackage(pkgId); - convey.packageStates[$(storyPkgElem).data('pkg-name')] = "collapsed"; - } - else - { - expandPackage(pkgId); - convey.packageStates[$(storyPkgElem).data('pkg-name')] = "expanded"; - } -} - -function loadSettingsFromStorage() -{ - var pkgExpCollapse = get("pkg-expand-collapse"); - if (!pkgExpCollapse) - { - pkgExpCollapse = "expanded"; - save("pkg-expand-collapse", pkgExpCollapse); - } - enumSel("pkg-expand-collapse", pkgExpCollapse); - - var showDebugOutput = get("show-debug-output"); - if (!showDebugOutput) - { - showDebugOutput = "show"; - save("show-debug-output", showDebugOutput); - } - enumSel("show-debug-output", showDebugOutput); - - var uiEffects = get("ui-effects"); - if (uiEffects === null) - uiEffects = "true"; - convey.uiEffects = uiEffects === "true"; - enumSel("ui-effects", uiEffects); - - if (notif()) - $('#toggle-notif').toggleClass("fa-bell-o fa-bell " + convey.layout.selClass); -} - - - - - - - - - - - -function latest() -{ - log("Fetching latest test results"); - $.getJSON("/latest", process); -} - -function process(data, status, jqxhr) -{ - if (!data || !data.Revision) - { - log("No data received or revision timestamp was missing"); - return; - } - - if (data.Paused && !$('#play-pause').hasClass(convey.layout.selClass)) - { - $('footer .recording').hide(); - $('footer .paused').show(); - $('#play-pause').toggleClass("throb " + convey.layout.selClass); - } - - if (current() && data.Revision === current().results.Revision) - { - log("No changes"); - changeStatus(current().overall.status); // re-assures that status is unchanged - return; - } - - - // Put the new frame in the queue so we can use current() to get to it - convey.history.push(newFrame()); - convey.framesOnSamePath++; - - // Store the raw results in our frame - current().results = data; - - log("Updating watch path"); - updateWatchPath(); - - // Remove all templated items from the DOM as we'll - // replace them with new ones; also remove tipsy tooltips - // that may have lingered around - $('.templated, .tipsy').remove(); - - var uniqueID = 0; - var coverageAvgHelper = { countedPackages: 0, coverageSum: 0 }; - var packages = { - tested: [], - ignored: [], - coverage: {}, - nogofiles: [], - notestfiles: [], - notestfn: [] - }; - - log("Compiling package statistics"); - - // Look for failures and panics through the packages->tests->stories... - for (var i in data.Packages) - { - pkg = makeContext(data.Packages[i]); - current().overall.duration += pkg.Elapsed; - pkg._id = uniqueID++; - - if (pkg.Outcome === "build failure") - { - current().overall.failedBuilds++; - current().failedBuilds.push(pkg); - continue; - } - - - if (pkg.Outcome === "no go code") - packages.nogofiles.push(pkg); - else if (pkg.Outcome === "no test files") - packages.notestfiles.push(pkg); - else if (pkg.Outcome === "no test functions") - packages.notestfn.push(pkg); - else if (pkg.Outcome === "ignored" || pkg.Outcome === "disabled") - packages.ignored.push(pkg); - else - { - if (pkg.Coverage >= 0) - coverageAvgHelper.coverageSum += pkg.Coverage; - coverageAvgHelper.countedPackages++; - packages.coverage[pkg.PackageName] = pkg.Coverage; - packages.tested.push(pkg); - } - - - for (var j in pkg.TestResults) - { - test = makeContext(pkg.TestResults[j]); - test._id = uniqueID++; - test._pkgid = pkg._id; - test._pkg = pkg.PackageName; - - if (test.Stories.length === 0) - { - // Here we've got ourselves a classic Go test, - // not a GoConvey test that has stories and assertions - // so we'll treat this whole test as a single assertion - current().overall.assertions++; - - if (test.Error) - { - test._status = convey.statuses.panic; - pkg._panicked++; - test._panicked++; - current().assertions.panicked.push(test); - } - else if (test.Passed === false) - { - test._status = convey.statuses.fail; - pkg._failed++; - test._failed++; - current().assertions.failed.push(test); - } - else if (test.Skipped) - { - test._status = convey.statuses.skipped; - pkg._skipped++; - test._skipped++; - current().assertions.skipped.push(test); - } - else - { - test._status = convey.statuses.pass; - pkg._passed++; - test._passed++; - current().assertions.passed.push(test); - } - } - else - test._status = convey.statuses.pass; - - var storyPath = [{ Depth: -1, Title: test.TestName, _id: test._id }]; // Maintains the current assertion's story as we iterate - - for (var k in test.Stories) - { - var story = makeContext(test.Stories[k]); - - story._id = uniqueID; - story._pkgid = pkg._id; - current().overall.assertions += story.Assertions.length; - - // Establish the current story path so we can report the context - // of failures and panicks more conveniently at the top of the page - if (storyPath.length > 0) - for (var x = storyPath[storyPath.length - 1].Depth; x >= test.Stories[k].Depth; x--) - storyPath.pop(); - storyPath.push({ Depth: test.Stories[k].Depth, Title: test.Stories[k].Title, _id: test.Stories[k]._id }); - - - for (var l in story.Assertions) - { - var assertion = story.Assertions[l]; - assertion._id = uniqueID; - assertion._pkg = pkg.PackageName; - assertion._pkgId = pkg._id; - assertion._failed = !!assertion.Failure; - assertion._panicked = !!assertion.Error; - assertion._maxDepth = storyPath[storyPath.length - 1].Depth; - $.extend(assertion._path = [], storyPath); - - if (assertion.Failure) - { - current().assertions.failed.push(assertion); - pkg._failed++; - test._failed++; - story._failed++; - } - if (assertion.Error) - { - current().assertions.panicked.push(assertion); - pkg._panicked++; - test._panicked++; - story._panicked++; - } - if (assertion.Skipped) - { - current().assertions.skipped.push(assertion); - pkg._skipped++; - test._skipped++; - story._skipped++; - } - if (!assertion.Failure && !assertion.Error && !assertion.Skipped) - { - current().assertions.passed.push(assertion); - pkg._passed++; - test._passed++; - story._passed++; - } - } - - assignStatus(story); - uniqueID++; - } - - if (!test.Passed && !test._failed && !test._panicked) - { - // Edge case: Developer is using the GoConvey DSL, but maybe - // in some cases is using t.Error() instead of So() assertions. - // This can be detected, assuming all child stories with - // assertions (in this test) are passing. - test._status = convey.statuses.fail; - pkg._failed++; - test._failed++; - current().assertions.failed.push(test); - } - } - } - - current().overall.passed = current().assertions.passed.length; - current().overall.panics = current().assertions.panicked.length; - current().overall.failures = current().assertions.failed.length; - current().overall.skipped = current().assertions.skipped.length; - - current().overall.coverage = Math.round((coverageAvgHelper.coverageSum / (coverageAvgHelper.countedPackages || 1)) * 100) / 100; - current().overall.duration = Math.round(current().overall.duration * 1000) / 1000; - - // Compute the coverage delta (difference in overall coverage between now and last frame) - // Only compare coverage on the same watch path - var coverDelta = current().overall.coverage; - if (convey.framesOnSamePath > 2) - coverDelta = current().overall.coverage - convey.history[convey.history.length - 2].overall.coverage; - current().coverDelta = Math.round(coverDelta * 100) / 100; - - - // Build failures trump panics, - // Panics trump failures, - // Failures trump pass. - if (current().overall.failedBuilds) - changeStatus(convey.statuses.buildfail); - else if (current().overall.panics) - changeStatus(convey.statuses.panic); - else if (current().overall.failures) - changeStatus(convey.statuses.fail); - else - changeStatus(convey.statuses.pass); - - // Save our organized package lists - current().packages = packages; - - log(" Assertions: " + current().overall.assertions); - log(" Passed: " + current().overall.passed); - log(" Skipped: " + current().overall.skipped); - log(" Failures: " + current().overall.failures); - log(" Panics: " + current().overall.panics); - log("Build Failures: " + current().overall.failedBuilds); - log(" Coverage: " + current().overall.coverage + "% (" + showCoverDelta(current().coverDelta) + ")"); - - // Save timestamp when this test was executed - convey.moments['last-test'] = moment(); - - - - // Render... render ALL THE THINGS! (All model/state modifications are DONE!) - renderFrame(current()); - // Now, just finish up miscellaneous UI things - - - // Add this frame to the history pane - var framePiece = render('tpl-history', current()); - $('.history .container').prepend(framePiece); - $('.history .item:first-child').addClass('selected'); - convey.moments['frame-'+current().id] = moment(); - if (convey.history.length > convey.maxHistory) - { - // Delete the oldest frame out of the history pane if we have too many - convey.history.splice(0, 1); - $('.history .container .item').last().remove(); - } - - // Now add the momentjs time to the new frame in the history - convey.intervalFuncs.momentjs(); - - // Show notification, if enabled - if (notif()) - { - log("Showing notification"); - if (convey.notif) - { - clearTimeout(convey.notifTimer); - convey.notif.close(); - } - - var notifText = notifSummary(current()) - - convey.notif = new Notification(notifText.title, { - body: notifText.body, - icon: $('.favicon').attr('href') - }); - - convey.notifTimer = setTimeout(function() { convey.notif.close(); }, 5000); - } - - // Update title in title bar - if (current().overall.passed === current().overall.assertions && current().overall.status.class === "ok") - $('title').text("GoConvey (ALL PASS)"); - else - $('title').text("GoConvey [" + current().overall.status.text + "] " + current().overall.passed + "/" + current().overall.assertions); - - // All done! - log("Processing complete"); -} - - - - - - - - - - - - - - - - - -// Updates the entire UI given a frame from the history -function renderFrame(frame) -{ - log("Rendering frame (id: " + frame.id + ")"); - - $('#coverage').html(render('tpl-coverage', frame.packages.tested.sort(sortPackages))); - $('#ignored').html(render('tpl-ignored', frame.packages.ignored.sort(sortPackages))); - $('#nogofiles').html(render('tpl-nogofiles', frame.packages.nogofiles.sort(sortPackages))); - $('#notestfiles').html(render('tpl-notestfiles', frame.packages.notestfiles.sort(sortPackages))); - $('#notestfn').html(render('tpl-notestfn', frame.packages.notestfn.sort(sortPackages))); - - if (frame.overall.failedBuilds) - { - $('.buildfailures').show(); - $('#buildfailures').html(render('tpl-buildfailures', frame.failedBuilds)); - } - else - $('.buildfailures').hide(); - - if (frame.overall.panics) - { - $('.panics').show(); - $('#panics').html(render('tpl-panics', frame.assertions.panicked)); - } - else - $('.panics').hide(); - - - if (frame.overall.failures) - { - $('.failures').show(); - $('#failures').html(render('tpl-failures', frame.assertions.failed)); - $(".failure").each(function() { - $(this).prettyTextDiff(); - }); - } - else - $('.failures').hide(); - - $('#stories').html(render('tpl-stories', frame.packages.tested.sort(sortPackages))); - $('#stories').append(render('tpl-stories', frame.packages.ignored.sort(sortPackages))); - - var pkgDefaultView = get('pkg-expand-collapse'); - $('.story-pkg.expanded').each(function() - { - if (pkgDefaultView === "collapsed" && convey.packageStates[$(this).data('pkg-name')] !== "expanded") - collapsePackage($(this).data('pkg')); - }); - - redrawCoverageBars(); - - $('#assert-count').html("<b>"+frame.overall.assertions+"</b> assertion" - + (frame.overall.assertions !== 1 ? "s" : "")); - $('#skip-count').html("<b>"+frame.assertions.skipped.length + "</b> skipped"); - $('#fail-count').html("<b>"+frame.assertions.failed.length + "</b> failed"); - $('#panic-count').html("<b>"+frame.assertions.panicked.length + "</b> panicked"); - $('#duration').html("<b>"+frame.overall.duration + "</b>s"); - - $('#narrow-assert-count').html("<b>"+frame.overall.assertions+"</b>"); - $('#narrow-skip-count').html("<b>"+frame.assertions.skipped.length + "</b>"); - $('#narrow-fail-count').html("<b>"+frame.assertions.failed.length + "</b>"); - $('#narrow-panic-count').html("<b>"+frame.assertions.panicked.length + "</b>"); - - $('.history .item').removeClass('selected'); - - if (get('show-debug-output') === "hide") - $('.story-line-desc .message').hide(); - - log("Rendering finished"); -} - - - - - - - -function enumSel(id, val) -{ - if (typeof id === "string" && typeof val === "string") - { - $('.enum#'+id+' > li').each(function() - { - if ($(this).data(id).toString() === val) - { - $(this).addClass(convey.layout.selClass).siblings().removeClass(convey.layout.selClass); - return false; - } - }); - } - else - $(this).addClass(convey.layout.selClass).siblings().removeClass(convey.layout.selClass); -} - -function toggle(jqelem, switchelem) -{ - var speed = 250; - var transition = 'easeInOutQuart'; - var containerSel = '.container'; - - if (!jqelem.is(':visible')) - { - $(containerSel, jqelem).css('opacity', 0); - jqelem.stop().slideDown(speed, transition, function() - { - if (switchelem) - switchelem.toggleClass(convey.layout.selClass); - $(containerSel, jqelem).stop().animate({ - opacity: 1 - }, speed); - reframe(); - }); - } - else - { - $(containerSel, jqelem).stop().animate({ - opacity: 0 - }, speed, function() - { - if (switchelem) - switchelem.toggleClass(convey.layout.selClass); - jqelem.stop().slideUp(speed, transition, function() { reframe(); }); - }); - } -} - -function changeStatus(newStatus, isHistoricalFrame) -{ - if (!newStatus || !newStatus.class || !newStatus.text) - newStatus = convey.statuses.pass; - - var sameStatus = newStatus.class === convey.overallClass; - - // The CSS class .flash and the jQuery UI 'pulsate' effect don't play well together. - // This series of callbacks does the flickering/pulsating as well as - // enabling/disabling flashing in the proper order so that they don't overlap. - // TODO: I suppose the pulsating could also be done with just CSS, maybe...? - - if (convey.uiEffects) - { - var times = sameStatus ? 3 : 2; - var duration = sameStatus ? 500 : 300; - - $('.overall .status').removeClass('flash').effect("pulsate", {times: times}, duration, function() - { - $(this).text(newStatus.text); - - if (newStatus !== convey.statuses.pass) // only flicker extra when not currently passing - { - $(this).effect("pulsate", {times: 1}, 300, function() - { - $(this).effect("pulsate", {times: 1}, 500, function() - { - if (newStatus === convey.statuses.panic - || newStatus === convey.statuses.buildfail) - $(this).addClass('flash'); - else - $(this).removeClass('flash'); - }); - }); - } - }); - } - else - $('.overall .status').text(newStatus.text); - - if (!sameStatus) // change the color - $('.overall').switchClass(convey.overallClass, newStatus.class, 1000); - - if (!isHistoricalFrame) - current().overall.status = newStatus; - convey.overallClass = newStatus.class; - $('.favicon').attr('href', '/resources/ico/goconvey-'+newStatus.class+'.ico'); -} - -function updateWatchPath() -{ - $.get("/watch", function(data) - { - var newPath = $.trim(data); - if (newPath !== $('#path').val()) - convey.framesOnSamePath = 1; - $('#path').val(newPath); - }); -} - -function notifSummary(frame) -{ - var body = frame.overall.passed + " passed, "; - - if (frame.overall.failedBuilds) - body += frame.overall.failedBuilds + " build" + (frame.overall.failedBuilds !== 1 ? "s" : "") + " failed, "; - if (frame.overall.failures) - body += frame.overall.failures + " failed, "; - if (frame.overall.panics) - body += frame.overall.panics + " panicked, "; - body += frame.overall.skipped + " skipped"; - - body += "\r\n" + frame.overall.duration + "s"; - - if (frame.coverDelta > 0) - body += "\r\n↑ coverage (" + showCoverDelta(frame.coverDelta) + ")"; - else if (frame.coverDelta < 0) - body += "\r\n↓ coverage (" + showCoverDelta(frame.coverDelta) + ")"; - - return { - title: frame.overall.status.text.toUpperCase(), - body: body - }; -} - -function redrawCoverageBars() -{ - $('.pkg-cover-bar').each(function() - { - var pkgName = $(this).data("pkg"); - var hue = $(this).data("width"); - var hueDiff = hue; - - if (convey.history.length > 1) - { - var oldHue = convey.history[convey.history.length - 2].packages.coverage[pkgName] || 0; - $(this).width(oldHue + "%"); - hueDiff = hue - oldHue; - } - - $(this).animate({ - width: "+=" + hueDiff + "%" - }, 1250); - }); - - colorizeCoverageBars(); -} - -function colorizeCoverageBars() -{ - var colorTpl = convey.config.themes[convey.theme].coverage - || "hsla({{hue}}, 75%, 30%, .3)"; //default color template - - $('.pkg-cover-bar').each(function() - { - var hue = $(this).data("width"); - $(this).css({ - background: colorTpl.replace("{{hue}}", hue) - }); - }); -} - - -function getFrame(id) -{ - for (var i in convey.history) - if (convey.history[i].id === id) - return convey.history[i]; -} - -function render(templateID, context) -{ - var tpl = $('#' + templateID).text(); - return $($.trim(Mark.up(tpl, context))); -} - -function reframe() -{ - var heightBelowHeader = $(window).height() - convey.layout.header.outerHeight(); - var middleHeight = heightBelowHeader - convey.layout.footer.outerHeight(); - convey.layout.frame.height(middleHeight); - - var pathWidth = $(window).width() - $('#logo').outerWidth() - $('#control-buttons').outerWidth() - 10; - $('#path-container').width(pathWidth); -} - -function notif() -{ - return get('notifications') === "true"; // stored as strings -} - -function showServerDown(message) -{ - $('.server-down .notice-message').text(message); - $('.server-down').show(); - $('.server-not-down').hide(); - reframe(); -} - -function hideServerDown() -{ - $('.server-down').hide(); - $('.server-not-down').show(); - reframe(); -} - -function log(msg) -{ - var jqLog = $('#log'); - if (jqLog.length > 0) - { - var t = new Date(); - var h = zerofill(t.getHours(), 2); - var m = zerofill(t.getMinutes(), 2); - var s = zerofill(t.getSeconds(), 2); - var ms = zerofill(t.getMilliseconds(), 3); - date = h + ":" + m + ":" + s + "." + ms; - - $(jqLog).append(render('tpl-log-line', { time: date, msg: msg })); - $(jqLog).parent('.col').scrollTop(jqLog[0].scrollHeight); - } - else - console.log(msg); -} - -function zerofill(val, count) -{ - // Cheers to http://stackoverflow.com/a/9744576/1048862 - var pad = new Array(1 + count).join('0'); - return (pad + val).slice(-pad.length); -} - -// Sorts packages ascending by only the last part of their name -// Can be passed into Array.sort() -function sortPackages(a, b) -{ - var aPkg = splitPathName(a.PackageName); - var bPkg = splitPathName(b.PackageName); - - if (aPkg.length === 0 || bPkg.length === 0) - return 0; - - var aName = aPkg.parts[aPkg.parts.length - 1].toLowerCase(); - var bName = bPkg.parts[bPkg.parts.length - 1].toLowerCase(); - - if (aName < bName) - return -1; - else if (aName > bName) - return 1; - else - return 0; - - /* - MEMO: Use to sort by entire package name: - if (a.PackageName < b.PackageName) return -1; - else if (a.PackageName > b.PackageName) return 1; - else return 0; - */ -} - -function get(key) -{ - var val = localStorage.getItem(key); - if (val && (val[0] === '[' || val[0] === '{')) - return JSON.parse(val); - else - return val; -} - -function save(key, val) -{ - if (typeof val === 'object') - val = JSON.stringify(val); - else if (typeof val === 'number' || typeof val === 'boolean') - val = val.toString(); - localStorage.setItem(key, val); -} - -function splitPathName(str) -{ - var delim = str.indexOf('\\') > -1 ? '\\' : '/'; - return { delim: delim, parts: str.split(delim) }; -} - -function newFrame() -{ - return { - results: {}, // response from server (with some of our own context info) - packages: {}, // packages organized into statuses for convenience (like with coverage) - overall: emptyOverall(), // overall status info, compiled from server's response - assertions: emptyAssertions(), // lists of assertions, compiled from server's response - failedBuilds: [], // list of packages that failed to build - timestamp: moment(), // the timestamp of this "freeze-state" - id: convey.frameCounter++, // unique ID for this frame - coverDelta: 0 // difference in total coverage from the last frame to this one - }; -} - -function emptyOverall() -{ - return { - status: {}, - duration: 0, - assertions: 0, - passed: 0, - panics: 0, - failures: 0, - skipped: 0, - failedBuilds: 0, - coverage: 0 - }; -} - -function emptyAssertions() -{ - return { - passed: [], - failed: [], - panicked: [], - skipped: [] - }; -} - -function makeContext(obj) -{ - obj._passed = 0; - obj._failed = 0; - obj._panicked = 0; - obj._skipped = 0; - obj._status = ''; - return obj; -} - -function current() -{ - return convey.history[convey.history.length - 1]; -} - -function assignStatus(obj) -{ - if (obj._skipped) - obj._status = 'skip'; - else if (obj.Outcome === "ignored") - obj._status = convey.statuses.ignored; - else if (obj._panicked) - obj._status = convey.statuses.panic; - else if (obj._failed || obj.Outcome === "failed") - obj._status = convey.statuses.fail; - else - obj._status = convey.statuses.pass; -} - -function showCoverDelta(delta) -{ - if (delta > 0) - return "+" + delta + "%"; - else if (delta === 0) - return "±" + delta + "%"; - else - return delta + "%"; -} - -function customMarkupPipes() -{ - // MARKUP.JS custom pipes - Mark.pipes.relativePath = function(str) - { - basePath = new RegExp($('#path').val()+'[\\/]', 'gi'); - return str.replace(basePath, ''); - }; - Mark.pipes.htmlSafe = function(str) - { - return str.replace(/</g, "<").replace(/>/g, ">"); - }; - Mark.pipes.ansiColours = ansispan; - Mark.pipes.boldPkgName = function(str) - { - var pkg = splitPathName(str); - pkg.parts[0] = '<span class="not-pkg-name">' + pkg.parts[0]; - pkg.parts[pkg.parts.length - 1] = "</span><b>" + pkg.parts[pkg.parts.length - 1] + "</b>"; - return pkg.parts.join(pkg.delim); - }; - Mark.pipes.needsDiff = function(test) - { - return !!test.Failure && (test.Expected !== "" || test.Actual !== ""); - }; - Mark.pipes.coveragePct = function(str) - { - // Expected input: 75% to be represented as: "75.0" - var num = parseInt(str); // we only need int precision - if (num < 0) - return "0"; - else if (num <= 5) - return "5px"; // Still shows low coverage - else if (num > 100) - str = "100"; - return str; - }; - Mark.pipes.coverageDisplay = function(str) - { - var num = parseFloat(str); - return num < 0 ? "" : num + "% coverage"; - }; - Mark.pipes.coverageReportName = function(str) - { - return str.replace(/\//g, "-"); - }; -} - -function suppress(event) -{ - if (!event) - return false; - if (event.preventDefault) - event.preventDefault(); - if (event.stopPropagation) - event.stopPropagation(); - event.cancelBubble = true; - return false; -} |