-
-
Notifications
You must be signed in to change notification settings - Fork 119
/
test_reloading.rb
192 lines (153 loc) · 4.89 KB
/
test_reloading.rb
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# frozen_string_literal: true
require "test_helper"
require "fileutils"
class TestReloading < LoaderTest
module Namespace; end
test "enabling reloading after setup raises" do
e = assert_raises(Zeitwerk::Error) do
loader = Zeitwerk::Loader.new
loader.setup
loader.enable_reloading
end
assert_equal "cannot enable reloading after setup", e.message
end
test "enabling reloading is idempotent, even after setup" do
assert loader.reloading_enabled? # precondition
loader.setup
loader.enable_reloading # should not raise
assert loader.reloading_enabled?
end
test "reloading works if the flag is set (Object)" do
files = [
["x.rb", "X = 1"], # top-level
["y.rb", "module Y; end"], # explicit namespace
["y/a.rb", "Y::A = 1"],
["z/a.rb", "Z::A = 1"] # implicit namespace
]
with_setup(files) do
assert_equal 1, X
assert_equal 1, Y::A
assert_equal 1, Z::A
y_object_id = Y.object_id
z_object_id = Z.object_id
File.write("x.rb", "X = 2")
File.write("y/a.rb", "Y::A = 2")
File.write("z/a.rb", "Z::A = 2")
loader.reload
assert_equal 2, X
assert_equal 2, Y::A
assert_equal 2, Z::A
assert Y.object_id != y_object_id
assert Z.object_id != z_object_id
assert_equal 2, X
end
end
test "reloading works if the flag is set (Namespace)" do
files = [
["x.rb", "#{Namespace}::X = 1"], # top-level
["y.rb", "module #{Namespace}::Y; end"], # explicit namespace
["y/a.rb", "#{Namespace}::Y::A = 1"],
["z/a.rb", "#{Namespace}::Z::A = 1"] # implicit namespace
]
with_setup(files, namespace: Namespace) do
assert_equal 1, Namespace::X
assert_equal 1, Namespace::Y::A
assert_equal 1, Namespace::Z::A
ns_object_id = Namespace.object_id
y_object_id = Namespace::Y.object_id
z_object_id = Namespace::Z.object_id
File.write("x.rb", "#{Namespace}::X = 2")
File.write("y/a.rb", "#{Namespace}::Y::A = 2")
File.write("z/a.rb", "#{Namespace}::Z::A = 2")
loader.reload
assert_equal 2, Namespace::X
assert_equal 2, Namespace::Y::A
assert_equal 2, Namespace::Z::A
assert Namespace.object_id == ns_object_id
assert Namespace::Y.object_id != y_object_id
assert Namespace::Z.object_id != z_object_id
assert_equal 2, Namespace::X
end
end
test "reloading raises if the flag is not set" do
e = assert_raises(Zeitwerk::ReloadingDisabledError) do
loader = Zeitwerk::Loader.new
loader.setup
loader.reload
end
assert_equal "can't reload, please call loader.enable_reloading before setup", e.message
end
test "if reloading is disabled, autoloading metadata shrinks while autoloading (performance test)" do
on_teardown do
remove_const :X
delete_loaded_feature "x.rb"
remove_const :Y
delete_loaded_feature "y.rb"
delete_loaded_feature "y/a.rb"
remove_const :Z
delete_loaded_feature "z/a.rb"
end
files = [
["x.rb", "X = 1"],
["y.rb", "module Y; end"],
["y/a.rb", "Y::A = 1"],
["z/a.rb", "Z::A = 1"]
]
with_files(files) do
loader = new_loader(dirs: ".", enable_reloading: false)
assert !loader.autoloads.empty?
assert_equal 1, X
assert_equal 1, Y::A
assert_equal 1, Z::A
assert loader.autoloads.empty?
assert loader.to_unload.empty?
end
end
test "if reloading is disabled, autoloading metadata shrinks while eager loading (performance test)" do
on_teardown do
remove_const :X
delete_loaded_feature "x.rb"
remove_const :Y
delete_loaded_feature "y.rb"
delete_loaded_feature "y/a.rb"
remove_const :Z
delete_loaded_feature "z/a.rb"
end
files = [
["x.rb", "X = 1"],
["y.rb", "module Y; end"],
["y/a.rb", "Y::A = 1"],
["z/a.rb", "Z::A = 1"]
]
with_files(files) do
loader = new_loader(dirs: ".", enable_reloading: false)
assert !loader.autoloads.empty?
assert !Zeitwerk::Registry.autoloads.empty?
loader.eager_load
assert loader.autoloads.empty?
assert Zeitwerk::Registry.autoloads.empty?
assert loader.to_unload.empty?
end
end
test "reloading supports deleted root directories" do
files = [["a/x.rb", "X = 1"], ["b/y.rb", "Y = 1"]]
with_setup(files, dirs: %w(a b)) do
assert X
assert Y
FileUtils.rm_rf("b")
loader.reload
assert X
end
end
test "you can eager load again after reloading" do
$test_eager_load_after_reload = 0
files = [["x.rb", "$test_eager_load_after_reload += 1; X = 1"]]
with_setup(files) do
loader.eager_load
assert_equal 1, $test_eager_load_after_reload
loader.reload
loader.eager_load
assert_equal 2, $test_eager_load_after_reload
end
end
end