aquarium 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Aquarium-IDEA.ipr +252 -0
- data/Aquarium-IDEA.iws +493 -0
- data/Aquarium.ipr +1 -1
- data/Aquarium.iws +133 -138
- data/CHANGES +63 -0
- data/ParseTreePlay.rb +25 -0
- data/README +55 -3
- data/RELEASE-PLAN +9 -1
- data/TODO.rb +175 -15
- data/examples/aspect_design_example.rb +13 -1
- data/examples/aspect_design_example_spec.rb +20 -2
- data/examples/introductions_example.rb +35 -0
- data/examples/introductions_example_spec.rb +37 -0
- data/examples/method_missing_example.rb +2 -1
- data/lib/aquarium/aspects/advice.rb +127 -74
- data/lib/aquarium/aspects/aspect.rb +139 -72
- data/lib/aquarium/aspects/default_objects_handler.rb +6 -4
- data/lib/aquarium/aspects/exclusion_handler.rb +15 -3
- data/lib/aquarium/aspects/join_point.rb +60 -55
- data/lib/aquarium/aspects/pointcut.rb +153 -124
- data/lib/aquarium/aspects/pointcut_composition.rb +1 -1
- data/lib/aquarium/dsl/aspect_dsl.rb +13 -5
- data/lib/aquarium/dsl/object_dsl.rb +4 -2
- data/lib/aquarium/extras/design_by_contract.rb +9 -5
- data/lib/aquarium/finders.rb +1 -0
- data/lib/aquarium/finders/finder_result.rb +13 -5
- data/lib/aquarium/finders/method_finder.rb +75 -70
- data/lib/aquarium/finders/pointcut_finder.rb +166 -0
- data/lib/aquarium/finders/type_finder.rb +104 -62
- data/lib/aquarium/utils/array_utils.rb +1 -1
- data/lib/aquarium/utils/invalid_options.rb +2 -0
- data/lib/aquarium/utils/name_utils.rb +3 -2
- data/lib/aquarium/utils/nil_object.rb +7 -3
- data/lib/aquarium/utils/options_utils.rb +38 -27
- data/lib/aquarium/utils/set_utils.rb +2 -2
- data/lib/aquarium/utils/type_utils.rb +11 -0
- data/lib/aquarium/version.rb +1 -1
- data/spec/aquarium/aspects/advice_spec.rb +147 -32
- data/spec/aquarium/aspects/aspect_invocation_spec.rb +252 -43
- data/spec/aquarium/aspects/aspect_spec.rb +148 -88
- data/spec/aquarium/aspects/aspect_with_nested_types_spec.rb +40 -34
- data/spec/aquarium/aspects/aspect_with_subtypes_spec.rb +39 -3
- data/spec/aquarium/aspects/join_point_spec.rb +190 -227
- data/spec/aquarium/aspects/pointcut_spec.rb +24 -1
- data/spec/aquarium/dsl/aspect_dsl_spec.rb +17 -17
- data/spec/aquarium/finders/method_finder_spec.rb +8 -2
- data/spec/aquarium/finders/pointcut_finder_spec.rb +193 -0
- data/spec/aquarium/finders/pointcut_finder_spec_test_classes.rb +90 -0
- data/spec/aquarium/finders/type_finder_spec.rb +17 -0
- data/spec/aquarium/finders/type_finder_with_descendents_and_ancestors_spec.rb +4 -4
- data/spec/aquarium/finders/type_finder_with_nested_types.rb +47 -0
- data/spec/aquarium/utils/nil_object_spec.rb +21 -0
- data/spec/aquarium/utils/type_utils_sample_nested_types.rb +51 -0
- data/spec/aquarium/utils/type_utils_spec.rb +18 -1
- metadata +13 -3
@@ -6,15 +6,15 @@ include Aquarium::Aspects
|
|
6
6
|
|
7
7
|
describe Advice, "#sort_by_priority_order" do
|
8
8
|
it "should return an empty array for empty input" do
|
9
|
-
|
9
|
+
Advice.sort_by_priority_order([]).should == []
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should return a properly-sorted array for arbitrary input of valid advice kind symbols" do
|
13
|
-
|
13
|
+
Advice.sort_by_priority_order([:after_raising, :after_returning, :before, :after, :around]).should == [:around, :before, :after, :after_returning, :after_raising]
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should accept strings for the advice kinds, but return sorted symbols" do
|
17
|
-
|
17
|
+
Advice.sort_by_priority_order(["after_raising", "after_returning", "before", "after", "around"]).should == [:around, :before, :after, :after_returning, :after_raising]
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -53,16 +53,20 @@ describe Advice, "#invoke_original_join_point" do
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
+
def should_raise_expected_exception_with_message message
|
57
|
+
begin
|
58
|
+
yield ; fail
|
59
|
+
rescue => e
|
60
|
+
e.message.should include(message)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
56
64
|
describe Advice, "that raises an exception" do
|
57
65
|
it "should add the kind of advice to the exception message." do
|
58
66
|
aspect = Aspect.new :before, :pointcut => {:type => Watchful, :methods => :public_watchful_method} do |jp, obj, *args|
|
59
67
|
raise SpecExceptionForTesting.new("advice called with args: #{args.inspect}")
|
60
68
|
end
|
61
|
-
|
62
|
-
Watchful.new.public_watchful_method(:a1, :a2) || fail
|
63
|
-
rescue => e
|
64
|
-
e.message.should include("\"before\" advice")
|
65
|
-
end
|
69
|
+
should_raise_expected_exception_with_message("\"before\" advice") {Watchful.new.public_watchful_method(:a1, :a2)}
|
66
70
|
aspect.unadvise
|
67
71
|
end
|
68
72
|
|
@@ -70,11 +74,7 @@ describe Advice, "that raises an exception" do
|
|
70
74
|
aspect = Aspect.new :before, :pointcut => {:type => Watchful, :methods => :public_watchful_method} do |jp, obj, *args|
|
71
75
|
raise "advice called with args: #{args.inspect}"
|
72
76
|
end
|
73
|
-
|
74
|
-
Watchful.new.public_watchful_method(:a1, :a2) || fail
|
75
|
-
rescue => e
|
76
|
-
e.message.should include("Watchful#public_watchful_method")
|
77
|
-
end
|
77
|
+
should_raise_expected_exception_with_message("Watchful#public_watchful_method") {Watchful.new.public_watchful_method(:a1, :a2)}
|
78
78
|
aspect.unadvise
|
79
79
|
end
|
80
80
|
|
@@ -82,29 +82,25 @@ describe Advice, "that raises an exception" do
|
|
82
82
|
aspect = Aspect.new :before, :pointcut => {:type => Watchful, :methods => :public_class_watchful_method, :method_options => [:class]} do |jp, obj, *args|
|
83
83
|
raise "advice called with args: #{args.inspect}"
|
84
84
|
end
|
85
|
-
|
86
|
-
Watchful.public_class_watchful_method(:a1, :a2) || fail
|
87
|
-
rescue => e
|
88
|
-
e.message.should include("Watchful.public_class_watchful_method")
|
89
|
-
end
|
85
|
+
should_raise_expected_exception_with_message("Watchful.public_class_watchful_method") {Watchful.public_class_watchful_method(:a1, :a2)}
|
90
86
|
aspect.unadvise
|
91
87
|
end
|
92
88
|
|
93
89
|
it "should rethrow an exception of the same type as the original exception." do
|
94
|
-
class
|
90
|
+
class MyException1 < Exception; end
|
95
91
|
aspect = Aspect.new :before, :pointcut => {:type => Watchful, :methods => :public_class_watchful_method, :method_options => [:class]} do |jp, obj, *args|
|
96
|
-
raise
|
92
|
+
raise MyException1.new("advice called with args: #{args.inspect}")
|
97
93
|
end
|
98
|
-
lambda { Watchful.public_class_watchful_method :a1, :a2 }.should raise_error(
|
94
|
+
lambda { Watchful.public_class_watchful_method :a1, :a2 }.should raise_error(MyException1)
|
99
95
|
aspect.unadvise
|
100
96
|
end
|
101
97
|
|
102
98
|
it "should rethrow an exception with the same backtrace as the original exception." do
|
103
|
-
class
|
99
|
+
class MyException2 < Exception; end
|
104
100
|
@backtrace = nil
|
105
101
|
aspect = Aspect.new :before, :pointcut => {:type => Watchful, :methods => :public_class_watchful_method, :method_options => [:class]} do |jp, obj, *args|
|
106
102
|
begin
|
107
|
-
exception =
|
103
|
+
exception = MyException2.new("advice called with args: #{args.inspect}")
|
108
104
|
raise exception
|
109
105
|
rescue Exception => e
|
110
106
|
@backtrace = e.backtrace
|
@@ -112,7 +108,89 @@ describe Advice, "that raises an exception" do
|
|
112
108
|
end
|
113
109
|
end
|
114
110
|
begin
|
115
|
-
Watchful.public_class_watchful_method(:a1, :a2)
|
111
|
+
Watchful.public_class_watchful_method(:a1, :a2) ; fail
|
112
|
+
rescue Exception => e
|
113
|
+
e.backtrace.should == @backtrace
|
114
|
+
end
|
115
|
+
aspect.unadvise
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe Advice, "#invoke_original_join_point that raises an exception" do
|
120
|
+
class InvokeOriginalJoinPointRaisingException
|
121
|
+
class IOJPRException < Exception; end
|
122
|
+
def raise_exception *args
|
123
|
+
raise IOJPRException.new(":raise_exception called with args: #{args.inspect}")
|
124
|
+
end
|
125
|
+
def self.class_raise_exception *args
|
126
|
+
raise IOJPRException.new(":class_raise_exception called with args: #{args.inspect}")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should add the kind of advice to the exception message." do
|
131
|
+
aspect = Aspect.new :before,
|
132
|
+
:pointcut => {:type => InvokeOriginalJoinPointRaisingException, :methods => :raise_exception} do |jp, obj, *args|
|
133
|
+
jp.invoke_original_join_point
|
134
|
+
end
|
135
|
+
begin
|
136
|
+
InvokeOriginalJoinPointRaisingException.new.raise_exception(:a1, :a2) ; fail
|
137
|
+
rescue InvokeOriginalJoinPointRaisingException::IOJPRException => e
|
138
|
+
e.message.should include("\"before\" advice")
|
139
|
+
end
|
140
|
+
aspect.unadvise
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should add the \"Class#method\" of the advised object's type and method to the exception message." do
|
144
|
+
aspect = Aspect.new :before,
|
145
|
+
:pointcut => {:type => InvokeOriginalJoinPointRaisingException, :methods => :raise_exception} do |jp, obj, *args|
|
146
|
+
jp.invoke_original_join_point
|
147
|
+
end
|
148
|
+
begin
|
149
|
+
InvokeOriginalJoinPointRaisingException.new.raise_exception(:a1, :a2) ; fail
|
150
|
+
rescue InvokeOriginalJoinPointRaisingException::IOJPRException => e
|
151
|
+
e.message.should include("InvokeOriginalJoinPointRaisingException#raise_exception")
|
152
|
+
end
|
153
|
+
aspect.unadvise
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should add the \"Class.method\" of the advised type's class method to the exception message." do
|
157
|
+
aspect = Aspect.new :before,
|
158
|
+
:pointcut => {:type => InvokeOriginalJoinPointRaisingException, :methods => :class_raise_exception,
|
159
|
+
:method_options => [:class]} do |jp, obj, *args|
|
160
|
+
jp.invoke_original_join_point
|
161
|
+
end
|
162
|
+
begin
|
163
|
+
InvokeOriginalJoinPointRaisingException.class_raise_exception(:a1, :a2) ; fail
|
164
|
+
rescue InvokeOriginalJoinPointRaisingException::IOJPRException => e
|
165
|
+
e.message.should include("InvokeOriginalJoinPointRaisingException.class_raise_exception")
|
166
|
+
end
|
167
|
+
aspect.unadvise
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should rethrow an exception of the same type as the original exception." do
|
171
|
+
aspect = Aspect.new :before,
|
172
|
+
:pointcut => {:type => InvokeOriginalJoinPointRaisingException, :methods => :class_raise_exception,
|
173
|
+
:method_options => [:class]} do |jp, obj, *args|
|
174
|
+
jp.invoke_original_join_point
|
175
|
+
end
|
176
|
+
lambda { InvokeOriginalJoinPointRaisingException.class_raise_exception :a1, :a2 }.should raise_error(InvokeOriginalJoinPointRaisingException::IOJPRException)
|
177
|
+
aspect.unadvise
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should rethrow an exception with the same backtrace as the original exception." do
|
181
|
+
@backtrace = nil
|
182
|
+
aspect = Aspect.new :before,
|
183
|
+
:pointcut => {:type => InvokeOriginalJoinPointRaisingException, :methods => :class_raise_exception,
|
184
|
+
:method_options => [:class]} do |jp, obj, *args|
|
185
|
+
begin
|
186
|
+
jp.invoke_original_join_point
|
187
|
+
rescue Exception => e
|
188
|
+
@backtrace = e.backtrace
|
189
|
+
raise e
|
190
|
+
end
|
191
|
+
end
|
192
|
+
begin
|
193
|
+
InvokeOriginalJoinPointRaisingException.class_raise_exception(:a1, :a2) ; fail
|
116
194
|
rescue Exception => e
|
117
195
|
e.backtrace.should == @backtrace
|
118
196
|
end
|
@@ -120,19 +198,56 @@ describe Advice, "that raises an exception" do
|
|
120
198
|
end
|
121
199
|
end
|
122
200
|
|
201
|
+
describe Advice, ".compare_advice_kinds with nil or UNKNOWN_ADVICE_KIND" do
|
202
|
+
it "should return 0 when comparing nil to nil" do
|
203
|
+
Advice.compare_advice_kinds(nil, nil).should == 0
|
204
|
+
end
|
205
|
+
it "should return 0 when comparing UNKNOWN_ADVICE_KIND to UNKNOWN_ADVICE_KIND" do
|
206
|
+
Advice.compare_advice_kinds(Advice::UNKNOWN_ADVICE_KIND, Advice::UNKNOWN_ADVICE_KIND).should == 0
|
207
|
+
end
|
208
|
+
it "should return 1 when comparing UNKNOWN_ADVICE_KIND to nil" do
|
209
|
+
Advice.compare_advice_kinds(Advice::UNKNOWN_ADVICE_KIND, nil).should == 1
|
210
|
+
end
|
211
|
+
it "should return -1 when comparing nil to UNKNOWN_ADVICE_KIND" do
|
212
|
+
Advice.compare_advice_kinds(nil, Advice::UNKNOWN_ADVICE_KIND).should == -1
|
213
|
+
end
|
214
|
+
|
215
|
+
Advice::KINDS_IN_PRIORITY_ORDER.each do |kind|
|
216
|
+
it "should return 1 when comparing :#{kind} to UNKNOWN_ADVICE_KIND" do
|
217
|
+
Advice.compare_advice_kinds(kind, Advice::UNKNOWN_ADVICE_KIND).should == 1
|
218
|
+
end
|
219
|
+
end
|
220
|
+
Advice::KINDS_IN_PRIORITY_ORDER.each do |kind|
|
221
|
+
it "should return -1 when comparing UNKNOWN_ADVICE_KIND to :#{kind}" do
|
222
|
+
Advice.compare_advice_kinds(Advice::UNKNOWN_ADVICE_KIND, kind).should == -1
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
describe Advice, ".compare_advice_kinds between 'real' advice kinds" do
|
228
|
+
Advice::KINDS_IN_PRIORITY_ORDER.each do |kind1|
|
229
|
+
Advice::KINDS_IN_PRIORITY_ORDER.each do |kind2|
|
230
|
+
expected = Advice::KINDS_IN_PRIORITY_ORDER.index(kind1) <=> Advice::KINDS_IN_PRIORITY_ORDER.index(kind2)
|
231
|
+
it "should return #{expected} when comparing :#{kind1} to :#{kind2} (using priority order)" do
|
232
|
+
Advice.compare_advice_kinds(kind1, kind2).should == expected
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
123
238
|
describe AdviceChainNodeFactory, "#make_node" do
|
124
239
|
it "should raise if an unknown advice kind is specified" do
|
125
|
-
lambda {
|
240
|
+
lambda {AdviceChainNodeFactory.make_node :advice_kind => :foo}.should raise_error(Aquarium::Utils::InvalidOptions)
|
126
241
|
end
|
127
242
|
|
128
243
|
it "should return a node of the type corresponding to the input advice kind" do
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
244
|
+
AdviceChainNodeFactory.make_node(:advice_kind => :no).kind_of?(NoAdviceChainNode).should be_true
|
245
|
+
AdviceChainNodeFactory.make_node(:advice_kind => :none).kind_of?(NoAdviceChainNode).should be_true
|
246
|
+
AdviceChainNodeFactory.make_node(:advice_kind => :before).kind_of?(BeforeAdviceChainNode).should be_true
|
247
|
+
AdviceChainNodeFactory.make_node(:advice_kind => :after).kind_of?(AfterAdviceChainNode).should be_true
|
248
|
+
AdviceChainNodeFactory.make_node(:advice_kind => :after_raising).kind_of?(AfterRaisingAdviceChainNode).should be_true
|
249
|
+
AdviceChainNodeFactory.make_node(:advice_kind => :after_returning).kind_of?(AfterReturningAdviceChainNode).should be_true
|
250
|
+
AdviceChainNodeFactory.make_node(:advice_kind => :around).kind_of?(AroundAdviceChainNode).should be_true
|
136
251
|
end
|
137
252
|
end
|
138
253
|
|
@@ -1,13 +1,16 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
require File.dirname(__FILE__) + '/../spec_example_types'
|
3
|
+
require File.dirname(__FILE__) + '/../utils/type_utils_sample_nested_types'
|
3
4
|
require 'aquarium/aspects/aspect'
|
4
|
-
require 'aquarium/
|
5
|
+
require 'aquarium/dsl'
|
5
6
|
require 'aquarium/utils/array_utils'
|
7
|
+
require File.dirname(__FILE__) + '/../finders/pointcut_finder_spec_test_classes'
|
6
8
|
|
7
9
|
require 'profiler'
|
8
10
|
|
9
11
|
include Aquarium::Aspects
|
10
12
|
include Aquarium::Utils::ArrayUtils
|
13
|
+
include Aquarium::PointcutFinderTestClasses
|
11
14
|
|
12
15
|
|
13
16
|
def aspects_should_be_equal num_jps, aspect1, aspect2
|
@@ -132,18 +135,18 @@ describe Aspect, "methods" do
|
|
132
135
|
it "should reject the :exceptions argument unless specified with :after_raising." do
|
133
136
|
lambda { Aspect.new :before, :after, :exceptions => [Exception, String], :pointcut => @pointcut_opts, :noop => true }.should raise_error(Aquarium::Utils::InvalidOptions)
|
134
137
|
end
|
135
|
-
end
|
138
|
+
end
|
136
139
|
|
137
140
|
describe Aspect, ".new (parameters that specify pointcuts)" do
|
138
141
|
before :all do
|
139
142
|
@pointcut_opts = {:type => Aquarium::AspectInvocationTestClass}
|
140
143
|
end
|
141
144
|
|
142
|
-
it "should contain at least one of :method(s), :pointcut(s), :type(s), or :object(s)." do
|
145
|
+
it "should contain at least one of :method(s), :pointcut(s), :named_pointcut(s), :type(s), or :object(s)." do
|
143
146
|
lambda {Aspect.new(:after, :ignore_no_matching_join_points => true) {true}}.should raise_error(Aquarium::Utils::InvalidOptions)
|
144
147
|
end
|
145
148
|
|
146
|
-
it "should contain at least one of :pointcut(s), :type(s), or :object(s) unless :default_objects => object is given." do
|
149
|
+
it "should contain at least one of :pointcut(s), :named_pointcut(s), :type(s), or :object(s) unless :default_objects => object is given." do
|
147
150
|
aspect = Aspect.new(:after, :default_objects => Aquarium::AspectInvocationTestClass.new, :method => :public_test_method, :noop => true) {true}
|
148
151
|
end
|
149
152
|
|
@@ -163,7 +166,7 @@ end
|
|
163
166
|
aspect.join_points_matched.each {|jp| jp.type_or_object.should_not == Aquarium::AspectInvocationTestClass}
|
164
167
|
end
|
165
168
|
|
166
|
-
it "should ignore the :default_objects if at least one :pointcut is given
|
169
|
+
it "should ignore the :default_objects if at least one :pointcut is given even if the :default_objects => object are given." do
|
167
170
|
object = Aquarium::AspectInvocationTestClass.new
|
168
171
|
aspect = Aspect.new(:after, :default_objects => object,
|
169
172
|
:pointcut => {:type => Aquarium::AspectInvocationTestClass2, :method => :public_test_method}, :method => :public_test_method) {true}
|
@@ -171,7 +174,7 @@ end
|
|
171
174
|
aspect.join_points_matched.each {|jp| jp.type_or_object.should_not == object}
|
172
175
|
end
|
173
176
|
|
174
|
-
it "should ignore the :default_objects if at least one :pointcut is given
|
177
|
+
it "should ignore the :default_objects if at least one :pointcut is given even if the :default_objects => type are given." do
|
175
178
|
aspect = Aspect.new(:after, :default_objects => Aquarium::AspectInvocationTestClass,
|
176
179
|
:pointcut => {:type => Aquarium::AspectInvocationTestClass2, :method => :public_test_method}, :method => :public_test_method) {true}
|
177
180
|
aspect.join_points_matched.size.should == 1
|
@@ -193,7 +196,7 @@ end
|
|
193
196
|
aspect.join_points_matched.each {|jp| jp.type_or_object.should_not == Aquarium::AspectInvocationTestClass}
|
194
197
|
end
|
195
198
|
|
196
|
-
[:type, :type_and_descendents, :type_and_ancestors].each do |type_key|
|
199
|
+
[:type, :type_and_descendents, :type_and_ancestors, :type_and_nested_types].each do |type_key|
|
197
200
|
it "should ignore the :default_objects if at least one :#{type_key} is given and the :default_objects are objects." do
|
198
201
|
object = Aquarium::AspectInvocationTestClass.new
|
199
202
|
aspect = Aspect.new(:after, :default_objects => object, type_key => Aquarium::AspectInvocationTestClass2, :method => :public_test_method, :method => :public_test_method) {true}
|
@@ -220,7 +223,37 @@ end
|
|
220
223
|
end
|
221
224
|
end
|
222
225
|
|
226
|
+
describe Aspect, ".new (parameters that specify named constant and/or class variable pointcuts)" do
|
227
|
+
it "should contain at least one :types or TypeFinder synonym for :types." do
|
228
|
+
lambda {Aspect.new(:after, :named_pointcuts => {}, :noop => true) {true}}.should raise_error(Aquarium::Utils::InvalidOptions)
|
229
|
+
lambda {Aspect.new(:after, :named_pointcuts => {:types => all_pointcut_classes}, :noop => true) {true}}.should_not raise_error(Aquarium::Utils::InvalidOptions)
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should ignore the :default_objects if at least one :named_pointcut is given even if the :default_objects => object are given." do
|
233
|
+
object = Aquarium::AspectInvocationTestClass.new
|
234
|
+
aspect = Aspect.new(:after, :default_objects => object, :named_pointcut => {:types => Aquarium::PointcutFinderTestClasses::PointcutClassVariableHolder1}) {true}
|
235
|
+
aspect.join_points_matched.size.should == 1
|
236
|
+
aspect.join_points_matched.each {|jp| jp.type_or_object.should_not == object}
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should ignore the :default_objects if at least one :named_pointcut is given even if the :default_objects => type are given." do
|
240
|
+
aspect = Aspect.new(:after, :default_objects => Aquarium::AspectInvocationTestClass, :named_pointcut => {:types => Aquarium::PointcutFinderTestClasses::PointcutClassVariableHolder1}) {true}
|
241
|
+
aspect.join_points_matched.size.should == 1
|
242
|
+
aspect.join_points_matched.each {|jp| jp.type_or_object.should_not == Aquarium::AspectInvocationTestClass}
|
243
|
+
end
|
244
|
+
|
245
|
+
Aspect::CANONICAL_OPTIONS["named_pointcuts"].each do |key|
|
246
|
+
it "should accept :#{key} as a synonym for :named_pointcuts." do
|
247
|
+
lambda { Aspect.new :before, key.intern => {:types => Aquarium::PointcutFinderTestClasses.all_pointcut_classes}, :noop => true do; end }.should_not raise_error
|
248
|
+
end
|
249
|
+
end
|
223
250
|
|
251
|
+
it "should not contain :named_pointcut(s) and either :type(s) or :object(s)." do
|
252
|
+
lambda {Aspect.new(:after, :named_pointcuts => {:types => Aquarium::PointcutFinderTestClasses::PointcutClassVariableHolder1}, :type => Aquarium::AspectInvocationTestClass, :method => :public_test_method) {true}}.should raise_error(Aquarium::Utils::InvalidOptions)
|
253
|
+
lambda {Aspect.new(:after, :named_pointcuts => {:types => Aquarium::PointcutFinderTestClasses::PointcutClassVariableHolder1}, :object => Aquarium::AspectInvocationTestClass.new, :method => :public_test_method) {true}}.should raise_error(Aquarium::Utils::InvalidOptions)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
224
257
|
describe Aspect, ".new with :types parameter" do
|
225
258
|
it "should advise the specified types." do
|
226
259
|
@advice_called = false
|
@@ -462,6 +495,27 @@ end
|
|
462
495
|
do_type_spec
|
463
496
|
end
|
464
497
|
|
498
|
+
it "should accept :type(s)_and_nested_types => T1, :methods => [m, ...]" do
|
499
|
+
@types_option = :types_and_nested_types
|
500
|
+
@type_spec = Aquarium::AspectInvocationTestClass
|
501
|
+
@method_spec = [:public_test_method]
|
502
|
+
do_type_spec
|
503
|
+
end
|
504
|
+
|
505
|
+
it "should accept :type(s)_and_nested_types => [T1, ...], :methods => [m, ...]" do
|
506
|
+
@types_option = :types_and_nested_types
|
507
|
+
@type_spec = [Aquarium::AspectInvocationTestClass]
|
508
|
+
@method_spec = [:public_test_method]
|
509
|
+
do_type_spec
|
510
|
+
end
|
511
|
+
|
512
|
+
it "should accept :type(s)_and_nested_types => /T1/, :methods => [m, ...]" do
|
513
|
+
@types_option = :types_and_nested_types
|
514
|
+
@type_spec = /Aquarium::AspectInvocationTestClass/
|
515
|
+
@method_spec = [:public_test_method]
|
516
|
+
do_type_spec
|
517
|
+
end
|
518
|
+
|
465
519
|
it "should accept :type(s) => ..., :methods => ..., :method_options => [:exclude_ancestor_methods] to exclude methods defined in ancestors" do
|
466
520
|
@type_spec = /Aquarium::AspectInvocationTestClass/
|
467
521
|
@method_spec = /test_method/
|
@@ -885,6 +939,11 @@ end
|
|
885
939
|
do_type_pointcut_spec
|
886
940
|
end
|
887
941
|
|
942
|
+
it "should accept {:type(s)_and_nested_types => [T1, ...], :methods => /m/} " do
|
943
|
+
@pointcut_hash = {:type_and_nested_types => [Aquarium::AspectInvocationTestClass], :methods => /test_method/}
|
944
|
+
do_type_pointcut_spec
|
945
|
+
end
|
946
|
+
|
888
947
|
it "should accept {:type(s) => T1, :methods => [m, ...]} " do
|
889
948
|
@pointcut_hash = {:type => Aquarium::AspectInvocationTestClass, :methods => [:public_test_method]}
|
890
949
|
do_type_pointcut_spec
|
@@ -910,6 +969,11 @@ end
|
|
910
969
|
do_type_pointcut_spec
|
911
970
|
end
|
912
971
|
|
972
|
+
it "should accept {:type(s)_and_nested_types => T1, :methods => /m/} " do
|
973
|
+
@pointcut_hash = {:type_and_nested_types => Aquarium::AspectInvocationTestClass, :methods => /test_method/}
|
974
|
+
do_type_pointcut_spec
|
975
|
+
end
|
976
|
+
|
913
977
|
it "should accept {:type(s) => /T1/, :methods => [m, ...]} " do
|
914
978
|
@pointcut_hash = {:type => /Aquarium::AspectInvocationTestClass/, :methods => [:public_test_method]}
|
915
979
|
do_type_pointcut_spec
|
@@ -935,6 +999,11 @@ end
|
|
935
999
|
do_type_pointcut_spec
|
936
1000
|
end
|
937
1001
|
|
1002
|
+
it "should accept {:type(s)_and_nested_types => /T1/, :methods => /m/} " do
|
1003
|
+
@pointcut_hash = {:type_and_nested_types => /Aquarium::AspectInvocationTestClass/, :methods => /test_method/}
|
1004
|
+
do_type_pointcut_spec
|
1005
|
+
end
|
1006
|
+
|
938
1007
|
%w[public protected private].each do |protection|
|
939
1008
|
it "should accept {:type(s) => T1, :methods => /m/, :method_options =>[:instance, #{protection}]} " do
|
940
1009
|
@protection = protection
|
@@ -1153,6 +1222,26 @@ end
|
|
1153
1222
|
aspects_should_be_equal 1, @aspect1, @aspect2
|
1154
1223
|
end
|
1155
1224
|
|
1225
|
+
it "should advise equivalent join points when :type_and_nested_types => T and :method => m is used or :pointcut =>{:type_and_nested_types => T, :method => m} is used." do
|
1226
|
+
@aspect1 = Aspect.new :after, :type_and_nested_types => Aquarium::AspectInvocationTestClass, :method => :public_test_method, &@advice
|
1227
|
+
@aspect2 = Aspect.new :after, :pointcut => {:type_and_nested_types => Aquarium::AspectInvocationTestClass, :method => :public_test_method}, &@advice
|
1228
|
+
aspects_should_be_equal 1, @aspect1, @aspect2
|
1229
|
+
end
|
1230
|
+
|
1231
|
+
it "should advise equivalent join points when :type_and_nested_types => T and :method => m is used or :pointcut => pointcut is used, where pointcut matches :type_and_nested_types => T and :method => m." do
|
1232
|
+
@aspect1 = Aspect.new :after, :type_and_nested_types => Aquarium::AspectInvocationTestClass, :method => :public_test_method, &@advice
|
1233
|
+
pointcut = Aquarium::Aspects::Pointcut.new :type_and_nested_types => Aquarium::AspectInvocationTestClass, :method => :public_test_method
|
1234
|
+
@aspect2 = Aspect.new :after, :pointcut => pointcut, &@advice
|
1235
|
+
aspects_should_be_equal 1, @aspect1, @aspect2
|
1236
|
+
end
|
1237
|
+
|
1238
|
+
it "should advise equivalent join points when :pointcut =>{:type_and_nested_types => T, :method => m} is used or :pointcut => pointcut is used, where pointcut matches :type_and_nested_types => T and :method => m." do
|
1239
|
+
@aspect1 = Aspect.new :after, :pointcut => {:type_and_nested_types => Aquarium::AspectInvocationTestClass, :method => :public_test_method}, &@advice
|
1240
|
+
pointcut = Aquarium::Aspects::Pointcut.new :type_and_nested_types => Aquarium::AspectInvocationTestClass, :method => :public_test_method
|
1241
|
+
@aspect2 = Aspect.new :after, :pointcut => pointcut, &@advice
|
1242
|
+
aspects_should_be_equal 1, @aspect1, @aspect2
|
1243
|
+
end
|
1244
|
+
|
1156
1245
|
end
|
1157
1246
|
|
1158
1247
|
describe Aspect, ".new (with a :type(s) parameter and an :attributes(s) parameter or one of several equivalent :pointcut parameters)" do
|
@@ -1407,7 +1496,7 @@ end
|
|
1407
1496
|
end
|
1408
1497
|
|
1409
1498
|
describe Aspect, ".new (advice block to around advice with just the join_point parameter - Bug #19262)" do
|
1410
|
-
it "should
|
1499
|
+
it "should not raise an error" do
|
1411
1500
|
aspect = Aspect.new :around, :type => Aquarium::AspectInvocationTestClass, :methods => :public_test_method do |jp|; jp.proceed; end
|
1412
1501
|
Aquarium::AspectInvocationTestClass.new.public_test_method
|
1413
1502
|
aspect.unadvise
|
@@ -1439,7 +1528,7 @@ end
|
|
1439
1528
|
def doit3; end
|
1440
1529
|
end
|
1441
1530
|
|
1442
|
-
describe Aspect, ".new (with a :type(s) parameter and an :exclude_type(s), and :exclude_type(s)_and_ancestors, or an :exclude_type(s)
|
1531
|
+
describe Aspect, ".new (with a :type(s) parameter and an :exclude_type(s), and :exclude_type(s)_and_ancestors, an :exclude_type(s)_and_descendents, or an :exclude_type(s)_and_nested_types parameter)" do
|
1443
1532
|
before :all do
|
1444
1533
|
@included_types = [DontExclude1, DontExclude2]
|
1445
1534
|
@excluded_types = [Exclude1, Exclude2]
|
@@ -1496,6 +1585,16 @@ end
|
|
1496
1585
|
end
|
1497
1586
|
end
|
1498
1587
|
|
1588
|
+
it "should accept :type(s) => [T1, ...], :exclude_types_and_nested_types => [T2, ...] and exclude join points in the excluded types" do
|
1589
|
+
do_exclude_types :exclude_types_and_nested_types
|
1590
|
+
end
|
1591
|
+
|
1592
|
+
Aspect::CANONICAL_OPTIONS["exclude_types_and_nested_types"].each do |key|
|
1593
|
+
it "should accept :#{key} as a synonym for :exclude_types_and_nested_types." do
|
1594
|
+
lambda { Aspect.new :before, :types => @all_types, key.intern => @excluded_types, :methods => :doit, :noop => true do; end }.should_not raise_error
|
1595
|
+
end
|
1596
|
+
end
|
1597
|
+
|
1499
1598
|
end
|
1500
1599
|
|
1501
1600
|
|
@@ -1650,6 +1749,27 @@ end
|
|
1650
1749
|
end
|
1651
1750
|
end
|
1652
1751
|
|
1752
|
+
describe Aspect, ".new (with a :type(s)_and_nested_types parameter and an :exclude_join_point(s) parameter)" do
|
1753
|
+
it "should accept :type(s)_and_nested_types => [T1, ...], :exclude_join_point(s) => [jps], where [jps] are the list of join points for the types and methods to exclude" do
|
1754
|
+
included_types = [ClassWithPublicInstanceMethod, ModuleWithPublicInstanceMethod]
|
1755
|
+
excluded_join_point1 = JoinPoint.new :type => ClassWithPublicInstanceMethod, :method => :public_instance_test_method
|
1756
|
+
excluded_join_point2 = JoinPoint.new :type => ModuleWithPublicInstanceMethod, :method => :public_instance_module_test_method
|
1757
|
+
excluded_join_points = [excluded_join_point1, excluded_join_point2]
|
1758
|
+
aspect = nil
|
1759
|
+
advice_called = false
|
1760
|
+
aspect = Aspect.new :before, :types_and_nested_types => included_types, :methods => :doit,
|
1761
|
+
:exclude_join_points => excluded_join_points, :ignore_no_matching_join_points => true do |jp, obj, *args|; advice_called = true; end
|
1762
|
+
|
1763
|
+
advice_called = false
|
1764
|
+
ClassWithPublicInstanceMethod.new.public_instance_test_method
|
1765
|
+
advice_called.should be_false
|
1766
|
+
advice_called = false
|
1767
|
+
ClassIncludingModuleWithPublicInstanceMethod.new.public_instance_module_test_method
|
1768
|
+
advice_called.should be_false
|
1769
|
+
aspect.unadvise
|
1770
|
+
end
|
1771
|
+
end
|
1772
|
+
|
1653
1773
|
describe Aspect, ".new (with a :pointcut(s) parameter and an :exclude_join_point(s) parameter)" do
|
1654
1774
|
it "should accept :pointcut(s) => [P1, ...], :exclude_join_point(s) => [jps], where [jps] are the list of join points for the types and methods to exclude" do
|
1655
1775
|
included_types = [DontExclude1, DontExclude2]
|
@@ -1716,7 +1836,7 @@ end
|
|
1716
1836
|
|
1717
1837
|
Aspect::CANONICAL_OPTIONS["exclude_pointcuts"].each do |key|
|
1718
1838
|
it "should accept :#{key} as a synonym for :exclude_pointcuts." do
|
1719
|
-
lambda {aspect = Aspect.new :before, :objects => @all_objects,
|
1839
|
+
lambda {aspect = Aspect.new :before, :objects => @all_objects, key.intern => @excluded_pointcuts, :methods => :doit, :noop => true do; end}.should_not raise_error
|
1720
1840
|
end
|
1721
1841
|
end
|
1722
1842
|
end
|
@@ -1787,40 +1907,82 @@ end
|
|
1787
1907
|
end
|
1788
1908
|
end
|
1789
1909
|
|
1790
|
-
describe Aspect, ".new (with
|
1791
|
-
it "should accept :pointcut(s) => [P1, ...], :
|
1792
|
-
included_types = [DontExclude1, DontExclude2]
|
1793
|
-
excluded_types = [Exclude1, Exclude2]
|
1794
|
-
pointcut1 = Pointcut.new :types => included_types, :method => :doit
|
1795
|
-
pointcut2 = Pointcut.new :types => excluded_types, :method => :doit
|
1910
|
+
describe Aspect, ".new (with a :pointcut(s) and an :exclude_named_pointcut(s) parameter)" do
|
1911
|
+
it "should accept :pointcut(s) => [P1, ...], :exclude_named_pointcut(s) => {...}, where any pointcuts matching the latter are excluded" do
|
1796
1912
|
aspect = nil
|
1797
1913
|
advice_called = false
|
1798
|
-
aspect = Aspect.new :before, :pointcuts =>
|
1914
|
+
aspect = Aspect.new :before, :pointcuts => Aquarium::PointcutFinderTestClasses.all_pointcuts,
|
1915
|
+
:exclude_named_pointcuts => {:matching => /POINTCUT/, :in_types => Aquarium::PointcutFinderTestClasses.all_pointcut_classes} do |jp, obj, *args|
|
1799
1916
|
advice_called = true
|
1800
|
-
|
1917
|
+
Aquarium::PointcutFinderTestClasses.all_constants_pointcut_classes.should_not include(jp.target_type)
|
1801
1918
|
end
|
1919
|
+
Aquarium::PointcutFinderTestClasses.all_class_variables_pointcut_classes.each do |type|
|
1920
|
+
advice_called = false
|
1921
|
+
type.new.doit
|
1922
|
+
advice_called.should be_true
|
1923
|
+
end
|
1924
|
+
Aquarium::PointcutFinderTestClasses.all_constants_pointcut_classes.each do |type|
|
1925
|
+
advice_called = false
|
1926
|
+
type.new.doit
|
1927
|
+
advice_called.should_not be_true
|
1928
|
+
end
|
1929
|
+
aspect.unadvise
|
1930
|
+
end
|
1802
1931
|
|
1803
|
-
|
1932
|
+
Aspect::CANONICAL_OPTIONS["exclude_named_pointcuts"].each do |key|
|
1933
|
+
it "should accept :#{key} as a synonym for :exclude_named_pointcuts." do
|
1934
|
+
lambda {aspect = Aspect.new :before, :pointcuts => Aquarium::PointcutFinderTestClasses.all_pointcuts,
|
1935
|
+
key.intern => {:matching => /POINTCUT/, :in_types => Aquarium::PointcutFinderTestClasses.all_pointcut_classes},
|
1936
|
+
:noop => true do; end}.should_not raise_error
|
1937
|
+
end
|
1938
|
+
end
|
1939
|
+
end
|
1940
|
+
|
1941
|
+
describe Aspect, ".new (with type-based :pointcut(s) and :exclude_type(s) parameter)" do
|
1942
|
+
before :all do
|
1943
|
+
@included_types = [DontExclude1, DontExclude2]
|
1944
|
+
@excluded_types = [Exclude1, Exclude2]
|
1945
|
+
@pointcut1 = Pointcut.new :types => @included_types, :method => :doit
|
1946
|
+
@pointcut2 = Pointcut.new :types => @excluded_types, :method => :doit
|
1947
|
+
end
|
1948
|
+
|
1949
|
+
it "should accept :pointcut(s) => [P1, ...], :exclude_type(s) => [types], where join points with [types] are excluded" do
|
1950
|
+
advice_called = false
|
1951
|
+
aspect = Aspect.new :before, :pointcuts => [@pointcut1, @pointcut2], :exclude_types => @excluded_types do |jp, obj, *args|
|
1952
|
+
advice_called = true
|
1953
|
+
@excluded_types.should_not include(jp.target_type)
|
1954
|
+
end
|
1955
|
+
|
1956
|
+
@included_types.each do |type|
|
1804
1957
|
advice_called = false
|
1805
1958
|
type.new(1).doit
|
1806
1959
|
advice_called.should be_true
|
1807
1960
|
end
|
1808
|
-
excluded_types.each do |type|
|
1961
|
+
@excluded_types.each do |type|
|
1809
1962
|
advice_called = false
|
1810
1963
|
type.new(1).doit
|
1811
1964
|
advice_called.should_not be_true
|
1812
1965
|
end
|
1813
1966
|
aspect.unadvise
|
1814
1967
|
end
|
1968
|
+
|
1969
|
+
Aspect::CANONICAL_OPTIONS["exclude_types"].each do |key|
|
1970
|
+
it "should accept :#{key} as a synonym for :exclude_types." do
|
1971
|
+
lambda {aspect = Aspect.new :before, :pointcuts => [@pointcut1, @pointcut2], key.intern => @excluded_types,
|
1972
|
+
:noop => true do; end}.should_not raise_error
|
1973
|
+
end
|
1974
|
+
end
|
1815
1975
|
end
|
1816
1976
|
|
1817
1977
|
describe Aspect, ".new (with type-based :pointcut(s) and :exclude_type(s)_and_ancestors parameter)" do
|
1978
|
+
before :all do
|
1979
|
+
@excluded_types = [ClassWithPublicInstanceMethod, ModuleWithPublicInstanceMethod]
|
1980
|
+
@types = @excluded_types + [ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod]
|
1981
|
+
@pointcut1 = Pointcut.new :types => @types, :method => :all, :method_options => [:exclude_ancestor_methods]
|
1982
|
+
end
|
1983
|
+
|
1818
1984
|
it "should accept :pointcut(s) => [P1, ...], :exclude_type(s)_and_ancestors => [types], where join points with [types] are excluded" do
|
1819
|
-
|
1820
|
-
types = excluded_types + [ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod]
|
1821
|
-
pointcut1 = Pointcut.new :types => types, :method => :all, :method_options => [:exclude_ancestor_methods]
|
1822
|
-
advice_called = false
|
1823
|
-
aspect = Aspect.new :before, :pointcuts => pointcut1, :exclude_types_and_ancestors => excluded_types do |jp, obj, *args|; end
|
1985
|
+
aspect = Aspect.new :before, :pointcuts => @pointcut1, :exclude_types_and_ancestors => @excluded_types do |jp, obj, *args|; end
|
1824
1986
|
aspect.pointcuts.each do |pc|
|
1825
1987
|
pc.join_points_matched.each do |jp|
|
1826
1988
|
jp.target_type.should == ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod
|
@@ -1828,48 +1990,95 @@ end
|
|
1828
1990
|
end
|
1829
1991
|
aspect.unadvise
|
1830
1992
|
end
|
1993
|
+
|
1994
|
+
Aspect::CANONICAL_OPTIONS["exclude_types_and_ancestors"].each do |key|
|
1995
|
+
it "should accept :#{key} as a synonym for :exclude_types_and_ancestors." do
|
1996
|
+
lambda {aspect = Aspect.new :before, :pointcuts => @pointcut1, key.intern => @excluded_types,
|
1997
|
+
:noop => true do; end}.should_not raise_error
|
1998
|
+
end
|
1999
|
+
end
|
1831
2000
|
end
|
1832
2001
|
|
1833
2002
|
describe Aspect, ".new (with type-based :pointcut(s) and :exclude_type(s)_and_descendents parameter)" do
|
2003
|
+
before :all do
|
2004
|
+
@excluded_types = [ClassWithPublicInstanceMethod, ModuleWithPublicInstanceMethod]
|
2005
|
+
@types = @excluded_types + [ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod]
|
2006
|
+
@pointcut1 = Pointcut.new :types => @types, :method => :all, :method_options => [:exclude_ancestor_methods]
|
2007
|
+
end
|
1834
2008
|
it "should accept :pointcut(s) => [P1, ...], :exclude_type(s)_and_descendents => [types], where join points with [types] are excluded" do
|
1835
|
-
|
1836
|
-
|
1837
|
-
pointcut1 = Pointcut.new :types => types, :method => :all, :method_options => [:exclude_ancestor_methods]
|
1838
|
-
advice_called = false
|
1839
|
-
aspect = Aspect.new :before, :pointcuts => pointcut1, :exclude_types_and_descendents => excluded_types, :ignore_no_matching_join_points => true do |jp, obj, *args|; end
|
2009
|
+
aspect = Aspect.new :before, :pointcuts => @pointcut1, :exclude_types_and_descendents => @excluded_types,
|
2010
|
+
:ignore_no_matching_join_points => true do |jp, obj, *args|; end
|
1840
2011
|
aspect.pointcuts.size.should == 0
|
1841
2012
|
aspect.unadvise
|
1842
2013
|
end
|
2014
|
+
|
2015
|
+
Aspect::CANONICAL_OPTIONS["exclude_types_and_descendents"].each do |key|
|
2016
|
+
it "should accept :#{key} as a synonym for :exclude_types_and_descendents." do
|
2017
|
+
lambda {aspect = Aspect.new :before, :pointcuts => @pointcut1, key.intern => @excluded_types,
|
2018
|
+
:ignore_no_matching_join_points => true, :noop => true do; end}.should_not raise_error
|
2019
|
+
end
|
2020
|
+
end
|
2021
|
+
end
|
2022
|
+
|
2023
|
+
describe Aspect, ".new (with type-based :pointcut(s) and :exclude_type(s)_and_nested_types parameter)" do
|
2024
|
+
before :all do
|
2025
|
+
@excluded_types = [ClassWithPublicInstanceMethod, ModuleWithPublicInstanceMethod]
|
2026
|
+
@types = @excluded_types + [ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod]
|
2027
|
+
@pointcut1 = Pointcut.new :types => @types, :method => :all, :method_options => [:exclude_ancestor_methods]
|
2028
|
+
end
|
2029
|
+
it "should accept :pointcut(s) => [P1, ...], :exclude_type(s)_and_nested_types => [types], where join points with [types] are excluded" do
|
2030
|
+
aspect = Aspect.new :before, :pointcuts => @pointcut1, :exclude_types_and_nested_types => @excluded_types,
|
2031
|
+
:ignore_no_matching_join_points => true do |jp, obj, *args|; end
|
2032
|
+
aspect.pointcuts.size.should == 1
|
2033
|
+
aspect.unadvise
|
2034
|
+
end
|
2035
|
+
|
2036
|
+
Aspect::CANONICAL_OPTIONS["exclude_types_and_nested_types"].each do |key|
|
2037
|
+
it "should accept :#{key} as a synonym for :exclude_types_and_nested_types." do
|
2038
|
+
lambda {aspect = Aspect.new :before, :pointcuts => @pointcut1, key.intern => @excluded_types,
|
2039
|
+
:ignore_no_matching_join_points => true, :noop => true do; end}.should_not raise_error
|
2040
|
+
end
|
2041
|
+
end
|
1843
2042
|
end
|
1844
2043
|
|
1845
|
-
describe Aspect, ".new (with object-based :pointcut(s) and :exclude_object(s)
|
2044
|
+
describe Aspect, ".new (with object-based :pointcut(s) and :exclude_object(s) parameter)" do
|
2045
|
+
before :all do
|
2046
|
+
@dontExclude1 = DontExclude1.new(1)
|
2047
|
+
@dontExclude2 = DontExclude1.new(2)
|
2048
|
+
@exclude1 = DontExclude1.new(3)
|
2049
|
+
@exclude2 = DontExclude1.new(4)
|
2050
|
+
@included_objects = [@dontExclude1, @dontExclude2]
|
2051
|
+
@excluded_objects = [@exclude1, @exclude2]
|
2052
|
+
@pointcut1 = Pointcut.new :objects => @included_objects, :method => :doit
|
2053
|
+
@pointcut2 = Pointcut.new :objects => @excluded_objects, :method => :doit
|
2054
|
+
end
|
2055
|
+
|
1846
2056
|
it "should accept :pointcut(s) => [P1, ...], :exclude_object(s) => [objects], where join points with [objects] are excluded" do
|
1847
|
-
dontExclude1 = DontExclude1.new(1)
|
1848
|
-
dontExclude2 = DontExclude1.new(2)
|
1849
|
-
exclude1 = DontExclude1.new(3)
|
1850
|
-
exclude2 = DontExclude1.new(4)
|
1851
|
-
included_objects = [dontExclude1, dontExclude2]
|
1852
|
-
excluded_objects = [exclude1, exclude2]
|
1853
|
-
pointcut1 = Pointcut.new :objects => included_objects, :method => :doit
|
1854
|
-
pointcut2 = Pointcut.new :objects => excluded_objects, :method => :doit
|
1855
2057
|
aspect = nil
|
1856
2058
|
advice_called = false
|
1857
|
-
aspect = Aspect.new :before, :pointcuts => [pointcut1, pointcut2], :exclude_objects => excluded_objects do |jp, obj, *args|
|
2059
|
+
aspect = Aspect.new :before, :pointcuts => [@pointcut1, @pointcut2], :exclude_objects => @excluded_objects do |jp, obj, *args|
|
1858
2060
|
advice_called = true
|
1859
|
-
excluded_objects.should_not include(obj)
|
2061
|
+
@excluded_objects.should_not include(obj)
|
1860
2062
|
end
|
1861
|
-
included_objects.each do |object|
|
2063
|
+
@included_objects.each do |object|
|
1862
2064
|
advice_called = false
|
1863
2065
|
object.doit
|
1864
2066
|
advice_called.should be_true
|
1865
2067
|
end
|
1866
|
-
excluded_objects.each do |object|
|
2068
|
+
@excluded_objects.each do |object|
|
1867
2069
|
advice_called = false
|
1868
2070
|
object.doit
|
1869
2071
|
advice_called.should_not be_true
|
1870
2072
|
end
|
1871
2073
|
aspect.unadvise
|
1872
2074
|
end
|
2075
|
+
|
2076
|
+
Aspect::CANONICAL_OPTIONS["exclude_objects"].each do |key|
|
2077
|
+
it "should accept :#{key} as a synonym for :exclude_objects." do
|
2078
|
+
lambda {aspect = Aspect.new :before, :pointcuts => [@pointcut1, @pointcut2], key.intern => @excluded_objects,
|
2079
|
+
:noop => true do; end}.should_not raise_error
|
2080
|
+
end
|
2081
|
+
end
|
1873
2082
|
end
|
1874
2083
|
|
1875
2084
|
describe Aspect, ".new (with :method(s) and :exclude_method(s) parameter)" do
|