179 lines
4.1 KiB
Ruby
179 lines
4.1 KiB
Ruby
|
require 'em_test_helper'
|
||
|
require 'em/completion'
|
||
|
|
||
|
class TestCompletion < Test::Unit::TestCase
|
||
|
def completion
|
||
|
@completion ||= EM::Completion.new
|
||
|
end
|
||
|
|
||
|
def crank
|
||
|
# This is a slow solution, but this just executes the next tick queue
|
||
|
# once. It's the easiest way for now.
|
||
|
EM.run { EM.stop }
|
||
|
end
|
||
|
|
||
|
def results
|
||
|
@results ||= []
|
||
|
end
|
||
|
|
||
|
def test_state
|
||
|
assert_equal :unknown, completion.state
|
||
|
end
|
||
|
|
||
|
def test_succeed
|
||
|
completion.callback { |val| results << val }
|
||
|
completion.succeed :object
|
||
|
crank
|
||
|
assert_equal :succeeded, completion.state
|
||
|
assert_equal [:object], results
|
||
|
end
|
||
|
|
||
|
def test_fail
|
||
|
completion.errback { |val| results << val }
|
||
|
completion.fail :object
|
||
|
crank
|
||
|
assert_equal :failed, completion.state
|
||
|
assert_equal [:object], results
|
||
|
end
|
||
|
|
||
|
def test_callback
|
||
|
completion.callback { results << :callback }
|
||
|
completion.errback { results << :errback }
|
||
|
completion.succeed
|
||
|
crank
|
||
|
assert_equal [:callback], results
|
||
|
end
|
||
|
|
||
|
def test_errback
|
||
|
completion.callback { results << :callback }
|
||
|
completion.errback { results << :errback }
|
||
|
completion.fail
|
||
|
crank
|
||
|
assert_equal [:errback], results
|
||
|
end
|
||
|
|
||
|
def test_stateback
|
||
|
completion.stateback(:magic) { results << :stateback }
|
||
|
completion.change_state(:magic)
|
||
|
crank
|
||
|
assert_equal [:stateback], results
|
||
|
end
|
||
|
|
||
|
def test_does_not_enqueue_when_completed
|
||
|
completion.callback { results << :callback }
|
||
|
completion.succeed
|
||
|
completion.errback { results << :errback }
|
||
|
completion.fail
|
||
|
crank
|
||
|
assert_equal [:callback], results
|
||
|
end
|
||
|
|
||
|
def test_completed
|
||
|
assert_equal false, completion.completed?
|
||
|
completion.succeed
|
||
|
assert_equal true, completion.completed?
|
||
|
completion.fail
|
||
|
assert_equal true, completion.completed?
|
||
|
completion.change_state :magic
|
||
|
assert_equal false, completion.completed?
|
||
|
end
|
||
|
|
||
|
def test_recursive_callbacks
|
||
|
completion.callback do |val|
|
||
|
results << val
|
||
|
completion.succeed :two
|
||
|
end
|
||
|
completion.callback do |val|
|
||
|
results << val
|
||
|
completion.succeed :three
|
||
|
end
|
||
|
completion.callback do |val|
|
||
|
results << val
|
||
|
end
|
||
|
completion.succeed :one
|
||
|
crank
|
||
|
assert_equal [:one, :two, :three], results
|
||
|
end
|
||
|
|
||
|
def test_late_defined_callbacks
|
||
|
completion.callback { results << :one }
|
||
|
completion.succeed
|
||
|
crank
|
||
|
assert_equal [:one], results
|
||
|
completion.callback { results << :two }
|
||
|
crank
|
||
|
assert_equal [:one, :two], results
|
||
|
end
|
||
|
|
||
|
def test_cleared_completions
|
||
|
completion.callback { results << :callback }
|
||
|
completion.errback { results << :errback }
|
||
|
|
||
|
completion.succeed
|
||
|
crank
|
||
|
completion.fail
|
||
|
crank
|
||
|
completion.succeed
|
||
|
crank
|
||
|
|
||
|
assert_equal [:callback], results
|
||
|
end
|
||
|
|
||
|
def test_skip_completed_callbacks
|
||
|
completion.callback { results << :callback }
|
||
|
completion.succeed
|
||
|
crank
|
||
|
|
||
|
completion.errback { results << :errback }
|
||
|
completion.fail
|
||
|
crank
|
||
|
|
||
|
assert_equal [:callback], results
|
||
|
end
|
||
|
|
||
|
def test_completions
|
||
|
completion.completion { results << :completion }
|
||
|
completion.succeed
|
||
|
crank
|
||
|
assert_equal [:completion], results
|
||
|
|
||
|
completion.change_state(:unknown)
|
||
|
results.clear
|
||
|
|
||
|
completion.completion { results << :completion }
|
||
|
completion.fail
|
||
|
crank
|
||
|
assert_equal [:completion], results
|
||
|
end
|
||
|
|
||
|
def test_latent_completion
|
||
|
completion.completion { results << :completion }
|
||
|
completion.succeed
|
||
|
crank
|
||
|
completion.completion { results << :completion }
|
||
|
crank
|
||
|
assert_equal [:completion, :completion], results
|
||
|
end
|
||
|
|
||
|
def test_timeout
|
||
|
args = [1, 2, 3]
|
||
|
EM.run do
|
||
|
completion.timeout(0.0001, *args)
|
||
|
completion.errback { |*errargs| results << errargs }
|
||
|
completion.completion { EM.stop }
|
||
|
EM.add_timer(0.1) { flunk 'test timed out' }
|
||
|
end
|
||
|
assert_equal [[1,2,3]], results
|
||
|
end
|
||
|
|
||
|
def test_timeout_gets_cancelled
|
||
|
EM.run do
|
||
|
completion.timeout(0.0001, :timeout)
|
||
|
completion.errback { results << :errback }
|
||
|
completion.succeed
|
||
|
EM.add_timer(0.0002) { EM.stop }
|
||
|
end
|
||
|
assert_equal [], results
|
||
|
end
|
||
|
end
|