minilab 1.0.0-mswin32
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 +2 -0
- data/CHANGES +2 -0
- data/LICENSE +19 -0
- data/README +107 -0
- data/Rakefile +145 -0
- data/config/environment.rb +15 -0
- data/config/objects.yml +22 -0
- data/lib/analog_io.rb +30 -0
- data/lib/digital_auxport_io.rb +49 -0
- data/lib/digital_configuration.rb +66 -0
- data/lib/digital_port_io.rb +68 -0
- data/lib/extension/extconf.rb +4 -0
- data/lib/extension/minilab_hardware.c +235 -0
- data/lib/extension/minilab_hardware.so +0 -0
- data/lib/library_translator.rb +48 -0
- data/lib/minilab.rb +149 -0
- data/lib/minilab_context.rb +39 -0
- data/lib/result_verifier.rb +14 -0
- data/test/integration/analog_input_output_test.rb +43 -0
- data/test/integration/connect_to_hardware_test.rb +13 -0
- data/test/integration/digital_input_output_test.rb +114 -0
- data/test/integration/integration_test.rb +53 -0
- data/test/integration/require_minilab_test.rb +9 -0
- data/test/system/analog_input.test +3 -0
- data/test/system/analog_output.test +37 -0
- data/test/system/digital_port_input.test +5 -0
- data/test/system/digital_port_output.test +39 -0
- data/test/system/digital_port_read_byte.test +26 -0
- data/test/system/digital_screw_terminals_input.test +2 -0
- data/test/system/digital_screw_terminals_output.test +11 -0
- data/test/system/minilab_driver.rb +85 -0
- data/test/test_helper.rb +11 -0
- data/test/unit/analog_io_test.rb +87 -0
- data/test/unit/digital_auxport_io_test.rb +114 -0
- data/test/unit/digital_configuration_test.rb +136 -0
- data/test/unit/digital_port_io_test.rb +117 -0
- data/test/unit/library_translator_test.rb +100 -0
- data/test/unit/minilab_context_test.rb +82 -0
- data/test/unit/minilab_hardware_test.rb +83 -0
- data/test/unit/minilab_test.rb +131 -0
- data/test/unit/result_verifier_test.rb +33 -0
- data/vendor/behaviors/lib/behaviors.rb +50 -0
- data/vendor/behaviors/tasks/behaviors_tasks.rake +140 -0
- data/vendor/behaviors/test/behaviors_tasks_test.rb +71 -0
- data/vendor/behaviors/test/behaviors_test.rb +50 -0
- data/vendor/behaviors/test/tasks_test/Rakefile +16 -0
- data/vendor/behaviors/test/tasks_test/doc/behaviors.html +55 -0
- data/vendor/behaviors/test/tasks_test/lib/user.rb +2 -0
- data/vendor/behaviors/test/tasks_test/test/user_test.rb +17 -0
- data/vendor/constructor/Rakefile +44 -0
- data/vendor/constructor/config/environment.rb +12 -0
- data/vendor/constructor/lib/constructor.rb +132 -0
- data/vendor/constructor/test/constructor_test.rb +366 -0
- data/vendor/constructor/test/helper.rb +3 -0
- data/vendor/diy/README +26 -0
- data/vendor/diy/Rakefile +18 -0
- data/vendor/diy/lib/constructor.rb +114 -0
- data/vendor/diy/lib/diy.rb +329 -0
- data/vendor/diy/proto/context.rb +117 -0
- data/vendor/diy/proto/context.yml +20 -0
- data/vendor/diy/test/diy_test.rb +370 -0
- data/vendor/diy/test/files/broken_construction.yml +7 -0
- data/vendor/diy/test/files/cat/cat.rb +4 -0
- data/vendor/diy/test/files/cat/extra_conflict.yml +5 -0
- data/vendor/diy/test/files/cat/heritage.rb +2 -0
- data/vendor/diy/test/files/cat/needs_input.yml +3 -0
- data/vendor/diy/test/files/cat/the_cat_lineage.rb +1 -0
- data/vendor/diy/test/files/dog/dog_model.rb +4 -0
- data/vendor/diy/test/files/dog/dog_presenter.rb +4 -0
- data/vendor/diy/test/files/dog/dog_view.rb +2 -0
- data/vendor/diy/test/files/dog/file_resolver.rb +2 -0
- data/vendor/diy/test/files/dog/other_thing.rb +2 -0
- data/vendor/diy/test/files/dog/simple.yml +11 -0
- data/vendor/diy/test/files/donkey/foo.rb +8 -0
- data/vendor/diy/test/files/donkey/foo/bar/qux.rb +7 -0
- data/vendor/diy/test/files/fud/objects.yml +13 -0
- data/vendor/diy/test/files/fud/toy.rb +15 -0
- data/vendor/diy/test/files/gnu/objects.yml +14 -0
- data/vendor/diy/test/files/gnu/thinger.rb +8 -0
- data/vendor/diy/test/files/goat/base.rb +8 -0
- data/vendor/diy/test/files/goat/can.rb +6 -0
- data/vendor/diy/test/files/goat/goat.rb +6 -0
- data/vendor/diy/test/files/goat/objects.yml +12 -0
- data/vendor/diy/test/files/goat/paper.rb +6 -0
- data/vendor/diy/test/files/goat/plane.rb +8 -0
- data/vendor/diy/test/files/goat/shirt.rb +6 -0
- data/vendor/diy/test/files/goat/wings.rb +8 -0
- data/vendor/diy/test/files/horse/holder_thing.rb +4 -0
- data/vendor/diy/test/files/horse/objects.yml +7 -0
- data/vendor/diy/test/files/yak/core_model.rb +4 -0
- data/vendor/diy/test/files/yak/core_presenter.rb +4 -0
- data/vendor/diy/test/files/yak/core_view.rb +1 -0
- data/vendor/diy/test/files/yak/data_source.rb +1 -0
- data/vendor/diy/test/files/yak/fringe_model.rb +4 -0
- data/vendor/diy/test/files/yak/fringe_presenter.rb +4 -0
- data/vendor/diy/test/files/yak/fringe_view.rb +1 -0
- data/vendor/diy/test/files/yak/my_objects.yml +21 -0
- data/vendor/diy/test/test_helper.rb +40 -0
- data/vendor/hardmock/CHANGES +8 -0
- data/vendor/hardmock/LICENSE +7 -0
- data/vendor/hardmock/README +48 -0
- data/vendor/hardmock/Rakefile +100 -0
- data/vendor/hardmock/TODO +7 -0
- data/vendor/hardmock/config/environment.rb +12 -0
- data/vendor/hardmock/homepage/demo.rb +21 -0
- data/vendor/hardmock/homepage/hardmock_sample.png +0 -0
- data/vendor/hardmock/homepage/index.html +65 -0
- data/vendor/hardmock/init.rb +3 -0
- data/vendor/hardmock/lib/hardmock.rb +634 -0
- data/vendor/hardmock/lib/method_cleanout.rb +14 -0
- data/vendor/hardmock/rcov.rake +18 -0
- data/vendor/hardmock/test/functional/assert_error_test.rb +52 -0
- data/vendor/hardmock/test/functional/auto_verify_test.rb +192 -0
- data/vendor/hardmock/test/functional/direct_mock_usage_test.rb +396 -0
- data/vendor/hardmock/test/functional/hardmock_test.rb +380 -0
- data/vendor/hardmock/test/test_helper.rb +23 -0
- data/vendor/hardmock/test/unit/expectation_builder_test.rb +18 -0
- data/vendor/hardmock/test/unit/expector_test.rb +56 -0
- data/vendor/hardmock/test/unit/method_cleanout_test.rb +35 -0
- data/vendor/hardmock/test/unit/mock_control_test.rb +172 -0
- data/vendor/hardmock/test/unit/mock_test.rb +273 -0
- data/vendor/hardmock/test/unit/simple_expectation_test.rb +345 -0
- data/vendor/hardmock/test/unit/trapper_test.rb +60 -0
- data/vendor/hardmock/test/unit/verify_error_test.rb +34 -0
- data/vendor/systir/systir.rb +403 -0
- data/vendor/systir/test/unit/ui/xml/testrunner.rb +192 -0
- data/vendor/systir/test/unit/ui/xml/xmltestrunner.xslt +109 -0
- metadata +235 -0
@@ -0,0 +1,370 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper"
|
2
|
+
require 'diy'
|
3
|
+
require 'fileutils'
|
4
|
+
include FileUtils
|
5
|
+
|
6
|
+
class DIYTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
# Add load paths:
|
10
|
+
%w|gnu dog cat yak donkey goat horse fud|.each do |p|
|
11
|
+
libdir = path_to_test_file(p)
|
12
|
+
$: << libdir unless $:.member?(libdir)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# HELPERS
|
18
|
+
#
|
19
|
+
def path_to_test_file(fname)
|
20
|
+
path_to("/files/#{fname}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def load_context(file_name)
|
24
|
+
hash = YAML.load(File.read(path_to_test_file(file_name)))
|
25
|
+
load_hash(hash)
|
26
|
+
end
|
27
|
+
|
28
|
+
def load_hash(hash)
|
29
|
+
@diy = DIY::Context.new(hash)
|
30
|
+
end
|
31
|
+
|
32
|
+
def check_dog_objects(context)
|
33
|
+
assert_not_nil context, "nil context"
|
34
|
+
names = %w|dog_presenter dog_model dog_view file_resolver|
|
35
|
+
names.each do |n|
|
36
|
+
assert context.contains_object(n), "Context had no object '#{n}'"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# TESTS
|
42
|
+
#
|
43
|
+
|
44
|
+
def test_essential_use_case
|
45
|
+
load_context "dog/simple.yml"
|
46
|
+
|
47
|
+
# Check object defs
|
48
|
+
check_dog_objects @diy
|
49
|
+
|
50
|
+
# Tweak the load-path
|
51
|
+
$: << path_to_test_file("dog")
|
52
|
+
|
53
|
+
# Get the objects, use reference comparison to check composition
|
54
|
+
presenter = @diy.get_object('dog_presenter')
|
55
|
+
assert_not_nil presenter, 'nil dog_presenter'
|
56
|
+
|
57
|
+
model = @diy.get_object('dog_model')
|
58
|
+
assert_not_nil model, 'nil dog_model'
|
59
|
+
assert_same presenter.model, model, "Different model came from context than found in presenter"
|
60
|
+
|
61
|
+
view = @diy.get_object('dog_view')
|
62
|
+
assert_not_nil view, 'nil dog_view'
|
63
|
+
assert_same presenter.view, view, "Different view came from context than found in presenter"
|
64
|
+
|
65
|
+
resolver = @diy.get_object('file_resolver')
|
66
|
+
assert_not_nil resolver, 'nil file_resolver'
|
67
|
+
assert_same model.file_resolver, resolver, "File resolver in model is different than one in context"
|
68
|
+
|
69
|
+
# Check repeat access:
|
70
|
+
assert_same model, @diy.get_object('dog_model'), "Second access of model yielded different result"
|
71
|
+
assert_same view, @diy.get_object('dog_view'), "Second access of view yielded different result"
|
72
|
+
assert_same presenter, @diy.get_object('dog_presenter'), "Second access of presenter got difrnt result"
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_classname_inside_a_module
|
76
|
+
load_hash 'thinger' => {'class' => "DiyTesting::Bar::Foo", 'lib' => 'foo'}
|
77
|
+
@diy.build_everything
|
78
|
+
assert_not_nil @diy['thinger'], "Should have got my thinger (which is hiding in a couple modules)"
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_classname_inside_a_module_loads_from_directories_named_after_the_underscored_module_names
|
82
|
+
load_hash 'thinger' => {'class' => "Foo::Bar::Qux"}
|
83
|
+
# expect it to be loaded from: foo/bar/qux.rb
|
84
|
+
@diy.build_everything
|
85
|
+
assert_not_nil @diy['thinger'], "Should have got my thinger (which is hiding in a couple modules)"
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_classname_inside_a_module_derives_the_namespaced_classname_from_the_underscored_object_def_key
|
89
|
+
load_hash 'foo/bar/qux' => nil
|
90
|
+
@diy.build_everything
|
91
|
+
assert_not_nil @diy['foo/bar/qux'], "Should have got my qux (which is hiding in a couple modules)"
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_keys
|
95
|
+
load_context "dog/simple.yml"
|
96
|
+
assert_equal %w|dog_model dog_presenter dog_view file_resolver other_thing|, @diy.keys.sort
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_constructor_no_hash
|
100
|
+
assert_raise RuntimeError do DIY::Context.new(nil) end
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_constructor_bad_extra_inputs
|
104
|
+
err = assert_raise RuntimeError do
|
105
|
+
DIY::Context.new({}, Object.new)
|
106
|
+
end
|
107
|
+
assert_match(/extra inputs/i, err.message)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_from_yaml
|
111
|
+
text = File.read(path_to_test_file("dog/simple.yml"))
|
112
|
+
diy = DIY::Context.from_yaml(text)
|
113
|
+
check_dog_objects diy
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_from_yaml_extra_inputs
|
117
|
+
extra = { 'the_cat_lineage' => 'siamese', :some_meat => 'horse' }
|
118
|
+
diy = DIY::Context.from_yaml(File.read(path_to_test_file('cat/needs_input.yml')), extra)
|
119
|
+
cat = diy['cat']
|
120
|
+
assert_equal 'siamese', cat.heritage
|
121
|
+
assert_equal 'horse', cat.food
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_from_file
|
125
|
+
diy = DIY::Context.from_file(path_to_test_file("dog/simple.yml"))
|
126
|
+
check_dog_objects diy
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_from_file_bad
|
130
|
+
assert_raise RuntimeError do
|
131
|
+
DIY::Context.from_file(nil)
|
132
|
+
end
|
133
|
+
assert_raise Errno::ENOENT do
|
134
|
+
DIY::Context.from_file("bad file name")
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_from_file_extra_inputs
|
139
|
+
extra = { 'the_cat_lineage' => 'siamese', :some_meat => 'horse' }
|
140
|
+
diy = DIY::Context.from_file(path_to_test_file('cat/needs_input.yml'), extra)
|
141
|
+
cat = diy['cat']
|
142
|
+
assert_equal 'siamese', cat.heritage
|
143
|
+
assert_equal 'horse', cat.food
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_contains_object
|
147
|
+
load_context "dog/simple.yml"
|
148
|
+
assert @diy.contains_object('dog_presenter'), "Should be true for dog_presenter"
|
149
|
+
assert !@diy.contains_object('woops'), "Should return false for 'woops'"
|
150
|
+
err = assert_raise ArgumentError do
|
151
|
+
@diy.contains_object(nil)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_contains_object_extra_inputs
|
156
|
+
extra = { 'the_cat_lineage' => 'siamese', :some_meat => 'horse' }
|
157
|
+
main = YAML.load(File.read(path_to_test_file('cat/needs_input.yml')))
|
158
|
+
diy = DIY::Context.new(main, extra)
|
159
|
+
|
160
|
+
assert diy.contains_object('cat')
|
161
|
+
assert diy.contains_object('the_cat_lineage')
|
162
|
+
assert diy.contains_object('some_meat')
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_get_object
|
166
|
+
load_context "dog/simple.yml"
|
167
|
+
assert_not_nil @diy.get_object('file_resolver'), "nil resolver?"
|
168
|
+
assert_raise ArgumentError do
|
169
|
+
@diy.get_object(nil)
|
170
|
+
end
|
171
|
+
assert_raise DIY::ConstructionError do
|
172
|
+
@diy.get_object("no such object")
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_hash_style_access
|
177
|
+
load_context "dog/simple.yml"
|
178
|
+
assert_not_nil @diy['file_resolver'], "nil resolver?"
|
179
|
+
assert_raise ArgumentError do
|
180
|
+
@diy[nil]
|
181
|
+
end
|
182
|
+
assert_raise DIY::ConstructionError do
|
183
|
+
@diy["no such object"]
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_get_object_construction_error
|
188
|
+
load_context "broken_construction.yml"
|
189
|
+
err = assert_raise DIY::ConstructionError do
|
190
|
+
@diy.get_object 'dog_presenter'
|
191
|
+
end
|
192
|
+
assert_match(/dog_presenter/, err.message)
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_context_with_extra_inputs
|
196
|
+
extra = { 'the_cat_lineage' => 'siamese', :some_meat => 'horse' }
|
197
|
+
main = YAML.load(File.read(path_to_test_file('cat/needs_input.yml')))
|
198
|
+
diy = DIY::Context.new(main, extra)
|
199
|
+
cat = diy['cat']
|
200
|
+
assert_equal 'siamese', cat.heritage
|
201
|
+
assert_equal 'horse', cat.food
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_conflicting_extra_inputs
|
205
|
+
extra = { 'the_cat_lineage' => 'siamese', :some_meat => 'horse' }
|
206
|
+
main = YAML.load(File.read(path_to_test_file('cat/extra_conflict.yml')))
|
207
|
+
|
208
|
+
DIY::Context.new(main,extra)
|
209
|
+
flunk "Should have raised err"
|
210
|
+
rescue Exception => err
|
211
|
+
assert_match(/conflict/i, err.message)
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_sub_context
|
215
|
+
load_context 'yak/my_objects.yml'
|
216
|
+
|
217
|
+
core_model = @diy['core_model']
|
218
|
+
assert_not_nil core_model, "no core model in main context?"
|
219
|
+
|
220
|
+
fmodel1 = nil
|
221
|
+
fview1 = nil
|
222
|
+
@diy.within('fringe_context') do |fc|
|
223
|
+
assert_not_nil fc["fringe_presenter"], "no fringe presenter"
|
224
|
+
fmodel1 = fc["fringe_model"]
|
225
|
+
fmodel1a = fc["fringe_model"]
|
226
|
+
assert_same fmodel1, fmodel1a, "Second fring model in fringe_context came out different"
|
227
|
+
assert_not_nil fmodel1, "no fringe_model"
|
228
|
+
fview1 = fc["fringe_view"]
|
229
|
+
assert_not_nil fview1, "no fringe_view"
|
230
|
+
assert_same core_model, fmodel1.connected
|
231
|
+
end
|
232
|
+
|
233
|
+
fmodel2 = nil
|
234
|
+
fview2 = nil
|
235
|
+
@diy.within('fringe_context') do |fc|
|
236
|
+
assert_not_nil fc["fringe_presenter"], "2: no fringe presenter"
|
237
|
+
fmodel2 = fc["fringe_model"]
|
238
|
+
fmodel2a = fc["fringe_model"]
|
239
|
+
assert_same fmodel2, fmodel2a, "Second fringe model in fringe_context came out different"
|
240
|
+
assert_not_nil fmodel2, "2: no fringe_model"
|
241
|
+
fview2 = fc["fringe_view"]
|
242
|
+
assert_not_nil fview2, "2: no fringe_view"
|
243
|
+
assert_same core_model, fmodel2.connected
|
244
|
+
|
245
|
+
assert fmodel1.object_id != fmodel2.object_id, "fringe models 1 and 2 are same!"
|
246
|
+
assert fview1.object_id != fview2.object_id, "fringe views 1 and 2 are same!"
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
def test_build_everything
|
251
|
+
# Singletons in the goat context will generate test output in their constructors.
|
252
|
+
# We just gotta tell em where:
|
253
|
+
ofile = path_to_test_file('goat/output.tmp')
|
254
|
+
$goat_test_output_file = ofile
|
255
|
+
|
256
|
+
# Reusable setup for this test
|
257
|
+
prep_output = proc do
|
258
|
+
remove ofile if File.exist?(ofile)
|
259
|
+
end
|
260
|
+
|
261
|
+
# Reusable assertion set and cleanup
|
262
|
+
examine_output = proc do
|
263
|
+
# Examine output file for expected construction
|
264
|
+
assert File.exist?(ofile), "no goat output created"
|
265
|
+
lines = File.readlines(ofile).map { |x| x.strip }
|
266
|
+
%w|can paper shirt goat|.each do |object|
|
267
|
+
assert lines.member?("#{object} built"), "Didn't see constructor output for #{object}"
|
268
|
+
end
|
269
|
+
assert_equal 4, lines.size, "wrong number of entries in output file"
|
270
|
+
|
271
|
+
# Make sure the subcontext was not built
|
272
|
+
assert !lines.member?("plane built"), "plane should not have been built -- it's in the subcontext"
|
273
|
+
assert !lines.member?("wings built"), "wings should not have been built -- it's in the subcontext"
|
274
|
+
|
275
|
+
# Check the objects in the context
|
276
|
+
%w|can paper shirt goat|.each do |object|
|
277
|
+
assert_same @diy[object], @diy[object], "Multiple accesses on #{object} yielded different refs"
|
278
|
+
end
|
279
|
+
|
280
|
+
# Try the subcontext
|
281
|
+
@diy.within('the_sub_context') do |tsc|
|
282
|
+
%w|plane wings|.each do |object|
|
283
|
+
assert_same tsc[object], tsc[object], "Multiple accesses on #{object} (in subcontext) yielded different refs"
|
284
|
+
end
|
285
|
+
end
|
286
|
+
# cleanup
|
287
|
+
remove ofile if File.exist?(ofile)
|
288
|
+
end
|
289
|
+
|
290
|
+
# Test all three methods
|
291
|
+
[:build_everything, :build_all, :preinstantiate_singletons].each do |method_name|
|
292
|
+
prep_output.call
|
293
|
+
load_context 'goat/objects.yml'
|
294
|
+
# go
|
295
|
+
@diy.send method_name
|
296
|
+
examine_output.call
|
297
|
+
end
|
298
|
+
ensure
|
299
|
+
# cleanup
|
300
|
+
remove ofile if File.exist?(ofile)
|
301
|
+
end
|
302
|
+
|
303
|
+
# See that the current object factory context can be referenced within the yaml
|
304
|
+
def test_this_context
|
305
|
+
load_context 'horse/objects.yml'
|
306
|
+
|
307
|
+
assert_same @diy, @diy['this_context'], "basic self-reference failed"
|
308
|
+
assert_same @diy, @diy['holder_thing'].thing_held, "composition self-reference failed"
|
309
|
+
end
|
310
|
+
|
311
|
+
def test_this_context_works_for_subcontexts
|
312
|
+
load_context 'horse/objects.yml'
|
313
|
+
|
314
|
+
@diy.within('repeater') do |ctx|
|
315
|
+
assert_same ctx, ctx['this_context'], "self-ref inside a subcontext doesn't work"
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
def test_multiple_classes_in_one_file
|
320
|
+
load_context 'fud/objects.yml'
|
321
|
+
|
322
|
+
toy = @diy['toy']
|
323
|
+
widget = @diy['widget']
|
324
|
+
thing = @diy['thing_ama_jack']
|
325
|
+
trinket = @diy['trinket']
|
326
|
+
|
327
|
+
assert_same widget, toy.widget, "wrong widget in toy"
|
328
|
+
assert_same trinket, toy.trinket, "wrong trinket in toy"
|
329
|
+
assert_same thing, trinket.thing_ama_jack, "wrong thing_ama_jack in trinket"
|
330
|
+
end
|
331
|
+
|
332
|
+
def test_objects_can_be_set_in_a_context_and_diy_will_not_attempt_to_build_it_as_a_dependency
|
333
|
+
load_context 'gnu/objects.yml'
|
334
|
+
|
335
|
+
injected = 'boom'
|
336
|
+
@diy[:injected] = injected
|
337
|
+
thinger = @diy[:thinger]
|
338
|
+
assert_not_nil thinger
|
339
|
+
assert_same injected, thinger.injected
|
340
|
+
assert_same injected, @diy[:injected]
|
341
|
+
|
342
|
+
inner_injected = 'slam'
|
343
|
+
@diy.within :inny do |sub|
|
344
|
+
sub.set_object :inner_injected, inner_injected
|
345
|
+
inner_thinger = sub[:inner_thinger]
|
346
|
+
assert_not_nil inner_thinger
|
347
|
+
assert_same inner_injected, inner_thinger.injected
|
348
|
+
assert_same inner_injected, sub[:inner_injected]
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
def test_should_not_allow_setting_of_an_object_which_has_already_been_loaded
|
353
|
+
load_context 'gnu/objects.yml'
|
354
|
+
|
355
|
+
injected = 'boom'
|
356
|
+
@diy[:injected] = injected
|
357
|
+
err = assert_raise RuntimeError do
|
358
|
+
@diy[:injected] = injected
|
359
|
+
end
|
360
|
+
assert_match /object 'injected' already exists/i, err.message
|
361
|
+
assert_same injected, @diy[:injected]
|
362
|
+
|
363
|
+
thinger = @diy[:thinger]
|
364
|
+
err = assert_raise RuntimeError do
|
365
|
+
@diy[:thinger] = 'sdf'
|
366
|
+
end
|
367
|
+
assert_match /object 'thinger' already exists/i, err.message
|
368
|
+
assert_same thinger, @diy[:thinger]
|
369
|
+
end
|
370
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
class TheCatLineage; end
|