Annotate

spec/util_promise_spec.lua @ 12181:783056b4e448 0.11 0.11.12

util.xml: Do not allow doctypes, comments or processing instructions Yes. This is as bad as it sounds. CVE pending. In Prosody itself, this only affects mod_websocket, which uses util.xml to parse the <open/> frame, thus allowing unauthenticated remote DoS using Billion Laughs. However, third-party modules using util.xml may also be affected by this. This commit installs handlers which disallow the use of doctype declarations and processing instructions without any escape hatch. It, by default, also introduces such a handler for comments, however, there is a way to enable comments nontheless. This is because util.xml is used to parse human-facing data, where comments are generally a desirable feature, and also because comments are generally harmless.
author Jonas Schäfer <jonas@wielicki.name>
date Mon, 10 Jan 2022 18:23:54 +0100
parent 9557:d7fdd418adf8
child 10297:da9f21a70e52
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9456
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local promise = require "util.promise";
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 describe("util.promise", function ()
9457
d01cff2f7a26 util.promise tests: Fix luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 9456
diff changeset
4 --luacheck: ignore 212/resolve 212/reject
9456
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 describe("new()", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 it("returns a promise object", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 assert(promise.new());
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 it("notifies immediately for fulfilled promises", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local p = promise.new(function (resolve)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 resolve("foo");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 local cb = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 assert.equal("foo", v);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 p:next(cb);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 assert.spy(cb).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 it("notifies on fulfilment of pending promises", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 local r;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 local p = promise.new(function (resolve)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 r = resolve;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 local cb = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 assert.equal("foo", v);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 p:next(cb);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 r("foo");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 assert.spy(cb).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 it("allows chaining :next() calls", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 local r;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 local result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 local p = promise.new(function (resolve)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 r = resolve;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 local cb1 = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 assert.equal("foo", v);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 return "bar";
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 local cb2 = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 assert.equal("bar", v);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 p:next(cb1):next(cb2);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 assert.spy(cb1).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 assert.spy(cb2).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 r("foo");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 assert.spy(cb1).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 assert.spy(cb2).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 assert.equal("bar", result);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 it("supports multiple :next() calls on the same promise", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 local r;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 local result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 local p = promise.new(function (resolve)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 r = resolve;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 local cb1 = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 assert.equal("foo", v);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 local cb2 = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 assert.equal("foo", v);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 p:next(cb1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 p:next(cb2);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 assert.spy(cb1).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 assert.spy(cb2).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 r("foo");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 assert.spy(cb1).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 assert.spy(cb2).was_called(1);
9457
d01cff2f7a26 util.promise tests: Fix luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 9456
diff changeset
76 assert.equal("foo", result);
9456
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 it("automatically rejects on error", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 local r;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 local p = promise.new(function (resolve)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 r = resolve;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 error("oh no");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 local cb = spy.new(function () end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 local err_cb = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 assert.equal("oh no", v);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 p:next(cb, err_cb);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 assert.spy(err_cb).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 r("foo");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 assert.spy(err_cb).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 it("supports reject()", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 local r, result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 local p = promise.new(function (resolve, reject)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 r = reject;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 local cb = spy.new(function () end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 local err_cb = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 assert.equal("oh doh", v);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 p:next(cb, err_cb);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 assert.spy(err_cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 r("oh doh");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 assert.spy(err_cb).was_called(1);
9457
d01cff2f7a26 util.promise tests: Fix luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 9456
diff changeset
111 assert.equal("oh doh", result);
9456
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 it("supports chaining of rejected promises", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 local r, result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 local p = promise.new(function (resolve, reject)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 r = reject;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 local cb = spy.new(function () end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 local err_cb = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 assert.equal("oh doh", v);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 return "ok"
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 local cb2 = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 end);
9457
d01cff2f7a26 util.promise tests: Fix luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 9456
diff changeset
127 local err_cb2 = spy.new(function () end);
9456
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 p:next(cb, err_cb):next(cb2, err_cb2)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 assert.spy(err_cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 assert.spy(cb2).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 assert.spy(err_cb2).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 r("oh doh");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 assert.spy(err_cb).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 assert.spy(cb2).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 assert.spy(err_cb2).was_called(0);
9457
d01cff2f7a26 util.promise tests: Fix luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 9456
diff changeset
138 assert.equal("ok", result);
9456
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140
9549
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
141 it("propagates errors down the chain, even when some handlers are not provided", function ()
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
142 local r, result;
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
143 local test_error = {};
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
144 local p = promise.new(function (resolve, reject)
9550
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
145 r = reject;
9549
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
146 end);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
147 local cb = spy.new(function () end);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
148 local err_cb = spy.new(function (e) result = e end);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
149 local p2 = p:next(function () error(test_error) end);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
150 local p3 = p2:next(cb)
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
151 p3:catch(err_cb);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
152 assert.spy(cb).was_called(0);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
153 assert.spy(err_cb).was_called(0);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
154 r("oh doh");
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
155 assert.spy(cb).was_called(0);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
156 assert.spy(err_cb).was_called(1);
9550
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
157 assert.spy(err_cb).was_called_with("oh doh");
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
158 assert.equal("oh doh", result);
9549
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
159 end);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
160
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
161 it("propagates values down the chain, even when some handlers are not provided", function ()
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
162 local r;
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
163 local p = promise.new(function (resolve, reject)
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
164 r = resolve;
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
165 end);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
166 local cb = spy.new(function () end);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
167 local err_cb = spy.new(function () end);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
168 local p2 = p:next(function (v) return v; end);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
169 local p3 = p2:catch(err_cb)
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
170 p3:next(cb);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
171 assert.spy(cb).was_called(0);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
172 assert.spy(err_cb).was_called(0);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
173 r(1337);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
174 assert.spy(cb).was_called(1);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
175 assert.spy(cb).was_called_with(1337);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
176 assert.spy(err_cb).was_called(0);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
177 end);
800c274928bf util.promise: Ensure chained promises always receive a value/rejection even if an intermediate promise has no handlers
Matthew Wild <mwild1@gmail.com>
parents: 9517
diff changeset
178
9550
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
179 it("fulfilled promises do not call error handlers and do propagate value", function ()
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
180 local p = promise.resolve("foo");
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
181 local cb = spy.new(function () end);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
182 local p2 = p:catch(cb);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
183 assert.spy(cb).was_called(0);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
184
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
185 local cb2 = spy.new(function () end);
9551
7421379ba464 util.promise tests: Fix declared but unused variables
Matthew Wild <mwild1@gmail.com>
parents: 9550
diff changeset
186 p2:catch(cb2);
9550
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
187 assert.spy(cb2).was_called(0);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
188 end);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
189
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
190 it("rejected promises do not call fulfilled handlers and do propagate reason", function ()
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
191 local p = promise.reject("foo");
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
192 local cb = spy.new(function () end);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
193 local p2 = p:next(cb);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
194 assert.spy(cb).was_called(0);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
195
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
196 local cb2 = spy.new(function () end);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
197 local cb2_err = spy.new(function () end);
9551
7421379ba464 util.promise tests: Fix declared but unused variables
Matthew Wild <mwild1@gmail.com>
parents: 9550
diff changeset
198 p2:next(cb2, cb2_err);
9550
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
199 assert.spy(cb2).was_called(0);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
200 assert.spy(cb2_err).was_called(1);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
201 assert.spy(cb2_err).was_called_with("foo");
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
202 end);
98de4c2e2627 util.promise: Fix missing parameters
Matthew Wild <mwild1@gmail.com>
parents: 9549
diff changeset
203
9557
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
204 describe("allows callbacks to return", function ()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
205 it("pending promises", function ()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
206 local r;
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
207 local p = promise.resolve()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
208 local cb = spy.new(function ()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
209 return promise.new(function (resolve)
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
210 r = resolve;
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
211 end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
212 end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
213 local cb2 = spy.new(function () end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
214 p:next(cb):next(cb2);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
215 assert.spy(cb).was_called(1);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
216 assert.spy(cb2).was_called(0);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
217 r("hello");
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
218 assert.spy(cb).was_called(1);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
219 assert.spy(cb2).was_called(1);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
220 assert.spy(cb2).was_called_with("hello");
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
221 end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
222
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
223 it("resolved promises", function ()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
224 local p = promise.resolve()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
225 local cb = spy.new(function ()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
226 return promise.resolve("hello");
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
227 end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
228 local cb2 = spy.new(function () end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
229 p:next(cb):next(cb2);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
230 assert.spy(cb).was_called(1);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
231 assert.spy(cb2).was_called(1);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
232 assert.spy(cb2).was_called_with("hello");
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
233 end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
234
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
235 it("rejected promises", function ()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
236 local p = promise.resolve()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
237 local cb = spy.new(function ()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
238 return promise.reject("hello");
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
239 end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
240 local cb2 = spy.new(function ()
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
241 return promise.reject("goodbye");
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
242 end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
243 local cb3 = spy.new(function () end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
244 p:next(cb):catch(cb2):catch(cb3);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
245 assert.spy(cb).was_called(1);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
246 assert.spy(cb2).was_called(1);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
247 assert.spy(cb2).was_called_with("hello");
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
248 assert.spy(cb3).was_called(1);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
249 assert.spy(cb3).was_called_with("goodbye");
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
250 end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
251 end);
d7fdd418adf8 util.promise: Add tests ensuring returning a promise resolves the current promise with that promise
Matthew Wild <mwild1@gmail.com>
parents: 9551
diff changeset
252
9456
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 describe("race()", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 it("works with fulfilled promises", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 local p1, p2 = promise.resolve("yep"), promise.resolve("nope");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256 local p = promise.race({ p1, p2 });
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 local result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 p:next(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 assert.equal("yep", result);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 it("works with pending promises", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 local r1, r2;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 local p1, p2 = promise.new(function (resolve) r1 = resolve end), promise.new(function (resolve) r2 = resolve end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 local p = promise.race({ p1, p2 });
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268 local result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269 local cb = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 p:next(cb);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 r2("yep");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 r1("nope");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 assert.spy(cb).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 assert.equal("yep", result);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 describe("all()", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 it("works with fulfilled promises", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
282 local p1, p2 = promise.resolve("yep"), promise.resolve("nope");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283 local p = promise.all({ p1, p2 });
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 local result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285 p:next(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288 assert.same({ "yep", "nope" }, result);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
289 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290 it("works with pending promises", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
291 local r1, r2;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292 local p1, p2 = promise.new(function (resolve) r1 = resolve end), promise.new(function (resolve) r2 = resolve end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 local p = promise.all({ p1, p2 });
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
294
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295 local result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296 local cb = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
297 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299 p:next(cb);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 r2("yep");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303 r1("nope");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 assert.spy(cb).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305 assert.same({ "nope", "yep" }, result);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307 it("rejects if any promise rejects", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
308 local r1, r2;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 local p1 = promise.new(function (resolve, reject) r1 = reject end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310 local p2 = promise.new(function (resolve, reject) r2 = reject end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
311 local p = promise.all({ p1, p2 });
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
313 local result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314 local cb = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 local cb_err = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
320 p:next(cb, cb_err);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322 assert.spy(cb_err).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323 r2("fail");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 assert.spy(cb_err).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 r1("nope");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328 assert.spy(cb_err).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 assert.equal("fail", result);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 describe("catch()", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 it("works", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334 local result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335 local p = promise.new(function (resolve)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336 error({ foo = true });
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 local cb1 = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 assert.spy(cb1).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 p:catch(cb1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 assert.spy(cb1).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344 assert.same({ foo = true }, result);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
345 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347 it("promises may be resolved by other promises", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 local r1, r2;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349 local p1, p2 = promise.new(function (resolve) r1 = resolve end), promise.new(function (resolve) r2 = resolve end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
351 local result;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
352 local cb = spy.new(function (v)
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353 result = v;
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
354 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
355 p1:next(cb);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
356 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358 r1(p2);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
359 assert.spy(cb).was_called(0);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 r2("yep");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361 assert.spy(cb).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
362 assert.equal("yep", result);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363 end);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 describe("reject()", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
365 it("returns a rejected promise", function ()
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366 local p = promise.reject("foo");
9457
d01cff2f7a26 util.promise tests: Fix luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 9456
diff changeset
367 local cb = spy.new(function () end);
9510
8ef46d09386a util.promise: Fix promise.reject() to return a rejected promise, and fix buggy test for it
Matthew Wild <mwild1@gmail.com>
parents: 9457
diff changeset
368 p:catch(cb);
9456
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
369 assert.spy(cb).was_called(1);
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
370 assert.spy(cb).was_called_with("foo");
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371 end);
9511
cb88d729e98d util.promise: Add additional test for promise.reject()
Matthew Wild <mwild1@gmail.com>
parents: 9510
diff changeset
372 it("returns a rejected promise and does not call on_fulfilled", function ()
cb88d729e98d util.promise: Add additional test for promise.reject()
Matthew Wild <mwild1@gmail.com>
parents: 9510
diff changeset
373 local p = promise.reject("foo");
cb88d729e98d util.promise: Add additional test for promise.reject()
Matthew Wild <mwild1@gmail.com>
parents: 9510
diff changeset
374 local cb = spy.new(function () end);
cb88d729e98d util.promise: Add additional test for promise.reject()
Matthew Wild <mwild1@gmail.com>
parents: 9510
diff changeset
375 p:next(cb);
cb88d729e98d util.promise: Add additional test for promise.reject()
Matthew Wild <mwild1@gmail.com>
parents: 9510
diff changeset
376 assert.spy(cb).was_called(0);
cb88d729e98d util.promise: Add additional test for promise.reject()
Matthew Wild <mwild1@gmail.com>
parents: 9510
diff changeset
377 end);
9456
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
378 end);
9514
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
379 describe("finally()", function ()
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
380 local p, p2, resolve, reject, on_finally;
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
381 before_each(function ()
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
382 p = promise.new(function (_resolve, _reject)
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
383 resolve, reject = _resolve, _reject;
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
384 end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
385 on_finally = spy.new(function () end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
386 p2 = p:finally(on_finally);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
387 end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
388 it("runs when a promise is resolved", function ()
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
389 assert.spy(on_finally).was_called(0);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
390 resolve("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
391 assert.spy(on_finally).was_called(1);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
392 assert.spy(on_finally).was_not_called_with("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
393 end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
394 it("runs when a promise is rejected", function ()
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
395 assert.spy(on_finally).was_called(0);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
396 reject("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
397 assert.spy(on_finally).was_called(1);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
398 assert.spy(on_finally).was_not_called_with("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
399 end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
400 it("returns a promise that fulfills with the original value", function ()
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
401 local cb2 = spy.new(function () end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
402 p2:next(cb2);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
403 assert.spy(on_finally).was_called(0);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
404 assert.spy(cb2).was_called(0);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
405 resolve("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
406 assert.spy(on_finally).was_called(1);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
407 assert.spy(cb2).was_called(1);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
408 assert.spy(on_finally).was_not_called_with("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
409 assert.spy(cb2).was_called_with("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
410 end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
411 it("returns a promise that rejects with the original error", function ()
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
412 local on_finally_err = spy.new(function () end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
413 local on_finally_ok = spy.new(function () end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
414 p2:catch(on_finally_err);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
415 p2:next(on_finally_ok);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
416 assert.spy(on_finally).was_called(0);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
417 assert.spy(on_finally_err).was_called(0);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
418 reject("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
419 assert.spy(on_finally).was_called(1);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
420 -- Since the original promise was rejected, the finally promise should also be
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
421 assert.spy(on_finally_ok).was_called(0);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
422 assert.spy(on_finally_err).was_called(1);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
423 assert.spy(on_finally).was_not_called_with("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
424 assert.spy(on_finally_err).was_called_with("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
425 end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
426 it("returns a promise that rejects with an uncaught error inside on_finally", function ()
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
427 p = promise.new(function (_resolve, _reject)
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
428 resolve, reject = _resolve, _reject;
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
429 end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
430 local test_error = {};
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
431 on_finally = spy.new(function () error(test_error) end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
432 p2 = p:finally(on_finally);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
433
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
434 local on_finally_err = spy.new(function () end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
435 p2:catch(on_finally_err);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
436 assert.spy(on_finally).was_called(0);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
437 assert.spy(on_finally_err).was_called(0);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
438 reject("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
439 assert.spy(on_finally).was_called(1);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
440 assert.spy(on_finally_err).was_called(1);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
441 assert.spy(on_finally).was_not_called_with("foo");
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
442 assert.spy(on_finally).was_not_called_with(test_error);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
443 assert.spy(on_finally_err).was_called_with(test_error);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
444 end);
9db707a86a25 util.promise: Add promise:finally()
Matthew Wild <mwild1@gmail.com>
parents: 9511
diff changeset
445 end);
9517
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
446 describe("try()", function ()
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
447 it("works with functions that return a promise", function ()
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
448 local resolve;
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
449 local p = promise.try(function ()
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
450 return promise.new(function (_resolve)
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
451 resolve = _resolve;
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
452 end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
453 end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
454 assert.is_function(resolve);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
455 local on_resolved = spy.new(function () end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
456 p:next(on_resolved);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
457 assert.spy(on_resolved).was_not_called();
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
458 resolve("foo");
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
459 assert.spy(on_resolved).was_called_with("foo");
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
460 end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
461
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
462 it("works with functions that return a value", function ()
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
463 local p = promise.try(function ()
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
464 return "foo";
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
465 end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
466 local on_resolved = spy.new(function () end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
467 p:next(on_resolved);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
468 assert.spy(on_resolved).was_called_with("foo");
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
469 end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
470
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
471 it("works with functions that return a promise that rejects", function ()
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
472 local reject;
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
473 local p = promise.try(function ()
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
474 return promise.new(function (_, _reject)
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
475 reject = _reject;
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
476 end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
477 end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
478 assert.is_function(reject);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
479 local on_rejected = spy.new(function () end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
480 p:catch(on_rejected);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
481 assert.spy(on_rejected).was_not_called();
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
482 reject("foo");
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
483 assert.spy(on_rejected).was_called_with("foo");
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
484 end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
485
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
486 it("works with functions that throw errors", function ()
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
487 local test_error = {};
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
488 local p = promise.try(function ()
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
489 error(test_error);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
490 end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
491 local on_rejected = spy.new(function () end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
492 p:catch(on_rejected);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
493 assert.spy(on_rejected).was_called(1);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
494 assert.spy(on_rejected).was_called_with(test_error);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
495 end);
b1c6ede17592 util.promise: Add promise.try()
Matthew Wild <mwild1@gmail.com>
parents: 9514
diff changeset
496 end);
9456
d54a0e129af8 util.promise: ES6-like API for promises
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
497 end);