Feature #7745 ยป 239.patch
| lib/observer.rb | ||
|---|---|---|
|
# <tt>*arg</tt> is the value passed to #notify_observers by this
|
||
|
# Observable
|
||
|
def add_observer(observer, func=:update)
|
||
|
@observer_peers = {} unless defined? @observer_peers
|
||
|
@observer_peers = {}.compare_by_identity unless defined? @observer_peers
|
||
|
unless observer.respond_to? func
|
||
|
raise NoMethodError, "observer does not respond to `#{func.to_s}'"
|
||
|
end
|
||
| test/test_observer.rb | ||
|---|---|---|
|
require 'test/unit'
|
||
|
require 'observer'
|
||
|
class TestObserver < Test::Unit::TestCase
|
||
|
class MockObservable
|
||
|
include Observable
|
||
|
end
|
||
|
class MockObserver
|
||
|
attr_reader :updates
|
||
|
def initialize
|
||
|
@updates = []
|
||
|
end
|
||
|
def update *args
|
||
|
updates.push(args)
|
||
|
end
|
||
|
end
|
||
|
def setup
|
||
|
@observable = MockObservable.new
|
||
|
@observer = MockObserver.new
|
||
|
end
|
||
|
def test_count_observers
|
||
|
assert_equal(0, @observable.count_observers)
|
||
|
@observable.add_observer(@observer)
|
||
|
assert_equal(1, @observable.count_observers)
|
||
|
9.times { @observable.add_observer(MockObserver.new) }
|
||
|
assert_equal(10, @observable.count_observers)
|
||
|
@observable.delete_observer(@observer)
|
||
|
assert_equal(9, @observable.count_observers)
|
||
|
@observable.delete_observers()
|
||
|
assert_equal(0, @observable.count_observers)
|
||
|
end
|
||
|
def test_changed
|
||
|
@observable = MockObservable.new
|
||
|
assert(!@observable.changed?)
|
||
|
@observable.changed
|
||
|
assert(@observable.changed?)
|
||
|
@observable.notify_observers
|
||
|
assert(!@observable.changed?)
|
||
|
@observable.changed(true)
|
||
|
assert(@observable.changed?)
|
||
|
@observable.changed(false)
|
||
|
assert(!@observable.changed?)
|
||
|
end
|
||
|
def test_notify
|
||
|
@observable.add_observer(@observer)
|
||
|
@observable.changed
|
||
|
@observable.notify_observers()
|
||
|
@observable.changed
|
||
|
@observable.notify_observers(1)
|
||
|
@observable.notify_observers(:not_changed)
|
||
|
@observable.changed
|
||
|
@observable.notify_observers(2, 3)
|
||
|
assert_equal([[], [1], [2, 3]], @observer.updates)
|
||
|
end
|
||
|
def test_add_delete_observer
|
||
|
@observable.changed
|
||
|
@observable.notify_observers(1)
|
||
|
@observable.add_observer(@observer)
|
||
|
@observable.changed
|
||
|
@observable.notify_observers(2)
|
||
|
@observable.delete_observer(@observer)
|
||
|
@observable.changed
|
||
|
@observable.notify_observers(3)
|
||
|
assert_equal([[2]], @observer.updates)
|
||
|
end
|
||
|
def test_add_custom_observer
|
||
|
custom_observer = []
|
||
|
@observable.add_observer(custom_observer, :push)
|
||
|
@observable.changed
|
||
|
@observable.notify_observers(1,2,3)
|
||
|
assert_equal([1, 2, 3], custom_observer)
|
||
|
@observable.delete_observer(custom_observer)
|
||
|
@observable.changed
|
||
|
@observable.notify_observers(4,5)
|
||
|
assert_equal([1, 2, 3], custom_observer)
|
||
|
end
|
||
|
end
|
||