jsdoc/test/jasmine-jsdoc.js

210 lines
6.0 KiB
JavaScript

/* global jasmine: true */
'use strict';
var fs = require('jsdoc/fs');
var path = require('jsdoc/path');
var jsdoc = {
augment: require('jsdoc/augment'),
doclet: require('jsdoc/doclet'),
env: require('jsdoc/env'),
schema: require('jsdoc/schema'),
src: {
handlers: require('jsdoc/src/handlers'),
parser: require('jsdoc/src/parser')
},
tag: {
dictionary: require('jsdoc/tag/dictionary'),
definitions: require('jsdoc/tag/dictionary/definitions')
}
};
var originalDictionary = jsdoc.tag.dictionary;
var jasmineAll = require('./lib/jasmine');
var jasmine = jasmineAll.jasmine;
var jasmineNode = ( require('./reporter') )(jasmine);
var reporter = null;
var parseResults = [];
jasmine.addParseResults = function(filename, doclets) {
parseResults.push({
filename: filename,
doclets: doclets
});
};
jasmine.getParseResults = function() {
return parseResults;
};
// use the requested parser, or default to the pure JS parser (on Node.js)
jasmine.jsParser = (function() {
var parser = 'js';
if (jsdoc.env.opts.query && jsdoc.env.opts.query.parser) {
parser = jsdoc.env.opts.query.parser;
// remove this so the config tests don't complain
delete jsdoc.env.opts.query;
}
return parser;
})();
jasmine.initialize = function(done) {
var jasmineEnv = jasmine.getEnv();
if (reporter !== null) {
// If we've run before, we need to reset the runner
jasmineEnv.currentRunner_ = new jasmine.Runner(jasmineEnv);
// And clear the reporter
jasmineEnv.reporter.subReporters_.splice(jasmineEnv.reporter.subReporters_.indexOf(reporter));
}
var reporterOpts = {
color: !jsdoc.env.opts.nocolor,
onComplete: done
};
reporter = jsdoc.env.opts.verbose ? new jasmineNode.TerminalVerboseReporter(reporterOpts) :
new jasmineNode.TerminalReporter(reporterOpts);
jasmineEnv.addReporter(reporter);
// updateInterval is set to 0 because there were not-fully-understood
// issues with asynchronous behavior in jasmine otherwise.
jasmineEnv.updateInterval = 0;
return jasmineEnv;
};
jasmine.createParser = function(type) {
return jsdoc.src.parser.createParser(type || jasmine.jsParser);
};
/**
* Execute the specs in the specified folder.
*
* @param {string} folder The folder in which the specs are to be found.
* @param {function?} done Callback function to execute when finished.
* @param {object} opts Options for executing the specs.
* @param {boolean} opts.verbose Whether or not to output verbose results.
* @param {RegExp} opts.matcher A regular expression to filter specs by. Only matching specs run.
*/
jasmine.executeSpecsInFolder = function(folder, done, opts) {
var specs = require('./spec-collection');
var fileMatcher = opts.matcher || new RegExp('.(js)$', 'i');
var jasmineEnv = jasmine.initialize(done, opts.verbose);
// Load the specs
specs.load(folder, fileMatcher, true, function() {
var specsList = specs.getSpecs();
var filename;
// Add the specs to the context
for (var i = 0, len = specsList.length; i < len; ++i) {
filename = specsList[i];
require(filename.path().replace(/\\/g, '/')
.replace(new RegExp('^' + jsdoc.env.dirname + '/test'), './')
.replace(/\.\w+$/, ''));
}
// Run Jasmine
jasmineEnv.execute();
});
};
function now() {
return new Date().getTime();
}
jasmine.asyncSpecWait = function() {
var wait = this.asyncSpecWait;
wait.start = now();
wait.done = false;
(function innerWait() {
waits(10);
runs(function() {
if (wait.start + wait.timeout < now()) {
expect('timeout waiting for spec').toBeNull();
} else if (wait.done) {
wait.done = false;
} else {
innerWait();
}
});
})();
};
jasmine.asyncSpecWait.timeout = 4 * 1000;
jasmine.asyncSpecDone = function() {
jasmine.asyncSpecWait.done = true;
};
jasmine.getDocSetFromFile = function(filename, parser, validate, augment) {
var doclets;
var sourceCode = fs.readFileSync( path.join(jsdoc.env.dirname, filename), 'utf8' );
var testParser = parser || jasmine.createParser();
jsdoc.src.handlers.attachTo(testParser);
/* eslint-disable no-script-url */
doclets = testParser.parse('javascript:' + sourceCode);
/* eslint-enable no-script-url */
if (augment !== false) {
jsdoc.augment.augmentAll(doclets);
}
// test assume borrows have not yet been resolved
// require('jsdoc/borrow').resolveBorrows(doclets);
// store the parse results for later validation
if (validate !== false) {
jasmine.addParseResults(filename, doclets);
}
return {
doclets: doclets,
getByLongname: function(longname) {
return doclets.filter(function(doclet) {
return (doclet.longname || doclet.name) === longname;
});
}
};
};
jasmine.replaceTagDictionary = function(dictionaryNames) {
var dict = new jsdoc.tag.dictionary.Dictionary();
var originalDictionaries = jsdoc.env.conf.tags.dictionaries.slice(0);
if (!Array.isArray(dictionaryNames)) {
dictionaryNames = [dictionaryNames];
}
jsdoc.env.conf.tags.dictionaries = dictionaryNames;
jsdoc.tag.definitions.defineTags(dict);
jsdoc.doclet._replaceDictionary(dict);
jsdoc.env.conf.tags.dictionaries = originalDictionaries;
};
jasmine.restoreTagDictionary = function() {
jsdoc.doclet._replaceDictionary(originalDictionary);
};
// set up jasmine's global functions
Object.keys(jasmine).forEach(function(key) {
exports[key] = global[key] = jasmine[key];
});
global.jasmine = jasmine;
require('./async-callback');
['spyOn', 'it', 'xit', 'expect', 'runs', 'waitsFor', 'beforeEach', 'afterEach', 'describe',
'xdescribe'].forEach(function(item) {
global[item] = jasmineAll[item];
});