UNPKG

2.73 kBJavaScriptView Raw
1'use strict';
2var fs = require('fs');
3var path = require('path');
4var _ = require('lodash');
5var jsdoctest = require('./index');
6var util = require('./util');
7
8/**
9 * Mocks `mocha`'s register environment for doctest mocha integration. This
10 * works in the same manner `coffee-script/register` or `mocha --require
11 * blanket` work.
12 */
13
14exports.loadDoctests = function loadDoctests(module, filename) {
15 require('should');
16 var rootDir = process.cwd();
17
18 var content = fs.readFileSync(filename, 'utf8');
19 var mochaSpec = exports.contentsToMochaSpec(rootDir, filename, content);
20
21 module._compile(util.stripBOM(content + mochaSpec), filename);
22};
23
24/**
25 * Compiles a string containing the contents of a JSDoc annotated file and
26 * outputs the generated mocha spec for its JSDocTests.
27 */
28
29exports.contentsToMochaSpec =
30function contentsToMochaSpec(rootDir, filename, content) {
31 var comments = jsdoctest.getJsdoctests(content);
32 var moduleName = exports._getModuleName(rootDir, filename);
33
34 return '\ndescribe(\'' + moduleName + '\', function() {' +
35 _.map(_.compact(comments), function(comment) {
36 return exports.commentToMochaSpec(comment);
37 }).join('') +
38 '});';
39};
40
41/**
42 * Compiles a jsdoc comment parsed by `dox` and its doctest examples into a
43 * mocha spec.
44 */
45
46exports.commentToMochaSpec = function commentToMochaSpec(comment) {
47 var ctx = comment.ctx || {};
48 return '\ndescribe(\'' + ctx.string + '\', function() {' +
49 _.map(comment.examples, function(example) {
50 return 'it(\'' + example.testCase + '\', function() {' +
51 '(' + example.testCase + ')' +
52 '.should.eql(' + example.expectedResult + ');' +
53 '});';
54 }).join('\n') +
55 '});';
56};
57
58var originalLoad;
59
60/**
61 * Toggles doctest injection into loaded modules. That is: doctests will be
62 * compiled into modules as mocha specs, whenever they're declared.
63 */
64
65exports.toggleDoctestInjection = function toggleDoctestInjection() {
66 if(originalLoad) {
67 require.extensions['.js'] = originalLoad;
68 } else {
69 originalLoad = originalLoad || require.extensions['.js'];
70 require.extensions['.js'] = exports.loadDoctests;
71 }
72};
73
74/**
75 * Resolves the expected module name for a given file, to use as the top-level
76 * spec when generating mocha doctest `describes`
77 *
78 * @param {String} The root directory
79 * @param {String} The module's filename
80 * @return {String} moduleName
81 */
82
83exports._getModuleName = function getModuleName(rootDir, filename) {
84 var filenamePrime = path.relative(rootDir, filename);
85 return stripExtension(filenamePrime);
86
87 function stripExtension(f) {
88 return f.replace(/\..+$/, '');
89 }
90};