aquarium 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +20 -0
- data/README +17 -0
- data/UPGRADE +5 -0
- data/lib/aquarium/aspects/advice.rb +10 -9
- data/lib/aquarium/aspects/aspect.rb +274 -199
- data/lib/aquarium/aspects/default_object_handler.rb +22 -10
- data/lib/aquarium/aspects/exclusion_handler.rb +61 -0
- data/lib/aquarium/aspects/join_point.rb +18 -17
- data/lib/aquarium/aspects/pointcut.rb +44 -49
- data/lib/aquarium/finders/method_finder.rb +1 -1
- data/lib/aquarium/finders/object_finder.rb +1 -0
- data/lib/aquarium/utils/method_utils.rb +49 -8
- data/lib/aquarium/version.rb +1 -1
- data/spec/aquarium/aspects/advice_chain_node_spec.rb +5 -3
- data/spec/aquarium/aspects/aspect_invocation_spec.rb +1334 -31
- data/spec/aquarium/aspects/aspect_spec.rb +164 -426
- data/spec/aquarium/aspects/concurrent_aspects_with_objects_and_types_spec.rb +18 -2
- data/spec/aquarium/aspects/join_point_spec.rb +46 -4
- data/spec/aquarium/aspects/pointcut_spec.rb +80 -39
- data/spec/aquarium/finders/method_finder_spec.rb +25 -2
- data/spec/aquarium/finders/type_finder_spec.rb +1 -1
- data/spec/aquarium/spec_example_classes.rb +17 -0
- data/spec/aquarium/utils/method_utils_spec.rb +270 -46
- metadata +4 -3
@@ -20,13 +20,14 @@ describe "Advising an object join point and then the corresponding type join poi
|
|
20
20
|
@aspects = []
|
21
21
|
@invoked = []
|
22
22
|
@accessed = ConcurrentlyAccessed.new
|
23
|
+
@accessed2 = ConcurrentlyAccessed.new
|
23
24
|
end
|
24
25
|
after :each do
|
25
26
|
@aspects.each {|a| a.unadvise}
|
26
27
|
end
|
27
28
|
|
28
29
|
Aquarium::Aspects::Advice.kinds.each do |advice_kind|
|
29
|
-
it "should invoke
|
30
|
+
it "should invoke both the :#{advice_kind} advices when the object join point is invoked" do
|
30
31
|
method = advice_kind == :after_raising ? :invoke_raises : :invoke
|
31
32
|
@aspects << make_aspect(method, advice_kind, :object, @accessed)
|
32
33
|
@aspects << make_aspect(method, advice_kind, :type, ConcurrentlyAccessed)
|
@@ -36,7 +37,22 @@ describe "Advising an object join point and then the corresponding type join poi
|
|
36
37
|
rescue ConcurrentlyAccessed::Error
|
37
38
|
fail unless advice_kind == :after_raising
|
38
39
|
end
|
39
|
-
@invoked.should == [:object]
|
40
|
+
@invoked.sort.should == [:object, :type]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
Aquarium::Aspects::Advice.kinds.each do |advice_kind|
|
45
|
+
it "should invoke only the :#{advice_kind} type advice when a different object is invoked" do
|
46
|
+
method = advice_kind == :after_raising ? :invoke_raises : :invoke
|
47
|
+
@aspects << make_aspect(method, advice_kind, :object, @accessed2)
|
48
|
+
@aspects << make_aspect(method, advice_kind, :type, ConcurrentlyAccessed)
|
49
|
+
begin
|
50
|
+
@accessed.method(method).call :a1, :a2
|
51
|
+
fail if advice_kind == :after_raising
|
52
|
+
rescue ConcurrentlyAccessed::Error
|
53
|
+
fail unless advice_kind == :after_raising
|
54
|
+
end
|
55
|
+
@invoked.should == [:type]
|
40
56
|
end
|
41
57
|
end
|
42
58
|
end
|
@@ -265,14 +265,56 @@ describe Aquarium::Aspects::JoinPoint, "#<=>" do
|
|
265
265
|
@jp3 = Aquarium::Aspects::JoinPoint.new :type => Array, :method_name => :size
|
266
266
|
@jp4 = Aquarium::Aspects::JoinPoint.new :object => [], :method_name => :size
|
267
267
|
@jp5 = Aquarium::Aspects::JoinPoint.new :object => [], :method_name => :size
|
268
|
+
dummy = Dummy.new
|
269
|
+
@jp6 = Aquarium::Aspects::JoinPoint.new :object => dummy, :method_name => :size
|
270
|
+
@jp7 = Aquarium::Aspects::JoinPoint.new :object => dummy, :method_name => :size
|
271
|
+
context_opts = {
|
272
|
+
:advice_kind => :before,
|
273
|
+
:advised_object => dummy,
|
274
|
+
:parameters => [],
|
275
|
+
:block_for_method => nil,
|
276
|
+
:returned_value => nil,
|
277
|
+
:raised_exception => nil,
|
278
|
+
:proceed_proc => nil
|
279
|
+
}
|
280
|
+
@jp1b = @jp1.make_current_context_join_point context_opts
|
281
|
+
@jp2b = @jp2.make_current_context_join_point context_opts
|
282
|
+
@jp6b = @jp6.make_current_context_join_point context_opts
|
283
|
+
@jp7b = @jp7.make_current_context_join_point context_opts
|
268
284
|
end
|
269
285
|
|
270
|
-
it "should
|
271
|
-
(@jp1
|
286
|
+
it "should return 1 of the second object is nil" do
|
287
|
+
(@jp1 <=> nil).should == 1
|
272
288
|
end
|
273
289
|
|
274
|
-
it "should
|
275
|
-
(@jp1
|
290
|
+
it "should return 0 for the same join point with no context" do
|
291
|
+
(@jp1 <=> @jp1).should == 0
|
292
|
+
(@jp6 <=> @jp6).should == 0
|
293
|
+
end
|
294
|
+
|
295
|
+
it "should return 0 for the same join point with equivalent contexts" do
|
296
|
+
(@jp1b <=> @jp1b).should == 0
|
297
|
+
(@jp6b <=> @jp6b).should == 0
|
298
|
+
end
|
299
|
+
|
300
|
+
it "should return 0 for equivalent join points with no context" do
|
301
|
+
(@jp1 <=>@jp2).should == 0
|
302
|
+
(@jp6 <=>@jp7).should == 0
|
303
|
+
end
|
304
|
+
|
305
|
+
it "should return 0 for equivalent join points with equivalent contexts" do
|
306
|
+
(@jp1b <=> @jp2b).should == 0
|
307
|
+
(@jp6b <=> @jp7b).should == 0
|
308
|
+
end
|
309
|
+
|
310
|
+
it "should return +1 for join points that equivalent except for the context, where the first join point has a context and the second does not" do
|
311
|
+
(@jp1b <=> @jp2).should == 1
|
312
|
+
(@jp6b <=> @jp7).should == 1
|
313
|
+
end
|
314
|
+
|
315
|
+
it "should return -1 for join points that equivalent except for the context, where the second join point has a context and the first does not" do
|
316
|
+
(@jp1 <=> @jp2b).should == -1
|
317
|
+
(@jp6 <=> @jp6b).should == -1
|
276
318
|
end
|
277
319
|
|
278
320
|
it "should sort by type name first" do
|
@@ -6,22 +6,6 @@ require 'aquarium/aspects/join_point'
|
|
6
6
|
require 'aquarium/aspects/pointcut'
|
7
7
|
require 'aquarium/utils'
|
8
8
|
|
9
|
-
class ExcludeTestOne
|
10
|
-
def method11; end
|
11
|
-
def method12; end
|
12
|
-
def method13; end
|
13
|
-
end
|
14
|
-
class ExcludeTestTwo
|
15
|
-
def method21; end
|
16
|
-
def method22; end
|
17
|
-
def method23; end
|
18
|
-
end
|
19
|
-
class ExcludeTestThree
|
20
|
-
def method31; end
|
21
|
-
def method32; end
|
22
|
-
def method33; end
|
23
|
-
end
|
24
|
-
|
25
9
|
def before_exclude_spec
|
26
10
|
@jp11 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestOne, :method_name => :method11
|
27
11
|
@jp12 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestOne, :method_name => :method12
|
@@ -371,28 +355,25 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_join_points => join_points spe
|
|
371
355
|
|
372
356
|
it "should remove from a list of explicitly-specified join points the set of explicitly-specified excluded join points." do
|
373
357
|
excluded = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
358
|
+
expected = [@jp11, @jp13, @jp21, @jp22, @jp23, @jp31, @jp32, @ojp12, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33]
|
374
359
|
pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_join_points => excluded
|
375
|
-
pc.join_points_matched.should == Set.new(
|
360
|
+
pc.join_points_matched.should == Set.new(expected)
|
376
361
|
pc.join_points_not_matched.size.should == 0
|
377
362
|
end
|
378
363
|
|
379
364
|
it "should remove from the list of generated, type-based join points the set of explicitly-specified excluded join points." do
|
380
|
-
|
381
|
-
|
382
|
-
jp33 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestThree, :method_name => :method33
|
383
|
-
excluded = [jp11, jp22, jp33]
|
365
|
+
excluded = [@jp11, @jp22, @jp33]
|
366
|
+
expected = [@jp12, @jp13, @jp21, @jp23, @jp31, @jp32]
|
384
367
|
pc = Aquarium::Aspects::Pointcut.new :types => /ExcludeTest/, :exclude_join_points => excluded, :method_options => :exclude_ancestor_methods
|
385
|
-
pc.join_points_matched.should == Set.new(
|
368
|
+
pc.join_points_matched.should == Set.new(expected)
|
386
369
|
pc.join_points_not_matched.size.should == 0
|
387
370
|
end
|
388
371
|
|
389
372
|
it "should remove from the list of generated, object-based join points the set of explicitly-specified excluded join points." do
|
390
|
-
|
391
|
-
|
392
|
-
ojp31 = Aquarium::Aspects::JoinPoint.new :object => @et3, :method_name => :method31
|
393
|
-
excluded = [ojp12, ojp23, ojp31]
|
373
|
+
excluded = [@ojp12, @ojp23, @ojp31]
|
374
|
+
expected = [@ojp11, @ojp13, @ojp21, @ojp22, @ojp32, @ojp33]
|
394
375
|
pc = Aquarium::Aspects::Pointcut.new :objects => [@et1, @et2, @et3], :exclude_join_points => excluded, :method_options => :exclude_ancestor_methods
|
395
|
-
pc.join_points_matched.should == Set.new(
|
376
|
+
pc.join_points_matched.should == Set.new(expected)
|
396
377
|
pc.join_points_not_matched.size.should == 0
|
397
378
|
end
|
398
379
|
|
@@ -404,8 +385,66 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_join_points => join_points spe
|
|
404
385
|
|
405
386
|
it "should be a synonym for :exclude_join_point." do
|
406
387
|
excluded = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
388
|
+
expected = [@jp11, @jp13, @jp21, @jp22, @jp23, @jp31, @jp32, @ojp12, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33]
|
407
389
|
pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_join_point => excluded
|
408
|
-
pc.join_points_matched.should == Set.new(
|
390
|
+
pc.join_points_matched.should == Set.new(expected)
|
391
|
+
pc.join_points_not_matched.size.should == 0
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
|
396
|
+
describe Aquarium::Aspects::Pointcut, " (:exclude_pointcuts => pointcuts specified)" do
|
397
|
+
before(:each) do
|
398
|
+
before_exclude_spec
|
399
|
+
end
|
400
|
+
|
401
|
+
it "should remove from a list of explicitly-specified join points the set of explicitly-specified excluded pointcuts." do
|
402
|
+
excluded_jps = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
403
|
+
excluded = Aquarium::Aspects::Pointcut.new :join_points => excluded_jps
|
404
|
+
expected = [@jp11, @jp13, @jp21, @jp22, @jp23, @jp31, @jp32, @ojp12, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33]
|
405
|
+
pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_pointcuts => excluded
|
406
|
+
pc.join_points_matched.should == Set.new(expected)
|
407
|
+
pc.join_points_not_matched.size.should == 0
|
408
|
+
end
|
409
|
+
|
410
|
+
it "should remove from the list of generated, type-based join points the set of explicitly-specified excluded pointcuts." do
|
411
|
+
excluded_jps = [@jp11, @jp22, @jp33]
|
412
|
+
excluded = Aquarium::Aspects::Pointcut.new :join_points => excluded_jps
|
413
|
+
expected = [@jp12, @jp13, @jp21, @jp23, @jp31, @jp32]
|
414
|
+
pc = Aquarium::Aspects::Pointcut.new :types => /ExcludeTest/, :exclude_pointcuts => excluded, :method_options => :exclude_ancestor_methods
|
415
|
+
pc.join_points_matched.should == Set.new(expected)
|
416
|
+
pc.join_points_not_matched.size.should == 0
|
417
|
+
end
|
418
|
+
|
419
|
+
it "should remove from the list of generated, object-based join points the set of explicitly-specified excluded pointcuts." do
|
420
|
+
excluded_jps = [@ojp12, @ojp23, @ojp31]
|
421
|
+
excluded = Aquarium::Aspects::Pointcut.new :join_points => excluded_jps
|
422
|
+
expected = [@ojp11, @ojp13, @ojp21, @ojp22, @ojp32, @ojp33]
|
423
|
+
pc = Aquarium::Aspects::Pointcut.new :objects => [@et1, @et2, @et3], :exclude_pointcuts => excluded, :method_options => :exclude_ancestor_methods
|
424
|
+
pc.join_points_matched.should == Set.new(expected)
|
425
|
+
pc.join_points_not_matched.size.should == 0
|
426
|
+
end
|
427
|
+
|
428
|
+
it "should not add excluded types to the #not_matched results." do
|
429
|
+
excluded_jps = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
430
|
+
excluded = Aquarium::Aspects::Pointcut.new :join_points => excluded_jps
|
431
|
+
pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_pointcuts => excluded
|
432
|
+
pc.join_points_not_matched.size.should == 0
|
433
|
+
end
|
434
|
+
|
435
|
+
it "should result in an empty pointcut if the join points in the :exclude_pointcuts are a superset of the matched join points." do
|
436
|
+
excluded = Aquarium::Aspects::Pointcut.new :join_points => @all_jps
|
437
|
+
pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_pointcut => excluded
|
438
|
+
pc.join_points_matched.size.should == 0
|
439
|
+
pc.join_points_not_matched.size.should == 0
|
440
|
+
end
|
441
|
+
|
442
|
+
it "should be a synonym for :exclude_pointcut." do
|
443
|
+
excluded_jps = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
444
|
+
excluded = Aquarium::Aspects::Pointcut.new :join_points => excluded_jps
|
445
|
+
expected = [@jp11, @jp13, @jp21, @jp22, @jp23, @jp31, @jp32, @ojp12, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33]
|
446
|
+
pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_pointcut => excluded
|
447
|
+
pc.join_points_matched.should == Set.new(expected)
|
409
448
|
pc.join_points_not_matched.size.should == 0
|
410
449
|
end
|
411
450
|
end
|
@@ -898,7 +937,7 @@ describe Aquarium::Aspects::Pointcut, "#eql?" do
|
|
898
937
|
pc1.should be_eql(pc2)
|
899
938
|
end
|
900
939
|
|
901
|
-
it "should return false
|
940
|
+
it "should return false if the matched types are different." do
|
902
941
|
pc1 = Aquarium::Aspects::Pointcut.new :types => /ClassWithPublicMethod/
|
903
942
|
pc2 = Aquarium::Aspects::Pointcut.new :types => /Class.*Method/
|
904
943
|
pc1.should_not eql(pc2)
|
@@ -928,18 +967,19 @@ describe Aquarium::Aspects::Pointcut, "#eql?" do
|
|
928
967
|
pc1.should_not eql(pc2)
|
929
968
|
end
|
930
969
|
|
931
|
-
it "should return false if the matched
|
932
|
-
pc1 = Aquarium::Aspects::Pointcut.new :types => /ClassWithPublicMethod/
|
933
|
-
pc2 = Aquarium::Aspects::Pointcut.new :types => /Class.*Method/
|
934
|
-
pc1.should_not eql(pc2)
|
935
|
-
end
|
936
|
-
|
937
|
-
it "should return false if the matched objects are different." do
|
970
|
+
it "should return false if the matched objects are different objects." do
|
938
971
|
pc1 = Aquarium::Aspects::Pointcut.new :object => ClassWithPublicClassMethod.new, :methods => /_test_method$/
|
939
972
|
pc2 = Aquarium::Aspects::Pointcut.new :object => ClassWithPrivateClassMethod.new, :methods => /_test_method$/
|
940
973
|
pc1.should_not eql(pc2)
|
941
974
|
end
|
942
975
|
|
976
|
+
it "should return true if the matched objects are the same object." do
|
977
|
+
object = ClassWithPublicClassMethod.new
|
978
|
+
pc1 = Aquarium::Aspects::Pointcut.new :object => object, :methods => /_test_method$/
|
979
|
+
pc2 = Aquarium::Aspects::Pointcut.new :object => object, :methods => /_test_method$/
|
980
|
+
pc1.should eql(pc2)
|
981
|
+
end
|
982
|
+
|
943
983
|
it "should return false if the not_matched types are different." do
|
944
984
|
pc1 = Aquarium::Aspects::Pointcut.new :types => :UnknownFoo
|
945
985
|
pc2 = Aquarium::Aspects::Pointcut.new :types => :UnknownBar
|
@@ -1100,8 +1140,9 @@ describe Aquarium::Aspects::Pointcut, "#specification" do
|
|
1100
1140
|
:exclude_types => @empty_set,
|
1101
1141
|
:exclude_objects => @empty_set,
|
1102
1142
|
:exclude_join_points => @empty_set,
|
1143
|
+
:exclude_pointcuts => @empty_set,
|
1103
1144
|
:exclude_methods => @empty_set,
|
1104
|
-
:
|
1145
|
+
:default_objects => @empty_set}
|
1105
1146
|
@default_specification_all_methods = { :methods => Set.new([:all]) } | @default_specification
|
1106
1147
|
end
|
1107
1148
|
|
@@ -1130,13 +1171,13 @@ describe Aquarium::Aspects::Pointcut, "#specification" do
|
|
1130
1171
|
it "should return the input :method_options verbatim." do
|
1131
1172
|
pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :methods => /^get/, :method => "dup", :method_options => [:instance, :public]
|
1132
1173
|
pc.specification.should == { :types => Set.new(@example_types), :methods => Set.new([/^get/, "dup"]),
|
1133
|
-
:method_options => Set.new([:instance, :public]), :
|
1174
|
+
:method_options => Set.new([:instance, :public]), :default_objects => @empty_set } | @default_specification
|
1134
1175
|
end
|
1135
1176
|
|
1136
1177
|
it "should return the input :methods and :method arguments combined into an array keyed by :methods." do
|
1137
1178
|
pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :attributes => /^state/, :attribute => "name"
|
1138
1179
|
pc.specification.should == { :types => Set.new(@example_types), :objects => @empty_set, :join_points => @empty_set,
|
1139
|
-
:methods => @empty_set, :method_options => Set.new([]), :
|
1180
|
+
:methods => @empty_set, :method_options => Set.new([]), :default_objects => @empty_set,
|
1140
1181
|
:attributes => Set.new([/^state/, "name"]), :attribute_options => @empty_set } | @default_specification
|
1141
1182
|
end
|
1142
1183
|
|
@@ -294,6 +294,12 @@ describe Aquarium::Finders::MethodFinder, "#find (searching for instance methods
|
|
294
294
|
actual = Aquarium::Finders::MethodFinder.new.find :types => ClassWithPublicInstanceMethod, :methods => /instance_test_method/
|
295
295
|
actual.matched.size.should == 1
|
296
296
|
actual.matched[ClassWithPublicInstanceMethod].should == Set.new([:public_instance_test_method])
|
297
|
+
actual2 = Aquarium::Finders::MethodFinder.new.find :types => ClassWithPublicInstanceMethod, :methods => /instance_test/
|
298
|
+
actual2.matched.size.should == 1
|
299
|
+
actual2.matched[ClassWithPublicInstanceMethod].should == Set.new([:public_instance_test_method])
|
300
|
+
actual3 = Aquarium::Finders::MethodFinder.new.find :types => ClassWithPublicInstanceMethod, :methods => /test_method/
|
301
|
+
actual3.matched.size.should == 1
|
302
|
+
actual3.matched[ClassWithPublicInstanceMethod].should == Set.new([:public_instance_test_method])
|
297
303
|
end
|
298
304
|
|
299
305
|
it "should find only one instance method for an object when searching with a regexp matching one method." do
|
@@ -443,7 +449,15 @@ describe Aquarium::Finders::MethodFinder, "#find for types (using :exclude_metho
|
|
443
449
|
actual.not_matched.size.should == 0
|
444
450
|
end
|
445
451
|
|
446
|
-
it "should remove excluded methods from the result where
|
452
|
+
it "should remove excluded methods from the result where a single excluded methods is specified by name." do
|
453
|
+
actual = Aquarium::Finders::MethodFinder.new.find :types => ExcludeMethodTester, :methods => :all, :exclude_method => :method1, :options => :exclude_ancestor_methods
|
454
|
+
actual.matched.size.should == 1
|
455
|
+
actual.matched[ExcludeMethodTester].size.should == 2
|
456
|
+
actual.matched[ExcludeMethodTester].should == Set.new([:method2, :method3])
|
457
|
+
actual.not_matched.size.should == 0
|
458
|
+
end
|
459
|
+
|
460
|
+
it "should remove excluded methods from the result where the excluded methods are specified by an array of names." do
|
447
461
|
actual = Aquarium::Finders::MethodFinder.new.find :types => ExcludeMethodTester, :methods => :all, :exclude_methods => [:method1, :method2], :options => :exclude_ancestor_methods
|
448
462
|
actual.matched.size.should == 1
|
449
463
|
actual.matched[ExcludeMethodTester].size.should == 1
|
@@ -480,7 +494,16 @@ describe Aquarium::Finders::MethodFinder, "#find for objects (using :exclude_met
|
|
480
494
|
actual.not_matched.size.should == 0
|
481
495
|
end
|
482
496
|
|
483
|
-
it "should remove excluded methods from the result where
|
497
|
+
it "should remove excluded methods from the result where a single excluded methods is specified by name." do
|
498
|
+
emt = ExcludeMethodTester.new
|
499
|
+
actual = Aquarium::Finders::MethodFinder.new.find :object => emt, :methods => :all, :exclude_method => :method1, :options => :exclude_ancestor_methods
|
500
|
+
actual.matched.size.should == 1
|
501
|
+
actual.matched[emt].size.should == 2
|
502
|
+
actual.matched[emt].should == Set.new([:method2, :method3])
|
503
|
+
actual.not_matched.size.should == 0
|
504
|
+
end
|
505
|
+
|
506
|
+
it "should remove excluded methods from the result where the excluded methods are specified by an array of names." do
|
484
507
|
emt = ExcludeMethodTester.new
|
485
508
|
actual = Aquarium::Finders::MethodFinder.new.find :object => emt, :methods => :all, :exclude_methods => [:method1, :method2], :options => :exclude_ancestor_methods
|
486
509
|
actual.matched.size.should == 1
|
@@ -289,7 +289,7 @@ describe Aquarium::Finders::TypeFinder, "#find_by_type" do
|
|
289
289
|
end
|
290
290
|
end
|
291
291
|
|
292
|
-
#
|
292
|
+
# This is a spec for a protected method.
|
293
293
|
describe Aquarium::Finders::TypeFinder, "#get_type_from_parent should" do
|
294
294
|
it "should raise if a type doesn't exist that matches the constant" do
|
295
295
|
lambda {Aquarium::Finders::TypeFinder.new.send(:get_type_from_parent, Aquarium::Finders, "Nonexistent", /Non/)}.should raise_error(NameError)
|
@@ -119,3 +119,20 @@ class Watchful
|
|
119
119
|
end
|
120
120
|
|
121
121
|
class WatchfulChild < Watchful; end
|
122
|
+
|
123
|
+
class ExcludeTestOne
|
124
|
+
def method11; end
|
125
|
+
def method12; end
|
126
|
+
def method13; end
|
127
|
+
end
|
128
|
+
class ExcludeTestTwo
|
129
|
+
def method21; end
|
130
|
+
def method22; end
|
131
|
+
def method23; end
|
132
|
+
end
|
133
|
+
class ExcludeTestThree
|
134
|
+
def method31; end
|
135
|
+
def method32; end
|
136
|
+
def method33; end
|
137
|
+
end
|
138
|
+
|
@@ -45,129 +45,353 @@ describe Aquarium::Utils::MethodUtils, ".method_args_to_hash" do
|
|
45
45
|
|
46
46
|
it "should return a hash with the non-hash arguments mapped to key-value pairs with value specified by the input block (or null) and the input unchanged." do
|
47
47
|
Aquarium::Utils::MethodUtils.method_args_to_hash(:x, :y, :a =>'a', :b => 'b'){|a| a.to_s.capitalize}.should == {:a => 'a', :b => 'b', :x => 'X', :y => 'Y'}
|
48
|
-
end
|
49
|
-
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class MethodUtilsSpecProtectionExample
|
52
|
+
def public_instance_m; end
|
53
|
+
protected
|
54
|
+
def protected_instance_m; end
|
55
|
+
private
|
56
|
+
def private_instance_m; end
|
57
|
+
def self.public_class_m; end
|
58
|
+
def self.private_class_m; end
|
59
|
+
private_class_method :private_class_m
|
60
|
+
end
|
61
|
+
class MethodUtilsSpecProtectionExample2 < MethodUtilsSpecProtectionExample
|
50
62
|
end
|
51
63
|
|
52
64
|
describe Aquarium::Utils::MethodUtils, ".visibility" do
|
53
|
-
class ProtectionExample
|
54
|
-
def public_instance_m; end
|
55
|
-
protected
|
56
|
-
def protected_instance_m; end
|
57
|
-
private
|
58
|
-
def private_instance_m; end
|
59
|
-
def self.public_class_m; end
|
60
|
-
def self.private_class_m; end
|
61
|
-
private_class_method :private_class_m
|
62
|
-
end
|
63
|
-
|
64
65
|
it "should return :public for public class methods on a class" do
|
65
|
-
Aquarium::Utils::MethodUtils.visibility(
|
66
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :public_class_m).should == :public
|
66
67
|
end
|
67
68
|
it "should return :public for public class methods on a class when only class methods are specified" do
|
68
|
-
Aquarium::Utils::MethodUtils.visibility(
|
69
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :public_class_m, :class_method_only).should == :public
|
69
70
|
end
|
70
71
|
it "should return nil for public class methods on a class when only instance methods are specified" do
|
71
|
-
Aquarium::Utils::MethodUtils.visibility(
|
72
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :public_class_m, :instance_method_only).should be_nil
|
72
73
|
end
|
73
74
|
|
74
75
|
it "should return :public for public instance methods on a class" do
|
75
|
-
Aquarium::Utils::MethodUtils.visibility(
|
76
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :public_instance_m).should == :public
|
76
77
|
end
|
77
78
|
it "should return nil for public instance methods on a class when only class methods are specified" do
|
78
|
-
Aquarium::Utils::MethodUtils.visibility(
|
79
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :public_instance_m, :class_method_only).should be_nil
|
79
80
|
end
|
80
81
|
it "should return :public for public instance methods on a class when only instance methods are specified" do
|
81
|
-
Aquarium::Utils::MethodUtils.visibility(
|
82
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :public_instance_m, :instance_method_only).should == :public
|
82
83
|
end
|
83
84
|
|
84
85
|
it "should return nil for public class methods on an instance of a class" do
|
85
|
-
Aquarium::Utils::MethodUtils.visibility(
|
86
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :public_class_m).should be_nil
|
86
87
|
end
|
87
88
|
it "should return nil for public class methods on an instance of a class when only class methods are specified" do
|
88
|
-
Aquarium::Utils::MethodUtils.visibility(
|
89
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :public_class_m, :class_method_only).should be_nil
|
89
90
|
end
|
90
91
|
it "should return nil for public class methods on an instance of a class when only instance methods are specified" do
|
91
|
-
Aquarium::Utils::MethodUtils.visibility(
|
92
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :public_class_m, :instance_method_only).should be_nil
|
92
93
|
end
|
93
94
|
|
94
95
|
it "should return :public for public instance methods on an instance of a class" do
|
95
|
-
Aquarium::Utils::MethodUtils.visibility(
|
96
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :public_instance_m).should == :public
|
96
97
|
end
|
97
98
|
it "should return nil for public instance methods on an instance of a class when only class methods are specified" do
|
98
|
-
Aquarium::Utils::MethodUtils.visibility(
|
99
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :public_instance_m, :class_method_only).should be_nil
|
99
100
|
end
|
100
101
|
it "should return :public for public instance methods on an instance of a class when only instance methods are specified" do
|
101
|
-
Aquarium::Utils::MethodUtils.visibility(
|
102
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :public_instance_m, :instance_method_only).should == :public
|
102
103
|
end
|
103
104
|
|
104
105
|
it "should return :protected for protected instance methods on a class" do
|
105
|
-
Aquarium::Utils::MethodUtils.visibility(
|
106
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :protected_instance_m).should == :protected
|
106
107
|
end
|
107
108
|
it "should return nil for protected instance methods on a class when only class methods are specified" do
|
108
|
-
Aquarium::Utils::MethodUtils.visibility(
|
109
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :protected_instance_m, :class_method_only).should be_nil
|
109
110
|
end
|
110
111
|
it "should return :protected for protected instance methods on a class when only instance methods are specified" do
|
111
|
-
Aquarium::Utils::MethodUtils.visibility(
|
112
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :protected_instance_m, :instance_method_only).should == :protected
|
112
113
|
end
|
113
114
|
|
114
115
|
it "should return :protected for protected instance methods on an instance of a class" do
|
115
|
-
Aquarium::Utils::MethodUtils.visibility(
|
116
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :protected_instance_m).should == :protected
|
116
117
|
end
|
117
118
|
it "should return nil for protected instance methods on an instance of a class when only class methods are specified" do
|
118
|
-
Aquarium::Utils::MethodUtils.visibility(
|
119
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :protected_instance_m, :class_method_only).should be_nil
|
119
120
|
end
|
120
121
|
it "should return :protected for protected instance methods on an instance of a class when only instance methods are specified" do
|
121
|
-
Aquarium::Utils::MethodUtils.visibility(
|
122
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :protected_instance_m, :instance_method_only).should == :protected
|
122
123
|
end
|
123
124
|
|
124
125
|
it "should return :private for private class methods on a class" do
|
125
|
-
Aquarium::Utils::MethodUtils.visibility(
|
126
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :private_class_m).should == :private #expected_private
|
126
127
|
end
|
127
128
|
it "should return :private for private class methods on a class when only class methods are specified" do
|
128
|
-
Aquarium::Utils::MethodUtils.visibility(
|
129
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :private_class_m, :class_method_only).should == :private #expected_private
|
129
130
|
end
|
130
131
|
it "should return nil for private class methods on a class when only instance methods are specified" do
|
131
|
-
Aquarium::Utils::MethodUtils.visibility(
|
132
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :private_class_m, :instance_method_only).should be_nil
|
132
133
|
end
|
133
134
|
|
134
135
|
it "should return :private for private instance methods on a class" do
|
135
|
-
Aquarium::Utils::MethodUtils.visibility(
|
136
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :private_instance_m).should == :private
|
136
137
|
end
|
137
138
|
it "should return nil for private instance methods on a class when only class methods are specified" do
|
138
|
-
Aquarium::Utils::MethodUtils.visibility(
|
139
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :private_instance_m, :class_method_only).should be_nil
|
139
140
|
end
|
140
141
|
it "should return :private for private instance methods on a class when only instance methods are specified" do
|
141
|
-
Aquarium::Utils::MethodUtils.visibility(
|
142
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample, :private_instance_m, :instance_method_only).should == :private
|
142
143
|
end
|
143
144
|
|
144
145
|
it "should return nil for private class methods on an instance of a class" do
|
145
|
-
Aquarium::Utils::MethodUtils.visibility(
|
146
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :private_class_m).should be_nil
|
146
147
|
end
|
147
148
|
it "should return nil for private class methods on an instance of a class when only class methods are specified" do
|
148
|
-
Aquarium::Utils::MethodUtils.visibility(
|
149
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :private_class_m, :class_method_only).should be_nil
|
149
150
|
end
|
150
151
|
it "should return nil for private class methods on an instance of a class when only instance methods are specified" do
|
151
|
-
Aquarium::Utils::MethodUtils.visibility(
|
152
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :private_class_m, :instance_method_only).should be_nil
|
152
153
|
end
|
153
154
|
|
154
155
|
it "should return :private for private instance methods on an instance of a class" do
|
155
|
-
Aquarium::Utils::MethodUtils.visibility(
|
156
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :private_instance_m).should == :private
|
156
157
|
end
|
157
158
|
it "should return nil for private instance methods on an instance of a class when only class methods are specified" do
|
158
|
-
Aquarium::Utils::MethodUtils.visibility(
|
159
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :private_instance_m, :class_method_only).should be_nil
|
159
160
|
end
|
160
161
|
it "should return :private for private instance methods on an instance of a class when only instance methods are specified" do
|
161
|
-
Aquarium::Utils::MethodUtils.visibility(
|
162
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :private_instance_m, :instance_method_only).should == :private
|
162
163
|
end
|
163
164
|
|
165
|
+
it "should ignore whether the exclude_ancestors flag is true or false for class methods" do
|
166
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample2, :public_class_m, :class_method_only, false).should == :public
|
167
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample2, :private_class_m, :class_method_only, false).should == :private
|
168
|
+
end
|
169
|
+
it "should return nil for public instance methods on a subclass when the exclude_ancestors flag is false" do
|
170
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample2, :public_instance_m, :instance_method_only, false).should == nil
|
171
|
+
end
|
172
|
+
it "should return nil for protected instance methods on a subclass when the exclude_ancestors flag is false" do
|
173
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample2, :protected_instance_m, :instance_method_only, false).should == nil
|
174
|
+
end
|
175
|
+
it "should return nil for private instance methods on a subclass when the exclude_ancestors flag is false" do
|
176
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample2, :private_instance_m, :instance_method_only, false).should == nil
|
177
|
+
end
|
178
|
+
|
164
179
|
it "should return nil for an unknown method" do
|
165
|
-
Aquarium::Utils::MethodUtils.visibility(
|
180
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :nonexistent_method).should be_nil
|
166
181
|
end
|
167
182
|
it "should return nil for an unknown method when only class methods are specified" do
|
168
|
-
Aquarium::Utils::MethodUtils.visibility(
|
183
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :nonexistent_method, :class_method_only).should be_nil
|
169
184
|
end
|
170
185
|
it "should return nil for an unknown method when only instance methods are specified" do
|
171
|
-
Aquarium::Utils::MethodUtils.visibility(
|
186
|
+
Aquarium::Utils::MethodUtils.visibility(MethodUtilsSpecProtectionExample.new, :nonexistent_method, :instance_method_only).should be_nil
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
describe Aquarium::Utils::MethodUtils, ".has_method" do
|
191
|
+
it "should return true for public class methods on a class" do
|
192
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :public_class_m).should be_true
|
193
|
+
end
|
194
|
+
it "should return true for public class methods on a class when only class methods are specified" do
|
195
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :public_class_m, :class_method_only).should be_true
|
196
|
+
end
|
197
|
+
it "should return false for public class methods on a class when only instance methods are specified" do
|
198
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :public_class_m, :instance_method_only).should be_false
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should return true for public instance methods on a class" do
|
202
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :public_instance_m).should be_true
|
203
|
+
end
|
204
|
+
it "should return false for public instance methods on a class when only class methods are specified" do
|
205
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :public_instance_m, :class_method_only).should be_false
|
206
|
+
end
|
207
|
+
it "should return true for public instance methods on a class when only instance methods are specified" do
|
208
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :public_instance_m, :instance_method_only).should be_true
|
209
|
+
end
|
210
|
+
|
211
|
+
it "should return false for public class methods on an instance of a class" do
|
212
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :public_class_m).should be_false
|
213
|
+
end
|
214
|
+
it "should return false for public class methods on an instance of a class when only class methods are specified" do
|
215
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :public_class_m, :class_method_only).should be_false
|
216
|
+
end
|
217
|
+
it "should return false for public class methods on an instance of a class when only instance methods are specified" do
|
218
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :public_class_m, :instance_method_only).should be_false
|
219
|
+
end
|
220
|
+
|
221
|
+
it "should return true for public instance methods on an instance of a class" do
|
222
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :public_instance_m).should be_true
|
223
|
+
end
|
224
|
+
it "should return false for public instance methods on an instance of a class when only class methods are specified" do
|
225
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :public_instance_m, :class_method_only).should be_false
|
226
|
+
end
|
227
|
+
it "should return true for public instance methods on an instance of a class when only instance methods are specified" do
|
228
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :public_instance_m, :instance_method_only).should be_true
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should return true for protected instance methods on a class" do
|
232
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :protected_instance_m).should be_true
|
233
|
+
end
|
234
|
+
it "should return false for protected instance methods on a class when only class methods are specified" do
|
235
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :protected_instance_m, :class_method_only).should be_false
|
236
|
+
end
|
237
|
+
it "should return true for protected instance methods on a class when only instance methods are specified" do
|
238
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :protected_instance_m, :instance_method_only).should be_true
|
239
|
+
end
|
240
|
+
|
241
|
+
it "should return true for protected instance methods on an instance of a class" do
|
242
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :protected_instance_m).should be_true
|
243
|
+
end
|
244
|
+
it "should return false for protected instance methods on an instance of a class when only class methods are specified" do
|
245
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :protected_instance_m, :class_method_only).should be_false
|
246
|
+
end
|
247
|
+
it "should return true for protected instance methods on an instance of a class when only instance methods are specified" do
|
248
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :protected_instance_m, :instance_method_only).should be_true
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should return true for private class methods on a class" do
|
252
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :private_class_m).should be_true #expected_private
|
253
|
+
end
|
254
|
+
it "should return true for private class methods on a class when only class methods are specified" do
|
255
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :private_class_m, :class_method_only).should be_true
|
256
|
+
end
|
257
|
+
it "should return false for private class methods on a class when only instance methods are specified" do
|
258
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :private_class_m, :instance_method_only).should be_false
|
259
|
+
end
|
260
|
+
|
261
|
+
it "should return true for private instance methods on a class" do
|
262
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :private_instance_m).should be_true
|
263
|
+
end
|
264
|
+
it "should return false for private instance methods on a class when only class methods are specified" do
|
265
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :private_instance_m, :class_method_only).should be_false
|
266
|
+
end
|
267
|
+
it "should return true for private instance methods on a class when only instance methods are specified" do
|
268
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample, :private_instance_m, :instance_method_only).should be_true
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should return false for private class methods on an instance of a class" do
|
272
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :private_class_m).should be_false
|
273
|
+
end
|
274
|
+
it "should return false for private class methods on an instance of a class when only class methods are specified" do
|
275
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :private_class_m, :class_method_only).should be_false
|
276
|
+
end
|
277
|
+
it "should return false for private class methods on an instance of a class when only instance methods are specified" do
|
278
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :private_class_m, :instance_method_only).should be_false
|
279
|
+
end
|
280
|
+
|
281
|
+
it "should return true for private instance methods on an instance of a class" do
|
282
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :private_instance_m).should be_true
|
283
|
+
end
|
284
|
+
it "should return false for private instance methods on an instance of a class when only class methods are specified" do
|
285
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :private_instance_m, :class_method_only).should be_false
|
286
|
+
end
|
287
|
+
it "should return true for private instance methods on an instance of a class when only instance methods are specified" do
|
288
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :private_instance_m, :instance_method_only).should be_true
|
289
|
+
end
|
290
|
+
|
291
|
+
it "should ignore whether the exclude_ancestors flag is true or false for class methods" do
|
292
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample2, :public_class_m, :class_method_only, false).should be_true
|
293
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample2, :private_class_m, :class_method_only, false).should be_true
|
294
|
+
end
|
295
|
+
it "should return false for public instance methods on a subclass when the exclude_ancestors flag is false" do
|
296
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample2, :public_instance_m, :instance_method_only, false).should be_false
|
297
|
+
end
|
298
|
+
it "should return false for protected instance methods on a subclass when the exclude_ancestors flag is false" do
|
299
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample2, :protected_instance_m, :instance_method_only, false).should be_false
|
300
|
+
end
|
301
|
+
it "should return false for private instance methods on a subclass when the exclude_ancestors flag is false" do
|
302
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample2, :private_instance_m, :instance_method_only, false).should be_false
|
303
|
+
end
|
304
|
+
|
305
|
+
it "should return false for an unknown method" do
|
306
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :nonexistent_method).should be_false
|
307
|
+
end
|
308
|
+
it "should return false for an unknown method when only class methods are specified" do
|
309
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :nonexistent_method, :class_method_only).should be_false
|
310
|
+
end
|
311
|
+
it "should return false for an unknown method when only instance methods are specified" do
|
312
|
+
Aquarium::Utils::MethodUtils.has_method(MethodUtilsSpecProtectionExample.new, :nonexistent_method, :instance_method_only).should be_false
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
module DefinerModule1
|
317
|
+
def m1; end
|
318
|
+
end
|
319
|
+
module DefinerModule2
|
320
|
+
def m2; end
|
321
|
+
end
|
322
|
+
class DefinerClass1
|
323
|
+
include DefinerModule1
|
324
|
+
def c1; end
|
325
|
+
end
|
326
|
+
class DefinerClass2 < DefinerClass1
|
327
|
+
include DefinerModule2
|
328
|
+
def c2; end
|
329
|
+
end
|
330
|
+
class DefinerClass2b < DefinerClass1
|
331
|
+
include DefinerModule2
|
332
|
+
end
|
333
|
+
|
334
|
+
describe Aquarium::Utils::MethodUtils, ".definer" do
|
335
|
+
it "should return the type that defines the method, when given a type" do
|
336
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2b, :c1).should == DefinerClass1
|
337
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2b, :m1).should == DefinerModule1
|
338
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2b, :m2).should == DefinerModule2
|
339
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2, :c2).should == DefinerClass2
|
340
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2, :c1).should == DefinerClass1
|
341
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2, :m1).should == DefinerModule1
|
342
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2, :m2).should == DefinerModule2
|
343
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass1, :c1).should == DefinerClass1
|
344
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass1, :m1).should == DefinerModule1
|
345
|
+
Aquarium::Utils::MethodUtils.definer(DefinerModule2, :m2).should == DefinerModule2
|
346
|
+
Aquarium::Utils::MethodUtils.definer(DefinerModule1, :m1).should == DefinerModule1
|
347
|
+
end
|
348
|
+
|
349
|
+
it "should return the type that defines the method, when given an object" do
|
350
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2b.new, :c1).should == DefinerClass1
|
351
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2b.new, :m1).should == DefinerModule1
|
352
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2b.new, :m2).should == DefinerModule2
|
353
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2.new, :c2).should == DefinerClass2
|
354
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2.new, :c1).should == DefinerClass1
|
355
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2.new, :m1).should == DefinerModule1
|
356
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2.new, :m2).should == DefinerModule2
|
357
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass1.new, :c1).should == DefinerClass1
|
358
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass1.new, :m1).should == DefinerModule1
|
359
|
+
end
|
360
|
+
|
361
|
+
it "should return the eigenclass/singleton of an object when the method is defined on the object" do
|
362
|
+
dc = DefinerClass2.new
|
363
|
+
eigen = (class << dc; self; end)
|
364
|
+
def dc.dc1; end
|
365
|
+
Aquarium::Utils::MethodUtils.definer(dc, :dc1).should == eigen
|
366
|
+
end
|
367
|
+
|
368
|
+
it "should return the class of an object when the method is defined on the type or ancestor type, even if the eigenclass has been used to define an instance-only type" do
|
369
|
+
dc = DefinerClass2.new
|
370
|
+
eigen = (class << dc; self; end)
|
371
|
+
def dc.dc2; end
|
372
|
+
Aquarium::Utils::MethodUtils.definer(dc, :c2).should == DefinerClass2
|
373
|
+
Aquarium::Utils::MethodUtils.definer(dc, :m1).should == DefinerModule1
|
374
|
+
Aquarium::Utils::MethodUtils.definer(dc, :m2).should == DefinerModule2
|
375
|
+
end
|
376
|
+
|
377
|
+
it "should return nil if the specified method is defined by a subtype of the specified type" do
|
378
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass1, :c2).should be_nil
|
379
|
+
Aquarium::Utils::MethodUtils.definer(DefinerModule1, :c2).should be_nil
|
380
|
+
Aquarium::Utils::MethodUtils.definer(DefinerModule2, :c2).should be_nil
|
381
|
+
end
|
382
|
+
|
383
|
+
it "should return nil if the specified method is defined by a subtype of the specified object's type" do
|
384
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass1.new, :c2).should be_nil
|
385
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass2b.new, :c2).should be_nil
|
386
|
+
end
|
387
|
+
|
388
|
+
it "should return nil if nil is specified for the type or object" do
|
389
|
+
Aquarium::Utils::MethodUtils.definer(nil, :ignored).should be_nil
|
390
|
+
end
|
391
|
+
|
392
|
+
it "should return nil if nil is specified for the method" do
|
393
|
+
Aquarium::Utils::MethodUtils.definer(DefinerModule1, nil).should be_nil
|
394
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass1, nil).should be_nil
|
395
|
+
Aquarium::Utils::MethodUtils.definer(DefinerClass1.new, nil).should be_nil
|
172
396
|
end
|
173
397
|
end
|