///
///
import tsd = require('../typescript_deferred');
import assert = require('assert');
import util = require('util');
function createResolvingPseudoThenable(value: T): tsd.ThenableInterface {
return {
then: function(successCB: Function) {
successCB(value);
}
};
}
function createRejectingPseudoThenable(value: T): tsd.ThenableInterface {
return {
then: function(successCB: Function, errorCB: Function) {
errorCB(value);
}
};
}
function assertResolvesTo(
promise: tsd.PromiseInterface,
value: T,
done: Mocha.ReadyCallback
): void
{
promise.then(function(result: T) {
try {
assert.strictEqual(value, result, util.format(
'value was not transferred correctly, expected %s, got %s', value ,result)
);
} catch (e) {
return done(e);
}
done();
});
}
function assertRejectsTo(
promise: tsd.PromiseInterface,
value: any,
done: Mocha.ReadyCallback
): void
{
promise.then(undefined, function(reason: any) {
try {
assert.strictEqual(value, reason, util.format(
'reason was not transferred correctly, expected %s, got %s', value ,reason)
);
} catch (e) {
return done(e);
}
done();
});
}
suite('typescript-deferred::when', function() {
this.timeout(100);
test('no argument', function(done) {
tsd.when().then((): void => done());
});
test('plain argument', function(done) {
assertResolvesTo(tsd.when('foo'), 'foo', done)
});
test('thenable argument, resolves', function(done) {
assertResolvesTo(tsd.when(createResolvingPseudoThenable('foo')), 'foo', done);
});
test('thenable argument, rejects', function(done) {
assertRejectsTo(tsd.when(createRejectingPseudoThenable('foo')), 'foo', done);
});
test('tsd promise, resolves', function(done) {
var deferred = tsd.create();
assertResolvesTo(tsd.when(deferred.promise), 'foo', done);
deferred.resolve('foo');
});
test('tsd promise, rejects', function(done) {
var deferred = tsd.create();
assertRejectsTo(tsd.when(deferred.promise), 'foo', done);
deferred.reject('foo');
});
});