impromptu 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +34 -0
- data/README.rdoc +76 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/impromptu.gemspec +106 -0
- data/lib/impromptu/autoload.rb +33 -0
- data/lib/impromptu/component.rb +124 -0
- data/lib/impromptu/component_set.rb +10 -0
- data/lib/impromptu/file.rb +220 -0
- data/lib/impromptu/folder.rb +151 -0
- data/lib/impromptu/impromptu.rb +81 -0
- data/lib/impromptu/ordered_set.rb +49 -0
- data/lib/impromptu/resource.rb +195 -0
- data/lib/impromptu/symbol.rb +43 -0
- data/lib/impromptu.rb +12 -0
- data/test/framework/copies/extra_klass2.rb +7 -0
- data/test/framework/copies/new_klass.rb +10 -0
- data/test/framework/copies/new_unseen.rb +7 -0
- data/test/framework/copies/original_klass.rb +10 -0
- data/test/framework/ext/extensions/blog.rb +6 -0
- data/test/framework/ext/extensions.rb +4 -0
- data/test/framework/lib/group/klass2.rb +4 -0
- data/test/framework/lib/klass.rb +10 -0
- data/test/framework/other/also.rb +8 -0
- data/test/framework/other/ignore.rb +2 -0
- data/test/framework/other/load.rb +2 -0
- data/test/framework/other/two.rb +14 -0
- data/test/framework/private/klass.rb +10 -0
- data/test/framework/test.components +23 -0
- data/test/helper.rb +10 -0
- data/test/test_autoload.rb +32 -0
- data/test/test_component.rb +133 -0
- data/test/test_component_set.rb +20 -0
- data/test/test_folder.rb +4 -0
- data/test/test_impromptu.rb +43 -0
- data/test/test_integration.rb +312 -0
- data/test/test_ordered_set.rb +93 -0
- data/test/test_resource.rb +186 -0
- data/test/test_symbol.rb +99 -0
- metadata +139 -0
@@ -0,0 +1,312 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
class TestIntegration < Test::Unit::TestCase
|
5
|
+
context "Loading the test.components file" do
|
6
|
+
setup do
|
7
|
+
Impromptu.reset
|
8
|
+
Impromptu.define_components do
|
9
|
+
parse_file 'test/framework/test.components'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# ----------------------------------------
|
14
|
+
# Loading component definitions
|
15
|
+
# ----------------------------------------
|
16
|
+
should "01 create four components" do
|
17
|
+
assert_equal 4, Impromptu.components.size
|
18
|
+
end
|
19
|
+
|
20
|
+
should "02 have a single folder per component" do
|
21
|
+
assert_equal 1, Impromptu.components['framework'].folders.size
|
22
|
+
assert_equal 1, Impromptu.components['framework.extensions'].folders.size
|
23
|
+
assert_equal 1, Impromptu.components['other'].folders.size
|
24
|
+
end
|
25
|
+
|
26
|
+
should "03 have a single require in the framework component" do
|
27
|
+
assert_equal 1, Impromptu.components['framework'].requirements.size
|
28
|
+
end
|
29
|
+
|
30
|
+
should "04 have a namespace for the framework components" do
|
31
|
+
assert_equal :Framework, Impromptu.components['framework'].namespace
|
32
|
+
assert_equal :Framework, Impromptu.components['framework.extensions'].namespace
|
33
|
+
assert_equal nil, Impromptu.components['other'].namespace
|
34
|
+
end
|
35
|
+
|
36
|
+
should "05 start tracking 8 files" do
|
37
|
+
assert_equal 2, Impromptu.components['framework'].folders.first.files.size
|
38
|
+
assert_equal 2, Impromptu.components['framework.extensions'].folders.first.files.size
|
39
|
+
assert_equal 3, Impromptu.components['other'].folders.first.files.size
|
40
|
+
assert_equal 1, Impromptu.components['private'].folders.first.files.size
|
41
|
+
end
|
42
|
+
|
43
|
+
should "06 load definitions for 9 resources" do
|
44
|
+
assert Impromptu.root_resource.child?(:Framework)
|
45
|
+
assert Impromptu.root_resource.child(:Framework).child?(:Extensions)
|
46
|
+
assert Impromptu.root_resource.child(:Framework).child(:Extensions).child?(:Blog)
|
47
|
+
assert Impromptu.root_resource.child(:Framework).child?(:Klass)
|
48
|
+
assert Impromptu.root_resource.child(:Framework).child?(:Klass2)
|
49
|
+
assert Impromptu.root_resource.child?(:Load)
|
50
|
+
assert Impromptu.root_resource.child?(:OtherName)
|
51
|
+
assert Impromptu.root_resource.child?(:ModOne)
|
52
|
+
assert Impromptu.root_resource.child?(:ModTwo)
|
53
|
+
end
|
54
|
+
|
55
|
+
should "07 correctly mark namespace resources" do
|
56
|
+
assert_equal true, Impromptu.root_resource.child(:Framework).namespace?
|
57
|
+
assert_equal false, Impromptu.root_resource.child(:Framework).child(:Extensions).namespace?
|
58
|
+
assert_equal false, Impromptu.root_resource.child(:Framework).child(:Extensions).child(:Blog).namespace?
|
59
|
+
assert_equal false, Impromptu.root_resource.child(:Framework).child(:Klass).namespace?
|
60
|
+
assert_equal false, Impromptu.root_resource.child(:Framework).child(:Klass2).namespace?
|
61
|
+
assert_equal false, Impromptu.root_resource.child(:Load).namespace?
|
62
|
+
assert_equal false, Impromptu.root_resource.child(:OtherName).namespace?
|
63
|
+
assert_equal false, Impromptu.root_resource.child(:ModOne).namespace?
|
64
|
+
assert_equal false, Impromptu.root_resource.child(:ModTwo).namespace?
|
65
|
+
end
|
66
|
+
|
67
|
+
should "08 keep all resources unloaded to start with" do
|
68
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework').loaded?
|
69
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework::Extensions').loaded?
|
70
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework::Extensions::Blog').loaded?
|
71
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework::Klass').loaded?
|
72
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework::Klass2').loaded?
|
73
|
+
assert_equal false, Impromptu.root_resource.child(:'Load').loaded?
|
74
|
+
assert_equal false, Impromptu.root_resource.child(:'OtherName').loaded?
|
75
|
+
assert_equal false, Impromptu.root_resource.child(:'ModOne').loaded?
|
76
|
+
assert_equal false, Impromptu.root_resource.child(:'ModTwo').loaded?
|
77
|
+
end
|
78
|
+
|
79
|
+
should "09 have all resources specified by the correct number of files" do
|
80
|
+
assert_equal 0, Impromptu.root_resource.child(:'Framework').files.size
|
81
|
+
assert_equal 1, Impromptu.root_resource.child(:'Framework::Extensions').files.size
|
82
|
+
assert_equal 1, Impromptu.root_resource.child(:'Framework::Extensions::Blog').files.size
|
83
|
+
assert_equal 2, Impromptu.root_resource.child(:'Framework::Klass').files.size
|
84
|
+
assert_equal 1, Impromptu.root_resource.child(:'Framework::Klass2').files.size
|
85
|
+
assert_equal 1, Impromptu.root_resource.child(:'Framework::Klass2').files.size
|
86
|
+
assert_equal 1, Impromptu.root_resource.child(:'Load').files.size
|
87
|
+
assert_equal 2, Impromptu.root_resource.child(:'OtherName').files.size
|
88
|
+
assert_equal 1, Impromptu.root_resource.child(:'ModOne').files.size
|
89
|
+
assert_equal 1, Impromptu.root_resource.child(:'ModTwo').files.size
|
90
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework').implicitly_defined?
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
# ----------------------------------------
|
95
|
+
# Loading/unloading
|
96
|
+
# ----------------------------------------
|
97
|
+
should "10 allow loading the implicitly defined framework module" do
|
98
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework').loaded?
|
99
|
+
Impromptu.root_resource.child(:'Framework').reload
|
100
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework').loaded?
|
101
|
+
assert_nothing_raised do
|
102
|
+
Framework
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
should "11 load resources using associated files when required" do
|
107
|
+
# ext
|
108
|
+
Impromptu.root_resource.child(:'Framework::Extensions::Blog').reload
|
109
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework::Extensions').loaded?
|
110
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework::Extensions::Blog').loaded?
|
111
|
+
assert_nothing_raised do
|
112
|
+
Framework::Extensions
|
113
|
+
end
|
114
|
+
assert_nothing_raised do
|
115
|
+
Framework::Extensions::Blog
|
116
|
+
end
|
117
|
+
|
118
|
+
# lib
|
119
|
+
Impromptu.root_resource.child(:'Framework::Klass').reload
|
120
|
+
Impromptu.root_resource.child(:'Framework::Klass2').reload
|
121
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework::Klass').loaded?
|
122
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework::Klass2').loaded?
|
123
|
+
assert_nothing_raised do
|
124
|
+
Framework::Klass
|
125
|
+
end
|
126
|
+
assert_nothing_raised do
|
127
|
+
Framework::Klass2
|
128
|
+
end
|
129
|
+
|
130
|
+
# other
|
131
|
+
Impromptu.root_resource.child(:Load).reload
|
132
|
+
Impromptu.root_resource.child(:OtherName).reload
|
133
|
+
Impromptu.root_resource.child(:ModOne).reload
|
134
|
+
Impromptu.root_resource.child(:ModTwo).reload
|
135
|
+
assert_equal true, Impromptu.root_resource.child(:Load).loaded?
|
136
|
+
assert_equal true, Impromptu.root_resource.child(:OtherName).loaded?
|
137
|
+
assert_equal true, Impromptu.root_resource.child(:ModOne).loaded?
|
138
|
+
assert_equal true, Impromptu.root_resource.child(:ModTwo).loaded?
|
139
|
+
assert_nothing_raised do
|
140
|
+
Load
|
141
|
+
end
|
142
|
+
assert_nothing_raised do
|
143
|
+
OtherName
|
144
|
+
end
|
145
|
+
assert_nothing_raised do
|
146
|
+
ModOne
|
147
|
+
end
|
148
|
+
assert_nothing_raised do
|
149
|
+
ModTwo
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
should "12 load multiple files for a resource when required" do
|
154
|
+
# Klass
|
155
|
+
Impromptu.root_resource.child(:'Framework::Klass').reload
|
156
|
+
assert_respond_to Framework::Klass, :standard_method
|
157
|
+
assert_respond_to Framework::Klass, :overriden_method
|
158
|
+
assert_respond_to Framework::Klass, :extension_method
|
159
|
+
assert_equal 2, Framework::Klass.overriden_method
|
160
|
+
|
161
|
+
# OtherName
|
162
|
+
Impromptu.root_resource.child(:OtherName).reload
|
163
|
+
assert_respond_to OtherName, :one
|
164
|
+
assert_respond_to OtherName, :overriden_method
|
165
|
+
assert_respond_to OtherName, :two
|
166
|
+
assert_equal 4, OtherName.overriden_method
|
167
|
+
end
|
168
|
+
|
169
|
+
should "13 be able to unload implicit and explicit resources" do
|
170
|
+
# explicit
|
171
|
+
Impromptu.root_resource.child(:'Framework::Extensions::Blog').reload
|
172
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework::Extensions').loaded?
|
173
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework::Extensions::Blog').loaded?
|
174
|
+
Impromptu.root_resource.child(:'Framework::Extensions').unload
|
175
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework::Extensions').loaded?
|
176
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework::Extensions::Blog').loaded?
|
177
|
+
|
178
|
+
# implicit
|
179
|
+
Impromptu.root_resource.child(:'Framework').reload
|
180
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework').loaded?
|
181
|
+
Impromptu.root_resource.child(:'Framework').unload
|
182
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework').loaded?
|
183
|
+
end
|
184
|
+
|
185
|
+
should "14 be able to reload previously unloaded resources" do
|
186
|
+
# implicit
|
187
|
+
Impromptu.root_resource.child(:'Framework').reload
|
188
|
+
Impromptu.root_resource.child(:'Framework').unload
|
189
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework').loaded?
|
190
|
+
Impromptu.root_resource.child(:'Framework').reload
|
191
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework').loaded?
|
192
|
+
|
193
|
+
# explicit
|
194
|
+
Impromptu.root_resource.child(:'Framework::Extensions::Blog').reload
|
195
|
+
Impromptu.root_resource.child(:'Framework::Extensions').unload
|
196
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework::Extensions').loaded?
|
197
|
+
assert_equal false, Impromptu.root_resource.child(:'Framework::Extensions::Blog').loaded?
|
198
|
+
Impromptu.root_resource.child(:'Framework::Extensions::Blog').reload
|
199
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework::Extensions').loaded?
|
200
|
+
assert_equal true, Impromptu.root_resource.child(:'Framework::Extensions::Blog').loaded?
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
# ----------------------------------------
|
205
|
+
# Updating files
|
206
|
+
# ----------------------------------------
|
207
|
+
context "and changing the definition of klass" do
|
208
|
+
setup do
|
209
|
+
Impromptu.root_resource.child(:'Framework::Klass').reload
|
210
|
+
new_klass = File.open('test/framework/copies/new_klass.rb').read
|
211
|
+
File.open('test/framework/lib/klass.rb', 'w') do |file|
|
212
|
+
file.write new_klass
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
teardown do
|
217
|
+
old_klass = File.open('test/framework/copies/original_klass.rb').read
|
218
|
+
File.open('test/framework/lib/klass.rb', 'w') do |file|
|
219
|
+
file.write old_klass
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
should "reload a class definition correctly when a file is changed" do
|
224
|
+
# update impromptu and test the new klass is loaded
|
225
|
+
assert_respond_to Framework::Klass, :standard_method
|
226
|
+
assert_equal 2, Framework::Klass.overriden_method
|
227
|
+
Impromptu.update
|
228
|
+
assert_respond_to Framework::Klass, :new_method
|
229
|
+
assert_equal false, Framework::Klass.respond_to?(:standard_method)
|
230
|
+
assert_equal 2, Framework::Klass.overriden_method
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
|
235
|
+
# ----------------------------------------
|
236
|
+
# Adding files
|
237
|
+
# ----------------------------------------
|
238
|
+
context "and adding a new file to a reloadable folder" do
|
239
|
+
setup do
|
240
|
+
FileUtils.mv 'test/framework/copies/new_unseen.rb', 'test/framework/private/unseen.rb'
|
241
|
+
end
|
242
|
+
|
243
|
+
teardown do
|
244
|
+
FileUtils.mv 'test/framework/private/unseen.rb', 'test/framework/copies/new_unseen.rb'
|
245
|
+
end
|
246
|
+
|
247
|
+
should "make the resource from the new file available for loading" do
|
248
|
+
assert_equal false, Impromptu.root_resource.child?(:'Framework::Unseen')
|
249
|
+
Impromptu.update
|
250
|
+
assert_equal true, Impromptu.root_resource.child?(:'Framework::Unseen')
|
251
|
+
Impromptu.root_resource.child(:'Framework::Unseen').reload
|
252
|
+
assert Framework::Unseen.test_method
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
|
257
|
+
# ----------------------------------------
|
258
|
+
# Removing files
|
259
|
+
# ----------------------------------------
|
260
|
+
context "and removing a file from a reloadable folder" do
|
261
|
+
teardown do
|
262
|
+
FileUtils.mv 'test/framework/copies/klass2.rb', 'test/framework/lib/group/klass2.rb'
|
263
|
+
end
|
264
|
+
|
265
|
+
should "make the resource from the old unavailable since its definition has been removed" do
|
266
|
+
# ensure the resource exists and load it
|
267
|
+
assert_equal true, Impromptu.root_resource.child?(:'Framework::Klass2')
|
268
|
+
Impromptu.root_resource.child(:'Framework::Klass2').reload
|
269
|
+
assert_nothing_raised do
|
270
|
+
Framework::Klass2
|
271
|
+
end
|
272
|
+
|
273
|
+
# update and see the missing file
|
274
|
+
FileUtils.mv 'test/framework/lib/group/klass2.rb', 'test/framework/copies/klass2.rb'
|
275
|
+
Impromptu.update
|
276
|
+
assert_equal false, Impromptu.root_resource.child?(:'Framework::Klass2')
|
277
|
+
assert_raise NameError do
|
278
|
+
Framework::Klass2
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
|
284
|
+
# ----------------------------------------
|
285
|
+
# Adding a file to a previously defined
|
286
|
+
# resource
|
287
|
+
# ----------------------------------------
|
288
|
+
context "and adding a file to a previously defined resource" do
|
289
|
+
setup do
|
290
|
+
Impromptu.root_resource.child(:'Framework::Klass2').reload
|
291
|
+
FileUtils.mv 'test/framework/copies/extra_klass2.rb', 'test/framework/private/klass2.rb'
|
292
|
+
end
|
293
|
+
|
294
|
+
teardown do
|
295
|
+
FileUtils.mv 'test/framework/private/klass2.rb', 'test/framework/copies/extra_klass2.rb'
|
296
|
+
end
|
297
|
+
|
298
|
+
should "extend the definition and the list of files implementing the resource" do
|
299
|
+
# existing definition
|
300
|
+
assert Impromptu.root_resource.child?(:'Framework::Klass2')
|
301
|
+
assert_equal 1, Impromptu.root_resource.child(:'Framework::Klass2').files.size
|
302
|
+
assert_equal false, Framework::Klass2.respond_to?(:new_method)
|
303
|
+
|
304
|
+
# extend with new definition
|
305
|
+
Impromptu.update
|
306
|
+
assert_equal 2, Impromptu.root_resource.child(:'Framework::Klass2').files.size
|
307
|
+
assert Framework::Klass2.respond_to?(:new_method)
|
308
|
+
assert Framework::Klass2.new_method
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestOrderedSet < Test::Unit::TestCase
|
4
|
+
context "An ordered set" do
|
5
|
+
setup { @set = Impromptu::OrderedSet.new }
|
6
|
+
|
7
|
+
# ----------------------------------------
|
8
|
+
# API
|
9
|
+
# ----------------------------------------
|
10
|
+
should "respond to push" do
|
11
|
+
assert_respond_to @set, :push
|
12
|
+
end
|
13
|
+
|
14
|
+
should "respond to <<" do
|
15
|
+
assert_respond_to @set, :<<
|
16
|
+
end
|
17
|
+
|
18
|
+
should "respond to merge" do
|
19
|
+
assert_respond_to @set, :merge
|
20
|
+
end
|
21
|
+
|
22
|
+
should "respond to delete" do
|
23
|
+
assert_respond_to @set, :delete
|
24
|
+
end
|
25
|
+
|
26
|
+
should "respond to to_a" do
|
27
|
+
assert_respond_to @set, :to_a
|
28
|
+
end
|
29
|
+
|
30
|
+
should "respond to each" do
|
31
|
+
assert_respond_to @set, :each
|
32
|
+
end
|
33
|
+
|
34
|
+
should "respond to size" do
|
35
|
+
assert_respond_to @set, :size
|
36
|
+
end
|
37
|
+
|
38
|
+
should "respond to empty?" do
|
39
|
+
assert_respond_to @set, :empty?
|
40
|
+
end
|
41
|
+
|
42
|
+
# ----------------------------------------
|
43
|
+
# Core usage
|
44
|
+
# ----------------------------------------
|
45
|
+
should "be able to have items added" do
|
46
|
+
assert_equal 1, @set << 1
|
47
|
+
assert_equal 2, @set.push(2)
|
48
|
+
assert_equal 2, @set.size
|
49
|
+
end
|
50
|
+
|
51
|
+
should "only allow an item to be added once" do
|
52
|
+
assert_equal 1, @set << 1
|
53
|
+
assert_equal 1, @set.push(1)
|
54
|
+
assert_equal 1, @set.size
|
55
|
+
end
|
56
|
+
|
57
|
+
should "store items in order" do
|
58
|
+
@set << 1
|
59
|
+
@set << 2
|
60
|
+
assert_equal [1,2], @set.to_a
|
61
|
+
end
|
62
|
+
|
63
|
+
should "be able to delete items" do
|
64
|
+
@set << 1
|
65
|
+
assert_equal 1, @set.size
|
66
|
+
@set.delete(1)
|
67
|
+
assert_equal 0, @set.size
|
68
|
+
assert_equal true, @set.empty?
|
69
|
+
end
|
70
|
+
|
71
|
+
should "correctly implement empty?" do
|
72
|
+
assert_equal true, @set.empty?
|
73
|
+
@set << 1
|
74
|
+
assert_equal false, @set.empty?
|
75
|
+
end
|
76
|
+
|
77
|
+
should "correctly implement include?" do
|
78
|
+
@set << 1
|
79
|
+
assert_equal true, @set.include?(1)
|
80
|
+
assert_equal false, @set.include?(2)
|
81
|
+
end
|
82
|
+
|
83
|
+
should "be able to be iterated over, in order of insertion" do
|
84
|
+
items = []
|
85
|
+
@set << 1
|
86
|
+
@set << 2
|
87
|
+
@set.each do |item|
|
88
|
+
items << item
|
89
|
+
end
|
90
|
+
assert_equal [1,2], items
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestResource < Test::Unit::TestCase
|
4
|
+
# ----------------------------------------
|
5
|
+
# Root resource and API
|
6
|
+
# ----------------------------------------
|
7
|
+
context "The root resource" do
|
8
|
+
should "exist" do
|
9
|
+
assert_not_nil Impromptu.root_resource
|
10
|
+
end
|
11
|
+
|
12
|
+
should "respond to children?" do
|
13
|
+
assert_respond_to Impromptu.root_resource, :children?
|
14
|
+
end
|
15
|
+
|
16
|
+
should "respond to child?" do
|
17
|
+
assert_respond_to Impromptu.root_resource, :child?
|
18
|
+
end
|
19
|
+
|
20
|
+
should "respond to child" do
|
21
|
+
assert_respond_to Impromptu.root_resource, :child
|
22
|
+
end
|
23
|
+
|
24
|
+
should "respond to reference" do
|
25
|
+
assert_respond_to Impromptu.root_resource, :reference
|
26
|
+
end
|
27
|
+
|
28
|
+
should "respond to get_or_create_child" do
|
29
|
+
assert_respond_to Impromptu.root_resource, :get_or_create_child
|
30
|
+
end
|
31
|
+
|
32
|
+
should "respond to namespace?" do
|
33
|
+
assert_respond_to Impromptu.root_resource, :namespace?
|
34
|
+
end
|
35
|
+
|
36
|
+
should "be a root resource" do
|
37
|
+
assert Impromptu.root_resource.root?
|
38
|
+
end
|
39
|
+
|
40
|
+
should "reference Object" do
|
41
|
+
assert_equal Object, Impromptu.root_resource.reference
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# ----------------------------------------
|
46
|
+
# Hash and equality
|
47
|
+
# ----------------------------------------
|
48
|
+
context "Two resources" do
|
49
|
+
setup { @one = Impromptu::Resource.new(:Object, nil) }
|
50
|
+
context "which refer to the same symbol" do
|
51
|
+
setup { @two = Impromptu::Resource.new(:Object, nil) }
|
52
|
+
should "be equal" do
|
53
|
+
assert @one.eql?(@two)
|
54
|
+
assert @two.eql?(@one)
|
55
|
+
end
|
56
|
+
|
57
|
+
should "have equal hashes" do
|
58
|
+
assert @one.hash == @two.hash
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "which refer to different symbols" do
|
63
|
+
setup { @two = Impromptu::Resource.new(:Test, @one) }
|
64
|
+
should "not be equal" do
|
65
|
+
assert_equal false, @one.eql?(@two)
|
66
|
+
assert_equal false, @two.eql?(@one)
|
67
|
+
end
|
68
|
+
|
69
|
+
should "have different hashes if their symbols have different hashes" do
|
70
|
+
assert_equal false, @one.hash == @two.hash
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# ----------------------------------------
|
76
|
+
# Creating and retrieving resources
|
77
|
+
# ----------------------------------------
|
78
|
+
context "A root resource" do
|
79
|
+
setup { @root = Impromptu::Resource.new(:Object, nil) }
|
80
|
+
context "with a child resource" do
|
81
|
+
setup { @child = @root.get_or_create_child(:Klass) }
|
82
|
+
should "have children" do
|
83
|
+
assert @root.children?
|
84
|
+
end
|
85
|
+
|
86
|
+
should "have a child with the name just created" do
|
87
|
+
assert @root.child?(:Klass)
|
88
|
+
end
|
89
|
+
|
90
|
+
should "be able to retrieve a reference to the child resource" do
|
91
|
+
assert_not_nil @root.child(:Klass)
|
92
|
+
assert_instance_of Impromptu::Resource, @root.child(:Klass)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "with a deep chain of child resources" do
|
97
|
+
setup { @base = @root.get_or_create_child(:'One::Two::Three::Four') }
|
98
|
+
should "have children" do
|
99
|
+
assert @root.children?
|
100
|
+
end
|
101
|
+
|
102
|
+
should "be able to retrieve a reference to each resource just created" do
|
103
|
+
# One
|
104
|
+
assert_not_nil @root.child(:'One')
|
105
|
+
assert_instance_of Impromptu::Resource, @root.child(:'One')
|
106
|
+
|
107
|
+
# One::Two
|
108
|
+
assert_not_nil @root.child(:'One::Two')
|
109
|
+
assert_instance_of Impromptu::Resource, @root.child(:'One::Two')
|
110
|
+
|
111
|
+
# One::Two::Three
|
112
|
+
assert_not_nil @root.child(:'One::Two::Three')
|
113
|
+
assert_instance_of Impromptu::Resource, @root.child(:'One::Two::Three')
|
114
|
+
|
115
|
+
# One::Two::Three::Four
|
116
|
+
assert_not_nil @root.child(:'One::Two::Three::Four')
|
117
|
+
assert_instance_of Impromptu::Resource, @root.child(:'One::Two::Three::Four')
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# ----------------------------------------
|
123
|
+
# Adding/removing references
|
124
|
+
# ----------------------------------------
|
125
|
+
context "A new blank resource" do
|
126
|
+
setup { @resource = Impromptu::Resource.new(:Object, nil) }
|
127
|
+
should "have no files" do
|
128
|
+
assert_equal 0, @resource.files.size
|
129
|
+
end
|
130
|
+
|
131
|
+
should "have no children" do
|
132
|
+
assert_equal 0, @resource.children.size
|
133
|
+
end
|
134
|
+
|
135
|
+
should "be implicitly defined" do
|
136
|
+
assert @resource.implicitly_defined?
|
137
|
+
end
|
138
|
+
|
139
|
+
context "with an added child" do
|
140
|
+
setup do
|
141
|
+
@child = Impromptu::Resource.new(:Test, @resource)
|
142
|
+
@resource.add_child(@child)
|
143
|
+
end
|
144
|
+
|
145
|
+
should "have an added child" do
|
146
|
+
assert_equal 1, @resource.children.size
|
147
|
+
end
|
148
|
+
|
149
|
+
should "be able to remove the child" do
|
150
|
+
@resource.remove_child(@child)
|
151
|
+
assert_equal 0, @resource.children.size
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context "with an added file" do
|
156
|
+
setup do
|
157
|
+
@file = Impromptu::File.new(nil, nil, [:blank])
|
158
|
+
@resource.add_file(@file)
|
159
|
+
end
|
160
|
+
|
161
|
+
should "have an added file" do
|
162
|
+
assert_equal 1, @resource.files.size
|
163
|
+
end
|
164
|
+
|
165
|
+
should "not be implicitly defined" do
|
166
|
+
assert_equal false, @resource.implicitly_defined?
|
167
|
+
end
|
168
|
+
|
169
|
+
should "be able to remove the file" do
|
170
|
+
@resource.remove_file(@file)
|
171
|
+
assert_equal 0, @resource.files.size
|
172
|
+
end
|
173
|
+
|
174
|
+
should "not be implicitly defined after all files are removed" do
|
175
|
+
@resource.remove_file(@file)
|
176
|
+
assert_equal false, @resource.implicitly_defined?
|
177
|
+
end
|
178
|
+
|
179
|
+
should "be implicitly defined after all files are removed if it is a namespace" do
|
180
|
+
@resource.namespace!
|
181
|
+
@resource.remove_file(@file)
|
182
|
+
assert_equal true, @resource.implicitly_defined?
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
data/test/test_symbol.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestResource < Test::Unit::TestCase
|
4
|
+
context "A symbol" do
|
5
|
+
setup { @symbol = :ASymbolWhichDoesntNormallyExist }
|
6
|
+
|
7
|
+
# ----------------------------------------
|
8
|
+
# API
|
9
|
+
# ----------------------------------------
|
10
|
+
should "respond to nested?" do
|
11
|
+
assert_respond_to @symbol, :nested?
|
12
|
+
end
|
13
|
+
|
14
|
+
should "respond to unnested?" do
|
15
|
+
assert_respond_to @symbol, :unnested?
|
16
|
+
end
|
17
|
+
|
18
|
+
should "respond to nested_symbols" do
|
19
|
+
assert_respond_to @symbol, :nested_symbols
|
20
|
+
end
|
21
|
+
|
22
|
+
should "respond to base_symbol" do
|
23
|
+
assert_respond_to @symbol, :base_symbol
|
24
|
+
end
|
25
|
+
|
26
|
+
should "respond to root_symbol" do
|
27
|
+
assert_respond_to @symbol, :root_symbol
|
28
|
+
end
|
29
|
+
|
30
|
+
should "respond to each_namespaced_symbol" do
|
31
|
+
assert_respond_to @symbol, :each_namespaced_symbol
|
32
|
+
end
|
33
|
+
|
34
|
+
# ----------------------------------------
|
35
|
+
# Unnested symbol
|
36
|
+
# ----------------------------------------
|
37
|
+
context "which isn't nested" do
|
38
|
+
should "return false for nested?" do
|
39
|
+
assert_equal false, @symbol.nested?
|
40
|
+
end
|
41
|
+
|
42
|
+
should "return true for unnested?" do
|
43
|
+
assert @symbol.unnested?
|
44
|
+
end
|
45
|
+
|
46
|
+
should "return an array of a single symbol from nested_symbols" do
|
47
|
+
assert_instance_of Array, @symbol.nested_symbols
|
48
|
+
assert_equal 1, @symbol.nested_symbols.size
|
49
|
+
assert_instance_of Symbol, @symbol.nested_symbols.first
|
50
|
+
end
|
51
|
+
|
52
|
+
should "return itself for base_symbol" do
|
53
|
+
assert_equal @symbol, @symbol.base_symbol
|
54
|
+
end
|
55
|
+
|
56
|
+
should "return itself for root_symbol" do
|
57
|
+
assert_equal @symbol, @symbol.root_symbol
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# ----------------------------------------
|
62
|
+
# Nested symbol
|
63
|
+
# ----------------------------------------
|
64
|
+
context "which is nested" do
|
65
|
+
setup { @symbol = :'TopLevel::BottomLevel' }
|
66
|
+
should "return true for nested?" do
|
67
|
+
assert @symbol.nested?
|
68
|
+
end
|
69
|
+
|
70
|
+
should "return false for unnested?" do
|
71
|
+
assert_equal false, @symbol.unnested?
|
72
|
+
end
|
73
|
+
|
74
|
+
should "return an array of multiple symbols from nested_symbols" do
|
75
|
+
assert_instance_of Array, @symbol.nested_symbols
|
76
|
+
assert_equal 2, @symbol.nested_symbols.size
|
77
|
+
assert_instance_of Symbol, @symbol.nested_symbols[0]
|
78
|
+
assert_instance_of Symbol, @symbol.nested_symbols[1]
|
79
|
+
end
|
80
|
+
|
81
|
+
should "return the first nested name for root_symbol" do
|
82
|
+
assert_equal :TopLevel, @symbol.root_symbol
|
83
|
+
end
|
84
|
+
|
85
|
+
should "return the last nested name for base_symbol" do
|
86
|
+
assert_equal :BottomLevel, @symbol.base_symbol
|
87
|
+
end
|
88
|
+
|
89
|
+
should "return consecutive namespaced symbols when calling each_namespaced_symbol" do
|
90
|
+
symbols = []
|
91
|
+
@symbol.each_namespaced_symbol do |symbol|
|
92
|
+
symbols << symbol
|
93
|
+
end
|
94
|
+
|
95
|
+
assert_equal [:TopLevel, :'TopLevel::BottomLevel'], symbols
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|