[Pkg-javascript-commits] [less.js] 203/285: improver browsertest-server and use jasmine js-reporter (for integration with sauce)
Jonas Smedegaard
dr at jones.dk
Mon Oct 26 23:23:54 UTC 2015
This is an automated email from the git hooks/post-receive script.
js pushed a commit to annotated tag v2.0.0
in repository less.js.
commit 329e87563aaf348f5dbfa2c32a4fd5c5c41c869f
Author: Luke Page <luke.a.page at gmail.com>
Date: Mon Oct 20 09:29:49 2014 +0100
improver browsertest-server and use jasmine js-reporter (for integration with sauce)
---
Gruntfile.js | 4 +-
test/browser/common.js | 4 +
test/browser/jasmine-jsreporter.js | 392 +++++++++++++++++++++++++++++++++++++
3 files changed, 398 insertions(+), 2 deletions(-)
diff --git a/Gruntfile.js b/Gruntfile.js
index 0958a51..baef752 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -121,10 +121,9 @@ module.exports = function (grunt) {
jasmine: {
options: {
- // version: '2.0.0-rc2',
keepRunner: true,
host: 'http://localhost:8081/',
- vendor: ['test/browser/common.js', 'test/browser/less.js'],
+ vendor: ['test/browser/jasmine-jsreporter.js', 'test/browser/common.js', 'test/browser/less.js'],
template: 'test/browser/test-runner-template.tmpl'
},
main: {
@@ -282,6 +281,7 @@ module.exports = function (grunt) {
// setup a web server to run the browser tests in a browser rather than phantom
grunt.registerTask('browsertest-server', [
'browsertest-lessjs',
+ 'jasmine::build',
'connect::keepalive'
]);
diff --git a/test/browser/common.js b/test/browser/common.js
index 4e9ea54..50a9c25 100644
--- a/test/browser/common.js
+++ b/test/browser/common.js
@@ -1,3 +1,7 @@
+/* Add js reporter for sauce */
+
+jasmine.getEnv().addReporter(new jasmine.JSReporter2());
+
/* record log messages for testing */
var logMessages = [];
diff --git a/test/browser/jasmine-jsreporter.js b/test/browser/jasmine-jsreporter.js
new file mode 100644
index 0000000..4755317
--- /dev/null
+++ b/test/browser/jasmine-jsreporter.js
@@ -0,0 +1,392 @@
+/*
+ This file is part of the Jasmine JSReporter project from Ivan De Marino.
+
+ Copyright (C) 2011-2014 Ivan De Marino <http://ivandemarino.me>
+ Copyright (C) 2014 Alex Treppass <http://alextreppass.co.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the <organization> nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL IVAN DE MARINO BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+(function (jasmine) {
+
+ if (!jasmine) {
+ throw new Error("[Jasmine JSReporter] 'Jasmine' library not found");
+ }
+
+ // ------------------------------------------------------------------------
+ // Jasmine JSReporter for Jasmine 1.x
+ // ------------------------------------------------------------------------
+
+ /**
+ * Calculate elapsed time, in Seconds.
+ * @param startMs Start time in Milliseconds
+ * @param finishMs Finish time in Milliseconds
+ * @return Elapsed time in Seconds */
+ function elapsedSec (startMs, finishMs) {
+ return (finishMs - startMs) / 1000;
+ }
+
+ /**
+ * Round an amount to the given number of Digits.
+ * If no number of digits is given, than '2' is assumed.
+ * @param amount Amount to round
+ * @param numOfDecDigits Number of Digits to round to. Default value is '2'.
+ * @return Rounded amount */
+ function round (amount, numOfDecDigits) {
+ numOfDecDigits = numOfDecDigits || 2;
+ return Math.round(amount * Math.pow(10, numOfDecDigits)) / Math.pow(10, numOfDecDigits);
+ }
+
+ /**
+ * Create a new array which contains only the failed items.
+ * @param items Items which will be filtered
+ * @returns {Array} of failed items */
+ function failures (items) {
+ var fs = [], i, v;
+ for (i = 0; i < items.length; i += 1) {
+ v = items[i];
+ if (!v.passed_) {
+ fs.push(v);
+ }
+ }
+ return fs;
+ }
+
+ /**
+ * Collect information about a Suite, recursively, and return a JSON result.
+ * @param suite The Jasmine Suite to get data from
+ */
+ function getSuiteData (suite) {
+ var suiteData = {
+ description : suite.description,
+ durationSec : 0,
+ specs: [],
+ suites: [],
+ passed: true
+ },
+ specs = suite.specs(),
+ suites = suite.suites(),
+ i, ilen;
+
+ // Loop over all the Suite's Specs
+ for (i = 0, ilen = specs.length; i < ilen; ++i) {
+ suiteData.specs[i] = {
+ description : specs[i].description,
+ durationSec : specs[i].durationSec,
+ passed : specs[i].results().passedCount === specs[i].results().totalCount,
+ skipped : specs[i].results().skipped,
+ passedCount : specs[i].results().passedCount,
+ failedCount : specs[i].results().failedCount,
+ totalCount : specs[i].results().totalCount,
+ failures: failures(specs[i].results().getItems())
+ };
+ suiteData.passed = !suiteData.specs[i].passed ? false : suiteData.passed;
+ suiteData.durationSec += suiteData.specs[i].durationSec;
+ }
+
+ // Loop over all the Suite's sub-Suites
+ for (i = 0, ilen = suites.length; i < ilen; ++i) {
+ suiteData.suites[i] = getSuiteData(suites[i]); //< recursive population
+ suiteData.passed = !suiteData.suites[i].passed ? false : suiteData.passed;
+ suiteData.durationSec += suiteData.suites[i].durationSec;
+ }
+
+ // Rounding duration numbers to 3 decimal digits
+ suiteData.durationSec = round(suiteData.durationSec, 4);
+
+ return suiteData;
+ }
+
+ var JSReporter = function () {
+ };
+
+ JSReporter.prototype = {
+ reportRunnerStarting: function (runner) {
+ // Nothing to do
+ },
+
+ reportSpecStarting: function (spec) {
+ // Start timing this spec
+ spec.startedAt = new Date();
+ },
+
+ reportSpecResults: function (spec) {
+ // Finish timing this spec and calculate duration/delta (in sec)
+ spec.finishedAt = new Date();
+ // If the spec was skipped, reportSpecStarting is never called and spec.startedAt is undefined
+ spec.durationSec = spec.startedAt ? elapsedSec(spec.startedAt.getTime(), spec.finishedAt.getTime()) : 0;
+ },
+
+ reportSuiteResults: function (suite) {
+ // Nothing to do
+ },
+
+ reportRunnerResults: function (runner) {
+ var suites = runner.suites(),
+ i, j, ilen;
+
+ // Attach results to the "jasmine" object to make those results easy to scrap/find
+ jasmine.runnerResults = {
+ suites: [],
+ durationSec : 0,
+ passed : true
+ };
+
+ // Loop over all the Suites
+ for (i = 0, ilen = suites.length, j = 0; i < ilen; ++i) {
+ if (suites[i].parentSuite === null) {
+ jasmine.runnerResults.suites[j] = getSuiteData(suites[i]);
+ // If 1 suite fails, the whole runner fails
+ jasmine.runnerResults.passed = !jasmine.runnerResults.suites[j].passed ? false : jasmine.runnerResults.passed;
+ // Add up all the durations
+ jasmine.runnerResults.durationSec += jasmine.runnerResults.suites[j].durationSec;
+ j++;
+ }
+ }
+
+ // Decorate the 'jasmine' object with getters
+ jasmine.getJSReport = function () {
+ if (jasmine.runnerResults) {
+ return jasmine.runnerResults;
+ }
+ return null;
+ };
+ jasmine.getJSReportAsString = function () {
+ return JSON.stringify(jasmine.getJSReport());
+ };
+ }
+ };
+
+ // export public
+ jasmine.JSReporter = JSReporter;
+
+
+ // ------------------------------------------------------------------------
+ // Jasmine JSReporter for Jasmine 2.0
+ // ------------------------------------------------------------------------
+
+ /*
+ Simple timer implementation
+ */
+ var Timer = function () {};
+
+ Timer.prototype.start = function () {
+ this.startTime = new Date().getTime();
+ return this;
+ };
+
+ Timer.prototype.elapsed = function () {
+ if (this.startTime == null) {
+ return -1;
+ }
+ return new Date().getTime() - this.startTime;
+ };
+
+ /*
+ Utility methods
+ */
+ var _extend = function (obj1, obj2) {
+ for (var prop in obj2) {
+ obj1[prop] = obj2[prop];
+ }
+ return obj1;
+ };
+ var _clone = function (obj) {
+ if (obj !== Object(obj)) {
+ return obj;
+ }
+ return _extend({}, obj);
+ };
+
+ jasmine.JSReporter2 = function () {
+ this.specs = {};
+ this.suites = {};
+ this.rootSuites = [];
+ this.suiteStack = [];
+
+ // export methods under jasmine namespace
+ jasmine.getJSReport = this.getJSReport;
+ jasmine.getJSReportAsString = this.getJSReportAsString;
+ };
+
+ var JSR = jasmine.JSReporter2.prototype;
+
+ // Reporter API methods
+ // --------------------
+
+ JSR.suiteStarted = function (suite) {
+ suite = this._cacheSuite(suite);
+ // build up suite tree as we go
+ suite.specs = [];
+ suite.suites = [];
+ suite.passed = true;
+ suite.parentId = this.suiteStack.slice(this.suiteStack.length -1)[0];
+ if (suite.parentId) {
+ this.suites[suite.parentId].suites.push(suite);
+ } else {
+ this.rootSuites.push(suite.id);
+ }
+ this.suiteStack.push(suite.id);
+ suite.timer = new Timer().start();
+ };
+
+ JSR.suiteDone = function (suite) {
+ suite = this._cacheSuite(suite);
+ suite.duration = suite.timer.elapsed();
+ suite.durationSec = suite.duration / 1000;
+ this.suiteStack.pop();
+
+ // maintain parent suite state
+ var parent = this.suites[suite.parentId];
+ if (parent) {
+ parent.passed = parent.passed && suite.passed;
+ }
+
+ // keep report representation clean
+ delete suite.timer;
+ delete suite.id;
+ delete suite.parentId;
+ delete suite.fullName;
+ };
+
+ JSR.specStarted = function (spec) {
+ spec = this._cacheSpec(spec);
+ spec.timer = new Timer().start();
+ // build up suites->spec tree as we go
+ spec.suiteId = this.suiteStack.slice(this.suiteStack.length -1)[0];
+ this.suites[spec.suiteId].specs.push(spec);
+ };
+
+ JSR.specDone = function (spec) {
+ spec = this._cacheSpec(spec);
+
+ spec.duration = spec.timer.elapsed();
+ spec.durationSec = spec.duration / 1000;
+
+ spec.skipped = spec.status === 'pending';
+ spec.passed = spec.skipped || spec.status === 'passed';
+
+ spec.totalCount = spec.passedExpectations.length + spec.failedExpectations.length;
+ spec.passedCount = spec.passedExpectations.length;
+ spec.failedCount = spec.failedExpectations.length;
+ spec.failures = [];
+
+ for (var i = 0, j = spec.failedExpectations.length; i < j; i++) {
+ var fail = spec.failedExpectations[i];
+ spec.failures.push({
+ type: 'expect',
+ expected: fail.expected,
+ passed: false,
+ message: fail.message,
+ matcherName: fail.matcherName,
+ trace: {
+ stack: fail.stack
+ }
+ });
+ }
+
+ // maintain parent suite state
+ var parent = this.suites[spec.suiteId];
+ if (spec.failed) {
+ parent.failingSpecs.push(spec);
+ }
+ parent.passed = parent.passed && spec.passed;
+
+ // keep report representation clean
+ delete spec.timer;
+ delete spec.totalExpectations;
+ delete spec.passedExpectations;
+ delete spec.suiteId;
+ delete spec.fullName;
+ delete spec.id;
+ delete spec.status;
+ delete spec.failedExpectations;
+ };
+
+ JSR.jasmineDone = function () {
+ this._buildReport();
+ };
+
+ JSR.getJSReport = function () {
+ if (jasmine.jsReport) {
+ return jasmine.jsReport;
+ }
+ };
+
+ JSR.getJSReportAsString = function () {
+ if (jasmine.jsReport) {
+ return JSON.stringify(jasmine.jsReport);
+ }
+ };
+
+ // Private methods
+ // ---------------
+
+ JSR._haveSpec = function (spec) {
+ return this.specs[spec.id] != null;
+ };
+
+ JSR._cacheSpec = function (spec) {
+ var existing = this.specs[spec.id];
+ if (existing == null) {
+ existing = this.specs[spec.id] = _clone(spec);
+ } else {
+ _extend(existing, spec);
+ }
+ return existing;
+ };
+
+ JSR._haveSuite = function (suite) {
+ return this.suites[suite.id] != null;
+ };
+
+ JSR._cacheSuite = function (suite) {
+ var existing = this.suites[suite.id];
+ if (existing == null) {
+ existing = this.suites[suite.id] = _clone(suite);
+ } else {
+ _extend(existing, suite);
+ }
+ return existing;
+ };
+
+ JSR._buildReport = function () {
+ var overallDuration = 0;
+ var overallPassed = true;
+ var overallSuites = [];
+
+ for (var i = 0, j = this.rootSuites.length; i < j; i++) {
+ var suite = this.suites[this.rootSuites[i]];
+ overallDuration += suite.duration;
+ overallPassed = overallPassed && suite.passed;
+ overallSuites.push(suite);
+ }
+
+ jasmine.jsReport = {
+ passed: overallPassed,
+ durationSec: overallDuration / 1000,
+ suites: overallSuites
+ };
+ };
+
+})(jasmine);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/less.js.git
More information about the Pkg-javascript-commits
mailing list