ns-options 0.1.1 → 0.2.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/README.markdown +273 -16
- data/lib/ns-options/boolean.rb +25 -0
- data/lib/ns-options/errors/invalid_name.rb +15 -0
- data/lib/ns-options/has_options.rb +33 -7
- data/lib/ns-options/helper/advisor.rb +68 -0
- data/lib/ns-options/helper.rb +42 -19
- data/lib/ns-options/namespace.rb +55 -33
- data/lib/ns-options/namespaces.rb +1 -1
- data/lib/ns-options/option.rb +30 -28
- data/lib/ns-options/options.rb +29 -17
- data/lib/ns-options/version.rb +1 -1
- data/lib/ns-options.rb +9 -0
- data/log/.gitkeep +0 -0
- data/ns-options.gemspec +1 -1
- data/test/helper.rb +3 -8
- data/test/integration/app_test.rb +12 -6
- data/test/integration/user_test.rb +40 -2
- data/test/irb.rb +9 -0
- data/test/support/app.rb +8 -2
- data/test/support/user.rb +12 -3
- data/test/unit/ns-options/{option/boolean_test.rb → boolean_test.rb} +21 -5
- data/test/unit/ns-options/helper/advisor_test.rb +144 -0
- data/test/unit/ns-options/helper_test.rb +29 -40
- data/test/unit/ns-options/namespace_test.rb +186 -17
- data/test/unit/ns-options/namespaces_test.rb +1 -1
- data/test/unit/ns-options/option_test.rb +145 -52
- data/test/unit/ns-options/options_test.rb +83 -89
- metadata +18 -11
- data/lib/ns-options/option/boolean.rb +0 -27
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'assert'
|
2
|
+
|
3
|
+
class NsOptions::Helper::Advisor
|
4
|
+
|
5
|
+
module Output
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def capture
|
9
|
+
out = StringIO.new
|
10
|
+
$stdout = out
|
11
|
+
yield
|
12
|
+
return out
|
13
|
+
ensure
|
14
|
+
$stdout = STDOUT
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class BaseTest < Assert::Context
|
19
|
+
desc "NsOptions::Helper::Advisor"
|
20
|
+
setup do
|
21
|
+
@namespace = NsOptions::Namespace.new("something")
|
22
|
+
@advisor = NsOptions::Helper::Advisor.new(@namespace)
|
23
|
+
end
|
24
|
+
subject{ @advisor }
|
25
|
+
|
26
|
+
should have_accessors :namespace
|
27
|
+
should have_instance_methods :is_this_ok?, :is_this_option_ok?, :is_this_namespace_ok?,
|
28
|
+
:is_already_defined?, :bad_methods, :not_recommended_methods, :bad_method_message,
|
29
|
+
:duplicate_message, :not_recommended_method_message
|
30
|
+
|
31
|
+
should "return methods that cannot be overwritten with a call to #bad_methods" do
|
32
|
+
expected = [ :define, :namespace, :option, :options ].map(&:to_s).sort
|
33
|
+
assert_equal(expected, subject.bad_methods.map(&:to_s).sort)
|
34
|
+
end
|
35
|
+
should "return methods that shouldn't be overwritten with a call to #not_recommended_methods" do
|
36
|
+
expected = NsOptions::Namespace.instance_methods(false).map(&:to_sym)
|
37
|
+
assert_equal(expected, subject.not_recommended_methods)
|
38
|
+
end
|
39
|
+
should "return if an option/namespace is defined with a call to #is_already_defined?" do
|
40
|
+
assert_equal false, subject.is_already_defined?(:first)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class BadOptionTest < BaseTest
|
45
|
+
desc "with a bad option"
|
46
|
+
setup do
|
47
|
+
begin
|
48
|
+
@advisor.is_this_option_ok?("namespace")
|
49
|
+
rescue Exception => @exception
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
should "raise an exception when an option matches one of the bad methods" do
|
54
|
+
assert_kind_of NsOptions::Errors::InvalidName, @exception
|
55
|
+
expected = subject.bad_method_message("option", "namespace")
|
56
|
+
assert_equal expected, @exception.message
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class DuplicateOptionTest < BaseTest
|
61
|
+
desc "with a duplicate option"
|
62
|
+
setup do
|
63
|
+
@namespace.option(:duplicate)
|
64
|
+
@output = Output.capture do
|
65
|
+
@advisor.is_this_option_ok?("duplicate")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
should "output a message warning that they are re-defining an option" do
|
70
|
+
expected = subject.duplicate_message("duplicate")
|
71
|
+
assert_match expected, @output.string
|
72
|
+
assert_match "From: ", @output.string
|
73
|
+
end
|
74
|
+
should "return true with a call to #is_already_defined?" do
|
75
|
+
assert_equal true, subject.is_already_defined?(:duplicate)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class NotRecommendedOptionTest < BaseTest
|
80
|
+
desc "with a not recommended option"
|
81
|
+
setup do
|
82
|
+
@output = Output.capture do
|
83
|
+
@advisor.is_this_option_ok?("apply")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
should "output a message warning using the method name as an option name" do
|
88
|
+
expected = subject.not_recommended_method_message("option", "apply")
|
89
|
+
assert_match expected, @output.string
|
90
|
+
assert_match "From: ", @output.string
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class BadNamespaceTest < BaseTest
|
95
|
+
desc "with a bad namespace"
|
96
|
+
setup do
|
97
|
+
begin
|
98
|
+
@advisor.is_this_namespace_ok?("options")
|
99
|
+
rescue Exception => @exception
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
should "raise an exception when a namespace matches one of the bad methods" do
|
104
|
+
assert_kind_of NsOptions::Errors::InvalidName, @exception
|
105
|
+
expected = subject.bad_method_message("sub-namespace", "options")
|
106
|
+
assert_equal expected, @exception.message
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class DuplicateNamespaceTest < BaseTest
|
111
|
+
desc "with a duplicate namespace"
|
112
|
+
setup do
|
113
|
+
@namespace.namespace(:duplicate)
|
114
|
+
@output = Output.capture do
|
115
|
+
@advisor.is_this_namespace_ok?("duplicate")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
should "output a message warning that they are re-defining a namespace" do
|
120
|
+
expected = subject.duplicate_message("duplicate")
|
121
|
+
assert_match expected, @output.string
|
122
|
+
assert_match "From: ", @output.string
|
123
|
+
end
|
124
|
+
should "return true with a call to #is_already_defined?" do
|
125
|
+
assert_equal true, subject.is_already_defined?(:duplicate)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class NotRecommendedNamespaceTest < BaseTest
|
130
|
+
desc "with a not recommended namespace"
|
131
|
+
setup do
|
132
|
+
@output = Output.capture do
|
133
|
+
@advisor.is_this_namespace_ok?("apply")
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
should "output a message warning using the method name as a namespace name" do
|
138
|
+
expected = subject.not_recommended_method_message("sub-namespace", "apply")
|
139
|
+
assert_match expected, @output.string
|
140
|
+
assert_match "From: ", @output.string
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
@@ -9,54 +9,43 @@ module NsOptions::Helper
|
|
9
9
|
end
|
10
10
|
subject{ @module }
|
11
11
|
|
12
|
-
should have_instance_methods :
|
13
|
-
|
12
|
+
should have_instance_methods :find_and_define_namespace, :find_and_define_option,
|
13
|
+
:define_namespace_methods, :define_option_methods, :advisor
|
14
|
+
|
15
|
+
should "return an instance of NsOptions::Helper::Advisor with a call to #advisor" do
|
16
|
+
advisor = subject.advisor(NsOptions::Namespace.new("something"))
|
17
|
+
assert_instance_of NsOptions::Helper::Advisor, advisor
|
18
|
+
end
|
14
19
|
end
|
15
|
-
|
16
|
-
class
|
17
|
-
desc "
|
20
|
+
|
21
|
+
class FindAndDefineOptionTest < BaseTest
|
22
|
+
desc "find_and_define_option method"
|
18
23
|
setup do
|
19
|
-
@
|
20
|
-
@
|
21
|
-
|
22
|
-
end
|
24
|
+
@namespace = NsOptions::Namespace.new("something")
|
25
|
+
@option = @namespace.options.add(:anything)
|
26
|
+
@result = @module.find_and_define_option(@namespace, @option.name)
|
23
27
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
assert_equal
|
30
|
-
assert_equal @parent, @child.options.parent
|
31
|
-
assert @child.options[:something]
|
28
|
+
subject{ @namespace }
|
29
|
+
|
30
|
+
should "have defined reader/writer methods for the option and returned the option" do
|
31
|
+
assert_respond_to @option.name, subject
|
32
|
+
assert_respond_to "#{@option.name}=", subject
|
33
|
+
assert_equal @option, @result
|
32
34
|
end
|
33
|
-
end
|
35
|
+
end
|
34
36
|
|
35
|
-
class
|
36
|
-
desc "
|
37
|
+
class FindAndDefineNamespaceTest < BaseTest
|
38
|
+
desc "find_and_define_namespace method"
|
37
39
|
setup do
|
38
|
-
@
|
39
|
-
@
|
40
|
-
@
|
41
|
-
@first_owner = mock()
|
42
|
-
@first_owner.stubs({ :class => @mock_class })
|
43
|
-
@first = @module.new_child_namespace(@first_owner, "super_settings") do
|
44
|
-
option :something
|
45
|
-
end
|
46
|
-
@second_owner = User.new
|
47
|
-
@second = @module.new_child_namespace(@second_owner, "preferences")
|
40
|
+
@namespace = NsOptions::Namespace.new("something")
|
41
|
+
@namespace.options.add_namespace(:else, "something:else")
|
42
|
+
@result = @module.find_and_define_namespace(@namespace, :else)
|
48
43
|
end
|
44
|
+
subject{ @namespace }
|
49
45
|
|
50
|
-
should "have
|
51
|
-
|
52
|
-
|
53
|
-
assert_equal key, @first.options.key
|
54
|
-
assert_equal @parent, @first.options.parent
|
55
|
-
assert @first.options[:something]
|
56
|
-
end
|
57
|
-
should "have created a second child namespace" do
|
58
|
-
key = "#{@second.options.parent.options.key}:#{@second_owner.preferences_key}"
|
59
|
-
assert_equal key, @second.options.key
|
46
|
+
should "have defined reader method for the namespace and returned the namespace" do
|
47
|
+
assert_respond_to :else, subject
|
48
|
+
assert_equal subject.options.get_namespace(:else), @result
|
60
49
|
end
|
61
50
|
end
|
62
51
|
|
@@ -5,33 +5,43 @@ class NsOptions::Namespace
|
|
5
5
|
class BaseTest < Assert::Context
|
6
6
|
desc "NsOptions::Namespace"
|
7
7
|
setup do
|
8
|
-
@key = "
|
8
|
+
@key = "something"
|
9
9
|
@namespace = NsOptions::Namespace.new(@key)
|
10
10
|
end
|
11
11
|
subject{ @namespace }
|
12
12
|
|
13
13
|
should have_accessors :metaclass, :options
|
14
|
-
should have_instance_methods :option, :namespace, :required_set?, :define
|
14
|
+
should have_instance_methods :option, :namespace, :required_set?, :define, :apply, :valid?
|
15
|
+
should have_instance_methods :to_hash, :each
|
15
16
|
|
16
17
|
should "have set it's metaclass accessor" do
|
17
18
|
assert subject.metaclass
|
18
19
|
end
|
20
|
+
|
19
21
|
should "have created a new options collection and set it's options accessor" do
|
20
22
|
assert subject.options
|
21
23
|
assert_kind_of NsOptions::Options, subject.options
|
22
24
|
assert_equal @key, subject.options.key
|
23
25
|
assert_nil subject.options.parent
|
24
26
|
end
|
27
|
+
|
28
|
+
should "contain its options key in its inspect output" do
|
29
|
+
assert_included ":#{subject.options.key}", subject.inspect
|
30
|
+
end
|
31
|
+
|
25
32
|
end
|
26
33
|
|
27
34
|
class OptionTest < BaseTest
|
28
35
|
desc "option method"
|
29
36
|
setup do
|
30
37
|
@name = :something
|
31
|
-
@type =
|
38
|
+
@type = String
|
32
39
|
@rules = { :default => true }
|
33
40
|
@namespace.option(@name, @type, @rules)
|
34
41
|
end
|
42
|
+
teardown do
|
43
|
+
NsOptions::Helper.unstub(:advisor)
|
44
|
+
end
|
35
45
|
subject{ @namespace }
|
36
46
|
|
37
47
|
should "have added the option to the namespace's options collection" do
|
@@ -40,6 +50,15 @@ class NsOptions::Namespace
|
|
40
50
|
assert_equal @type, option.type_class
|
41
51
|
assert_equal @rules, option.rules
|
42
52
|
end
|
53
|
+
|
54
|
+
should "check if the option name is ok" do
|
55
|
+
advisor = NsOptions::Helper::Advisor.new(@namespace)
|
56
|
+
NsOptions::Helper.expects(:advisor).with(@namespace).returns(advisor)
|
57
|
+
advisor.expects(:is_this_option_ok?)
|
58
|
+
assert_nothing_raised do
|
59
|
+
@namespace.option(:amazing)
|
60
|
+
end
|
61
|
+
end
|
43
62
|
end
|
44
63
|
|
45
64
|
class OptionWithNoTypeTest < BaseTest
|
@@ -50,10 +69,11 @@ class NsOptions::Namespace
|
|
50
69
|
end
|
51
70
|
subject{ @namespace }
|
52
71
|
|
53
|
-
should "default the type to
|
72
|
+
should "default the type to Object" do
|
54
73
|
assert(option = subject.options[@name])
|
55
|
-
assert_equal
|
74
|
+
assert_equal Object, option.type_class
|
56
75
|
end
|
76
|
+
|
57
77
|
end
|
58
78
|
|
59
79
|
class OptionMethodsTest < OptionTest
|
@@ -62,13 +82,15 @@ class NsOptions::Namespace
|
|
62
82
|
should have_instance_methods :something, :something=
|
63
83
|
|
64
84
|
should "be writable through the defined writer" do
|
65
|
-
assert_nothing_raised{ subject.something =
|
66
|
-
assert_equal
|
85
|
+
assert_nothing_raised{ subject.something = "abc" }
|
86
|
+
assert_equal "abc", subject.something
|
67
87
|
end
|
88
|
+
|
68
89
|
should "be writable through the reader with args" do
|
69
|
-
assert_nothing_raised{ subject.something
|
70
|
-
assert_equal
|
90
|
+
assert_nothing_raised{ subject.something "123" }
|
91
|
+
assert_equal "123", subject.something
|
71
92
|
end
|
93
|
+
|
72
94
|
end
|
73
95
|
|
74
96
|
class NamespaceTest < BaseTest
|
@@ -79,6 +101,9 @@ class NsOptions::Namespace
|
|
79
101
|
end
|
80
102
|
@namespace.namespace(:another, "special_key")
|
81
103
|
end
|
104
|
+
teardown do
|
105
|
+
NsOptions::Helper.unstub(:advisor)
|
106
|
+
end
|
82
107
|
subject{ @namespace }
|
83
108
|
|
84
109
|
should "have added a namespace to the namespace's options collection" do
|
@@ -87,10 +112,21 @@ class NsOptions::Namespace
|
|
87
112
|
assert_equal subject, namespace.options.parent
|
88
113
|
assert namespace.options[:something_else]
|
89
114
|
end
|
115
|
+
|
90
116
|
should "allow passing a special key to the namespace" do
|
91
117
|
assert(namespace = subject.options.namespaces[:another])
|
92
118
|
assert_equal "#{subject.options.key}:special_key", namespace.options.key
|
93
119
|
end
|
120
|
+
|
121
|
+
should "check if the namespace name is ok" do
|
122
|
+
advisor = NsOptions::Helper::Advisor.new(@namespace)
|
123
|
+
NsOptions::Helper.expects(:advisor).with(@namespace).returns(advisor)
|
124
|
+
advisor.expects(:is_this_namespace_ok?)
|
125
|
+
assert_nothing_raised do
|
126
|
+
@namespace.namespace(:yet_another)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
94
130
|
end
|
95
131
|
|
96
132
|
class NamespaceMethodsTest < NamespaceTest
|
@@ -101,12 +137,14 @@ class NsOptions::Namespace
|
|
101
137
|
should "be return the namespace using the reader" do
|
102
138
|
assert_equal subject.options.namespaces[:something], subject.something
|
103
139
|
end
|
140
|
+
|
104
141
|
should "define the namespace with the reader and a block" do
|
105
142
|
subject.something do
|
106
143
|
option :another
|
107
144
|
end
|
108
145
|
assert subject.something.options[:another]
|
109
146
|
end
|
147
|
+
|
110
148
|
end
|
111
149
|
|
112
150
|
class DefineTest < BaseTest
|
@@ -146,10 +184,9 @@ class NsOptions::Namespace
|
|
146
184
|
class MethodMissingTest < BaseTest
|
147
185
|
desc "method missing"
|
148
186
|
setup do
|
149
|
-
@
|
150
|
-
@
|
151
|
-
@
|
152
|
-
@namespace = NsOptions::Namespace.new("child", @parent)
|
187
|
+
@namespace = NsOptions::Namespace.new("strange")
|
188
|
+
@namespace.options.add(:something)
|
189
|
+
@namespace.options.set(:something, "amazing")
|
153
190
|
end
|
154
191
|
|
155
192
|
class ReaderForAKnownOptionTest < MethodMissingTest
|
@@ -184,6 +221,8 @@ class NsOptions::Namespace
|
|
184
221
|
@namespace.something_not_defined = "you know it"
|
185
222
|
@namespace.another_not_defined = true
|
186
223
|
@namespace.even_more_not_defined = 12
|
224
|
+
@namespace.just_one_more_not_defined = nil
|
225
|
+
@namespace.proc_opt_not_defined = Proc.new { "imma proc!" }
|
187
226
|
end
|
188
227
|
|
189
228
|
should "have defined the accessors and added the option" do
|
@@ -193,11 +232,20 @@ class NsOptions::Namespace
|
|
193
232
|
assert_includes :something_not_defined=, defined_methods
|
194
233
|
assert_equal "you know it", subject.something_not_defined
|
195
234
|
end
|
196
|
-
|
197
|
-
|
198
|
-
assert_equal
|
199
|
-
assert_equal
|
235
|
+
|
236
|
+
should "use Object for the option's type class, no matter what the value is" do
|
237
|
+
assert_equal Object, subject.options[:something_not_defined].type_class
|
238
|
+
assert_equal Object, subject.options[:another_not_defined].type_class
|
239
|
+
assert_equal Object, subject.options[:even_more_not_defined].type_class
|
240
|
+
assert_equal Object, subject.options[:just_one_more_not_defined].type_class
|
241
|
+
assert_equal Object, subject.options[:proc_opt_not_defined].type_class
|
242
|
+
end
|
243
|
+
|
244
|
+
should "return the Proc return val when an unknow option is set to a Proc" do
|
245
|
+
assert_not_kind_of Proc, subject.options[:proc_opt_not_defined].type_class
|
246
|
+
assert_equal "imma proc!", subject.proc_opt_not_defined
|
200
247
|
end
|
248
|
+
|
201
249
|
end
|
202
250
|
end
|
203
251
|
|
@@ -229,4 +277,125 @@ class NsOptions::Namespace
|
|
229
277
|
end
|
230
278
|
end
|
231
279
|
|
280
|
+
|
281
|
+
|
282
|
+
class HandlingTests < BaseTest
|
283
|
+
setup do
|
284
|
+
@namespace.define do
|
285
|
+
option :first
|
286
|
+
option :second
|
287
|
+
option :third
|
288
|
+
namespace(:child_a) do
|
289
|
+
option(:fourth)
|
290
|
+
option(:fifth)
|
291
|
+
namespace(:child_b) do
|
292
|
+
option(:sixth)
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
@named_values = {
|
298
|
+
:first => "1", :second => "2", :third => "3", :twenty_one => "21",
|
299
|
+
:child_a => {
|
300
|
+
:fourth => "4", :fifth => "5",
|
301
|
+
:child_b => { :sixth => "6" }
|
302
|
+
},
|
303
|
+
:child_c => { :what => "?" }
|
304
|
+
}
|
305
|
+
end
|
306
|
+
|
307
|
+
end
|
308
|
+
|
309
|
+
|
310
|
+
|
311
|
+
class ApplyTest < HandlingTests
|
312
|
+
desc "apply method"
|
313
|
+
setup do
|
314
|
+
@namespace.apply(@named_values)
|
315
|
+
end
|
316
|
+
|
317
|
+
should "have mass set all the defined options" do
|
318
|
+
assert_equal @named_values[:first], subject.first
|
319
|
+
assert_equal @named_values[:second], subject.second
|
320
|
+
assert_equal @named_values[:third], subject.third
|
321
|
+
assert_equal @named_values[:child_a][:fourth], subject.child_a.fourth
|
322
|
+
assert_equal @named_values[:child_a][:fifth], subject.child_a.fifth
|
323
|
+
assert_equal @named_values[:child_a][:child_b][:sixth], subject.child_a.child_b.sixth
|
324
|
+
end
|
325
|
+
should "have dynamically added options for the undefined keys" do
|
326
|
+
assert_equal @named_values[:twenty_one], subject.twenty_one
|
327
|
+
assert_equal @named_values[:child_c], subject.child_c
|
328
|
+
end
|
329
|
+
|
330
|
+
end
|
331
|
+
|
332
|
+
|
333
|
+
|
334
|
+
class ToHashTests < HandlingTests
|
335
|
+
desc "when to_hash"
|
336
|
+
subject { @namespace.to_hash }
|
337
|
+
|
338
|
+
should "return a Hash representation for the namespace" do
|
339
|
+
assert_equal({
|
340
|
+
:first => nil,
|
341
|
+
:second => nil,
|
342
|
+
:third => nil,
|
343
|
+
:child_a => {
|
344
|
+
:fourth => nil,
|
345
|
+
:fifth => nil,
|
346
|
+
:child_b => {
|
347
|
+
:sixth => nil
|
348
|
+
}
|
349
|
+
}
|
350
|
+
}, subject)
|
351
|
+
|
352
|
+
@namespace.first = "first"
|
353
|
+
assert_equal({
|
354
|
+
:first => "first",
|
355
|
+
:second => nil,
|
356
|
+
:third => nil,
|
357
|
+
:child_a => {
|
358
|
+
:fourth => nil,
|
359
|
+
:fifth => nil,
|
360
|
+
:child_b => {
|
361
|
+
:sixth => nil
|
362
|
+
}
|
363
|
+
}
|
364
|
+
}, subject)
|
365
|
+
|
366
|
+
@namespace.apply(@named_values)
|
367
|
+
assert_equal @named_values, subject
|
368
|
+
end
|
369
|
+
|
370
|
+
should "contain its to_hash representation in its inspect output" do
|
371
|
+
assert_included subject.inspect, @namespace.inspect
|
372
|
+
end
|
373
|
+
|
374
|
+
end
|
375
|
+
|
376
|
+
|
377
|
+
class EachTests < HandlingTests
|
378
|
+
desc "iterated with the each method"
|
379
|
+
setup do
|
380
|
+
@namespace.apply(@named_values)
|
381
|
+
@exp = "".tap do |exp|
|
382
|
+
@namespace.to_hash.each do |k,v|
|
383
|
+
exp << "#{k}=#{v};"
|
384
|
+
end
|
385
|
+
end
|
386
|
+
@act = "".tap do |exp|
|
387
|
+
@namespace.each do |k,v|
|
388
|
+
exp << "#{k}=#{v};"
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
should "yield k/v pairs by iterating over the #to_hash" do
|
394
|
+
assert_equal @exp, @act
|
395
|
+
end
|
396
|
+
|
397
|
+
end
|
398
|
+
|
399
|
+
|
400
|
+
|
232
401
|
end
|