From 0954607864bcdd81ea5f3dd2ea52f638f2f32e47 Mon Sep 17 00:00:00 2001 From: shugo Date: Sat, 29 Sep 2012 02:21:27 +0000 Subject: * vm_insnhelper.c (rb_vm_using_modules): use using_modules before klass to fix method lookup order, and use klass even if klass is not a module to make refinements in class_eval invoked on classes work. * eval.c (rb_using_module): accept a class as the second argument. * eval.c (rb_mod_using, f_using): raise a TypeError if the argument is not a module. * test/ruby/test_refinement.rb: add new tests for the above changes. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37053 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/ruby/test_refinement.rb | 56 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'test/ruby') diff --git a/test/ruby/test_refinement.rb b/test/ruby/test_refinement.rb index 98645745e9..476c6442c7 100644 --- a/test/ruby/test_refinement.rb +++ b/test/ruby/test_refinement.rb @@ -361,6 +361,34 @@ class TestRefinement < Test::Unit::TestCase assert_equal([:m1, :m2], m2.module_eval { obj.foo }) end + def test_refine_module_with_double_overriding + m1 = Module.new { + def foo + [:m1] + end + } + c = Class.new { + include m1 + } + m2 = Module.new { + refine m1 do + def foo + super << :m2 + end + end + } + m3 = Module.new { + using m2 + refine m1 do + def foo + super << :m3 + end + end + } + obj = c.new + assert_equal([:m1, :m2, :m3], m3.module_eval { obj.foo }) + end + def test_refine_module_and_call_superclass_method m1 = Module.new c1 = Class.new { @@ -399,4 +427,32 @@ class TestRefinement < Test::Unit::TestCase } end end + + def test_refine_in_class_and_class_eval + c = Class.new { + refine Fixnum do + def foo + "c" + end + end + } + assert_equal("c", c.class_eval { 123.foo }) + end + + def test_kernel_using_class + c = Class.new + assert_raise(TypeError) do + using c + end + end + + def test_module_using_class + c = Class.new + m = Module.new + assert_raise(TypeError) do + m.module_eval do + using c + end + end + end end -- cgit v1.2.3