blockenspiel 0.2.0.1-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,42 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Blockenspiel version
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2008-2009 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ module Blockenspiel
38
+
39
+ # Current gem version
40
+ VERSION_STRING = '0.2.0.1'.freeze
41
+
42
+ end
@@ -0,0 +1,137 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Blockenspiel basic tests
4
+ #
5
+ # This file contains tests for the simple use cases.
6
+ #
7
+ # -----------------------------------------------------------------------------
8
+ # Copyright 2008-2009 Daniel Azuma
9
+ #
10
+ # All rights reserved.
11
+ #
12
+ # Redistribution and use in source and binary forms, with or without
13
+ # modification, are permitted provided that the following conditions are met:
14
+ #
15
+ # * Redistributions of source code must retain the above copyright notice,
16
+ # this list of conditions and the following disclaimer.
17
+ # * Redistributions in binary form must reproduce the above copyright notice,
18
+ # this list of conditions and the following disclaimer in the documentation
19
+ # and/or other materials provided with the distribution.
20
+ # * Neither the name of the copyright holder, nor the names of any other
21
+ # contributors to this software, may be used to endorse or promote products
22
+ # derived from this software without specific prior written permission.
23
+ #
24
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
+ # POSSIBILITY OF SUCH DAMAGE.
35
+ # -----------------------------------------------------------------------------
36
+ ;
37
+
38
+
39
+ require 'test/unit'
40
+ require File.expand_path("#{File.dirname(__FILE__)}/../lib/blockenspiel.rb")
41
+
42
+
43
+ module Blockenspiel
44
+ module Tests # :nodoc:
45
+
46
+ class TestBasic < Test::Unit::TestCase # :nodoc:
47
+
48
+
49
+ class SimpleTarget < Blockenspiel::Base
50
+
51
+ def initialize
52
+ @hash = Hash.new
53
+ end
54
+
55
+ def set_value(key_, value_)
56
+ @hash[key_] = value_
57
+ end
58
+
59
+ def set_value_by_block(key_)
60
+ @hash[key_] = yield
61
+ end
62
+
63
+ def get_value(key_)
64
+ @hash[key_]
65
+ end
66
+ dsl_method :get_value, false
67
+
68
+ end
69
+
70
+
71
+ # Test basic usage with a parameter object.
72
+ #
73
+ # * Asserts that methods are not mixed in to self.
74
+ # * Asserts that the specified target object does in fact receive the block messages.
75
+
76
+ def test_basic_param
77
+ block_ = proc do |t_|
78
+ t_.set_value(:a, 1)
79
+ t_.set_value_by_block(:b){ 2 }
80
+ assert(!self.respond_to?(:set_value))
81
+ assert(!self.respond_to?(:set_value_by_block))
82
+ end
83
+ target_ = SimpleTarget.new
84
+ Blockenspiel.invoke(block_, target_)
85
+ assert_equal(1, target_.get_value(:a))
86
+ assert_equal(2, target_.get_value(:b))
87
+ end
88
+
89
+
90
+ # Test basic usage with a mixin.
91
+ #
92
+ # * Asserts that methods are mixed in to self.
93
+ # * Asserts that methods are removed from self afterward.
94
+ # * Asserts that the specified target object still receives the messages.
95
+
96
+ def test_basic_mixin
97
+ block_ = proc do
98
+ set_value(:a, 1)
99
+ set_value_by_block(:b){ 2 }
100
+ end
101
+ target_ = SimpleTarget.new
102
+ Blockenspiel.invoke(block_, target_)
103
+ assert(!self.respond_to?(:set_value))
104
+ assert(!self.respond_to?(:set_value_by_block))
105
+ assert_equal(1, target_.get_value(:a))
106
+ assert_equal(2, target_.get_value(:b))
107
+ end
108
+
109
+
110
+ # Test basic usage with a builder.
111
+ #
112
+ # * Asserts that the receivers are called.
113
+ # * Asserts that receivers with blocks are handled properly.
114
+
115
+ def test_basic_builder
116
+ block_ = proc do
117
+ set_value(:a, 1)
118
+ set_value_by_block(:b){ 2 }
119
+ end
120
+ hash_ = Hash.new
121
+ Blockenspiel.invoke(block_) do
122
+ add_method(:set_value) do |key_, value_|
123
+ hash_[key_] = value_
124
+ end
125
+ add_method(:set_value_by_block, :block => true) do |bl_, key_|
126
+ hash_[key_] = bl_.call
127
+ end
128
+ end
129
+ assert_equal(1, hash_[:a])
130
+ assert_equal(2, hash_[:b])
131
+ end
132
+
133
+
134
+ end
135
+
136
+ end
137
+ end
@@ -0,0 +1,191 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Blockenspiel behavior tests
4
+ #
5
+ # This file contains tests for behavior settings.
6
+ #
7
+ # -----------------------------------------------------------------------------
8
+ # Copyright 2008-2009 Daniel Azuma
9
+ #
10
+ # All rights reserved.
11
+ #
12
+ # Redistribution and use in source and binary forms, with or without
13
+ # modification, are permitted provided that the following conditions are met:
14
+ #
15
+ # * Redistributions of source code must retain the above copyright notice,
16
+ # this list of conditions and the following disclaimer.
17
+ # * Redistributions in binary form must reproduce the above copyright notice,
18
+ # this list of conditions and the following disclaimer in the documentation
19
+ # and/or other materials provided with the distribution.
20
+ # * Neither the name of the copyright holder, nor the names of any other
21
+ # contributors to this software, may be used to endorse or promote products
22
+ # derived from this software without specific prior written permission.
23
+ #
24
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
+ # POSSIBILITY OF SUCH DAMAGE.
35
+ # -----------------------------------------------------------------------------
36
+ ;
37
+
38
+
39
+ require 'test/unit'
40
+ require File.expand_path("#{File.dirname(__FILE__)}/../lib/blockenspiel.rb")
41
+
42
+
43
+ module Blockenspiel
44
+ module Tests # :nodoc:
45
+
46
+ class TextBehaviors < Test::Unit::TestCase # :nodoc:
47
+
48
+
49
+ class Target1 < Blockenspiel::Base
50
+
51
+ dsl_methods false
52
+
53
+ def initialize(hash_)
54
+ @hash = hash_
55
+ end
56
+
57
+ def set_value1(key_, value_)
58
+ @hash["#{key_}1"] = value_
59
+ end
60
+ dsl_method :set_value1
61
+
62
+ def set_value2(key_)
63
+ @hash["#{key_}2"] = yield
64
+ end
65
+ dsl_method :set_value2
66
+
67
+ def set_value3(key_, value_)
68
+ @hash["#{key_}3"] = value_
69
+ end
70
+ dsl_method :set_value3_dslversion, :set_value3
71
+
72
+ end
73
+
74
+
75
+ def helper_method
76
+ true
77
+ end
78
+
79
+
80
+ # Test instance_eval behavior.
81
+ #
82
+ # * Asserts that self points at the target.
83
+ # * Asserts that the target methods are available.
84
+ # * Asserts that the target methods are not renamed by dsl_method directives.
85
+ # * Asserts that the caller's instance variables are not available.
86
+ # * Asserts that the caller's helper methods are not available.
87
+
88
+ def test_instance_eval_behavior
89
+ hash_ = Hash.new
90
+ context_self_ = self
91
+ @my_instance_variable_test = :hello
92
+ block_ = proc do
93
+ set_value1('a', 1)
94
+ set_value2('b'){ 2 }
95
+ set_value3('c', 3)
96
+ context_self_.assert_raise(NoMethodError){ set_value3_dslversion('d', 4) }
97
+ context_self_.assert_raise(NoMethodError){ helper_method() }
98
+ context_self_.assert(!instance_variable_defined?(:@my_instance_variable_test))
99
+ context_self_.assert_instance_of(Blockenspiel::Tests::TextBehaviors::Target1, self)
100
+ end
101
+ Blockenspiel.invoke(block_, Target1.new(hash_), :parameterless => :instance)
102
+ assert_equal(1, hash_['a1'])
103
+ assert_equal(2, hash_['b2'])
104
+ assert_equal(3, hash_['c3'])
105
+ end
106
+
107
+
108
+ # Test proxy behavior.
109
+ #
110
+ # * Asserts that self doesn't point at the Target nor the original context.
111
+ # * Asserts that the target methods are available in their dsl renamed forms.
112
+ # * Asserts that the caller's instance variables are not available.
113
+ # * Asserts that the caller's helper methods *are* available.
114
+
115
+ def test_proxy_behavior
116
+ hash_ = Hash.new
117
+ context_self_ = self
118
+ @my_instance_variable_test = :hello
119
+ block_ = proc do
120
+ set_value1('a', 1)
121
+ set_value2('b'){ 2 }
122
+ set_value3_dslversion('c', 3)
123
+ context_self_.assert_raise(NoMethodError){ set_value3('d', 4) }
124
+ context_self_.assert(helper_method())
125
+ context_self_.assert(!instance_variable_defined?(:@my_instance_variable_test))
126
+ context_self_.assert(!self.kind_of?(Blockenspiel::Tests::TextBehaviors::Target1))
127
+ context_self_.assert_not_equal(context_self_, self)
128
+ end
129
+ Blockenspiel.invoke(block_, Target1.new(hash_), :parameterless => :proxy)
130
+ assert_equal(1, hash_['a1'])
131
+ assert_equal(2, hash_['b2'])
132
+ assert_equal(3, hash_['c3'])
133
+ end
134
+
135
+
136
+ # Test parameterless blocks disabled
137
+ #
138
+ # * Asserts that an error is raised if sending a no-parameter block in this case.
139
+ # * Asserts that sending a one-parameter block still works.
140
+
141
+ def test_disable_parameterless
142
+ hash_ = Hash.new
143
+ block1_ = proc do ||
144
+ set_value1('a', 1)
145
+ end
146
+ block2_ = proc do |target_|
147
+ target_.set_value1('b', 2)
148
+ end
149
+ block3_ = proc do
150
+ set_value1('c', 3)
151
+ end
152
+ assert_raise(Blockenspiel::BlockParameterError) do
153
+ Blockenspiel.invoke(block1_, Target1.new(hash_), :parameterless => false)
154
+ end
155
+ Blockenspiel.invoke(block2_, Target1.new(hash_), :parameterless => false)
156
+ assert_raise(Blockenspiel::BlockParameterError) do
157
+ Blockenspiel.invoke(block3_, Target1.new(hash_), :parameterless => false)
158
+ end
159
+ assert_equal(2, hash_['b1'])
160
+ end
161
+
162
+
163
+ # Test parametered blocks disabled
164
+ #
165
+ # * Asserts that an error is raised if sending a one-parameter block in this case.
166
+ # * Asserts that sending a no-parameter block still works.
167
+
168
+ def test_disable_parametered
169
+ hash_ = Hash.new
170
+ block1_ = proc do ||
171
+ set_value1('a', 1)
172
+ end
173
+ block2_ = proc do |target_|
174
+ target_.set_value1('b', 2)
175
+ end
176
+ block3_ = proc do
177
+ set_value1('c', 3)
178
+ end
179
+ Blockenspiel.invoke(block1_, Target1.new(hash_), :parameter => false)
180
+ assert_raise(Blockenspiel::BlockParameterError) do
181
+ Blockenspiel.invoke(block2_, Target1.new(hash_), :parameter => false)
182
+ end
183
+ Blockenspiel.invoke(block3_, Target1.new(hash_), :parameter => false)
184
+ assert_equal(1, hash_['a1'])
185
+ assert_equal(3, hash_['c1'])
186
+ end
187
+
188
+ end
189
+
190
+ end
191
+ end
@@ -0,0 +1,324 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Blockenspiel dsl method tests
4
+ #
5
+ # This file contains tests for the dsl method directives.
6
+ #
7
+ # -----------------------------------------------------------------------------
8
+ # Copyright 2008-2009 Daniel Azuma
9
+ #
10
+ # All rights reserved.
11
+ #
12
+ # Redistribution and use in source and binary forms, with or without
13
+ # modification, are permitted provided that the following conditions are met:
14
+ #
15
+ # * Redistributions of source code must retain the above copyright notice,
16
+ # this list of conditions and the following disclaimer.
17
+ # * Redistributions in binary form must reproduce the above copyright notice,
18
+ # this list of conditions and the following disclaimer in the documentation
19
+ # and/or other materials provided with the distribution.
20
+ # * Neither the name of the copyright holder, nor the names of any other
21
+ # contributors to this software, may be used to endorse or promote products
22
+ # derived from this software without specific prior written permission.
23
+ #
24
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
+ # POSSIBILITY OF SUCH DAMAGE.
35
+ # -----------------------------------------------------------------------------
36
+ ;
37
+
38
+
39
+ require 'test/unit'
40
+ require File.expand_path("#{File.dirname(__FILE__)}/../lib/blockenspiel.rb")
41
+
42
+
43
+ module Blockenspiel
44
+ module Tests # :nodoc:
45
+
46
+ class TestDSLMethods < Test::Unit::TestCase # :nodoc:
47
+
48
+
49
+ class Target1 < Blockenspiel::Base
50
+
51
+ def initialize(hash_)
52
+ @hash = hash_
53
+ end
54
+
55
+ def set_value1(key_, value_)
56
+ @hash["#{key_}1"] = value_
57
+ end
58
+
59
+ def set_value2(key_)
60
+ @hash["#{key_}2"] = yield
61
+ end
62
+
63
+ def _set_value3(key_, value_)
64
+ @hash["#{key_}3"] = value_
65
+ end
66
+
67
+ end
68
+
69
+
70
+ class Target2 < Blockenspiel::Base
71
+
72
+ def initialize(hash_)
73
+ @hash = hash_
74
+ end
75
+
76
+ dsl_methods false
77
+
78
+ def set_value1(key_, value_)
79
+ @hash["#{key_}1"] = value_
80
+ end
81
+
82
+ dsl_methods true
83
+
84
+ def set_value2(key_)
85
+ @hash["#{key_}2"] = yield
86
+ end
87
+
88
+ def _set_value3(key_, value_)
89
+ @hash["#{key_}3"] = value_
90
+ end
91
+
92
+ end
93
+
94
+
95
+ class Target3 < Blockenspiel::Base
96
+
97
+ def initialize(hash_)
98
+ @hash = hash_
99
+ end
100
+
101
+ dsl_methods false
102
+
103
+ def set_value1(key_, value_)
104
+ @hash["#{key_}1"] = value_
105
+ end
106
+ dsl_method :set_value1
107
+
108
+ def set_value2(key_)
109
+ @hash["#{key_}2"] = yield
110
+ end
111
+ dsl_method :renamed_set_value2, :set_value2
112
+ dsl_method :another_set_value2, :set_value2
113
+
114
+ end
115
+
116
+
117
+ class Target4 < Blockenspiel::Base
118
+
119
+ def initialize(hash_)
120
+ @hash = hash_
121
+ end
122
+
123
+ def set_value1(key_, value_)
124
+ @hash["#{key_}1"] = value_
125
+ end
126
+ dsl_method :set_value1, false
127
+
128
+ def set_value2(key_)
129
+ @hash["#{key_}2"] = yield
130
+ end
131
+ dsl_method :set_value2, false
132
+ dsl_method :renamed_set_value2, :set_value2
133
+
134
+ end
135
+
136
+
137
+ class Target5a < Blockenspiel::Base
138
+
139
+ def initialize(hash_)
140
+ @hash = hash_
141
+ end
142
+
143
+ def set_value1(key_, value_)
144
+ @hash["#{key_}1"] = value_
145
+ end
146
+
147
+ def set_value2(key_)
148
+ @hash["#{key_}2"] = yield
149
+ end
150
+
151
+ def set_value3(key_, value_)
152
+ @hash["#{key_}3"] = value_
153
+ end
154
+
155
+ def set_value4(key_, value_)
156
+ @hash["#{key_}4"] = value_
157
+ end
158
+ dsl_method :set_value4, false
159
+ dsl_method :renamed_set_value4, :set_value4
160
+
161
+ end
162
+
163
+
164
+ class Target5b < Target5a
165
+
166
+ def set_value1(key_, value_)
167
+ @hash["#{key_}1sub"] = value_
168
+ end
169
+
170
+ dsl_method :set_value3, false
171
+
172
+ def set_value5(key_, value_)
173
+ @hash["#{key_}5"] = value_
174
+ end
175
+
176
+ end
177
+
178
+
179
+ class Target6 < Blockenspiel::Base
180
+
181
+ def initialize(hash_)
182
+ @hash = hash_
183
+ end
184
+
185
+ dsl_methods false
186
+
187
+ def set_value1(key_, value_)
188
+ @hash["#{key_}1"] = value_
189
+ end
190
+
191
+ def set_value2(key_)
192
+ @hash["#{key_}2"] = yield
193
+ end
194
+
195
+ dsl_methods :set_value1, :renamed_set_value2 => :set_value2
196
+
197
+ end
198
+
199
+
200
+ # Test default dsl method setting.
201
+ #
202
+ # * Asserts the right dsl methods are added for the default setting.
203
+
204
+ def test_default_setting
205
+ hash_ = Hash.new
206
+ block_ = proc do
207
+ set_value1('a', 1)
208
+ set_value2('b'){ 2 }
209
+ assert_raise(NoMethodError){ _set_value3('c', 3) }
210
+ end
211
+ Blockenspiel.invoke(block_, Target1.new(hash_))
212
+ assert_equal(1, hash_['a1'])
213
+ assert_equal(2, hash_['b2'])
214
+ assert_nil(hash_['c3'])
215
+ end
216
+
217
+
218
+ # Test dsl_methods true and false switching.
219
+ #
220
+ # * Asserts that dsl_methods false turns off automatic method creation.
221
+ # * Asserts that dsl_methods true turns on automatic method creation.
222
+ # * Asserts that underscore methods are added in dsl_methods true mode.
223
+
224
+ def test_onoff_switching
225
+ hash_ = Hash.new
226
+ block_ = proc do
227
+ assert_raise(NoMethodError){ _set_value1('a', 1) }
228
+ set_value2('b'){ 2 }
229
+ _set_value3('c', 3)
230
+ end
231
+ Blockenspiel.invoke(block_, Target2.new(hash_))
232
+ assert_nil(hash_['a1'])
233
+ assert_equal(2, hash_['b2'])
234
+ assert_equal(3, hash_['c3'])
235
+ end
236
+
237
+
238
+ # Test dsl_methods explicit adding.
239
+ #
240
+ # * Asserts that adding an explicit dsl method works.
241
+ # * Asserts that adding an explicit dsl method with a different name works.
242
+
243
+ def test_explicit_add
244
+ hash_ = Hash.new
245
+ block_ = proc do
246
+ set_value1('a', 1)
247
+ assert_raise(NoMethodError){ set_value2('b'){ 2 } }
248
+ renamed_set_value2('c'){ 3 }
249
+ another_set_value2('d'){ 4 }
250
+ end
251
+ Blockenspiel.invoke(block_, Target3.new(hash_))
252
+ assert_equal(1, hash_['a1'])
253
+ assert_nil(hash_['b2'])
254
+ assert_equal(3, hash_['c2'])
255
+ assert_equal(4, hash_['d2'])
256
+ end
257
+
258
+
259
+ # Test dsl_methods explicit removing.
260
+ #
261
+ # * Asserts that removing a dsl method works.
262
+ # * Asserts that re-adding a removed method with a different name works.
263
+
264
+ def test_explicit_removing
265
+ hash_ = Hash.new
266
+ block_ = proc do
267
+ assert_raise(NoMethodError){ set_value1('a', 1) }
268
+ assert_raise(NoMethodError){ set_value2('b'){ 2 } }
269
+ renamed_set_value2('c'){ 3 }
270
+ end
271
+ Blockenspiel.invoke(block_, Target4.new(hash_))
272
+ assert_nil(hash_['a1'])
273
+ assert_nil(hash_['b2'])
274
+ assert_equal(3, hash_['c2'])
275
+ end
276
+
277
+
278
+ # Test dsl method setting with subclasses
279
+ #
280
+ # * Asserts that modules are properly inherited.
281
+ # * Asserts that method overriding is done correctly.
282
+
283
+ def test_subclassing
284
+ hash_ = Hash.new
285
+ block_ = proc do
286
+ set_value1('a', 1)
287
+ set_value2('b'){ 2 }
288
+ assert_raise(NoMethodError){ set_value3('c', 3) }
289
+ assert_raise(NoMethodError){ set_value4('d', 4) }
290
+ renamed_set_value4('e', 5)
291
+ set_value5('f', 6)
292
+ end
293
+ Blockenspiel.invoke(block_, Target5b.new(hash_))
294
+ assert_equal(1, hash_['a1sub'])
295
+ assert_equal(2, hash_['b2'])
296
+ assert_nil(hash_['c3'])
297
+ assert_nil(hash_['d4'])
298
+ assert_equal(5, hash_['e4'])
299
+ assert_equal(6, hash_['f5'])
300
+ end
301
+
302
+
303
+ # Test dsl_methods with multiple parameters.
304
+ #
305
+ # * Asserts that hash syntax for dsl_methods works.
306
+ # * Asserts that combined array and hash parameters works.
307
+
308
+ def test_multiple_dsl_methods
309
+ hash_ = Hash.new
310
+ block_ = proc do
311
+ set_value1('a', 1)
312
+ renamed_set_value2('b'){ 2 }
313
+ assert_raise(NoMethodError){ set_value2('c', 3) }
314
+ end
315
+ Blockenspiel.invoke(block_, Target6.new(hash_))
316
+ assert_equal(1, hash_['a1'])
317
+ assert_equal(2, hash_['b2'])
318
+ end
319
+
320
+
321
+ end
322
+
323
+ end
324
+ end