diff --git a/lib/delegate.rb b/lib/delegate.rb index 863c63f..a09fcf9 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -122,6 +122,22 @@ class Delegator < BasicObject self.__getobj__ == obj end + def eql?(obj) + if obj.equal? self + __getobj__.eql? obj.__getobj__ + else + __getobj__.eql?(obj) + end + end + + def <=>(obj) + if obj.equal? self + __getobj__ <=> obj.__getobj__ + else + __getobj__ <=> obj + end + end + # # Returns true if two objects are not considered of equal value. # diff --git a/test/test_delegate.rb b/test/test_delegate.rb index a09451b..d3e663e 100644 --- a/test/test_delegate.rb +++ b/test/test_delegate.rb @@ -134,3 +134,34 @@ class TestDelegateClass < Test::Unit::TestCase assert_raise(NoMethodError, '[ruby-dev:40314]#5') {d.send(:delegate_test_private)} end end + +class WidgetWrapperTests < MiniTest::Unit::TestCase + class Widget + end + + class WidgetWrapper < DelegateClass(Widget) + end + + attr_reader :widget, :wrapper + + def setup + @widget = Widget.new + @wrapper = WidgetWrapper.new @widget + end + + def test_equal_operator + assert_equal(widget == widget, wrapper == wrapper) + end + + def test_equal + assert_equal(widget.equal?(widget), wrapper.equal?(wrapper)) + end + + def test_comparison + assert_equal(widget <=> widget, wrapper <=> wrapper) + end + + def test_eql + assert_equal(widget.eql?(widget), wrapper.eql?(wrapper)) + end +end