Bug #4715 ยป singleton_tests.diff
| test/test_singleton.rb | ||
|---|---|---|
| require 'singleton' | ||
| class TestSingleton < Test::Unit::TestCase | ||
|   class C | ||
|   class SingletonTest | ||
|     include Singleton | ||
|   end | ||
|   def test_marshal | ||
|     o1 = C.instance | ||
|     o1 = SingletonTest.instance | ||
|     m = Marshal.dump(o1) | ||
|     o2 = Marshal.load(m) | ||
|     assert_same(o1, o2) | ||
|   end | ||
|   def test_instance_never_changes | ||
|     a = SingletonTest.instance | ||
|     b = SingletonTest.instance | ||
|     assert_same a, b | ||
|   end | ||
|   def test_initialize_raises_exception | ||
|     assert_raises NoMethodError do | ||
|       SingletonTest.new | ||
|     end | ||
|   end | ||
|   def test_allocate_raises_exception | ||
|     assert_raises NoMethodError do | ||
|       SingletonTest.allocate | ||
|     end | ||
|   end | ||
|   def test_clone_raises_exception | ||
|     exception = assert_raises TypeError do | ||
|       SingletonTest.instance.clone | ||
|     end | ||
|     expected = "can't clone instance of singleton TestSingleton::SingletonTest" | ||
|     assert_equal expected, exception.message | ||
|   end | ||
|   def test_dup_raises_exception | ||
|     exception = assert_raises TypeError do | ||
|       SingletonTest.instance.dup | ||
|     end | ||
|     expected = "can't dup instance of singleton TestSingleton::SingletonTest" | ||
|     assert_equal expected, exception.message | ||
|   end | ||
|   def test_include_in_module_raises_exception | ||
|     mod = Module.new | ||
|     exception = assert_raises TypeError do | ||
|       mod.class_eval do | ||
|         include Singleton | ||
|       end | ||
|     end | ||
|     expected = "Inclusion of the OO-Singleton module in module #{mod}" | ||
|     assert_equal expected, exception.message | ||
|   end | ||
|   def test_extending_singleton_raises_exception | ||
|     assert_raises NoMethodError do | ||
|       'foo'.extend Singleton | ||
|     end | ||
|   end | ||
|   def test_inheritance_works_with_overridden_inherited_method | ||
|     super_super_called = false | ||
|     outer = Class.new do | ||
|       define_singleton_method :inherited do |sub| | ||
|         super_super_called = true | ||
|       end | ||
|     end | ||
|     inner = Class.new(outer) do | ||
|       include Singleton | ||
|     end | ||
|     tester = Class.new(inner) | ||
|     assert super_super_called | ||
|     a = tester.instance | ||
|     b = tester.instance | ||
|     assert_same a, b | ||
|   end | ||
|   def test_class_level_cloning_preserves_singleton_behavior | ||
|     klass = SingletonTest.clone | ||
|     a = klass.instance | ||
|     b = klass.instance | ||
|     assert_same a, b | ||
|   end | ||
| end | ||