Skip to content

Commit 299d7c4

Browse files
committed
add timed functions
1 parent 8e91e44 commit 299d7c4

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

src/debug.js

+31
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,37 @@ function createDebug(namespace) {
160160
return section;
161161
};
162162

163+
debug.time = function () {
164+
var args = [].slice.call(arguments);
165+
if (args.length < 2) {
166+
throw new Error('debug.time() takes at least a debug string and a function');
167+
}
168+
169+
var fn = args.pop();
170+
if (typeof fn !== 'function') {
171+
throw new Error('the last argument to debug.time() must be a function');
172+
}
173+
174+
var isPromise = false;
175+
var section = debug.begin.apply(debug, args);
176+
try {
177+
var result = fn();
178+
179+
if (typeof Promise === 'function' && result instanceof Promise) { // eslint-disable-line no-undef
180+
isPromise = true;
181+
result.then(function () {
182+
section.end();
183+
});
184+
}
185+
186+
return result;
187+
} finally {
188+
if (!isPromise) {
189+
section.end();
190+
}
191+
}
192+
};
193+
163194
// env-specific initialization logic for debug instances
164195
if ('function' === typeof exports.init) {
165196
exports.init(debug);

test/debug_spec.js

+57
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,63 @@ describe('debug', function () {
8282

8383
expect(log.log).to.have.been.calledThrice;
8484
});
85+
86+
it('times a critical function', function () {
87+
log.log = sinon.spy();
88+
89+
var result = log.time('a critical function', function () {
90+
log('hello from inside');
91+
return 1234;
92+
});
93+
94+
expect(result).to.equal(1234);
95+
expect(log.log).to.have.been.calledThrice;
96+
});
97+
98+
if (typeof Promise !== 'undefined') {
99+
it('times a critical asynchronous function', function (cb) {
100+
log.log = sinon.spy();
101+
102+
log.time('a critical function', function () {
103+
return new Promise(function (resolve) {
104+
log('hello from the inside');
105+
resolve(1234);
106+
});
107+
}).then(function (result) {
108+
expect(result).to.equal(1234);
109+
expect(log.log).to.have.been.calledThrice;
110+
cb();
111+
}).catch(cb);
112+
});
113+
}
114+
115+
it('should throw if there aren\'t enough arguments', function () {
116+
log.log = sinon.stub();
117+
118+
expect(function () {
119+
log.time();
120+
}).to.throw('debug.time() takes at least a debug string and a function');
121+
122+
expect(function () {
123+
log.time('hello');
124+
}).to.throw('debug.time() takes at least a debug string and a function');
125+
126+
expect(function () {
127+
log.time(function () {});
128+
}).to.throw('debug.time() takes at least a debug string and a function');
129+
});
130+
131+
it('should throw if last argument isn\'t a function', function () {
132+
log.log = sinon.stub();
133+
134+
expect(function () {
135+
log.time('hello', 1234);
136+
}).to.throw('the last argument to debug.time() must be a function');
137+
138+
expect(function () {
139+
log.time('hello', function () {}, 1235);
140+
}).to.throw('the last argument to debug.time() must be a function');
141+
});
85142
});
86143
});
87144
});

0 commit comments

Comments
 (0)