ns-options 0.4.1 → 1.0.0.rc1

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.
Files changed (51) hide show
  1. data/.gitignore +3 -0
  2. data/Gemfile +2 -1
  3. data/LICENSE +1 -1
  4. data/README.md +187 -301
  5. data/Rakefile +1 -1
  6. data/lib/ns-options/assert_macros.rb +9 -12
  7. data/lib/ns-options/boolean.rb +2 -0
  8. data/lib/ns-options/namespace.rb +34 -134
  9. data/lib/ns-options/namespace_advisor.rb +35 -0
  10. data/lib/ns-options/namespace_data.rb +166 -0
  11. data/lib/ns-options/namespaces.rb +23 -12
  12. data/lib/ns-options/option.rb +50 -24
  13. data/lib/ns-options/options.rb +23 -49
  14. data/lib/ns-options/proxy.rb +40 -53
  15. data/lib/ns-options/proxy_method.rb +54 -0
  16. data/lib/ns-options/root_methods.rb +77 -0
  17. data/lib/ns-options/version.rb +1 -1
  18. data/lib/ns-options.rb +18 -8
  19. data/ns-options.gemspec +3 -4
  20. data/test/helper.rb +3 -10
  21. data/test/support/app.rb +3 -1
  22. data/test/support/proxy.rb +4 -0
  23. data/test/support/type_class_proxy.rb +29 -0
  24. data/test/support/user.rb +5 -5
  25. data/test/{integration/app_test.rb → system/app_tests.rb} +8 -6
  26. data/test/{integration/proxy_test.rb → system/proxy_tests.rb} +12 -0
  27. data/test/system/type_class_proxy_tests.rb +108 -0
  28. data/test/system/user_tests.rb +146 -0
  29. data/test/unit/{ns-options/boolean_test.rb → boolean_tests.rb} +5 -4
  30. data/test/unit/namespace_advisor_tests.rb +69 -0
  31. data/test/unit/namespace_data_tests.rb +336 -0
  32. data/test/unit/namespace_tests.rb +205 -0
  33. data/test/unit/namespaces_tests.rb +99 -0
  34. data/test/unit/{ns-options/option_test.rb → option_tests.rb} +155 -93
  35. data/test/unit/options_tests.rb +152 -0
  36. data/test/unit/proxy_method_tests.rb +87 -0
  37. data/test/unit/{ns-options/proxy_test.rb → proxy_tests.rb} +52 -0
  38. data/test/unit/root_methods_tests.rb +126 -0
  39. metadata +58 -63
  40. data/lib/ns-options/errors/invalid_name.rb +0 -15
  41. data/lib/ns-options/has_options.rb +0 -53
  42. data/lib/ns-options/helper/advisor.rb +0 -88
  43. data/lib/ns-options/helper.rb +0 -87
  44. data/test/integration/user_test.rb +0 -94
  45. data/test/unit/ns-options/has_options_test.rb +0 -90
  46. data/test/unit/ns-options/helper/advisor_test.rb +0 -148
  47. data/test/unit/ns-options/helper_test.rb +0 -56
  48. data/test/unit/ns-options/namespace_test.rb +0 -432
  49. data/test/unit/ns-options/namespaces_test.rb +0 -55
  50. data/test/unit/ns-options/options_test.rb +0 -221
  51. /data/test/unit/{ns-options/assert_macros_test.rb → assert_macros_tests.rb} +0 -0
@@ -1,96 +1,142 @@
1
1
  require 'assert'
2
+ require 'ns-options/option'
3
+ require 'ns-options/boolean'
2
4
 
3
5
  class NsOptions::Option
4
6
 
5
- class BaseTest < Assert::Context
7
+ class BaseTests < Assert::Context
6
8
  desc "NsOptions::Option"
7
9
  setup do
8
- @rules = { :default => "development", :require => true }
9
- @args = [:stage, String, @rules]
10
- @option = NsOptions::Option.new(*@args)
10
+ @rules = { :default => "development" }
11
+ @option = NsOptions::Option.new(:stage, nil, @rules)
11
12
  end
12
13
  subject{ @option }
13
14
 
14
- should have_class_method :rules, :args
15
+ should have_class_methods :rules, :args
15
16
  should have_accessors :name, :value, :type_class, :rules
17
+ should have_imeths :is_set?, :required?, :reset
16
18
 
17
- should "have set the name" do
18
- assert_equal "stage", subject.name
19
+ should "know its name" do
20
+ assert_equal :stage, subject.name
19
21
  end
20
22
 
21
- should "have set the type class" do
22
- assert_equal String, subject.type_class
23
+ should "know its type class" do
24
+ assert_equal Object, subject.type_class
23
25
  end
24
26
 
25
- should "have set the rules" do
26
- assert_equal(@rules, subject.rules)
27
+ should "know its rules" do
28
+ exp_rules = {
29
+ :default => "development",
30
+ :args => []
31
+ }
32
+ assert_equal exp_rules, subject.rules
27
33
  end
28
34
 
29
- should "have defaulted value based on the rules" do
30
- assert_equal subject.rules[:default], subject.value
35
+ should "not be required? by default" do
36
+ assert_equal false, subject.required?
31
37
  end
32
38
 
33
- should "return true with a call to #required?" do
34
- assert_equal true, subject.required?
39
+ end
40
+
41
+ class ParseArgsTests < BaseTests
42
+ desc "when parsing args"
43
+ setup do
44
+ @pname, @ptype_class, @prules = NsOptions::Option.args([:stage, String, @rules])
35
45
  end
36
46
 
37
- should "allow setting the value to nil" do
38
- subject.value = nil
39
- assert_nil subject.value
47
+ should "parse the name arg and convert to a string" do
48
+ assert_equal "stage", @pname
49
+
50
+ @pname, @ptype_class, @prules = NsOptions::Option.args(['test'])
51
+ assert_equal 'test', @pname
52
+ end
53
+
54
+ should "parse the type_class arg and default it to Object" do
55
+ assert_equal String, @ptype_class
56
+
57
+ @pname, @ptype_class, @prules = NsOptions::Option.args(['test'])
58
+ assert_equal Object, @ptype_class
59
+ end
60
+
61
+ should "parse the type_class arg and default it to a given default type class" do
62
+ assert_equal String, @ptype_class
63
+
64
+ @pname, @ptype_class, @prules = NsOptions::Option.args(['test'], Fixnum)
65
+ assert_equal Fixnum, @ptype_class
66
+ end
67
+
68
+ should "parse option rules arguments, defaulting to {:args => []}" do
69
+ assert_equal @rules, @prules
70
+
71
+ @pname, @ptype_class, @prules = NsOptions::Option.args(['test'])
72
+ assert_equal({:args => []}, @prules)
40
73
  end
74
+
41
75
  end
42
76
 
43
- class ParseRulesTests < BaseTest
44
- desc "parsing rules"
77
+ class DefaultRuleTests < BaseTests
78
+ desc "using the :default rule"
45
79
  setup do
46
- @cases = [nil, {}, {:args => 'is'}].map do |c|
47
- subject.class.rules(c)
48
- end
80
+ @option = NsOptions::Option.new(:opt, Object, :default => "something")
49
81
  end
50
82
 
51
- should "always return them as a Hash" do
52
- @cases.each { |c| assert_kind_of Hash, c }
83
+ should "have defaulted value based on the rule" do
84
+ assert_equal 'something', subject.value
53
85
  end
54
86
 
55
- should "always return with an array args rule" do
56
- @cases.each do |c|
57
- assert c.has_key? :args
58
- assert_kind_of Array, c[:args]
59
- end
87
+ should "allow overwriting the default value" do
88
+ assert_nothing_raised { subject.value = "overwritten" }
89
+ assert_equal "overwritten", subject.value
90
+ end
91
+
92
+ should "allow setting the value to nil" do
93
+ assert_nothing_raised { subject.value = nil }
94
+ assert_nil subject.value
95
+ end
96
+
97
+ should "return the value to its default when `reset` is called" do
98
+ subject.value = "overwritten"
99
+ subject.reset
100
+
101
+ assert_equal 'something', subject.value
60
102
  end
61
103
 
62
104
  end
63
105
 
64
- class ParseArgsTests < BaseTest
65
- desc "when parsing args"
106
+ class RequiredRuleTests < BaseTests
107
+ desc "using the :required rule"
66
108
  setup do
67
- @prules, @ptype_class, @pname = subject.class.args(*@args)
109
+ @option = NsOptions::Option.new(:opt, Object, :required => true)
68
110
  end
69
111
 
70
- should "parse option rules arguments, defaulting to {:args => []}" do
71
- assert_equal @rules, @prules
72
-
73
- @prules, @ptype_class, @pname = subject.class.args('test')
74
- assert_equal({:args => []}, @prules)
112
+ should "return true with a call to #required?" do
113
+ assert_equal true, subject.required?
75
114
  end
76
115
 
77
- should "parse the name arg and convert to a string" do
78
- assert_equal "stage", @pname
116
+ end
79
117
 
80
- @prules, @ptype_class, @pname = subject.class.args('test')
81
- assert_equal 'test', @pname
118
+ class ParseRulesTests < BaseTests
119
+ desc "parsing rules"
120
+ setup do
121
+ @cases = [nil, {}, {:args => 'is'}].map do |c|
122
+ NsOptions::Option.rules(c)
123
+ end
82
124
  end
83
125
 
84
- should "parse the type_class arg and default it to Object" do
85
- assert_equal String, @ptype_class
126
+ should "always return them as a Hash" do
127
+ @cases.each { |c| assert_kind_of Hash, c }
128
+ end
86
129
 
87
- @prules, @ptype_class, @pname = subject.class.args('test')
88
- assert_equal Object, @ptype_class
130
+ should "always return with an array args rule" do
131
+ @cases.each do |c|
132
+ assert c.has_key? :args
133
+ assert_kind_of Array, c[:args]
134
+ end
89
135
  end
90
136
 
91
137
  end
92
138
 
93
- class IsSetTest < BaseTest
139
+ class IsSetTests < BaseTests
94
140
  desc "is_set method"
95
141
  setup do
96
142
  @type_class = Class.new(String) do
@@ -101,7 +147,6 @@ class NsOptions::Option
101
147
 
102
148
  end
103
149
  @special = NsOptions::Option.new(:no_blank, @type_class)
104
-
105
150
  @boolean = NsOptions::Option.new(:boolean, NsOptions::Boolean)
106
151
  end
107
152
 
@@ -125,7 +170,7 @@ class NsOptions::Option
125
170
 
126
171
  end
127
172
 
128
- class EqualityOperatorTest < BaseTest
173
+ class EqualityOperatorTests < BaseTests
129
174
  desc "== operator"
130
175
  setup do
131
176
  @first = NsOptions::Option.new(:stage, String)
@@ -142,9 +187,10 @@ class NsOptions::Option
142
187
  @first.value = "staging"
143
188
  assert_not_equal @first, @second
144
189
  end
190
+
145
191
  end
146
192
 
147
- class WithNativeTypeClassTest < BaseTest
193
+ class WithNativeTypeClassTests < BaseTests
148
194
  desc "with a native type class (Float)"
149
195
  setup do
150
196
  @option = NsOptions::Option.new(:something, Float)
@@ -168,9 +214,10 @@ class NsOptions::Option
168
214
  subject.value = new_value
169
215
  assert_equal new_value.to_f, subject.value
170
216
  end
217
+
171
218
  end
172
219
 
173
- class WithSymbolTypeClasstest < BaseTest
220
+ class WithSymbolTypeClasstests < BaseTests
174
221
  desc "with a Symbol as a type class"
175
222
  setup do
176
223
  @option = NsOptions::Option.new(:something, Symbol)
@@ -192,13 +239,14 @@ class NsOptions::Option
192
239
  end
193
240
 
194
241
  should "error on anything that doesn't define #to_sym" do
195
- assert_raises(NoMethodError) do
242
+ assert_raises(NsOptions::Option::CoerceError) do
196
243
  subject.value = true
197
244
  end
198
245
  end
246
+
199
247
  end
200
248
 
201
- class WithHashTypeClassTest < BaseTest
249
+ class WithHashTypeClassTests < BaseTests
202
250
  desc "with a Hash as a type class"
203
251
  setup do
204
252
  @option = NsOptions::Option.new(:something, Hash)
@@ -210,9 +258,10 @@ class NsOptions::Option
210
258
  subject.value = new_value
211
259
  assert_equal new_value, subject.value
212
260
  end
261
+
213
262
  end
214
263
 
215
- class WithArrayTypeClassTest < BaseTest
264
+ class WithArrayTypeClassTests < BaseTests
216
265
  desc "with an Array as a type class"
217
266
  setup do
218
267
  @option = NsOptions::Option.new(:something, Array)
@@ -224,21 +273,10 @@ class NsOptions::Option
224
273
  subject.value = new_value
225
274
  assert_equal new_value, subject.value
226
275
  end
227
- end
228
276
 
229
- class WithoutTypeClassTest < BaseTest
230
- desc "without a type class provided"
231
- setup do
232
- @option = NsOptions::Option.new(:something, nil)
233
- end
234
- subject{ @option }
235
-
236
- should "have default it to Object" do
237
- assert_equal Object, subject.type_class
238
- end
239
277
  end
240
278
 
241
- class WithTypeClassArgErrorTests < BaseTest
279
+ class WithTypeClassArgErrorTests < BaseTests
242
280
  desc "setting a value with arg error"
243
281
  setup do
244
282
  @err = begin
@@ -254,18 +292,21 @@ class NsOptions::Option
254
292
  @option = NsOptions::Option.new(:something, SuperSuperTestTest)
255
293
  end
256
294
 
257
- should "reraise the arg error, including its type_class in the error message" do
295
+ should "reraise the arg error, with a custom message and backtrace" do
258
296
  err = begin
259
297
  @option.value = "arg error should be raised"
260
298
  rescue Exception => err
261
299
  err
262
300
  end
263
- assert_equal ArgumentError, err.class
264
- assert_included @option.type_class.to_s, err.message
301
+
302
+ assert_equal NsOptions::Option::CoerceError, err.class
303
+ assert_included @option.type_class.to_s, err.message
304
+ assert_included 'test/unit/option_tests.rb:', err.backtrace.first
265
305
  end
306
+
266
307
  end
267
308
 
268
- class WithAValueOfTheSameClassTest < BaseTest
309
+ class WithAValueOfTheSameClassTests < BaseTests
269
310
  desc "with a value of the same class"
270
311
  setup do
271
312
  @class = Class.new
@@ -277,9 +318,10 @@ class NsOptions::Option
277
318
  @option.value = value
278
319
  assert_same value, @option.value
279
320
  end
321
+
280
322
  end
281
323
 
282
- class WithAValueKindOfTest < BaseTest
324
+ class WithAValueKindOfTests < BaseTests
283
325
  desc "with a value that is a kind of the class"
284
326
  setup do
285
327
  @class = Class.new
@@ -292,9 +334,10 @@ class NsOptions::Option
292
334
  @option.value = value
293
335
  assert_same value, @option.value
294
336
  end
337
+
295
338
  end
296
339
 
297
- class ProcHandlingTests < BaseTest
340
+ class ProcHandlingTests < BaseTests
298
341
  setup do
299
342
  class KindOfProc < Proc; end
300
343
  @a_string = "a string"
@@ -342,17 +385,17 @@ class NsOptions::Option
342
385
  end
343
386
  end
344
387
 
345
- class WithReturnValueTests < BaseTest
388
+ class WithReturnValueTests < BaseTests
346
389
  setup do
347
390
  # test control values
348
- @string = NsOptions::Option.new(:string, String)
349
- @symbol = NsOptions::Option.new(:symbol, Symbol)
350
- @integer = NsOptions::Option.new(:integer, Integer)
351
- @float = NsOptions::Option.new(:float, Float)
352
- @hash = NsOptions::Option.new(:hash, Hash)
353
- @array = NsOptions::Option.new(:array, Array)
354
- @proc = NsOptions::Option.new(:proc, Proc)
355
- @lazy_proc = NsOptions::Option.new(:lazy_proc)
391
+ @string = NsOptions::Option.new :string, String
392
+ @symbol = NsOptions::Option.new :symbol, Symbol
393
+ @integer = NsOptions::Option.new :integer, Integer
394
+ @float = NsOptions::Option.new :float, Float
395
+ @hash = NsOptions::Option.new :hash, Hash
396
+ @array = NsOptions::Option.new :array, Array
397
+ @proc = NsOptions::Option.new :proc, Proc
398
+ @lazy_proc = NsOptions::Option.new :lazy_proc, Object
356
399
 
357
400
  # custom return value
358
401
  class HostedAt
@@ -402,9 +445,10 @@ class NsOptions::Option
402
445
  @hosted_at.value = "path/to/resource/"
403
446
  assert_equal '/path/to/resource', @hosted_at.value
404
447
  end
448
+
405
449
  end
406
450
 
407
- class WithArgsTest < BaseTest
451
+ class WithArgsTests < BaseTests
408
452
  desc "with args rule"
409
453
  setup do
410
454
  @class = Class.new do
@@ -413,50 +457,68 @@ class NsOptions::Option
413
457
  self.args = args
414
458
  end
415
459
  end
416
- @value = "amazing"
417
460
  end
418
461
 
419
- class AsArrayTest < WithArgsTest
462
+ class AsArrayTests < WithArgsTests
420
463
  desc "as an array"
421
464
  setup do
422
465
  @args = [ true, false, { :hash => "yes" } ]
423
466
  @option = NsOptions::Option.new(:something, @class, { :args => @args })
424
- @option.value = @value
467
+ @option.value = "amazing"
425
468
  end
426
469
 
427
470
  should "pass the args to the type class with the value" do
428
- expected = @args.dup.insert(0, @value)
471
+ expected = ["amazing", *@args]
429
472
  assert_equal expected, subject.value.args
430
473
  end
474
+
431
475
  end
432
476
 
433
- class AsSingleValueTest < WithArgsTest
477
+ class AsSingleValueTests < WithArgsTests
434
478
  desc "as a single value"
435
479
  setup do
436
480
  @args = lambda{ "something" }
437
481
  @option = NsOptions::Option.new(:something, @class, { :args => @args })
438
- @option.value = @value
482
+ @option.value = "amazing"
439
483
  end
440
484
 
441
485
  should "pass the single value to the type class with the value" do
442
- expected = [*@args].insert(0, @value)
486
+ expected = ["amazing", *@args]
443
487
  assert_equal expected, subject.value.args
444
488
  end
489
+
445
490
  end
446
491
 
447
- class AsNilValueTest < WithArgsTest
492
+ class AsNilValueTests < WithArgsTests
448
493
  desc "as a nil value"
449
494
  setup do
450
495
  @args = nil
451
496
  @option = NsOptions::Option.new(:something, @class, { :args => @args })
452
- @option.value = @value
497
+ @option.value = "amazing"
498
+ end
499
+
500
+ should "just pass the value to the type class and that's it" do
501
+ expected = ["amazing"]
502
+ assert_equal expected, subject.value.args
503
+ end
504
+
505
+ end
506
+
507
+ class AsEmptyArrayValueTests < WithArgsTests
508
+ desc "as an empty Array value"
509
+ setup do
510
+ @args = []
511
+ @option = NsOptions::Option.new(:something, @class, { :args => @args })
512
+ @option.value = "amazing"
453
513
  end
454
514
 
455
- should "just pass the value to the type class" do
456
- expected = [@value]
515
+ should "just pass the value to the type class and that's it" do
516
+ expected = ["amazing"]
457
517
  assert_equal expected, subject.value.args
458
518
  end
519
+
459
520
  end
521
+
460
522
  end
461
523
 
462
524
  end
@@ -0,0 +1,152 @@
1
+ require 'assert'
2
+ require 'ns-options/options'
3
+
4
+ class NsOptions::Options
5
+
6
+ class BaseTests < Assert::Context
7
+ desc "NsOptions::Options"
8
+ setup do
9
+ @options = NsOptions::Options.new
10
+ end
11
+ subject{ @options }
12
+
13
+ should have_accessor :[]
14
+ should have_imeths :keys, :each, :empty?
15
+ should have_imeths :add, :rm, :get, :set, :required_set?
16
+
17
+ should "only use strings for keys (indifferent access)" do
18
+ subject['string_key'] = true
19
+ subject[:symbol_key] = true
20
+
21
+ assert_includes 'string_key', subject.keys
22
+ assert_includes 'symbol_key', subject.keys
23
+ assert_not_includes :string_key, subject.keys
24
+ end
25
+
26
+ end
27
+
28
+ class AddTests < BaseTests
29
+ desc "add method"
30
+
31
+ should "add options" do
32
+ assert_nil subject[:my_string]
33
+ subject.add(:my_string, NsOptions::Option.new(:my_string))
34
+ assert subject[:my_string]
35
+ end
36
+
37
+ should "should work with both string and symbol names" do
38
+ assert_nil subject[:my_string]
39
+ subject.add('my_string', NsOptions::Option.new('my_string'))
40
+ assert subject[:my_string]
41
+ end
42
+
43
+ should "return the option added" do
44
+ added_opt = subject.add(:something, NsOptions::Option.new(:something))
45
+ assert_kind_of NsOptions::Option, added_opt
46
+ end
47
+
48
+ should "build options with args when adding" do
49
+ subject.add(:my_float, NsOptions::Option.new(:my_float, Float, :default => 1.0))
50
+
51
+ assert_equal Float, subject[:my_float].type_class
52
+ assert_equal 1.0, subject[:my_float].rules[:default]
53
+ end
54
+
55
+ end
56
+
57
+ class RmTests < BaseTests
58
+ desc "rm method"
59
+ setup do
60
+ @options.add(:my_string, NsOptions::Option.new(:my_string))
61
+ end
62
+
63
+ should "remove the option definition from the collection" do
64
+ assert subject[:my_string]
65
+
66
+ subject.rm(:my_string)
67
+ assert_nil subject[:my_string]
68
+ end
69
+
70
+ should "should work with both string and symbol names" do
71
+ assert subject[:my_string]
72
+
73
+ subject.rm('my_string')
74
+ assert_nil subject[:my_string]
75
+ end
76
+
77
+ end
78
+
79
+ class GetTests < BaseTests
80
+ desc "get method"
81
+ setup do
82
+ opt = NsOptions::Option.new(:my_string, Object, :default => "something")
83
+ @options.add(:my_string, opt)
84
+ end
85
+
86
+ should "return the named option value" do
87
+ assert_equal "something", subject.get(:my_string)
88
+ end
89
+
90
+ should "should work with both string and symbol names" do
91
+ assert_equal "something", subject.get('my_string')
92
+ end
93
+
94
+ end
95
+
96
+ class SetTests < BaseTests
97
+ desc "set method"
98
+ setup do
99
+ @options.add(:my_string, NsOptions::Option.new(:my_string))
100
+ end
101
+
102
+ should "set option values" do
103
+ assert_nil subject[:my_string].value
104
+ subject.set(:my_string, "something")
105
+
106
+ assert_equal "something", subject.get(:my_string)
107
+ end
108
+
109
+ should "should work with both string and symbol names" do
110
+ assert_nil subject[:my_string].value
111
+ subject.set('my_string', "something")
112
+
113
+ assert_equal "something", subject.get(:my_string)
114
+ end
115
+
116
+ end
117
+
118
+ class RequiredSetTests < BaseTests
119
+ desc "required_set? method"
120
+ setup do
121
+ @options.add(:first, NsOptions::Option.new(:first, String, :required => true))
122
+ @options.add(:second, NsOptions::Option.new(:second, String, :required => true))
123
+ @options.add(:third, NsOptions::Option.new(:third, String))
124
+ end
125
+
126
+ should "return true when all required options are set" do
127
+ subject.set(:first, "first")
128
+ subject.set(:second, "second")
129
+
130
+ assert_equal true, subject.required_set?
131
+ end
132
+
133
+ should "return false if one required option is not set" do
134
+ subject.set(:first, "first")
135
+ subject.set(:third, "third")
136
+
137
+ assert_equal false, subject.required_set?
138
+ end
139
+
140
+ should "not change because of options that aren't required" do
141
+ subject.set(:first, "first")
142
+ subject.set(:second, "second")
143
+ subject.set(:third, "third")
144
+ assert_equal true, subject.required_set?
145
+
146
+ subject.set(:third, nil)
147
+ assert_equal true, subject.required_set?
148
+ end
149
+
150
+ end
151
+
152
+ end
@@ -0,0 +1,87 @@
1
+ require 'assert'
2
+ require 'ns-options/proxy_method'
3
+
4
+ class NsOptions::RootMethods
5
+
6
+ class BaseTests < Assert::Context
7
+ desc "NsOptions::RootMethods"
8
+ setup do
9
+ @pm = NsOptions::ProxyMethod.new(Module.new, 'whatever', 'a thing')
10
+ end
11
+ subject { @pm }
12
+
13
+ should have_imeths :define_on_class?, :define, :validate
14
+
15
+ end
16
+
17
+ class ValidateTests < BaseTests
18
+ desc "validate meth"
19
+ setup do
20
+ @io = StringIO.new(@out = "")
21
+ @caller = ["a test caller"]
22
+ end
23
+
24
+ should "return false for not recommended methods" do
25
+ pm = NsOptions::ProxyMethod.new(Module.new, :option, 'a thing')
26
+ assert_equal false, pm.validate(@io, @caller)
27
+
28
+ pm = NsOptions::ProxyMethod.new(Module.new, "anything_else", 'a thing')
29
+ assert_equal true, pm.validate(@io, @caller)
30
+ end
31
+
32
+ should "write a warning and any caller info" do
33
+ NsOptions::ProxyMethod.new(Module.new, :ns, 'a thing').validate(@io, @caller)
34
+
35
+ assert_match "WARNING: ", @out
36
+ assert_match @caller.first, @out
37
+ end
38
+
39
+ should "be called when calling `define'" do
40
+ NsOptions::ProxyMethod.new(Module.new, :ns, 'a thing').define(@io, @caller)
41
+
42
+ assert_match "WARNING: ", @out
43
+ assert_match @caller.first, @out
44
+ end
45
+
46
+ end
47
+
48
+ class ModuleTests < BaseTests
49
+ desc "defined on a module"
50
+ setup do
51
+ @pm = NsOptions::ProxyMethod.new(@the_module = Module.new, 'on_module', 'a thing')
52
+ @pm.define
53
+ end
54
+
55
+ should "know its not defining on a class" do
56
+ assert_not subject.define_on_class?
57
+ end
58
+
59
+ should "define a singleton method that builds a ns" do
60
+ assert_responds_to 'on_module', @the_module
61
+ end
62
+
63
+ end
64
+
65
+ class ClassTests < BaseTests
66
+ desc "defined on a class"
67
+ setup do
68
+ @pm = NsOptions::ProxyMethod.new(@the_class = Class.new, 'on_class', 'a thing')
69
+ @pm.define
70
+ end
71
+
72
+ should "know its defining on a class" do
73
+ assert subject.define_on_class?
74
+ end
75
+
76
+ should "define a singleton method that builds a ns" do
77
+ assert_responds_to 'on_class', @the_class
78
+ end
79
+
80
+ should "define an instance method that builds a ns from its singleton" do
81
+ a_class = @the_class.new
82
+ assert_responds_to 'on_class', a_class
83
+ end
84
+
85
+ end
86
+
87
+ end