Skip to content

Commit

Permalink
already-resolved deferreds return a promise for the passed-in value w…
Browse files Browse the repository at this point in the history
…hen resolved or rejected again. This makes them indistinguishable from unresolved deferreds
  • Loading branch information
briancavalier committed Jun 27, 2012
1 parent 18c7132 commit f002752
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 30 deletions.
61 changes: 32 additions & 29 deletions test/defer.js
@@ -1,8 +1,9 @@
(function(buster, when) {

var assert, fail;
var assert, refute, fail;

assert = buster.assert;
refute = buster.refute;
fail = buster.assertions.fail;

function fakeResolved(val) {
Expand Down Expand Up @@ -242,58 +243,60 @@ buster.testCase('when.defer', {
}
},

'should throw if resolved when already resolved': function() {
'should return a promise for passed-in resolution value when already resolved': function(done) {
var d = when.defer();
d.resolve(1);

assert.exception(function() {
d.resolve();
});
d.resolve(2).then(function(val) {
assert.equals(val, 2);
}).always(done);
},

'should throw if rejected when already resolved': function() {
'should return a promise for passed-in rejection value when already resolved': function(done) {
var d = when.defer();
d.resolve(1);

assert.exception(function() {
d.reject();
});
d.reject(2).then(
fail,
function(val) {
assert.equals(val, 2);
}
).always(done);
},

'should throw on progress when already resolved': function() {
'should return silently on progress when already resolved': function() {
var d = when.defer();
d.resolve(1);

assert.exception(function() {
d.progress();
});
refute.defined(d.progress());
},

'should throw if resolved when already rejected': function() {
'should return a promise for passed-in resolution value when already rejected': function(done) {
var d = when.defer();
d.resolve(1);
d.reject(1);

assert.exception(function() {
d.resolve();
});
d.resolve(2).then(function(val) {
assert.equals(val, 2);
}).always(done);
},

'should throw if rejected when already rejected': function() {
'should return a promise for passed-in rejection value when already rejected': function(done) {
var d = when.defer();
d.resolve(1);

assert.exception(function() {
d.reject();
});
d.reject(1);

d.reject(2).then(
fail,
function(val) {
assert.equals(val, 2);
}
).always(done);
},

'should throw on progress when already rejected': function() {
'should return silently on progress when already rejected': function() {
var d = when.defer();
d.resolve(1);
d.reject(1);

assert.exception(function() {
d.progress();
});
refute.defined(d.progress());
}

});
Expand Down
3 changes: 2 additions & 1 deletion when.js
Expand Up @@ -343,7 +343,8 @@ define(function() { "use strict";
// Replace _then with one that directly notifies with the result.
// Replace _resolve so that this Deferred can only be resolved once
_then = value.then;
_resolve = _progress = noop;
_resolve = resolve;
_progress = noop;

// Notify listeners
while (listener = listeners[i++]) listener(value);
Expand Down

0 comments on commit f002752

Please sign in to comment.