1 |
|
2 | var AssertionError, Does, Loader, colors, config, deferred, does, facto, ipso, loadModules, loadModulesSync, parallel, should, util, _ref, _ref1;
|
3 |
|
4 | _ref = require('also'), util = _ref.util, deferred = _ref.deferred, parallel = _ref.parallel;
|
5 |
|
6 | AssertionError = require('assert').AssertionError;
|
7 |
|
8 | facto = require('facto');
|
9 |
|
10 | Loader = require('./loader');
|
11 |
|
12 | colors = require('colors');
|
13 |
|
14 | Does = require('does');
|
15 |
|
16 | does = Does({
|
17 | does: {
|
18 | mode: 'spec'
|
19 | }
|
20 | });
|
21 |
|
22 | should = require('should');
|
23 |
|
24 | config = {
|
25 | dir: process.cwd(),
|
26 | modules: {}
|
27 | };
|
28 |
|
29 | _ref1 = Loader.create(config), loadModules = _ref1.loadModules, loadModulesSync = _ref1.loadModulesSync;
|
30 |
|
31 | module.exports = ipso = function(actualTestFunction) {
|
32 | var testFunctionForMocha;
|
33 | return testFunctionForMocha = function(done) {
|
34 | var Module, arg1, argsToInjectIntoTest, fnArgsArray, testResolver, _i, _len, _ref2,
|
35 | _this = this;
|
36 | fnArgsArray = util.argsOf(actualTestFunction);
|
37 | argsToInjectIntoTest = [];
|
38 | if (done == null) {
|
39 | if (fnArgsArray[0] === 'done' || fnArgsArray[0] === 'facto') {
|
40 | console.log('ipso cannot inject done into describe() or context()'.red);
|
41 | return;
|
42 | }
|
43 | does.activate({
|
44 | context: this,
|
45 | mode: 'spec',
|
46 | spec: null,
|
47 | resolver: null
|
48 | });
|
49 | _ref2 = loadModulesSync(fnArgsArray, does);
|
50 | for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
51 | Module = _ref2[_i];
|
52 | argsToInjectIntoTest.push(Module);
|
53 | }
|
54 | actualTestFunction.apply(this, argsToInjectIntoTest);
|
55 | return;
|
56 | }
|
57 | does.activate({
|
58 | context: this,
|
59 | mode: 'spec',
|
60 | spec: this.test,
|
61 | resolver: done
|
62 | });
|
63 | testResolver = function(metadata) {
|
64 | return does.assert(done).then(function(result) {
|
65 | if (fnArgsArray[0] === 'facto') {
|
66 | facto(metadata);
|
67 | }
|
68 | return done();
|
69 | }, function(error) {
|
70 | if (fnArgsArray[0] === 'facto') {
|
71 | return facto(metadata);
|
72 | }
|
73 | }, function(notify) {});
|
74 | };
|
75 | if (fnArgsArray[0] === 'done' || fnArgsArray[0] === 'facto') {
|
76 | argsToInjectIntoTest.push(testResolver);
|
77 | arg1 = fnArgsArray.shift();
|
78 | }
|
79 | return loadModules(fnArgsArray, does).then(function(Modules) {
|
80 | var error, promise, _j, _len1;
|
81 | for (_j = 0, _len1 = Modules.length; _j < _len1; _j++) {
|
82 | Module = Modules[_j];
|
83 | argsToInjectIntoTest.push(Module);
|
84 | }
|
85 | try {
|
86 | promise = actualTestFunction.apply(_this, argsToInjectIntoTest);
|
87 | } catch (_error) {
|
88 | error = _error;
|
89 | does.reset();
|
90 | done(error);
|
91 | return;
|
92 | }
|
93 | if (arg1 !== 'done' && arg1 !== 'facto') {
|
94 | testResolver();
|
95 | }
|
96 | if (promise.then != null) {
|
97 | return promise.then((function() {}), done);
|
98 | }
|
99 | }, done);
|
100 | };
|
101 | };
|
102 |
|
103 | ipso.modules = function(list) {
|
104 | var tag;
|
105 | for (tag in list) {
|
106 | if (list[tag].require == null) {
|
107 | throw new Error('ipso.module expects { tagName: { require: "path/or/name" } }');
|
108 | }
|
109 | config.modules[tag] = list[tag];
|
110 | }
|
111 | return ipso;
|
112 | };
|
113 |
|
114 | ipso.ipso = ipso;
|
115 |
|
116 | ipso.mock = function(name) {
|
117 | var object;
|
118 | object = {
|
119 | title: name,
|
120 | is: function(mock) {
|
121 | if (typeof mock === 'object') {
|
122 | return object.should.equal(mock);
|
123 | }
|
124 | return name.should.equal(mock);
|
125 | }
|
126 | };
|
127 | return does.spectateSync({
|
128 | name: name,
|
129 | tagged: true
|
130 | }, object);
|
131 | };
|
132 |
|
133 | ipso.tag = deferred(function(action, list) {
|
134 | var tag;
|
135 | return parallel((function() {
|
136 | var _results;
|
137 | _results = [];
|
138 | for (tag in list) {
|
139 | _results.push((function(tag) {
|
140 | return function() {
|
141 | return does.spectate({
|
142 | name: tag,
|
143 | tagged: true
|
144 | }, list[tag]);
|
145 | };
|
146 | })(tag));
|
147 | }
|
148 | return _results;
|
149 | })()).then(action.resolve, action.reject, action.notify);
|
150 | });
|
151 |
|
152 | module.exports.once = function(fn) {
|
153 | return (function(done) {
|
154 | return function() {
|
155 | if (done) {
|
156 | return;
|
157 | }
|
158 | done = true;
|
159 | return fn.apply(this, arguments);
|
160 | };
|
161 | })(false);
|
162 | };
|