aquarium 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. data/CHANGES +18 -0
  2. data/README +68 -39
  3. data/RELEASE-PLAN +25 -1
  4. data/UPGRADE +4 -0
  5. data/examples/aspect_design_example.rb +9 -3
  6. data/examples/aspect_design_example_spec.rb +7 -2
  7. data/examples/method_tracing_example.rb +1 -1
  8. data/examples/method_tracing_example_spec.rb +2 -2
  9. data/lib/aquarium/aspects/aspect.rb +53 -60
  10. data/lib/aquarium/aspects/dsl/aspect_dsl.rb +0 -1
  11. data/lib/aquarium/aspects/pointcut.rb +72 -17
  12. data/lib/aquarium/aspects/pointcut_composition.rb +4 -1
  13. data/lib/aquarium/extensions/hash.rb +65 -28
  14. data/lib/aquarium/extensions/set.rb +2 -0
  15. data/lib/aquarium/finders/finder_result.rb +13 -2
  16. data/lib/aquarium/finders/method_finder.rb +54 -28
  17. data/lib/aquarium/finders/type_finder.rb +36 -19
  18. data/lib/aquarium/utils/method_utils.rb +3 -12
  19. data/lib/aquarium/utils/name_utils.rb +27 -1
  20. data/lib/aquarium/version.rb +1 -1
  21. data/spec/aquarium/aspects/aspect_invocation_spec.rb +182 -51
  22. data/spec/aquarium/aspects/aspect_spec.rb +43 -8
  23. data/spec/aquarium/aspects/pointcut_and_composition_spec.rb +32 -3
  24. data/spec/aquarium/aspects/pointcut_or_composition_spec.rb +36 -5
  25. data/spec/aquarium/aspects/pointcut_spec.rb +373 -99
  26. data/spec/aquarium/extensions/hash_spec.rb +129 -38
  27. data/spec/aquarium/finders/finder_result_spec.rb +73 -15
  28. data/spec/aquarium/finders/method_finder_spec.rb +156 -72
  29. data/spec/aquarium/finders/object_finder_spec.rb +1 -0
  30. data/spec/aquarium/finders/type_finder_spec.rb +43 -0
  31. data/spec/aquarium/utils/name_utils_spec.rb +79 -4
  32. metadata +3 -3
@@ -416,27 +416,27 @@ describe Aspect, "#new modifications to the list of methods for the advised obje
416
416
 
417
417
  it "should not include new public instance or class methods for the advised type." do
418
418
  all_public_methods_before = all_public_methods_of_type Watchful
419
- @aspect = Aspect.new :after, :pointcut => {:type => Watchful, :method_options => :suppress_ancestor_methods}, :advice => @advice
419
+ @aspect = Aspect.new :after, :pointcut => {:type => Watchful, :method_options => :exclude_ancestor_methods}, :advice => @advice
420
420
  (all_public_methods_of_type(Watchful) - all_public_methods_before).should == []
421
421
  end
422
422
 
423
423
  it "should not include new protected instance or class methods for the advised type." do
424
424
  all_protected_methods_before = all_protected_methods_of_type Watchful
425
- @aspect = Aspect.new :after, :pointcut => {:type => Watchful, :method_options => :suppress_ancestor_methods}, :advice => @advice
425
+ @aspect = Aspect.new :after, :pointcut => {:type => Watchful, :method_options => :exclude_ancestor_methods}, :advice => @advice
426
426
  (all_protected_methods_of_type(Watchful) - all_protected_methods_before).should == []
427
427
  end
428
428
 
429
429
  it "should not include new public methods for the advised object." do
430
430
  watchful = Watchful.new
431
431
  all_public_methods_before = all_public_methods_of_object Watchful
432
- @aspect = Aspect.new :after, :pointcut => {:object => watchful, :method_options => :suppress_ancestor_methods}, :advice => @advice
432
+ @aspect = Aspect.new :after, :pointcut => {:object => watchful, :method_options => :exclude_ancestor_methods}, :advice => @advice
433
433
  (all_public_methods_of_object(Watchful) - all_public_methods_before).should == []
434
434
  end
435
435
 
436
436
  it "should not include new protected methods for the advised object." do
437
437
  watchful = Watchful.new
438
438
  all_protected_methods_before = all_protected_methods_of_object Watchful
439
- @aspect = Aspect.new :after, :pointcut => {:object => watchful, :method_options => :suppress_ancestor_methods}, :advice => @advice
439
+ @aspect = Aspect.new :after, :pointcut => {:object => watchful, :method_options => :exclude_ancestor_methods}, :advice => @advice
440
440
  (all_protected_methods_of_object(Watchful) - all_protected_methods_before).should == []
441
441
  end
442
442
  end
@@ -808,7 +808,7 @@ describe Aspect, "#new with :around advice" do
808
808
  module AdvisingSuperClass
809
809
  class SuperClass
810
810
  def public_method *args
811
- yield *args if block_given?
811
+ # yield *args if block_given?
812
812
  end
813
813
  protected
814
814
  def protected_method *args
@@ -848,7 +848,7 @@ describe Aspect, "#new with :around advice" do
848
848
  module AdvisingSubClass
849
849
  class SuperClass
850
850
  def public_method *args
851
- yield *args if block_given?
851
+ # yield *args if block_given?
852
852
  end
853
853
  protected
854
854
  def protected_method *args
@@ -1005,7 +1005,7 @@ describe Aspect, "#unadvise" do
1005
1005
 
1006
1006
  it "should remove all advice added by the aspect." do
1007
1007
  advice_called = false
1008
- aspect = Aspect.new(:after, :pointcut => {:type => Watchful, :method_options => :suppress_ancestor_methods}) {|jp, *args| advice_called = true}
1008
+ aspect = Aspect.new(:after, :pointcut => {:type => Watchful, :method_options => :exclude_ancestor_methods}) {|jp, *args| advice_called = true}
1009
1009
  aspect.unadvise
1010
1010
  watchful = Watchful.new
1011
1011
 
@@ -1023,7 +1023,7 @@ describe Aspect, "#unadvise" do
1023
1023
  def bar; end
1024
1024
  end
1025
1025
  before = Foo.private_instance_methods.sort
1026
- aspect = Aspect.new(:after, :pointcut => {:type => Foo, :method_options => :suppress_ancestor_methods}) {|jp, *args| true}
1026
+ aspect = Aspect.new(:after, :pointcut => {:type => Foo, :method_options => :exclude_ancestor_methods}) {|jp, *args| true}
1027
1027
  after = Foo.private_instance_methods
1028
1028
  (after - before).should_not == []
1029
1029
  aspect.unadvise
@@ -1053,6 +1053,41 @@ describe Aspect, "Unadvising methods should restore the original protection leve
1053
1053
  it_should_behave_like("invariant protection level of methods under advising and unadvising")
1054
1054
  end
1055
1055
 
1056
+
1057
+ describe Aspect, "Advising methods with non-alphanumeric characters" do
1058
+ module Aquarium::Aspects
1059
+ class ClassWithMethodNamesContainingOddChars
1060
+ @@method_names = []
1061
+ %w[= ! ?].each do |s|
1062
+ @@method_names << "_a#{s}" << "a#{s}"
1063
+ end
1064
+ %w[+ - * / < << > >> =~ == === <=> % ^ ~ [] & | `].each do |s|
1065
+ @@method_names << s
1066
+ end
1067
+ @@method_names.each do |s|
1068
+ class_eval <<-EOF
1069
+ def #{s}; "#{s}"; end
1070
+ EOF
1071
+ end
1072
+ def self.method_names; @@method_names; end
1073
+ end
1074
+ end
1075
+ it "should work with any valid ruby character" do
1076
+ actual = ""
1077
+ Aspect.new :before, :type => Aquarium::Aspects::ClassWithMethodNamesContainingOddChars,
1078
+ :methods => Aquarium::Aspects::ClassWithMethodNamesContainingOddChars.method_names do |jp, *args|
1079
+ actual += ", #{jp.method_name}"
1080
+ end
1081
+ object = Aquarium::Aspects::ClassWithMethodNamesContainingOddChars.new
1082
+ expected = ""
1083
+ Aquarium::Aspects::ClassWithMethodNamesContainingOddChars.method_names.each do |s|
1084
+ object.send s
1085
+ expected += ", #{s}"
1086
+ end
1087
+ actual.should == expected
1088
+ end
1089
+ end
1090
+
1056
1091
  describe Aspect, "#eql?" do
1057
1092
  before(:all) do
1058
1093
  @advice = Proc.new {}
@@ -5,9 +5,9 @@ require 'aquarium/extensions'
5
5
  require 'aquarium/aspects/pointcut'
6
6
  require 'aquarium/aspects/pointcut_composition'
7
7
 
8
- describe "Aquarium::Aspects::Pointcut#and" do
8
+ describe "Intersection of Pointcuts", :shared => true do
9
9
  include Aquarium::Utils::HashUtils
10
- include Aquarium::Utils::HtmlEscaper
10
+ # include Aquarium::Utils::HtmlEscaper
11
11
 
12
12
  before(:each) do
13
13
  @example_types = {}
@@ -127,5 +127,34 @@ describe "Aquarium::Aspects::Pointcut#and" do
127
127
  pc123b = pc1.and(pc2.and(pc3))
128
128
  pc123a.should == pc123b
129
129
  end
130
-
130
+ end
131
+
132
+ describe Aquarium::Aspects::Pointcut, "#and" do
133
+ it_should_behave_like "Intersection of Pointcuts"
134
+ end
135
+
136
+ describe Aquarium::Aspects::Pointcut, "#&" do
137
+ include Aquarium::Utils::HashUtils
138
+
139
+ it_should_behave_like "Intersection of Pointcuts"
140
+
141
+ it "should be associativity for type-based Aquarium::Aspects::Pointcuts." do
142
+ pc1 = Aquarium::Aspects::Pointcut.new :types => ClassWithAttribs, :attributes => [/^attr/], :attribute_options => [:writers]
143
+ pc2 = Aquarium::Aspects::Pointcut.new :types => ClassWithAttribs, :attributes => [/^attr/], :attribute_options => [:readers]
144
+ pc3 = Aquarium::Aspects::Pointcut.new :types => /Class.*Method/
145
+ pc123a = (pc1 & pc2) & pc3
146
+ pc123b = pc1 & (pc2 & pc3)
147
+ pc123a.should == pc123b
148
+ end
149
+
150
+ it "should be associativity for object-based Aquarium::Aspects::Pointcuts." do
151
+ cwa = ClassWithAttribs.new
152
+ pub = ClassWithPublicInstanceMethod.new
153
+ pc1 = Aquarium::Aspects::Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:writers]
154
+ pc2 = Aquarium::Aspects::Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:readers]
155
+ pc3 = Aquarium::Aspects::Pointcut.new :objects => pub
156
+ pc123a = (pc1 & pc2) & pc3
157
+ pc123b = pc1 & (pc2 & pc3)
158
+ pc123a.should == pc123b
159
+ end
131
160
  end
@@ -5,7 +5,7 @@ require 'aquarium/extensions'
5
5
  require 'aquarium/aspects/pointcut'
6
6
  require 'aquarium/aspects/pointcut_composition'
7
7
 
8
- describe "Aquarium::Aspects::Pointcut#and" do
8
+ describe "Union of Pointcuts", :shared => true do
9
9
  include Aquarium::Utils::HashUtils
10
10
 
11
11
  before(:each) do
@@ -31,9 +31,9 @@ describe "Aquarium::Aspects::Pointcut#and" do
31
31
  end
32
32
 
33
33
  it "should return a new Aquarium::Aspects::Pointcut whose join points are the union of the left- and right-hand side Aquarium::Aspects::Pointcuts for type-based Aquarium::Aspects::Pointcuts." do
34
- pc1 = Aquarium::Aspects::Pointcut.new :types => ClassWithAttribs, :attributes => [/^attr/], :attribute_options => [:writers, :suppress_ancestor_methods]
34
+ pc1 = Aquarium::Aspects::Pointcut.new :types => ClassWithAttribs, :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
35
35
  # "[^F]" excludes the ClassWithFunkyMethodNames...
36
- pc2 = Aquarium::Aspects::Pointcut.new :types => /Class[^F]+Method/, :method_options => :suppress_ancestor_methods
36
+ pc2 = Aquarium::Aspects::Pointcut.new :types => /Class[^F]+Method/, :method_options => :exclude_ancestor_methods
37
37
  pc = pc1.or pc2
38
38
  jp1 = Aquarium::Aspects::JoinPoint.new :type => ClassWithAttribs, :method => :attrRW_ClassWithAttribs=
39
39
  jp2 = Aquarium::Aspects::JoinPoint.new :type => ClassWithAttribs, :method => :attrW_ClassWithAttribs=
@@ -46,8 +46,8 @@ describe "Aquarium::Aspects::Pointcut#and" do
46
46
  it "should return a new Aquarium::Aspects::Pointcut whose join points are the union of the left- and right-hand side Aquarium::Aspects::Pointcuts for object-based Aquarium::Aspects::Pointcuts." do
47
47
  cwa = ClassWithAttribs.new
48
48
  pub = ClassWithPublicInstanceMethod.new
49
- pc1 = Aquarium::Aspects::Pointcut.new :objects => [cwa], :attributes => [/^attr/], :attribute_options => [:writers, :suppress_ancestor_methods]
50
- pc2 = Aquarium::Aspects::Pointcut.new :object => pub, :method_options => :suppress_ancestor_methods
49
+ pc1 = Aquarium::Aspects::Pointcut.new :objects => [cwa], :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
50
+ pc2 = Aquarium::Aspects::Pointcut.new :object => pub, :method_options => :exclude_ancestor_methods
51
51
  pc = pc1.or pc2
52
52
  jp1 = Aquarium::Aspects::JoinPoint.new :object => cwa, :method => :attrRW_ClassWithAttribs=
53
53
  jp2 = Aquarium::Aspects::JoinPoint.new :object => cwa, :method => :attrW_ClassWithAttribs=
@@ -110,4 +110,35 @@ describe "Aquarium::Aspects::Pointcut#and" do
110
110
  pc123b = pc1.or(pc2.or(pc3))
111
111
  pc123a.should eql(pc123b)
112
112
  end
113
+
114
+ end
115
+
116
+ describe Aquarium::Aspects::Pointcut, "#or" do
117
+ it_should_behave_like "Union of Pointcuts"
118
+ end
119
+
120
+ describe Aquarium::Aspects::Pointcut, "#|" do
121
+ include Aquarium::Utils::HashUtils
122
+
123
+ it_should_behave_like "Union of Pointcuts"
124
+
125
+ it "should be associativity for type-based Aquarium::Aspects::Pointcuts." do
126
+ pc1 = Aquarium::Aspects::Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:writers]
127
+ pc2 = Aquarium::Aspects::Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:readers]
128
+ pc3 = Aquarium::Aspects::Pointcut.new :types => /Class.*Method/
129
+ pc123a = (pc1 | pc2) | pc3
130
+ pc123b = pc1 | (pc2 | pc3)
131
+ pc123a.should eql(pc123b)
132
+ end
133
+
134
+ it "should be associativity for object-based Aquarium::Aspects::Pointcuts." do
135
+ cwa = ClassWithAttribs.new
136
+ pub = ClassWithPublicInstanceMethod.new
137
+ pc1 = Aquarium::Aspects::Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:writers]
138
+ pc2 = Aquarium::Aspects::Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:readers]
139
+ pc3 = Aquarium::Aspects::Pointcut.new :objects => pub
140
+ pc123a = (pc1 | pc2) | pc3
141
+ pc123b = pc1 | (pc2 | pc3)
142
+ pc123a.should eql(pc123b)
143
+ end
113
144
  end
@@ -6,7 +6,50 @@ require 'aquarium/aspects/join_point'
6
6
  require 'aquarium/aspects/pointcut'
7
7
  require 'aquarium/utils'
8
8
 
9
- def common_setup
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
+ def before_exclude_spec
26
+ @jp11 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestOne, :method_name => :method11
27
+ @jp12 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestOne, :method_name => :method12
28
+ @jp13 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestOne, :method_name => :method13
29
+ @jp21 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestTwo, :method_name => :method21
30
+ @jp22 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestTwo, :method_name => :method22
31
+ @jp23 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestTwo, :method_name => :method23
32
+ @jp31 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestThree, :method_name => :method31
33
+ @jp32 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestThree, :method_name => :method32
34
+ @jp33 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestThree, :method_name => :method33
35
+ @et1 = ExcludeTestOne.new
36
+ @et2 = ExcludeTestTwo.new
37
+ @et3 = ExcludeTestThree.new
38
+ @ojp11 = Aquarium::Aspects::JoinPoint.new :object => @et1, :method_name => :method11
39
+ @ojp12 = Aquarium::Aspects::JoinPoint.new :object => @et1, :method_name => :method12
40
+ @ojp13 = Aquarium::Aspects::JoinPoint.new :object => @et1, :method_name => :method13
41
+ @ojp21 = Aquarium::Aspects::JoinPoint.new :object => @et2, :method_name => :method21
42
+ @ojp22 = Aquarium::Aspects::JoinPoint.new :object => @et2, :method_name => :method22
43
+ @ojp23 = Aquarium::Aspects::JoinPoint.new :object => @et2, :method_name => :method23
44
+ @ojp31 = Aquarium::Aspects::JoinPoint.new :object => @et3, :method_name => :method31
45
+ @ojp32 = Aquarium::Aspects::JoinPoint.new :object => @et3, :method_name => :method32
46
+ @ojp33 = Aquarium::Aspects::JoinPoint.new :object => @et3, :method_name => :method33
47
+ @all_type_jps = [@jp11, @jp12, @jp13, @jp21, @jp22, @jp23, @jp31, @jp32, @jp33]
48
+ @all_object_jps = [@ojp11, @ojp12, @ojp13, @ojp21, @ojp22, @ojp23, @ojp31, @ojp32, @ojp33]
49
+ @all_jps = @all_type_jps + @all_object_jps
50
+ end
51
+
52
+ def before_pointcut_spec
10
53
  @example_types_without_public_instance_method =
11
54
  [ClassWithProtectedInstanceMethod, ClassWithPrivateInstanceMethod, ClassWithPublicClassMethod, ClassWithPrivateClassMethod]
12
55
  @example_types = ([ClassWithPublicInstanceMethod] + @example_types_without_public_instance_method)
@@ -95,75 +138,75 @@ describe Aquarium::Aspects::Pointcut, "#empty?" do
95
138
  end
96
139
 
97
140
  describe Aquarium::Aspects::Pointcut, " (types specified using regular expressions)" do
98
- setup do
99
- common_setup
141
+ before(:each) do
142
+ before_pointcut_spec
100
143
  end
101
144
 
102
- it "should match multiple classes using regular expressions that cover the full class names." do
103
- pc = Aquarium::Aspects::Pointcut.new :types => /Class.*Method\Z/, :method_options => :suppress_ancestor_methods
145
+ it "should match multiple types using regular expressions that cover the full class names." do
146
+ pc = Aquarium::Aspects::Pointcut.new :types => /Class.*Method\Z/, :method_options => :exclude_ancestor_methods
104
147
  pc.join_points_matched.should == @expected_matched_jps
105
148
  pc.join_points_not_matched.should == @expected_not_matched_jps
106
149
  end
107
150
 
108
- it "should match classes using regular expressions that only cover partial class names." do
109
- pc = Aquarium::Aspects::Pointcut.new :types => /lass.*Pro.*Inst.*Met/, :method_options => [:public, :protected, :suppress_ancestor_methods]
151
+ it "should match types using regular expressions that only cover partial class names." do
152
+ pc = Aquarium::Aspects::Pointcut.new :types => /lass.*Pro.*Inst.*Met/, :method_options => [:public, :protected, :exclude_ancestor_methods]
110
153
  pc.join_points_matched.should == Set.new([@pro_jp])
111
154
  pc.join_points_not_matched.size.should == 0
112
155
  end
113
156
  end
114
157
 
115
158
  describe Aquarium::Aspects::Pointcut, " (types specified using names)" do
116
- setup do
117
- common_setup
159
+ before(:each) do
160
+ before_pointcut_spec
118
161
  end
119
162
 
120
- it "should match multiple classes using names." do
121
- pc = Aquarium::Aspects::Pointcut.new :types => @example_types.map {|t| t.to_s}, :method_options => :suppress_ancestor_methods
163
+ it "should match multiple types using names." do
164
+ pc = Aquarium::Aspects::Pointcut.new :types => @example_types.map {|t| t.to_s}, :method_options => :exclude_ancestor_methods
122
165
  pc.join_points_matched.should == @expected_matched_jps
123
166
  pc.join_points_not_matched.should == @expected_not_matched_jps
124
167
  end
125
168
 
126
- it "should match multiple classes using types themselves." do
127
- pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :method_options => :suppress_ancestor_methods
169
+ it "should match multiple types using types themselves." do
170
+ pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :method_options => :exclude_ancestor_methods
128
171
  pc.join_points_matched.should == @expected_matched_jps
129
172
  pc.join_points_not_matched.should == @expected_not_matched_jps
130
173
  end
131
174
 
132
175
  it "should match :all public instance methods for types by default." do
133
- pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :method_options => :suppress_ancestor_methods
176
+ pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :method_options => :exclude_ancestor_methods
134
177
  pc.join_points_matched.should == @expected_matched_jps
135
178
  pc.join_points_not_matched.should == @expected_not_matched_jps
136
179
  end
137
180
 
138
- it "should support MethodFinder's :suppress_ancestor_methods option when using types." do
139
- pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :method_options => :suppress_ancestor_methods
181
+ it "should support MethodFinder's :exclude_ancestor_methods option when using types." do
182
+ pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :method_options => :exclude_ancestor_methods
140
183
  pc.join_points_matched.should == @expected_matched_jps
141
184
  pc.join_points_not_matched.should == @expected_not_matched_jps
142
185
  end
143
186
  end
144
187
 
145
188
  describe Aquarium::Aspects::Pointcut, " (objects specified)" do
146
- setup do
147
- common_setup
189
+ before(:each) do
190
+ before_pointcut_spec
148
191
  end
149
192
 
150
193
  it "should match :all public instance methods for objects by default." do
151
194
  pub, pro = ClassWithPublicInstanceMethod.new, ClassWithProtectedInstanceMethod.new
152
- pc = Aquarium::Aspects::Pointcut.new :objects => [pub, pro], :method_options => :suppress_ancestor_methods
195
+ pc = Aquarium::Aspects::Pointcut.new :objects => [pub, pro], :method_options => :exclude_ancestor_methods
153
196
  pc.join_points_matched.should == Set.new([Aquarium::Aspects::JoinPoint.new(:object => pub, :method_name => :public_instance_test_method)])
154
197
  pc.join_points_not_matched.should == Set.new([Aquarium::Aspects::JoinPoint.new(:object => pro, :method_name => :all)])
155
198
  end
156
199
 
157
- it "should support MethodFinder's :suppress_ancestor_methods option when using objects." do
200
+ it "should support MethodFinder's :exclude_ancestor_methods option when using objects." do
158
201
  pub, pro = ClassWithPublicInstanceMethod.new, ClassWithProtectedInstanceMethod.new
159
- pc = Aquarium::Aspects::Pointcut.new :objects => [pub, pro], :method_options => :suppress_ancestor_methods
202
+ pc = Aquarium::Aspects::Pointcut.new :objects => [pub, pro], :method_options => :exclude_ancestor_methods
160
203
  pc.join_points_matched.should == Set.new([Aquarium::Aspects::JoinPoint.new(:object => pub, :method_name => :public_instance_test_method)])
161
204
  pc.join_points_not_matched.should == Set.new([Aquarium::Aspects::JoinPoint.new(:object => pro, :method_name => :all)])
162
205
  end
163
206
 
164
207
  it "should match all possible methods on the specified objects." do
165
208
  pub, pro = ClassWithPublicInstanceMethod.new, ClassWithProtectedInstanceMethod.new
166
- pc = Aquarium::Aspects::Pointcut.new :objects => [pub, pro], :methods => :all, :method_options => [:public, :protected, :suppress_ancestor_methods]
209
+ pc = Aquarium::Aspects::Pointcut.new :objects => [pub, pro], :methods => :all, :method_options => [:public, :protected, :exclude_ancestor_methods]
167
210
  pc.join_points_matched.size.should == 2
168
211
  pc.join_points_not_matched.size.should == 0
169
212
  pc.join_points_matched.should == Set.new([
@@ -182,105 +225,290 @@ describe Aquarium::Aspects::Pointcut, " (objects specified)" do
182
225
  end
183
226
  end
184
227
 
228
+ describe Aquarium::Aspects::Pointcut, " (:exclude_types => types specified)" do
229
+ before(:each) do
230
+ before_exclude_spec
231
+ end
232
+
233
+ it "should remove from a list of explicitly-specified types the set of explicitly-specified excluded types." do
234
+ pc = Aquarium::Aspects::Pointcut.new :types => [ExcludeTestOne, ExcludeTestTwo, ExcludeTestThree], :exclude_type => ExcludeTestTwo, :method_options => :exclude_ancestor_methods
235
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
236
+ actual.size.should == 2
237
+ actual.should include(ExcludeTestOne)
238
+ actual.should include(ExcludeTestThree)
239
+ pc.join_points_not_matched.size.should == 0
240
+ end
241
+
242
+ it "should remove from a list of explicitly-specified types the set of excluded types specified by regular expression." do
243
+ pc = Aquarium::Aspects::Pointcut.new :types => [ExcludeTestOne, ExcludeTestTwo, ExcludeTestThree], :exclude_types => /Two$/, :method_options => :exclude_ancestor_methods
244
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
245
+ actual.size.should == 2
246
+ actual.should include(ExcludeTestOne)
247
+ actual.should include(ExcludeTestThree)
248
+ pc.join_points_not_matched.size.should == 0
249
+ end
250
+
251
+ it "should remove from a list of explicitly-specified types the set of excluded types specified by name." do
252
+ pc = Aquarium::Aspects::Pointcut.new :types => [ExcludeTestOne, ExcludeTestTwo, ExcludeTestThree], :exclude_type => "ExcludeTestTwo", :method_options => :exclude_ancestor_methods
253
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
254
+ actual.size.should == 2
255
+ actual.should include(ExcludeTestOne)
256
+ actual.should include(ExcludeTestThree)
257
+ pc.join_points_not_matched.size.should == 0
258
+ end
259
+
260
+ it "should remove from the types specified by regular expression the explicitly-specified excluded types." do
261
+ pc = Aquarium::Aspects::Pointcut.new :types => /ExcludeTest/, :exclude_type => ExcludeTestTwo, :method_options => :exclude_ancestor_methods
262
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
263
+ actual.size.should == 2
264
+ actual.should include(ExcludeTestOne)
265
+ actual.should include(ExcludeTestThree)
266
+ pc.join_points_not_matched.size.should == 0
267
+ end
268
+
269
+ it "should remove from the types specified by regular expression the excluded types specified by regular expression." do
270
+ pc = Aquarium::Aspects::Pointcut.new :types => /ExcludeTest/, :exclude_type => /Two$/, :method_options => :exclude_ancestor_methods
271
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
272
+ actual.size.should == 2
273
+ actual.should include(ExcludeTestOne)
274
+ actual.should include(ExcludeTestThree)
275
+ pc.join_points_not_matched.size.should == 0
276
+ end
277
+
278
+ it "should remove from the types specified by regular expression the excluded types specified by name." do
279
+ pc = Aquarium::Aspects::Pointcut.new :types => /ExcludeTest/, :exclude_type => "ExcludeTestTwo", :method_options => :exclude_ancestor_methods
280
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
281
+ actual.size.should == 2
282
+ actual.should include(ExcludeTestOne)
283
+ actual.should include(ExcludeTestThree)
284
+ pc.join_points_not_matched.size.should == 0
285
+ end
286
+
287
+ it "should remove from the join points corresponding to the excluded types, specified by name." do
288
+ pc = Aquarium::Aspects::Pointcut.new :join_points => @all_type_jps, :exclude_type => "ExcludeTestTwo", :method_options => :exclude_ancestor_methods
289
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
290
+ actual.size.should == 2
291
+ actual.should include(ExcludeTestOne)
292
+ actual.should include(ExcludeTestThree)
293
+ pc.join_points_not_matched.size.should == 0
294
+ end
295
+
296
+ it "should remove the specified join points corresponding to the excluded types, specified by regular expression." do
297
+ pc = Aquarium::Aspects::Pointcut.new :join_points => @all_type_jps, :exclude_type => /Exclude.*Two/, :method_options => :exclude_ancestor_methods
298
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
299
+ actual.size.should == 2
300
+ actual.should include(ExcludeTestOne)
301
+ actual.should include(ExcludeTestThree)
302
+ pc.join_points_not_matched.size.should == 0
303
+ end
304
+
305
+ it "should not add excluded types to the #not_matched results." do
306
+ pc = Aquarium::Aspects::Pointcut.new :types => /ExcludeTest/, :exclude_type => ExcludeTestTwo, :method_options => :exclude_ancestor_methods
307
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
308
+ pc.join_points_not_matched.size.should == 0
309
+ end
310
+
311
+ it "should be a synonym for :exclude_type." do
312
+ pc = Aquarium::Aspects::Pointcut.new :types => /ExcludeTest/, :exclude_types => [ExcludeTestTwo, ExcludeTestThree], :method_options => :exclude_ancestor_methods
313
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
314
+ actual.size.should == 1
315
+ actual.should include(ExcludeTestOne)
316
+ pc.join_points_not_matched.size.should == 0
317
+ end
318
+ end
319
+
320
+ describe Aquarium::Aspects::Pointcut, " (:exclude_objects => objects specified)" do
321
+ before(:each) do
322
+ @e11 = ExcludeTestOne.new
323
+ @e12 = ExcludeTestOne.new
324
+ @e21 = ExcludeTestTwo.new
325
+ @e22 = ExcludeTestTwo.new
326
+ @e31 = ExcludeTestThree.new
327
+ @e32 = ExcludeTestThree.new
328
+ @objects = [@e11, @e12, @e21, @e22, @e31, @e32]
329
+ end
330
+
331
+ it "should remove from the matched objects the excluded objects." do
332
+ pc = Aquarium::Aspects::Pointcut.new :objects => @objects, :exclude_objects => [@e22, @e31], :method_options => :exclude_ancestor_methods
333
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
334
+ actual.size.should == 4
335
+ [@e11, @e12, @e21, @e32].each {|e| actual.should include(e)}
336
+ pc.join_points_not_matched.size.should == 0
337
+ end
338
+
339
+ it "should remove the specified join points corresponding to the excluded objects." do
340
+ jps11 = Aquarium::Aspects::JoinPoint.new :object => @e11, :method => :method11
341
+ jps21 = Aquarium::Aspects::JoinPoint.new :object => @e21, :method => :method21
342
+ jps22 = Aquarium::Aspects::JoinPoint.new :object => @e22, :method => :method22
343
+ jps31 = Aquarium::Aspects::JoinPoint.new :object => @e31, :method => :method31
344
+ jps = [jps11, jps21, jps22, jps31]
345
+ pc = Aquarium::Aspects::Pointcut.new :join_points => jps, :exclude_objects => [@e22, @e31], :method_options => :exclude_ancestor_methods
346
+ pc.join_points_matched.size.should == 2
347
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
348
+ [@e11, @e21].each {|e| actual.should include(e)}
349
+ pc.join_points_not_matched.size.should == 0
350
+ end
351
+
352
+ it "should not add excluded objects to the #not_matched results." do
353
+ pc = Aquarium::Aspects::Pointcut.new :objects => @objects, :exclude_objects => [@e22, @e31], :method_options => :exclude_ancestor_methods
354
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
355
+ pc.join_points_not_matched.size.should == 0
356
+ end
357
+
358
+ it "should be a synonym for :exclude_object." do
359
+ pc = Aquarium::Aspects::Pointcut.new :objects => @objects, :exclude_object => @e22, :method_options => :exclude_ancestor_methods
360
+ actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
361
+ actual.size.should == 5
362
+ [@e11, @e12, @e21, @e31, @e32].each {|e| actual.should include(e)}
363
+ pc.join_points_not_matched.size.should == 0
364
+ end
365
+ end
366
+
367
+ describe Aquarium::Aspects::Pointcut, " (:exclude_join_points => join_points specified)" do
368
+ before(:each) do
369
+ before_exclude_spec
370
+ end
371
+
372
+ it "should remove from a list of explicitly-specified join points the set of explicitly-specified excluded join points." do
373
+ excluded = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
374
+ pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_join_points => excluded
375
+ pc.join_points_matched.should == Set.new(@all_jps - excluded)
376
+ pc.join_points_not_matched.size.should == 0
377
+ end
378
+
379
+ it "should remove from the list of generated, type-based join points the set of explicitly-specified excluded join points." do
380
+ jp11 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestOne, :method_name => :method11
381
+ jp22 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestTwo, :method_name => :method22
382
+ jp33 = Aquarium::Aspects::JoinPoint.new :type => ExcludeTestThree, :method_name => :method33
383
+ excluded = [jp11, jp22, jp33]
384
+ pc = Aquarium::Aspects::Pointcut.new :types => /ExcludeTest/, :exclude_join_points => excluded, :method_options => :exclude_ancestor_methods
385
+ pc.join_points_matched.should == Set.new(@all_type_jps - excluded)
386
+ pc.join_points_not_matched.size.should == 0
387
+ end
388
+
389
+ it "should remove from the list of generated, object-based join points the set of explicitly-specified excluded join points." do
390
+ ojp12 = Aquarium::Aspects::JoinPoint.new :object => @et1, :method_name => :method12
391
+ ojp23 = Aquarium::Aspects::JoinPoint.new :object => @et2, :method_name => :method23
392
+ ojp31 = Aquarium::Aspects::JoinPoint.new :object => @et3, :method_name => :method31
393
+ excluded = [ojp12, ojp23, ojp31]
394
+ 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(@all_object_jps - excluded)
396
+ pc.join_points_not_matched.size.should == 0
397
+ end
398
+
399
+ it "should not add excluded types to the #not_matched results." do
400
+ excluded = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
401
+ pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_join_points => excluded
402
+ pc.join_points_not_matched.size.should == 0
403
+ end
404
+
405
+ it "should be a synonym for :exclude_join_point." do
406
+ excluded = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
407
+ pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_join_point => excluded
408
+ pc.join_points_matched.should == Set.new(@all_jps - excluded)
409
+ pc.join_points_not_matched.size.should == 0
410
+ end
411
+ end
412
+
185
413
  describe Aquarium::Aspects::Pointcut, " (types or objects specified with public instance methods)" do
186
- setup do
187
- common_setup
414
+ before(:each) do
415
+ before_pointcut_spec
188
416
  end
189
417
 
190
418
  it "should support MethodFinder's :public and :instance options for the specified types." do
191
- pc = Aquarium::Aspects::Pointcut.new :types => ClassWithPublicInstanceMethod, :method_options => [:public, :instance, :suppress_ancestor_methods]
192
- pc.join_points_matched.should eql(Set.new([@pub_jp]))
419
+ pc = Aquarium::Aspects::Pointcut.new :types => ClassWithPublicInstanceMethod, :method_options => [:public, :instance, :exclude_ancestor_methods]
420
+ pc.join_points_matched.should be_eql(Set.new([@pub_jp]))
193
421
  pc.join_points_not_matched.size.should == 0
194
422
  end
195
423
 
196
424
  it "should support MethodFinder's :public and :instance options for the specified objects." do
197
425
  pub = ClassWithPublicInstanceMethod.new
198
- pc = Aquarium::Aspects::Pointcut.new :objects => pub, :method_options => [:public, :instance, :suppress_ancestor_methods]
199
- pc.join_points_matched.should eql(Set.new([Aquarium::Aspects::JoinPoint.new(:object => pub, :method_name => :public_instance_test_method)]))
426
+ pc = Aquarium::Aspects::Pointcut.new :objects => pub, :method_options => [:public, :instance, :exclude_ancestor_methods]
427
+ pc.join_points_matched.should be_eql(Set.new([Aquarium::Aspects::JoinPoint.new(:object => pub, :method_name => :public_instance_test_method)]))
200
428
  pc.join_points_not_matched.size.should == 0
201
429
  end
202
430
  end
203
431
 
204
432
  describe Aquarium::Aspects::Pointcut, " (types or objects specified with protected instance methods)" do
205
- setup do
206
- common_setup
433
+ before(:each) do
434
+ before_pointcut_spec
207
435
  end
208
436
 
209
437
  it "should support MethodFinder's :protected and :instance options for the specified types." do
210
- pc = Aquarium::Aspects::Pointcut.new :types => ClassWithProtectedInstanceMethod, :method_options => [:protected, :instance, :suppress_ancestor_methods]
211
- pc.join_points_matched.should eql(Set.new([@pro_jp]))
438
+ pc = Aquarium::Aspects::Pointcut.new :types => ClassWithProtectedInstanceMethod, :method_options => [:protected, :instance, :exclude_ancestor_methods]
439
+ pc.join_points_matched.should be_eql(Set.new([@pro_jp]))
212
440
  pc.join_points_not_matched.size.should == 0
213
441
  end
214
442
 
215
443
  it "should support MethodFinder's :protected and :instance options for the specified objects." do
216
444
  pro = ClassWithProtectedInstanceMethod.new
217
- pc = Aquarium::Aspects::Pointcut.new :objects => pro, :method_options => [:protected, :instance, :suppress_ancestor_methods]
218
- pc.join_points_matched.should eql(Set.new([Aquarium::Aspects::JoinPoint.new(:object => pro, :method_name => :protected_instance_test_method)]))
445
+ pc = Aquarium::Aspects::Pointcut.new :objects => pro, :method_options => [:protected, :instance, :exclude_ancestor_methods]
446
+ pc.join_points_matched.should be_eql(Set.new([Aquarium::Aspects::JoinPoint.new(:object => pro, :method_name => :protected_instance_test_method)]))
219
447
  pc.join_points_not_matched.size.should == 0
220
448
  end
221
449
  end
222
450
 
223
451
  describe Aquarium::Aspects::Pointcut, " (types or objects specified with private instance methods)" do
224
- setup do
225
- common_setup
452
+ before(:each) do
453
+ before_pointcut_spec
226
454
  end
227
455
 
228
456
  it "should support MethodFinder's :private and :instance options for the specified types." do
229
- pc = Aquarium::Aspects::Pointcut.new :types => ClassWithPrivateInstanceMethod, :method_options => [:private, :instance, :suppress_ancestor_methods]
230
- pc.join_points_matched.should eql(Set.new([@pri_jp]))
457
+ pc = Aquarium::Aspects::Pointcut.new :types => ClassWithPrivateInstanceMethod, :method_options => [:private, :instance, :exclude_ancestor_methods]
458
+ pc.join_points_matched.should be_eql(Set.new([@pri_jp]))
231
459
  pc.join_points_not_matched.size.should == 0
232
460
  end
233
461
 
234
462
  it "should support MethodFinder's :private and :instance options for the specified objects." do
235
463
  pro = ClassWithPrivateInstanceMethod.new
236
- pc = Aquarium::Aspects::Pointcut.new :objects => pro, :method_options => [:private, :instance, :suppress_ancestor_methods]
237
- pc.join_points_matched.should eql(Set.new([Aquarium::Aspects::JoinPoint.new(:object => pro, :method_name => :private_instance_test_method)]))
464
+ pc = Aquarium::Aspects::Pointcut.new :objects => pro, :method_options => [:private, :instance, :exclude_ancestor_methods]
465
+ pc.join_points_matched.should be_eql(Set.new([Aquarium::Aspects::JoinPoint.new(:object => pro, :method_name => :private_instance_test_method)]))
238
466
  pc.join_points_not_matched.size.should == 0
239
467
  end
240
468
  end
241
469
 
242
470
  describe Aquarium::Aspects::Pointcut, " (types or objects specified with public class methods)" do
243
- setup do
244
- common_setup
471
+ before(:each) do
472
+ before_pointcut_spec
245
473
  end
246
474
 
247
475
  it "should support MethodFinder's :public and :class options for the specified types." do
248
- pc = Aquarium::Aspects::Pointcut.new :types => ClassWithPublicClassMethod, :method_options => [:public, :class, :suppress_ancestor_methods]
249
- pc.join_points_matched.should eql(Set.new([@cpub_jp]))
476
+ pc = Aquarium::Aspects::Pointcut.new :types => ClassWithPublicClassMethod, :method_options => [:public, :class, :exclude_ancestor_methods]
477
+ pc.join_points_matched.should be_eql(Set.new([@cpub_jp]))
250
478
  pc.join_points_not_matched.size.should == 0
251
479
  end
252
480
 
253
481
  it "should support MethodFinder's :public and :class options for the specified objects, which will return no methods." do
254
482
  pub = ClassWithPublicInstanceMethod.new
255
- pc = Aquarium::Aspects::Pointcut.new :objects => pub, :method_options => [:public, :class, :suppress_ancestor_methods]
483
+ pc = Aquarium::Aspects::Pointcut.new :objects => pub, :method_options => [:public, :class, :exclude_ancestor_methods]
256
484
  pc.join_points_matched.size.should == 0
257
485
  pc.join_points_not_matched.size.should == 1
258
- pc.join_points_not_matched.should eql(Set.new([Aquarium::Aspects::JoinPoint.new(:object => pub, :method_name => :all, :class_method => true)]))
486
+ pc.join_points_not_matched.should be_eql(Set.new([Aquarium::Aspects::JoinPoint.new(:object => pub, :method_name => :all, :class_method => true)]))
259
487
  end
260
488
  end
261
489
 
262
490
  describe Aquarium::Aspects::Pointcut, " (types or objects specified with private class methods)" do
263
- setup do
264
- common_setup
491
+ before(:each) do
492
+ before_pointcut_spec
265
493
  end
266
494
 
267
495
  it "should support MethodFinder's :private and :class options for the specified types." do
268
- pc = Aquarium::Aspects::Pointcut.new :types => ClassWithPrivateClassMethod, :method_options => [:private, :class, :suppress_ancestor_methods]
269
- pc.join_points_matched.should eql(Set.new([@cpri_jp]))
496
+ pc = Aquarium::Aspects::Pointcut.new :types => ClassWithPrivateClassMethod, :method_options => [:private, :class, :exclude_ancestor_methods]
497
+ pc.join_points_matched.should be_eql(Set.new([@cpri_jp]))
270
498
  pc.join_points_not_matched.size.should == 0
271
499
  end
272
500
 
273
501
  it "should support MethodFinder's :private and :class options for the specified objects, which will return no methods." do
274
502
  pri = ClassWithPrivateInstanceMethod.new
275
- pc = Aquarium::Aspects::Pointcut.new :objects => pri, :method_options => [:private, :class, :suppress_ancestor_methods]
276
- pc.join_points_not_matched.should eql(Set.new([Aquarium::Aspects::JoinPoint.new(:object => pri, :method_name => :all, :class_method => true)]))
503
+ pc = Aquarium::Aspects::Pointcut.new :objects => pri, :method_options => [:private, :class, :exclude_ancestor_methods]
504
+ pc.join_points_not_matched.should be_eql(Set.new([Aquarium::Aspects::JoinPoint.new(:object => pri, :method_name => :all, :class_method => true)]))
277
505
  pc.join_points_not_matched.size.should == 1
278
506
  end
279
507
  end
280
508
 
281
509
  describe Aquarium::Aspects::Pointcut, " (types or objects specified with method regular expressions)" do
282
- setup do
283
- common_setup
510
+ before(:each) do
511
+ before_pointcut_spec
284
512
  @jp_rwe = Aquarium::Aspects::JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
285
513
  @jp_rw = Aquarium::Aspects::JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
286
514
  @jp_we = Aquarium::Aspects::JoinPoint.new :type => ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
@@ -310,9 +538,57 @@ describe Aquarium::Aspects::Pointcut, " (types or objects specified with method
310
538
  end
311
539
  end
312
540
 
541
+ describe Aquarium::Aspects::Pointcut, " (:exclude_methods => methods specified)" do
542
+ before(:each) do
543
+ before_exclude_spec
544
+ end
545
+
546
+ it "should remove type-specified JoinPoints matching the excluded methods specified by name." do
547
+ pc = Aquarium::Aspects::Pointcut.new :types => [ExcludeTestOne, ExcludeTestTwo, ExcludeTestThree], :exclude_methods => [:method11, :method23], :method_options => :exclude_ancestor_methods
548
+ pc.join_points_matched.size.should == 7
549
+ pc.join_points_matched.should == Set.new([@jp12, @jp13, @jp21, @jp22, @jp31, @jp32, @jp33])
550
+ pc.join_points_not_matched.size.should == 0
551
+ end
552
+
553
+ it "should remove type-specified JoinPoints matching the excluded methods specified by regular expression." do
554
+ pc = Aquarium::Aspects::Pointcut.new :types => [ExcludeTestOne, ExcludeTestTwo, ExcludeTestThree], :exclude_methods => /method[12][13]/, :method_options => :exclude_ancestor_methods
555
+ pc.join_points_matched.size.should == 5
556
+ pc.join_points_matched.should == Set.new([@jp12, @jp22, @jp31, @jp32, @jp33])
557
+ pc.join_points_not_matched.size.should == 0
558
+ end
559
+
560
+ it "should remove object-specified JoinPoints matching the excluded methods specified by name." do
561
+ pc = Aquarium::Aspects::Pointcut.new :objects => [@et1, @et2, @et3], :exclude_methods => [:method11, :method23], :method_options => :exclude_ancestor_methods
562
+ pc.join_points_matched.size.should == 7
563
+ pc.join_points_matched.should == Set.new([@ojp12, @ojp13, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33])
564
+ pc.join_points_not_matched.size.should == 0
565
+ end
566
+
567
+ it "should remove object-specified JoinPoints matching the excluded methods specified by regular expression." do
568
+ pc = Aquarium::Aspects::Pointcut.new :objects => [@et1, @et2, @et3], :exclude_methods => /method[12][13]/, :method_options => :exclude_ancestor_methods
569
+ pc.join_points_matched.size.should == 5
570
+ pc.join_points_matched.should == Set.new([@ojp12, @ojp22, @ojp31, @ojp32, @ojp33])
571
+ pc.join_points_not_matched.size.should == 0
572
+ end
573
+
574
+ it "should remove join-point-specified JoinPoints matching the excluded methods specified by name." do
575
+ pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_methods => [:method11, :method23], :method_options => :exclude_ancestor_methods
576
+ pc.join_points_matched.size.should == 14
577
+ pc.join_points_matched.should == Set.new([@jp12, @jp13, @jp21, @jp22, @jp31, @jp32, @jp33, @ojp12, @ojp13, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33])
578
+ pc.join_points_not_matched.size.should == 0
579
+ end
580
+
581
+ it "should remove join-point-specified JoinPoints matching the excluded methods specified by regular expression." do
582
+ pc = Aquarium::Aspects::Pointcut.new :join_points => @all_jps, :exclude_methods => /method[12][13]/, :method_options => :exclude_ancestor_methods
583
+ pc.join_points_matched.size.should == 10
584
+ pc.join_points_matched.should == Set.new([@jp12, @jp22, @jp31, @jp32, @jp33, @ojp12, @ojp22, @ojp31, @ojp32, @ojp33])
585
+ pc.join_points_not_matched.size.should == 0
586
+ end
587
+ end
588
+
313
589
  describe Aquarium::Aspects::Pointcut, " (types or objects specified with attribute regular expressions)" do
314
- setup do
315
- common_setup
590
+ before(:each) do
591
+ before_pointcut_spec
316
592
  @jp_rwe = Aquarium::Aspects::JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
317
593
  @jp_rw = Aquarium::Aspects::JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
318
594
  @jp_we = Aquarium::Aspects::JoinPoint.new :type => ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
@@ -328,6 +604,7 @@ describe Aquarium::Aspects::Pointcut, " (types or objects specified with attribu
328
604
 
329
605
  it "should match on public attribute readers and writers for type names by default." do
330
606
  pc = Aquarium::Aspects::Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/]
607
+ pc.join_points_matched.size.should == 4
331
608
  pc.join_points_matched.should == @expected_for_types
332
609
  end
333
610
 
@@ -463,8 +740,8 @@ describe Aquarium::Aspects::Pointcut, " (types or objects specified with attribu
463
740
  end
464
741
 
465
742
  describe Aquarium::Aspects::Pointcut, " (join points specified)" do
466
- setup do
467
- common_setup
743
+ before(:each) do
744
+ before_pointcut_spec
468
745
  @anClassWithPublicInstanceMethod = ClassWithPublicInstanceMethod.new
469
746
  @expected_matched = [@pub_jp, @pro_jp, @pri_jp, @cpub_jp, @cpri_jp,
470
747
  Aquarium::Aspects::JoinPoint.new(:object => @anClassWithPublicInstanceMethod, :method => :public_instance_test_method)]
@@ -506,25 +783,25 @@ describe Aquarium::Aspects::Pointcut, " (methods that end in non-alphanumeric ch
506
783
 
507
784
  {'?' => :huh?, '!' => :yes!, '=' => :x=}.each do |char, method|
508
785
  it "should match instance methods for types when searching for names that end with a '#{char}' character." do
509
- pc = Aquarium::Aspects::Pointcut.new :types => ClassWithFunkyMethodNames, :method => method, :method_options => [:suppress_ancestor_methods]
786
+ pc = Aquarium::Aspects::Pointcut.new :types => ClassWithFunkyMethodNames, :method => method, :method_options => [:exclude_ancestor_methods]
510
787
  expected_jp = Aquarium::Aspects::JoinPoint.new :type => ClassWithFunkyMethodNames, :method_name => method
511
788
  pc.join_points_matched.should == Set.new([expected_jp])
512
789
  end
513
790
 
514
791
  it "should match instance methods for objects when searching for names that end with a '#{char}' character." do
515
- pc = Aquarium::Aspects::Pointcut.new :object => @funky, :method => method, :method_options => [:suppress_ancestor_methods]
792
+ pc = Aquarium::Aspects::Pointcut.new :object => @funky, :method => method, :method_options => [:exclude_ancestor_methods]
516
793
  expected_jp = Aquarium::Aspects::JoinPoint.new :object => @funky, :method_name => method
517
794
  pc.join_points_matched.should == Set.new([expected_jp])
518
795
  end
519
796
 
520
797
  it "should match instance methods for types when searching for names that end with a '#{char}' character, using a regular expressions." do
521
- pc = Aquarium::Aspects::Pointcut.new :types => ClassWithFunkyMethodNames, :methods => /#{Regexp.escape(char)}$/, :method_options => [:suppress_ancestor_methods]
798
+ pc = Aquarium::Aspects::Pointcut.new :types => ClassWithFunkyMethodNames, :methods => /#{Regexp.escape(char)}$/, :method_options => [:exclude_ancestor_methods]
522
799
  expected_jp = Aquarium::Aspects::JoinPoint.new :type => ClassWithFunkyMethodNames, :method_name => method
523
800
  pc.join_points_matched.should == Set.new([expected_jp])
524
801
  end
525
802
 
526
803
  it "should match instance methods for object when searching for names that end with a '#{char}' character, using a regular expressions." do
527
- pc = Aquarium::Aspects::Pointcut.new :object => @funky, :methods => /#{Regexp.escape(char)}$/, :method_options => [:suppress_ancestor_methods]
804
+ pc = Aquarium::Aspects::Pointcut.new :object => @funky, :methods => /#{Regexp.escape(char)}$/, :method_options => [:exclude_ancestor_methods]
528
805
  expected_jp = Aquarium::Aspects::JoinPoint.new :object => @funky, :method_name => method
529
806
  pc.join_points_matched.should == Set.new([expected_jp])
530
807
  end
@@ -568,7 +845,7 @@ end
568
845
 
569
846
  describe "Aquarium::Aspects::Pointcut" do
570
847
 
571
- setup do
848
+ before(:each) do
572
849
  class Empty; end
573
850
 
574
851
  @objectWithSingletonMethod = Empty.new
@@ -593,7 +870,7 @@ describe "Aquarium::Aspects::Pointcut" do
593
870
  end
594
871
 
595
872
  it "should find type-level singleton methods for types when :singleton is specified." do
596
- pc = Aquarium::Aspects::Pointcut.new :types => [NotQuiteEmpty, Empty], :methods => :all, :method_options => [:singleton, :suppress_ancestor_methods]
873
+ pc = Aquarium::Aspects::Pointcut.new :types => [NotQuiteEmpty, Empty], :methods => :all, :method_options => [:singleton, :exclude_ancestor_methods]
597
874
  pc.join_points_matched.should == Set.new([Aquarium::Aspects::JoinPoint.new(:type => NotQuiteEmpty, :method_name => :a_class_singleton_method)])
598
875
  pc.join_points_not_matched.should == Set.new([Aquarium::Aspects::JoinPoint.new(:type => Empty, :method_name => :all)])
599
876
  end
@@ -610,15 +887,15 @@ end
610
887
  describe Aquarium::Aspects::Pointcut, "#eql?" do
611
888
  it "should return true for the same Aquarium::Aspects::Pointcut object." do
612
889
  pc = Aquarium::Aspects::Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
613
- pc.should eql(pc)
890
+ pc.should be_eql(pc)
614
891
  pc1 = Aquarium::Aspects::Pointcut.new :object => ClassWithPublicClassMethod.new, :methods => /_test_method$/
615
- pc1.should eql(pc1)
892
+ pc1.should be_eql(pc1)
616
893
  end
617
894
 
618
895
  it "should return true for Aquarium::Aspects::Pointcuts that specify the same types and methods." do
619
896
  pc1 = Aquarium::Aspects::Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
620
897
  pc2 = Aquarium::Aspects::Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
621
- pc1.should eql(pc2)
898
+ pc1.should be_eql(pc2)
622
899
  end
623
900
 
624
901
  it "should return false for Aquarium::Aspects::Pointcuts that specify different types." do
@@ -731,16 +1008,16 @@ describe "Aquarium::Aspects::Pointcut#eql?" do
731
1008
  pc1 = Aquarium::Aspects::Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
732
1009
  pc2 = Aquarium::Aspects::Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
733
1010
  pc3 = Aquarium::Aspects::Pointcut.new :objects => [ClassWithPublicInstanceMethod.new, ClassWithPublicInstanceMethod.new]
734
- pc1.should eql(pc1)
735
- pc1.should eql(pc2)
1011
+ pc1.should be_eql(pc1)
1012
+ pc1.should be_eql(pc2)
736
1013
  pc1.should_not eql(pc3)
737
1014
  pc2.should_not eql(pc3)
738
1015
  end
739
1016
  end
740
1017
 
741
1018
  describe Aquarium::Aspects::Pointcut, "#candidate_types" do
742
- setup do
743
- common_setup
1019
+ before(:each) do
1020
+ before_pointcut_spec
744
1021
  end
745
1022
 
746
1023
  it "should return only candidate matching types when the input types exist." do
@@ -769,8 +1046,8 @@ describe Aquarium::Aspects::Pointcut, "#candidate_types" do
769
1046
  end
770
1047
 
771
1048
  describe Aquarium::Aspects::Pointcut, "#candidate_objects" do
772
- setup do
773
- common_setup
1049
+ before(:each) do
1050
+ before_pointcut_spec
774
1051
  end
775
1052
 
776
1053
  it "should return only candidate matching objects when the input are objects." do
@@ -784,8 +1061,8 @@ describe Aquarium::Aspects::Pointcut, "#candidate_objects" do
784
1061
  end
785
1062
 
786
1063
  describe Aquarium::Aspects::Pointcut, "#candidate_join_points" do
787
- setup do
788
- common_setup
1064
+ before(:each) do
1065
+ before_pointcut_spec
789
1066
  end
790
1067
 
791
1068
  it "should return only candidate non-matching join points for the input join points that do not exist." do
@@ -813,63 +1090,60 @@ describe Aquarium::Aspects::Pointcut, "#candidate_join_points" do
813
1090
  end
814
1091
 
815
1092
  describe Aquarium::Aspects::Pointcut, "#specification" do
816
- setup do
817
- common_setup
818
- @expected_specification_subset = {
819
- :methods => [:all], :method_options => [:suppress_ancestor_methods],
820
- :attributes => [], :attribute_options => []}
1093
+ before(:each) do
1094
+ before_pointcut_spec
821
1095
  @empty_set = Set.new
1096
+ @default_specification = {
1097
+ :types => @empty_set, :objects => @empty_set, :join_points => @empty_set,
1098
+ :methods => @empty_set, :method_options => @empty_set,
1099
+ :attributes => @empty_set, :attribute_options => @empty_set,
1100
+ :exclude_types => @empty_set,
1101
+ :exclude_objects => @empty_set,
1102
+ :exclude_join_points => @empty_set,
1103
+ :exclude_methods => @empty_set,
1104
+ :default_object => @empty_set}
1105
+ @default_specification_all_methods = { :methods => Set.new([:all]) } | @default_specification
822
1106
  end
823
1107
 
824
1108
  it "should return ':attribute_options => []', by default, if no arguments are given." do
825
1109
  pc = Aquarium::Aspects::Pointcut.new
826
- pc.specification.should == { :types => @empty_set, :objects => @empty_set, :join_points => @empty_set,
827
- :methods => Set.new([:all]), :method_options => Set.new([]), :default_object => @empty_set,
828
- :attributes => @empty_set, :attribute_options => @empty_set }
1110
+ pc.specification.should == @default_specification_all_methods
829
1111
  end
830
1112
 
831
1113
  it "should return the input :types and :type arguments combined into an array keyed by :types." do
832
1114
  pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :type => String
833
- pc.specification.should == { :types => Set.new(@example_types + [String]), :objects => @empty_set, :join_points => @empty_set,
834
- :methods => Set.new([:all]), :method_options => Set.new([]), :default_object => @empty_set,
835
- :attributes => @empty_set, :attribute_options => @empty_set }
1115
+ pc.specification.should == { :types => Set.new(@example_types + [String]) } | @default_specification_all_methods
836
1116
  end
837
1117
 
838
1118
  it "should return the input :objects and :object arguments combined into an array keyed by :objects." do
839
1119
  example_objs = @example_types.map {|t| t.new}
840
1120
  s1234 = "1234"
841
1121
  pc = Aquarium::Aspects::Pointcut.new :objects => example_objs, :object => s1234
842
- pc.specification.should == { :types => @empty_set, :objects => Set.new(example_objs + [s1234]), :join_points => @empty_set,
843
- :methods => Set.new([:all]), :method_options => Set.new([]), :default_object => @empty_set,
844
- :attributes => @empty_set, :attribute_options => @empty_set }
1122
+ pc.specification.should == { :objects => Set.new(example_objs + [s1234]) } | @default_specification_all_methods
845
1123
  end
846
1124
 
847
1125
  it "should return the input :methods and :method arguments combined into an array keyed by :methods." do
848
1126
  pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :methods => /^get/, :method => "dup"
849
- pc.specification.should == { :types => Set.new(@example_types), :objects => @empty_set, :join_points => @empty_set,
850
- :methods => Set.new([/^get/, "dup"]), :method_options => Set.new([]), :default_object => @empty_set,
851
- :attributes => @empty_set, :attribute_options => @empty_set }
1127
+ pc.specification.should == { :types => Set.new(@example_types), :methods => Set.new([/^get/, "dup"]) } | @default_specification
852
1128
  end
853
1129
 
854
1130
  it "should return the input :method_options verbatim." do
855
1131
  pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :methods => /^get/, :method => "dup", :method_options => [:instance, :public]
856
- pc.specification.should == { :types => Set.new(@example_types), :objects => @empty_set, :join_points => @empty_set,
857
- :methods => Set.new([/^get/, "dup"]), :method_options => Set.new([:instance, :public]), :default_object => @empty_set,
858
- :attributes => @empty_set, :attribute_options => @empty_set }
1132
+ pc.specification.should == { :types => Set.new(@example_types), :methods => Set.new([/^get/, "dup"]),
1133
+ :method_options => Set.new([:instance, :public]), :default_object => @empty_set } | @default_specification
859
1134
  end
860
1135
 
861
1136
  it "should return the input :methods and :method arguments combined into an array keyed by :methods." do
862
1137
  pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :attributes => /^state/, :attribute => "name"
863
1138
  pc.specification.should == { :types => Set.new(@example_types), :objects => @empty_set, :join_points => @empty_set,
864
1139
  :methods => @empty_set, :method_options => Set.new([]), :default_object => @empty_set,
865
- :attributes => Set.new([/^state/, "name"]), :attribute_options => @empty_set }
1140
+ :attributes => Set.new([/^state/, "name"]), :attribute_options => @empty_set } | @default_specification
866
1141
  end
867
1142
 
868
1143
  it "should return the input :attributes, :attribute and :attribute_options arguments, verbatim." do
869
1144
  pc = Aquarium::Aspects::Pointcut.new :types => @example_types, :attributes => /^state/, :attribute => "name", :attribute_options => :reader
870
- pc.specification.should == { :types => Set.new(@example_types), :objects => @empty_set, :join_points => @empty_set,
871
- :methods => @empty_set, :method_options => Set.new([]), :default_object => @empty_set,
872
- :attributes => Set.new([/^state/, "name"]), :attribute_options => Set.new([:reader]) }
1145
+ pc.specification.should == { :types => Set.new(@example_types), :attributes => Set.new([/^state/, "name"]),
1146
+ :attribute_options => Set.new([:reader]) } | @default_specification
873
1147
  end
874
1148
  end
875
1149