Skip to content

Commit 5bc0088

Browse files
committed
Add more tests for reopening classes and modules
1 parent d01bf69 commit 5bc0088

File tree

4 files changed

+70
-15
lines changed

4 files changed

+70
-15
lines changed

core/module/fixtures/classes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module ModuleSpecs
22
def self.without_test_modules(modules)
3-
ignore = %w[MSpecRSpecAdapter PP::ObjectMixin ModuleSpecs::IncludedInObject MainSpecs::Module ConstantSpecs::ModuleA]
3+
ignore = %w[MSpecRSpecAdapter PP::ObjectMixin MainSpecs::Module ConstantSpecs::ModuleA]
44
modules.reject { |k| ignore.include?(k.name) }
55
end
66

language/class_spec.rb

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,14 @@ class ClassSpecsKeywordWithSemicolon; end
4646
-> {
4747
class ClassSpecsNumber
4848
end
49-
}.should raise_error(TypeError)
49+
}.should raise_error(TypeError, /\AClassSpecsNumber is not a class/)
50+
end
51+
52+
it "raises TypeError if constant given as class name exists and is a Module but not a Class" do
53+
-> {
54+
class ClassSpecs
55+
end
56+
}.should raise_error(TypeError, /\AClassSpecs is not a class/)
5057
end
5158

5259
# test case known to be detecting bugs (JRuby, MRI)
@@ -346,6 +353,39 @@ def self.m
346353
ClassSpecs::M.m.should == 1
347354
ClassSpecs::L.singleton_class.send(:remove_method, :m)
348355
end
356+
357+
it "does not reopen a class included in Object" do
358+
ruby_exe(<<~RUBY).should == "false"
359+
module IncludedInObject
360+
class IncludedClass
361+
end
362+
end
363+
class Object
364+
include IncludedInObject
365+
end
366+
class IncludedClass
367+
end
368+
print IncludedInObject::IncludedClass == Object::IncludedClass
369+
RUBY
370+
end
371+
372+
it "does not reopen a class included in non-Object modules" do
373+
ruby_exe(<<~RUBY).should == "false/false"
374+
module Included
375+
module IncludedClass; end
376+
end
377+
module M
378+
include Included
379+
module IncludedClass; end
380+
end
381+
class C
382+
include Included
383+
module IncludedClass; end
384+
end
385+
print Included::IncludedClass == M::IncludedClass, "/",
386+
Included::IncludedClass == C::IncludedClass
387+
RUBY
388+
end
349389
end
350390

351391
describe "class provides hooks" do

language/fixtures/module.rb

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,4 @@ class Klass
1212

1313
module Anonymous
1414
end
15-
16-
module IncludedInObject
17-
module IncludedModuleSpecs
18-
end
19-
end
20-
end
21-
22-
class Object
23-
include ModuleSpecs::IncludedInObject
2415
end

language/module_spec.rb

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,34 @@ module ModuleSpecs; Reopened = true; end
3131
end
3232

3333
it "does not reopen a module included in Object" do
34-
module IncludedModuleSpecs; Reopened = true; end
35-
ModuleSpecs::IncludedInObject::IncludedModuleSpecs.should_not == Object::IncludedModuleSpecs
36-
ensure
37-
IncludedModuleSpecs.send(:remove_const, :Reopened)
34+
ruby_exe(<<~RUBY).should == "false"
35+
module IncludedInObject
36+
module IncludedModule; end
37+
end
38+
class Object
39+
include IncludedInObject
40+
end
41+
module IncludedModule; end
42+
print IncludedInObject::IncludedModule == Object::IncludedModule
43+
RUBY
44+
end
45+
46+
it "does not reopen a module included in non-Object modules" do
47+
ruby_exe(<<~RUBY).should == "false/false"
48+
module Included
49+
module IncludedModule; end
50+
end
51+
module M
52+
include Included
53+
module IncludedModule; end
54+
end
55+
class C
56+
include Included
57+
module IncludedModule; end
58+
end
59+
print Included::IncludedModule == M::IncludedModule, "/",
60+
Included::IncludedModule == C::IncludedModule
61+
RUBY
3862
end
3963

4064
it "raises a TypeError if the constant is a Class" do

0 commit comments

Comments
 (0)