1 | 'use strict';
|
2 | var fs = require('fs');
|
3 | var path = require('path');
|
4 | var _ = require('lodash');
|
5 | var jsdoctest = require('./index');
|
6 | var util = require('./util');
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | exports.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 |
|
26 |
|
27 |
|
28 |
|
29 | exports.contentsToMochaSpec =
|
30 | function 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 |
|
43 |
|
44 |
|
45 |
|
46 | exports.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 |
|
58 | var originalLoad;
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 | exports.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 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 |
|
83 | exports._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 | };
|