forked from assaf/zombie
-
Notifications
You must be signed in to change notification settings - Fork 0
/
eventloop_spec.coffee
178 lines (158 loc) · 5.99 KB
/
eventloop_spec.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
{ Vows, assert, brains, Browser } = require("./helpers")
Vows.describe("EventLoop").addBatch(
"setTimeout":
topic: ->
brains.get "/eventloop/timeout", (req, res)->
res.send """
<html>
<head><title>One</title></head>
<body></body>
</html>
"""
@callback null
"no wait":
Browser.wants "http://localhost:3003/eventloop/timeout"
topic: (browser)->
browser.window.setTimeout ->
@document.title += " Two"
, 100
@callback null, browser
"should not fire any timeout events": (browser)->
assert.equal browser.document.title, "One"
"from timeout":
Browser.wants "http://localhost:3003/eventloop/timeout"
topic: (browser)->
browser.window.setTimeout ->
browser.window.setTimeout ->
@document.title += " Two"
browser.window.setTimeout ->
@document.title += " Three"
, 100
, 100
, 100
browser.wait @callback
"should not fire any timeout events": (browser)->
assert.equal browser.document.title, "One Two Three"
"wait for all":
Browser.wants "http://localhost:3003/eventloop/timeout"
topic: (browser)->
browser.window.setTimeout ->
@document.title += " Two"
, 100
browser.window.setTimeout ->
@document.title += " Three"
, 200
browser.wait 250, @callback
"should fire all timeout events": (browser)->
assert.equal browser.document.title, "One Two Three"
"cancel timeout":
Browser.wants "http://localhost:3003/eventloop/timeout"
topic: (browser)->
first = browser.window.setTimeout ->
@document.title += " Two"
, 100
second = browser.window.setTimeout ->
@document.title += " Three"
, 200
setTimeout ->
browser.window.clearTimeout second
, 100
browser.wait 300, @callback
"should fire only uncancelled timeout events": (browser)->
assert.equal browser.document.title, "One Two"
"should not choke on invalid timers": (browser)->
assert.doesNotThrow ->
# clearTimeout should not choke when clearing an invalid timer
# https://developer.mozilla.org/en/DOM/window.clearTimeout
browser.window.clearTimeout undefined
"outside wait":
Browser.wants "http://localhost:3003/eventloop/timeout"
topic: (browser)->
browser.wants "http://localhost:3003/eventloop/function", =>
browser.window.setTimeout (-> @document.title += "1"), 100
browser.window.setTimeout (-> @document.title += "2"), 200
browser.window.setTimeout (-> @document.title += "3"), 300
browser.wait 100, =>
setTimeout =>
browser.wait 100, @callback
, 300
"should not fire": (browser)->
assert.equal browser.document.title, "12"
"setInterval":
topic: ->
brains.get "/eventloop/interval", (req, res)-> res.send """
<html>
<head><title></title></head>
<body></body>
</html>
"""
@callback null
"no wait":
Browser.wants "http://localhost:3003/eventloop/interval"
topic: (browser)->
browser.window.setInterval ->
@document.title += "."
, 100
@callback null, browser
"should not fire any timeout events": (browser)->
assert.equal browser.document.title, ""
"wait once":
Browser.wants "http://localhost:3003/eventloop/interval"
topic: (browser)->
browser.window.setInterval ->
@document.title += "."
, 100
browser.wait 150, @callback
"should fire interval event once": (browser)->
assert.equal browser.document.title, "."
"wait long enough":
Browser.wants "http://localhost:3003/eventloop/interval"
topic: (browser)->
browser.window.setInterval ->
@document.title += "."
, 100
browser.wait 350, @callback
"should fire five interval event": (browser)->
assert.equal browser.document.title, "..."
"cancel interval":
Browser.wants "http://localhost:3003/eventloop/interval"
topic: (browser)->
interval = browser.window.setInterval ->
@document.title += "."
, 100
browser.wait 250, =>
browser.window.clearInterval interval
browser.wait 200, @callback
"should fire only uncancelled interval events": (browser)->
assert.equal browser.document.title, ".."
"should not throw an exception with invalid interval": (browser)->
assert.doesNotThrow ->
# clearInterval should not choke on invalid interval
browser.window.clearInterval undefined
"outside wait":
Browser.wants "http://localhost:3003/eventloop/interval"
topic: (browser)->
browser.wants "http://localhost:3003/eventloop/function", =>
browser.window.setInterval (-> @document.title += "."), 100
browser.wait 100, =>
setTimeout =>
browser.wait 100, @callback
, 300
"should not fire": (browser)->
assert.equal browser.document.title, ".."
"browser.wait function":
topic: ->
brains.get "/eventloop/function", (req, res)-> res.send """
<html>
<head><title></title></head>
</html>
"""
browser = new Browser
browser.wants "http://localhost:3003/eventloop/function", =>
browser.window.setInterval (-> @document.title += "."), 100
gotFourDots = (window)->
return window.document.title == "...."
browser.wait gotFourDots, @callback
"should not wait longer than specified": (browser)->
assert.equal browser.document.title, "...."
).export(module)