Repository navigation
Expand file tree
/
Copy pathmodule_spec.rb
More file actions
129 lines (111 loc) · 3.58 KB
/
Copy pathmodule_spec.rb
File metadata and controls
129 lines (111 loc) · 3.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
require_relative '../spec_helper'
require_relative 'fixtures/module'
describe "The module keyword" do
it "creates a new module without semicolon" do
module ModuleSpecsKeywordWithoutSemicolon end
ModuleSpecsKeywordWithoutSemicolon.should.instance_of?(Module)
end
it "creates a new module with a non-qualified constant name" do
module ModuleSpecsToplevel; end
ModuleSpecsToplevel.should.instance_of?(Module)
end
it "creates a new module with a qualified constant name" do
module ModuleSpecs::Nested; end
ModuleSpecs::Nested.should.instance_of?(Module)
end
it "creates a new module with a variable qualified constant name" do
m = Module.new
module m::N; end
m::N.should.instance_of?(Module)
end
it "reopens an existing module" do
module ModuleSpecs; Reopened = true; end
ModuleSpecs::Reopened.should == true
ensure
ModuleSpecs.send(:remove_const, :Reopened)
end
it "does not reopen a module included in Object" do
ruby_exe(<<~RUBY).should == "false"
module IncludedInObject
module IncludedModule; end
end
class Object
include IncludedInObject
end
module IncludedModule; end
print IncludedInObject::IncludedModule == Object::IncludedModule
RUBY
end
it "does not reopen a module included in non-Object modules" do
ruby_exe(<<~RUBY).should == "false/false"
module Included
module IncludedModule; end
end
module M
include Included
module IncludedModule; end
end
class C
include Included
module IncludedModule; end
end
print Included::IncludedModule == M::IncludedModule, "/",
Included::IncludedModule == C::IncludedModule
RUBY
end
it "raises a TypeError if the constant is a Class" do
class Klass; end
-> do
module Klass; end
end.should.raise(TypeError, <<~MSG.strip)
Klass is not a module
#{__FILE__}:#{__LINE__ - 5}: previous definition of Klass was here
MSG
ensure
Object.send(:remove_const, :Klass)
end
it "raises a TypeError if the constant is a String" do
-> { module ModuleSpecs::Modules::A; end }.should.raise(TypeError)
end
it "raises a TypeError if the constant is an Integer" do
-> { module ModuleSpecs::Modules::B; end }.should.raise(TypeError)
end
it "raises a TypeError if the constant is nil" do
-> { module ModuleSpecs::Modules::C; end }.should.raise(TypeError)
end
it "raises a TypeError if the constant is true" do
-> { module ModuleSpecs::Modules::D; end }.should.raise(TypeError)
end
it "raises a TypeError if the constant is false" do
-> { module ModuleSpecs::Modules::D; end }.should.raise(TypeError)
end
end
describe "Assigning an anonymous module to a constant" do
it "sets the name of the module" do
mod = Module.new
mod.name.should == nil
::ModuleSpecs_CS1 = mod
mod.name.should == "ModuleSpecs_CS1"
ensure
Object.send(:remove_const, :ModuleSpecs_CS1)
end
it "sets the name of a module scoped by an anonymous module" do
a, b = Module.new, Module.new
a::B = b
b.name.should.end_with? '::B'
end
it "sets the name of contained modules when assigning a toplevel anonymous module" do
a, b, c, d = Module.new, Module.new, Module.new, Module.new
a::B = b
a::B::C = c
a::B::C::E = c
a::D = d
::ModuleSpecs_CS2 = a
a.name.should == "ModuleSpecs_CS2"
b.name.should == "ModuleSpecs_CS2::B"
c.name.should == "ModuleSpecs_CS2::B::C"
d.name.should == "ModuleSpecs_CS2::D"
ensure
Object.send(:remove_const, :ModuleSpecs_CS2)
end
end