Commit 1d3b8e6c authored by tomhuda's avatar tomhuda

Update to latest Promises/A+ spec

parent f3efd67e
...@@ -46,20 +46,20 @@ task :push => :dist do ...@@ -46,20 +46,20 @@ task :push => :dist do
sh "git commit -m 'Updates build artifacts'" sh "git commit -m 'Updates build artifacts'"
end end
file "promise-tests" do file "promises-tests" do
sh "git clone https://github.com/domenic/promise-tests.git" sh "git clone https://github.com/promises-aplus/promises-tests"
end end
task :update_tests => "promise-tests" do task :update_tests => "promises-tests" do
cd "promise-tests" do cd "promises-tests" do
sh "git pull" sh "git pull"
sh "npm install" sh "npm install"
end end
end end
task :test => [:update_tests, "tests/rsvp.js"] do task :test => [:update_tests, "tests/rsvp.js"] do
cd "promise-tests" do cd "promises-tests" do
sh "node ./lib/cli.js all ../tests/test-adapter.js" sh "node ./lib/cli.js ../tests/test-adapter.js"
end end
end end
......
...@@ -148,16 +148,19 @@ define("rsvp", ...@@ -148,16 +148,19 @@ define("rsvp",
var noop = function() {}; var noop = function() {};
var invokeCallback = function(type, promise, callback, event) { var invokeCallback = function(type, promise, callback, event) {
var value, error; var value, error, succeeded, failed;
if (callback) { if (callback) {
try { try {
value = callback(event.detail); value = callback(event.detail);
succeeded = true;
} catch(e) { } catch(e) {
failed = true;
error = e; error = e;
} }
} else { } else {
value = event.detail; value = event.detail;
succeeded = true;
} }
if (value instanceof Promise) { if (value instanceof Promise) {
...@@ -166,9 +169,9 @@ define("rsvp", ...@@ -166,9 +169,9 @@ define("rsvp",
}, function(error) { }, function(error) {
promise.reject(error); promise.reject(error);
}); });
} else if (callback && value) { } else if (callback && succeeded) {
promise.resolve(value); promise.resolve(value);
} else if (error) { } else if (failed) {
promise.reject(error); promise.reject(error);
} else { } else {
promise[type](value); promise[type](value);
......
...@@ -146,16 +146,19 @@ ...@@ -146,16 +146,19 @@
var noop = function() {}; var noop = function() {};
var invokeCallback = function(type, promise, callback, event) { var invokeCallback = function(type, promise, callback, event) {
var value, error; var value, error, succeeded, failed;
if (callback) { if (callback) {
try { try {
value = callback(event.detail); value = callback(event.detail);
succeeded = true;
} catch(e) { } catch(e) {
failed = true;
error = e; error = e;
} }
} else { } else {
value = event.detail; value = event.detail;
succeeded = true;
} }
if (value instanceof Promise) { if (value instanceof Promise) {
...@@ -164,9 +167,9 @@ ...@@ -164,9 +167,9 @@
}, function(error) { }, function(error) {
promise.reject(error); promise.reject(error);
}); });
} else if (callback && value) { } else if (callback && succeeded) {
promise.resolve(value); promise.resolve(value);
} else if (error) { } else if (failed) {
promise.reject(error); promise.reject(error);
} else { } else {
promise[type](value); promise[type](value);
......
(function(e){"use strict";function v(e,t){r.async(function(){e.trigger("promise:resolved",{detail:t}),e.isResolved=!0,e.resolvedValue=t})}function m(e,t){r.async(function(){e.trigger("promise:failed",{detail:t}),e.isRejected=!0,e.rejectedValue=t})}var t=typeof window!="undefined"?window:{},n=t.MutationObserver||t.WebKitMutationObserver,r,i;if(typeof process!="undefined"&&{}.toString.call(process)==="[object process]")i=function(e,t){process.nextTick(function(){e.call(t)})};else if(n){var s=[],o=new n(function(){var e=s.slice();s=[],e.forEach(function(e){var t=e[0],n=e[1];t.call(n)})}),u=document.createElement("div");o.observe(u,{attributes:!0}),i=function(e,t){s.push([e,t]),u.setAttribute("drainQueue","drainQueue")}}else i=function(e,t){setTimeout(function(){e.call(t)},1)};var a=function(e,t){this.type=e;for(var n in t){if(!t.hasOwnProperty(n))continue;this[n]=t[n]}},f=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n][0]===t)return n;return-1},l=function(e){var t=e._promiseCallbacks;return t||(t=e._promiseCallbacks={}),t},c={mixin:function(e){return e.on=this.on,e.off=this.off,e.trigger=this.trigger,e},on:function(e,t,n){var r=l(this),i,s;e=e.split(/\s+/),n=n||this;while(s=e.shift())i=r[s],i||(i=r[s]=[]),f(i,t)===-1&&i.push([t,n])},off:function(e,t){var n=l(this),r,i,s;e=e.split(/\s+/);while(i=e.shift()){if(!t){n[i]=[];continue}r=n[i],s=f(r,t),s!==-1&&r.splice(s,1)}},trigger:function(e,t){var n=l(this),r,i,s,o,u;if(r=n[e])for(var f=0,c=r.length;f<c;f++)i=r[f],s=i[0],o=i[1],typeof t!="object"&&(t={detail:t}),u=new a(e,t),s.call(o,u)}},h=function(){this.on("promise:resolved",function(e){this.trigger("success",{detail:e.detail})},this),this.on("promise:failed",function(e){this.trigger("error",{detail:e.detail})},this)},p=function(){},d=function(e,t,n,r){var i,s;if(n)try{i=n(r.detail)}catch(o){s=o}else i=r.detail;i instanceof h?i.then(function(e){t.resolve(e)},function(e){t.reject(e)}):n&&i?t.resolve(i):s?t.reject(s):t[e](i)};h.prototype={then:function(e,t){var n=new h;return this.isResolved&&r.async(function(){d("resolve",n,e,{detail:this.resolvedValue})},this),this.isRejected&&r.async(function(){d("reject",n,t,{detail:this.rejectedValue})},this),this.on("promise:resolved",function(t){d("resolve",n,e,t)}),this.on("promise:failed",function(e){d("reject",n,t,e)}),n},resolve:function(e){v(this,e),this.resolve=p,this.reject=p},reject:function(e){m(this,e),this.resolve=p,this.reject=p}},c.mixin(h.prototype),r={async:i,Promise:h,Event:a,EventTarget:c},e.RSVP=r})(window); (function(e){"use strict";function v(e,t){r.async(function(){e.trigger("promise:resolved",{detail:t}),e.isResolved=!0,e.resolvedValue=t})}function m(e,t){r.async(function(){e.trigger("promise:failed",{detail:t}),e.isRejected=!0,e.rejectedValue=t})}var t=typeof window!="undefined"?window:{},n=t.MutationObserver||t.WebKitMutationObserver,r,i;if(typeof process!="undefined"&&{}.toString.call(process)==="[object process]")i=function(e,t){process.nextTick(function(){e.call(t)})};else if(n){var s=[],o=new n(function(){var e=s.slice();s=[],e.forEach(function(e){var t=e[0],n=e[1];t.call(n)})}),u=document.createElement("div");o.observe(u,{attributes:!0}),i=function(e,t){s.push([e,t]),u.setAttribute("drainQueue","drainQueue")}}else i=function(e,t){setTimeout(function(){e.call(t)},1)};var a=function(e,t){this.type=e;for(var n in t){if(!t.hasOwnProperty(n))continue;this[n]=t[n]}},f=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n][0]===t)return n;return-1},l=function(e){var t=e._promiseCallbacks;return t||(t=e._promiseCallbacks={}),t},c={mixin:function(e){return e.on=this.on,e.off=this.off,e.trigger=this.trigger,e},on:function(e,t,n){var r=l(this),i,s;e=e.split(/\s+/),n=n||this;while(s=e.shift())i=r[s],i||(i=r[s]=[]),f(i,t)===-1&&i.push([t,n])},off:function(e,t){var n=l(this),r,i,s;e=e.split(/\s+/);while(i=e.shift()){if(!t){n[i]=[];continue}r=n[i],s=f(r,t),s!==-1&&r.splice(s,1)}},trigger:function(e,t){var n=l(this),r,i,s,o,u;if(r=n[e])for(var f=0,c=r.length;f<c;f++)i=r[f],s=i[0],o=i[1],typeof t!="object"&&(t={detail:t}),u=new a(e,t),s.call(o,u)}},h=function(){this.on("promise:resolved",function(e){this.trigger("success",{detail:e.detail})},this),this.on("promise:failed",function(e){this.trigger("error",{detail:e.detail})},this)},p=function(){},d=function(e,t,n,r){var i,s,o,u;if(n)try{i=n(r.detail),o=!0}catch(a){u=!0,s=a}else i=r.detail,o=!0;i instanceof h?i.then(function(e){t.resolve(e)},function(e){t.reject(e)}):n&&o?t.resolve(i):u?t.reject(s):t[e](i)};h.prototype={then:function(e,t){var n=new h;return this.isResolved&&r.async(function(){d("resolve",n,e,{detail:this.resolvedValue})},this),this.isRejected&&r.async(function(){d("reject",n,t,{detail:this.rejectedValue})},this),this.on("promise:resolved",function(t){d("resolve",n,e,t)}),this.on("promise:failed",function(e){d("reject",n,t,e)}),n},resolve:function(e){v(this,e),this.resolve=p,this.reject=p},reject:function(e){m(this,e),this.resolve=p,this.reject=p}},c.mixin(h.prototype),r={async:i,Promise:h,Event:a,EventTarget:c},e.RSVP=r})(window);
...@@ -144,27 +144,31 @@ var Promise = function() { ...@@ -144,27 +144,31 @@ var Promise = function() {
var noop = function() {}; var noop = function() {};
var invokeCallback = function(type, promise, callback, event) { var invokeCallback = function(type, promise, callback, event) {
var value, error; var hasCallback = typeof callback === 'function',
value, error, succeeded, failed;
if (callback) { if (hasCallback) {
try { try {
value = callback(event.detail); value = callback(event.detail);
succeeded = true;
} catch(e) { } catch(e) {
failed = true;
error = e; error = e;
} }
} else { } else {
value = event.detail; value = event.detail;
succeeded = true;
} }
if (value instanceof Promise) { if (value && typeof value.then === 'function') {
value.then(function(value) { value.then(function(value) {
promise.resolve(value); promise.resolve(value);
}, function(error) { }, function(error) {
promise.reject(error); promise.reject(error);
}); });
} else if (callback && value) { } else if (hasCallback && succeeded) {
promise.resolve(value); promise.resolve(value);
} else if (error) { } else if (failed) {
promise.reject(error); promise.reject(error);
} else { } else {
promise[type](value); promise[type](value);
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
switch(name) { switch(name) {
case "assert": return window.assert; case "assert": return window.assert;
case "sinon": return window.sinon; case "sinon": return window.sinon;
case "./helpers/testThreeCases": return window.testThreeCases;
case "./rsvp": return RSVP; case "./rsvp": return RSVP;
} }
}; };
...@@ -20,11 +21,19 @@ ...@@ -20,11 +21,19 @@
<script src="mocha.js"></script> <script src="mocha.js"></script>
<script src="../browser/rsvp.js"></script> <script src="../browser/rsvp.js"></script>
<script src="test-adapter.js"></script> <script src="test-adapter.js"></script>
<script>mocha.setup('bdd')</script> <script>
<script src="../promise-tests/lib/tests/promises-a.js"></script> var global = window;
<script src="../promise-tests/lib/tests/always-async.js"></script> var exports = testThreeCases = {};
<script src="../promise-tests/lib/tests/resolution-races.js"></script> </script>
<script src="../promise-tests/lib/tests/returning-a-promise.js"></script> <script src="../promises-tests/lib/tests/helpers/testThreeCases.js"></script>
<script>window.exports = undefined;</script>
<script>mocha.setup({ ui: 'bdd', timeout: 200 })</script>
<script src="../promises-tests/lib/tests/3.2.1.js"></script>
<script src="../promises-tests/lib/tests/3.2.2.js"></script>
<script src="../promises-tests/lib/tests/3.2.3.js"></script>
<script src="../promises-tests/lib/tests/3.2.4.js"></script>
<script src="../promises-tests/lib/tests/3.2.5.js"></script>
<script src="../promises-tests/lib/tests/3.2.6.js"></script>
<script> <script>
mocha.run(); mocha.run();
</script> </script>
......
...@@ -145,27 +145,31 @@ var Promise = function() { ...@@ -145,27 +145,31 @@ var Promise = function() {
var noop = function() {}; var noop = function() {};
var invokeCallback = function(type, promise, callback, event) { var invokeCallback = function(type, promise, callback, event) {
var value, error; var hasCallback = typeof callback === 'function',
value, error, succeeded, failed;
if (callback) { if (hasCallback) {
try { try {
value = callback(event.detail); value = callback(event.detail);
succeeded = true;
} catch(e) { } catch(e) {
failed = true;
error = e; error = e;
} }
} else { } else {
value = event.detail; value = event.detail;
succeeded = true;
} }
if (value instanceof Promise) { if (value && typeof value.then === 'function') {
value.then(function(value) { value.then(function(value) {
promise.resolve(value); promise.resolve(value);
}, function(error) { }, function(error) {
promise.reject(error); promise.reject(error);
}); });
} else if (callback && value) { } else if (hasCallback && succeeded) {
promise.resolve(value); promise.resolve(value);
} else if (error) { } else if (failed) {
promise.reject(error); promise.reject(error);
} else { } else {
promise[type](value); promise[type](value);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment