aquarium 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +35 -0
- data/MIT-LICENSE +1 -1
- data/README +66 -20
- data/Rakefile +1 -1
- data/UPGRADE +5 -0
- data/examples/aspect_design_example.rb +5 -4
- data/examples/aspect_design_example_spec.rb +6 -5
- data/examples/design_by_contract_example.rb +3 -3
- data/examples/design_by_contract_example_spec.rb +4 -4
- data/examples/method_missing_example.rb +1 -1
- data/examples/method_missing_example_spec.rb +2 -2
- data/examples/method_tracing_example.rb +3 -3
- data/examples/method_tracing_example_spec.rb +6 -6
- data/lib/aquarium/aspects/advice.rb +2 -3
- data/lib/aquarium/aspects/aspect.rb +100 -246
- data/lib/aquarium/aspects/{default_object_handler.rb → default_objects_handler.rb} +7 -6
- data/lib/aquarium/aspects/dsl/aspect_dsl.rb +2 -2
- data/lib/aquarium/aspects/pointcut.rb +190 -107
- data/lib/aquarium/finders/method_finder.rb +120 -34
- data/lib/aquarium/finders/type_finder.rb +2 -5
- data/lib/aquarium/utils.rb +1 -0
- data/lib/aquarium/utils/array_utils.rb +11 -3
- data/lib/aquarium/utils/options_utils.rb +74 -0
- data/lib/aquarium/utils/type_utils.rb +25 -11
- data/lib/aquarium/version.rb +1 -1
- data/spec/aquarium/aspects/advice_chain_node_spec.rb +1 -1
- data/spec/aquarium/aspects/advice_spec.rb +1 -1
- data/spec/aquarium/aspects/aspect_invocation_spec.rb +179 -145
- data/spec/aquarium/aspects/aspect_spec.rb +1 -1
- data/spec/aquarium/aspects/aspect_with_nested_types_spec.rb +1 -1
- data/spec/aquarium/aspects/aspect_with_subtypes_spec.rb +1 -1
- data/spec/aquarium/aspects/concurrent_aspects_spec.rb +1 -1
- data/spec/aquarium/aspects/concurrent_aspects_with_objects_and_types_spec.rb +1 -1
- data/spec/aquarium/aspects/default_objects_handler_spec.rb +147 -0
- data/spec/aquarium/aspects/dsl/aspect_dsl_spec.rb +72 -121
- data/spec/aquarium/aspects/join_point_spec.rb +1 -1
- data/spec/aquarium/aspects/pointcut_and_composition_spec.rb +1 -1
- data/spec/aquarium/aspects/pointcut_or_composition_spec.rb +48 -47
- data/spec/aquarium/aspects/pointcut_spec.rb +727 -410
- data/spec/aquarium/extensions/hash_spec.rb +1 -1
- data/spec/aquarium/extensions/regex_spec.rb +1 -1
- data/spec/aquarium/extensions/set_spec.rb +1 -1
- data/spec/aquarium/extensions/string_spec.rb +1 -1
- data/spec/aquarium/extensions/symbol_spec.rb +1 -1
- data/spec/aquarium/extras/design_by_contract_spec.rb +1 -1
- data/spec/aquarium/finders/finder_result_spec.rb +1 -1
- data/spec/aquarium/finders/method_finder_spec.rb +49 -16
- data/spec/aquarium/finders/type_finder_spec.rb +1 -1
- data/spec/aquarium/finders/type_finder_with_descendents_and_ancestors_spec.rb +16 -1
- data/spec/aquarium/utils/array_utils_spec.rb +31 -6
- data/spec/aquarium/utils/hash_utils_spec.rb +1 -1
- data/spec/aquarium/utils/html_escaper_spec.rb +1 -1
- data/spec/aquarium/utils/logic_error_spec.rb +1 -1
- data/spec/aquarium/utils/method_utils_spec.rb +1 -1
- data/spec/aquarium/utils/name_utils_spec.rb +1 -1
- data/spec/aquarium/utils/nil_object_spec.rb +1 -1
- data/spec/aquarium/utils/set_utils_spec.rb +1 -1
- data/spec/aquarium/utils/type_utils_spec.rb +1 -1
- metadata +9 -7
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
require File.dirname(__FILE__) + '/../spec_example_classes'
|
3
3
|
require 'aquarium/aspects/aspect'
|
4
4
|
require 'aquarium/aspects/dsl'
|
@@ -44,7 +44,7 @@ module Aquarium
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
describe Aspect, ".new parameters that specify the kind of advice" do
|
47
|
+
describe Aspect, ".new (parameters that specify the kind of advice)" do
|
48
48
|
it "should require the kind of advice as the first parameter." do
|
49
49
|
lambda { Aspect.new :pointcut => {:type => Aquarium::AspectInvocationTestClass} }.should raise_error(Aquarium::Utils::InvalidOptions)
|
50
50
|
end
|
@@ -73,92 +73,142 @@ describe Aspect, ".new parameters that specify the kind of advice" do
|
|
73
73
|
it "should allow :before to be specified with :after_raising." do
|
74
74
|
lambda { Aspect.new :before, :after_raising, :pointcut => {:type => Aquarium::AspectInvocationTestClass}, :noop => true }.should_not raise_error(Aquarium::Utils::InvalidOptions)
|
75
75
|
end
|
76
|
+
|
77
|
+
it "should accept a single exception specified with :after_raising." do
|
78
|
+
lambda { Aspect.new :before, :after_raising => Exception, :pointcut => {:type => Aquarium::AspectInvocationTestClass}, :noop => true }.should_not raise_error(Aquarium::Utils::InvalidOptions)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should accept a a list of exceptions specified with :after_raising." do
|
82
|
+
lambda { Aspect.new :before, :after_raising => [Exception, String], :pointcut => {:type => Aquarium::AspectInvocationTestClass}, :noop => true }.should_not raise_error(Aquarium::Utils::InvalidOptions)
|
83
|
+
end
|
76
84
|
end
|
77
85
|
|
78
|
-
describe Aspect, ".new parameters that specify
|
86
|
+
describe Aspect, ".new (parameters that specify pointcuts)" do
|
79
87
|
it "should contain at least one of :method(s), :pointcut(s), :type(s), or :object(s)." do
|
80
88
|
lambda {Aspect.new(:after) {|jp, obj, *args| true}}.should raise_error(Aquarium::Utils::InvalidOptions)
|
81
89
|
end
|
82
90
|
|
83
|
-
it "should contain at least one of :pointcut(s), :type(s), or :object(s) unless :
|
84
|
-
aspect = Aspect.new(:after, :
|
91
|
+
it "should contain at least one of :pointcut(s), :type(s), or :object(s) unless :default_objects => object is given." do
|
92
|
+
aspect = Aspect.new(:after, :default_objects => Aquarium::AspectInvocationTestClass.new, :methods => :public_test_method) {|jp, obj, *args| true}
|
85
93
|
aspect.unadvise
|
86
94
|
end
|
87
95
|
|
96
|
+
Aspect::CANONICAL_OPTIONS["default_objects"].each do |key|
|
97
|
+
it "should accept :#{key} as a synonym for :default_objects." do
|
98
|
+
aspect = Aspect.new(:after, key.intern => Aquarium::AspectInvocationTestClass.new, :methods => :public_test_method) {|jp, obj, *args| true}
|
99
|
+
aspect.unadvise
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
88
103
|
it "should not contain :pointcut(s) and either :type(s) or :object(s)." do
|
89
104
|
lambda {Aspect.new(:after, :pointcuts => {:type => Aquarium::AspectInvocationTestClass, :methods => :public_test_method}, :type => Aquarium::AspectInvocationTestClass, :methods => :public_test_method) {|jp, obj, *args| true}}.should raise_error(Aquarium::Utils::InvalidOptions)
|
90
105
|
lambda {Aspect.new(:after, :pointcuts => {:type => Aquarium::AspectInvocationTestClass, :methods => :public_test_method}, :object => Aquarium::AspectInvocationTestClass.new, :methods => :public_test_method) {|jp, obj, *args| true}}.should raise_error(Aquarium::Utils::InvalidOptions)
|
91
106
|
end
|
107
|
+
end
|
92
108
|
|
93
|
-
|
94
|
-
|
109
|
+
|
110
|
+
describe Aspect, ".new (:types parameter)" do
|
111
|
+
Aspect::CANONICAL_OPTIONS["types"].each do |key|
|
112
|
+
it "should accept :#{key} as a synonym for :types." do
|
113
|
+
@advice = Proc.new {}
|
114
|
+
@expected_methods = [:public_test_method]
|
115
|
+
aspect1 = Aspect.new :before, key.intern => Aquarium::AspectInvocationTestClass, :method => @expected_methods, :advice => @advice
|
116
|
+
aspect2 = Aspect.new :before, :types => Aquarium::AspectInvocationTestClass, :method => @expected_methods, :advice => @advice
|
117
|
+
aspects_should_be_equal 1, aspect1, aspect2
|
118
|
+
aspect1.unadvise
|
119
|
+
aspect2.unadvise
|
120
|
+
end
|
95
121
|
end
|
96
122
|
end
|
97
123
|
|
124
|
+
describe Aspect, ".new (:pointcuts parameter)" do
|
125
|
+
Aspect::CANONICAL_OPTIONS["pointcuts"].each do |key|
|
126
|
+
it "should accept :#{key} as a synonym for :pointcuts." do
|
127
|
+
@advice = Proc.new {}
|
128
|
+
@expected_methods = [:public_test_method]
|
129
|
+
aspect1 = Aspect.new :before, key.intern => {:type => Aquarium::AspectInvocationTestClass, :method => @expected_methods}, :advice => @advice
|
130
|
+
aspect2 = Aspect.new :before, :pointcuts => {:type => Aquarium::AspectInvocationTestClass, :method => @expected_methods}, :advice => @advice
|
131
|
+
aspects_should_be_equal 1, aspect1, aspect2
|
132
|
+
aspect1.unadvise
|
133
|
+
aspect2.unadvise
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
98
137
|
|
99
|
-
describe Aspect, ".new :
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
138
|
+
describe Aspect, ".new (:objects parameter)" do
|
139
|
+
Aspect::CANONICAL_OPTIONS["objects"].each do |key|
|
140
|
+
it "should accept :#{key} as a synonym for :objects." do
|
141
|
+
@advice = Proc.new {}
|
142
|
+
@expected_methods = [:public_test_method]
|
143
|
+
object = Aquarium::AspectInvocationTestClass.new
|
144
|
+
aspect1 = Aspect.new :before, key.intern => object, :method => @expected_methods, :advice => @advice
|
145
|
+
aspect2 = Aspect.new :before, :objects => object, :method => @expected_methods, :advice => @advice
|
146
|
+
aspects_should_be_equal 1, aspect1, aspect2
|
147
|
+
aspect1.unadvise
|
148
|
+
aspect2.unadvise
|
149
|
+
end
|
108
150
|
end
|
109
151
|
end
|
110
152
|
|
111
|
-
describe Aspect, ".new :
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
153
|
+
describe Aspect, ".new (:methods parameter)" do
|
154
|
+
Aspect::CANONICAL_OPTIONS["methods"].each do |key|
|
155
|
+
it "should accept :#{key} as a synonym for :methods." do
|
156
|
+
@advice = Proc.new {}
|
157
|
+
@expected_methods = [:public_test_method]
|
158
|
+
aspect1 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, key.intern => @expected_methods, :advice => @advice
|
159
|
+
aspect2 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :methods => @expected_methods, :advice => @advice
|
160
|
+
aspects_should_be_equal 1, aspect1, aspect2
|
161
|
+
aspect1.unadvise
|
162
|
+
aspect2.unadvise
|
163
|
+
end
|
120
164
|
end
|
121
165
|
end
|
122
166
|
|
123
|
-
describe Aspect, ".new :
|
124
|
-
|
167
|
+
describe Aspect, ".new (:attributes parameter)" do
|
168
|
+
Aspect::CANONICAL_OPTIONS["attributes"].each do |key|
|
169
|
+
it "should accept :#{key} as a synonym for :attributes." do
|
170
|
+
@advice = Proc.new {}
|
171
|
+
@expected_methods = [:public_test_method_args, :public_test_method_args=]
|
172
|
+
aspect1 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, key.intern => @expected_methods, :advice => @advice
|
173
|
+
aspect2 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :attributes => @expected_methods, :advice => @advice
|
174
|
+
aspects_should_be_equal 2, aspect1, aspect2
|
175
|
+
aspect1.unadvise
|
176
|
+
aspect2.unadvise
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should accept :reading => ... as a synonym for :attributes => ..., :attribute_options => [:readers]." do
|
125
181
|
@advice = Proc.new {}
|
126
|
-
@expected_methods = [:
|
127
|
-
|
128
|
-
|
129
|
-
aspect2 = Aspect.new :before, :objects => object, :method => @expected_methods, :advice => @advice
|
182
|
+
@expected_methods = [:public_test_method_args]
|
183
|
+
aspect1 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :reading => :public_test_method_args, :advice => @advice
|
184
|
+
aspect2 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :attributes => :public_test_method_args, :attribute_options => [:readers], :advice => @advice
|
130
185
|
aspects_should_be_equal 1, aspect1, aspect2
|
131
186
|
aspect1.unadvise
|
132
187
|
aspect2.unadvise
|
133
188
|
end
|
134
|
-
end
|
135
189
|
|
136
|
-
|
137
|
-
it "should be accepted as a synonym for :methods" do
|
190
|
+
it "should accept :writing => ... as a synonym for :attributes => ..., :attribute_options => [:writer]." do
|
138
191
|
@advice = Proc.new {}
|
139
|
-
@expected_methods = [:
|
140
|
-
aspect1 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :
|
141
|
-
aspect2 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :
|
192
|
+
@expected_methods = [:public_test_method_args=]
|
193
|
+
aspect1 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :writing => :public_test_method_args, :advice => @advice
|
194
|
+
aspect2 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :attributes => :public_test_method_args, :attribute_options => [:writers], :advice => @advice
|
142
195
|
aspects_should_be_equal 1, aspect1, aspect2
|
143
196
|
aspect1.unadvise
|
144
197
|
aspect2.unadvise
|
145
198
|
end
|
146
|
-
end
|
147
199
|
|
148
|
-
|
149
|
-
it "should be accepted as a synonym for :attributes" do
|
200
|
+
it "should accept :changing => ... as a synonym for :attributes => ..., :attribute_options => [:writer]." do
|
150
201
|
@advice = Proc.new {}
|
151
|
-
@expected_methods = [:public_test_method_args
|
152
|
-
aspect1 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :
|
153
|
-
aspect2 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :attributes =>
|
154
|
-
aspects_should_be_equal
|
202
|
+
@expected_methods = [:public_test_method_args=]
|
203
|
+
aspect1 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :changing => :public_test_method_args, :advice => @advice
|
204
|
+
aspect2 = Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :attributes => :public_test_method_args, :attribute_options => [:writers], :advice => @advice
|
205
|
+
aspects_should_be_equal 1, aspect1, aspect2
|
155
206
|
aspect1.unadvise
|
156
207
|
aspect2.unadvise
|
157
208
|
end
|
158
209
|
end
|
159
210
|
|
160
|
-
|
161
|
-
describe Aspect, ".new with a :type(s) parameter and a :method(s) parameter" do
|
211
|
+
describe Aspect, ".new (with a :type(s) parameter and a :method(s) parameter)" do
|
162
212
|
before :each do
|
163
213
|
@protection = 'public'
|
164
214
|
@are_class_methods = false
|
@@ -325,7 +375,7 @@ describe Aspect, ".new with a :type(s) parameter and a :method(s) parameter" do
|
|
325
375
|
end
|
326
376
|
|
327
377
|
|
328
|
-
describe Aspect, ".new with a :type(s) parameter and a :attribute(s) parameter" do
|
378
|
+
describe Aspect, ".new (with a :type(s) parameter and a :attribute(s) parameter)" do
|
329
379
|
before :each do
|
330
380
|
@protection = 'public'
|
331
381
|
@attribute_options = []
|
@@ -462,7 +512,7 @@ describe Aspect, ".new with a :type(s) parameter and a :attribute(s) parameter"
|
|
462
512
|
end
|
463
513
|
end
|
464
514
|
|
465
|
-
describe Aspect, ".new with a :object(s) parameter and a :method(s) parameter" do
|
515
|
+
describe Aspect, ".new (with a :object(s) parameter and a :method(s) parameter)" do
|
466
516
|
before :each do
|
467
517
|
@object1 = Aquarium::AspectInvocationTestClass.new
|
468
518
|
@object2 = Aquarium::AspectInvocationTestClass.new
|
@@ -554,7 +604,7 @@ describe Aspect, ".new with a :object(s) parameter and a :method(s) parameter" d
|
|
554
604
|
end
|
555
605
|
end
|
556
606
|
|
557
|
-
describe Aspect, ".new with a :object(s) parameter and a :attribute(s) parameter" do
|
607
|
+
describe Aspect, ".new (with a :object(s) parameter and a :attribute(s) parameter)" do
|
558
608
|
before :each do
|
559
609
|
@object1 = Aquarium::AspectInvocationTestClass.new
|
560
610
|
@object2 = Aquarium::AspectInvocationTestClass.new
|
@@ -654,7 +704,7 @@ describe Aspect, ".new with a :object(s) parameter and a :attribute(s) parameter
|
|
654
704
|
end
|
655
705
|
end
|
656
706
|
|
657
|
-
describe Aspect, ".new with a :pointcut parameter taking a hash with type specifications" do
|
707
|
+
describe Aspect, ".new (with a :pointcut parameter taking a hash with type specifications)" do
|
658
708
|
before :each do
|
659
709
|
@protection = 'public'
|
660
710
|
@are_class_methods = false
|
@@ -782,7 +832,7 @@ describe Aspect, ".new with a :pointcut parameter taking a hash with type specif
|
|
782
832
|
end
|
783
833
|
end
|
784
834
|
|
785
|
-
describe Aspect, ".new with a :pointcut parameter taking a hash with object specifications" do
|
835
|
+
describe Aspect, ".new (with a :pointcut parameter taking a hash with object specifications)" do
|
786
836
|
before :each do
|
787
837
|
@protection = 'public'
|
788
838
|
@expected_advice_count = 2
|
@@ -839,7 +889,7 @@ describe Aspect, ".new with a :pointcut parameter taking a hash with object spec
|
|
839
889
|
end
|
840
890
|
end
|
841
891
|
|
842
|
-
describe Aspect, ".new with a :pointcut parameter and a Pointcut object or an array of Pointcuts" do
|
892
|
+
describe Aspect, ".new (with a :pointcut parameter and a Pointcut object or an array of Pointcuts)" do
|
843
893
|
def do_pointcut_pointcut_spec
|
844
894
|
aspect = nil
|
845
895
|
advice_called = false
|
@@ -867,7 +917,7 @@ describe Aspect, ".new with a :pointcut parameter and a Pointcut object or an ar
|
|
867
917
|
end
|
868
918
|
end
|
869
919
|
|
870
|
-
describe Aspect, ".new with a :pointcut parameter and an array of Pointcuts" do
|
920
|
+
describe Aspect, ".new (with a :pointcut parameter and an array of Pointcuts)" do
|
871
921
|
it "should treat the array as if it is one Pointcut \"or'ed\" together." do
|
872
922
|
advice_called = 0
|
873
923
|
advice = Proc.new {|jp, obj, *args|
|
@@ -894,7 +944,7 @@ describe Aspect, ".new with a :pointcut parameter and an array of Pointcuts" do
|
|
894
944
|
end
|
895
945
|
end
|
896
946
|
|
897
|
-
describe Aspect, ".new with a :type(s) parameter and a :method(s) parameter or one of several equivalent :pointcut parameters" do
|
947
|
+
describe Aspect, ".new (with a :type(s) parameter and a :method(s) parameter or one of several equivalent :pointcut parameters)" do
|
898
948
|
before :each do
|
899
949
|
@advice = proc {|jp, obj, *args| "advice"}
|
900
950
|
@expected_methods = [:public_test_method]
|
@@ -973,7 +1023,7 @@ describe Aspect, ".new with a :type(s) parameter and a :method(s) parameter or o
|
|
973
1023
|
|
974
1024
|
end
|
975
1025
|
|
976
|
-
describe Aspect, ".new with a :type(s) parameter and an :attributes(s) parameter or one of several equivalent :pointcut parameters" do
|
1026
|
+
describe Aspect, ".new (with a :type(s) parameter and an :attributes(s) parameter or one of several equivalent :pointcut parameters)" do
|
977
1027
|
class ClassWithAttrib1
|
978
1028
|
def dummy; end
|
979
1029
|
attr_accessor :state
|
@@ -1030,7 +1080,7 @@ describe Aspect, ".new with a :type(s) parameter and an :attributes(s) parameter
|
|
1030
1080
|
end
|
1031
1081
|
end
|
1032
1082
|
|
1033
|
-
describe Aspect, ".new with a :object(s) parameter and a :method(s) parameter or one of several equivalent :pointcut parameters" do
|
1083
|
+
describe Aspect, ".new (with a :object(s) parameter and a :method(s) parameter or one of several equivalent :pointcut parameters)" do
|
1034
1084
|
before :each do
|
1035
1085
|
@advice = proc {|jp, obj, *args| "advice"}
|
1036
1086
|
@expected_methods = [:public_test_method]
|
@@ -1064,7 +1114,7 @@ describe Aspect, ".new with a :object(s) parameter and a :method(s) parameter or
|
|
1064
1114
|
end
|
1065
1115
|
end
|
1066
1116
|
|
1067
|
-
describe Aspect, ".new with a :object(s) parameter and an :attributes(s) parameter or one of several equivalent :pointcut parameters" do
|
1117
|
+
describe Aspect, ".new (with a :object(s) parameter and an :attributes(s) parameter or one of several equivalent :pointcut parameters)" do
|
1068
1118
|
class ClassWithAttrib2
|
1069
1119
|
def initialize *args
|
1070
1120
|
@state = args
|
@@ -1125,7 +1175,7 @@ describe Aspect, ".new with a :object(s) parameter and an :attributes(s) paramet
|
|
1125
1175
|
end
|
1126
1176
|
end
|
1127
1177
|
|
1128
|
-
describe Aspect, ".new block for advice" do
|
1178
|
+
describe Aspect, ".new (block for advice)" do
|
1129
1179
|
it "should accept a block as the advice to use." do
|
1130
1180
|
object = Aquarium::AspectInvocationTestClass.new
|
1131
1181
|
advice_called = false
|
@@ -1155,57 +1205,37 @@ describe Aspect, ".new block for advice" do
|
|
1155
1205
|
aspect.unadvise
|
1156
1206
|
end
|
1157
1207
|
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1163
|
-
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1173
|
-
it "should accept a :invoke => Proc parameter as a synonym for :advice." do
|
1174
|
-
object = Aquarium::AspectInvocationTestClass.new
|
1175
|
-
advice_called = false
|
1176
|
-
advice = Proc.new {|jp, obj, *args|
|
1177
|
-
advice_called = true
|
1178
|
-
jp.should_not be_nil
|
1179
|
-
args.size.should == 4
|
1180
|
-
args.should == [:a1, :a2, :a3, {:h1 => 'h1', :h2 => 'h2'}]
|
1181
|
-
}
|
1182
|
-
aspect = Aspect.new :before, :object => object, :methods => :public_test_method, :invoke => advice
|
1183
|
-
object.public_test_method :a1, :a2, :a3, :h1 => 'h1', :h2 => 'h2'
|
1184
|
-
advice_called.should be_true
|
1185
|
-
aspect.unadvise
|
1208
|
+
Aspect::CANONICAL_OPTIONS["advice"].each do |key|
|
1209
|
+
it "should accept :#{key} => proc as a synonym for :advice." do
|
1210
|
+
object = Aquarium::AspectInvocationTestClass.new
|
1211
|
+
advice_called = false
|
1212
|
+
advice = Proc.new {|jp, obj, *args|
|
1213
|
+
advice_called = true
|
1214
|
+
jp.should_not be_nil
|
1215
|
+
args.size.should == 4
|
1216
|
+
args.should == [:a1, :a2, :a3, {:h1 => 'h1', :h2 => 'h2'}]
|
1217
|
+
}
|
1218
|
+
aspect = Aspect.new :before, :object => object, :methods => :public_test_method, key.intern => advice
|
1219
|
+
object.public_test_method :a1, :a2, :a3, :h1 => 'h1', :h2 => 'h2'
|
1220
|
+
advice_called.should be_true
|
1221
|
+
aspect.unadvise
|
1222
|
+
end
|
1186
1223
|
end
|
1187
|
-
|
1188
|
-
it "should
|
1224
|
+
|
1225
|
+
it "should allow only one :advice object to be specified (including synonyms)." do
|
1189
1226
|
object = Aquarium::AspectInvocationTestClass.new
|
1190
1227
|
advice_called = false
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
args.size.should == 4
|
1195
|
-
args.should == [:a1, :a2, :a3, {:h1 => 'h1', :h2 => 'h2'}]
|
1196
|
-
}
|
1197
|
-
aspect = Aspect.new :before, :object => object, :methods => :public_test_method, :advise_with => advice
|
1198
|
-
object.public_test_method :a1, :a2, :a3, :h1 => 'h1', :h2 => 'h2'
|
1199
|
-
advice_called.should be_true
|
1200
|
-
aspect.unadvise
|
1228
|
+
advice1 = Proc.new {|jp, obj, *args| fail "advice1"}
|
1229
|
+
advice2 = Proc.new {|jp, obj, *args| fail "advice2"}
|
1230
|
+
lambda {Aspect.new :before, :object => object, :methods => :public_test_method, :advice => advice1, :invoke => advice2}.should raise_error(Aquarium::Utils::InvalidOptions)
|
1201
1231
|
end
|
1202
1232
|
|
1203
|
-
it "should ignore
|
1233
|
+
it "should allow ignore an :advice option if a block is given." do
|
1204
1234
|
object = Aquarium::AspectInvocationTestClass.new
|
1205
1235
|
advice_called = false
|
1206
1236
|
advice1 = Proc.new {|jp, obj, *args| fail "advice1"}
|
1207
1237
|
advice2 = Proc.new {|jp, obj, *args| fail "advice2"}
|
1208
|
-
aspect = Aspect.new :before, :object => object, :methods => :public_test_method, :advice => advice1
|
1238
|
+
aspect = Aspect.new :before, :object => object, :methods => :public_test_method, :advice => advice1 do |jp, obj, *args|
|
1209
1239
|
advice_called = true
|
1210
1240
|
end
|
1211
1241
|
object.public_test_method :a1, :a2, :a3, :h1 => 'h1', :h2 => 'h2'
|
@@ -1213,24 +1243,13 @@ describe Aspect, ".new block for advice" do
|
|
1213
1243
|
aspect.unadvise
|
1214
1244
|
end
|
1215
1245
|
|
1216
|
-
it "should ignore all but the last advice parameter, using any synonym, if there is no advice block." do
|
1217
|
-
object = Aquarium::AspectInvocationTestClass.new
|
1218
|
-
advice_called = false
|
1219
|
-
advice1 = Proc.new {|jp, obj, *args|
|
1220
|
-
advice_called = true
|
1221
|
-
jp.should_not be_nil
|
1222
|
-
args.size.should == 4
|
1223
|
-
args.should == [:a1, :a2, :a3, {:h1 => 'h1', :h2 => 'h2'}]
|
1224
|
-
}
|
1225
|
-
advice2 = Proc.new {|jp, obj, *args| raise "should not be called"}
|
1226
|
-
aspect = Aspect.new :before, :object => object, :methods => :public_test_method, :advice => advice2, :advice => advice1
|
1227
|
-
object.public_test_method :a1, :a2, :a3, :h1 => 'h1', :h2 => 'h2'
|
1228
|
-
advice_called.should be_true
|
1229
|
-
aspect.unadvise
|
1230
|
-
end
|
1231
1246
|
end
|
1232
1247
|
|
1233
|
-
describe Aspect, ".new advice block or proc parameter list" do
|
1248
|
+
describe Aspect, ".new (advice block or proc parameter list)" do
|
1249
|
+
it "should raise unless an advice block or :advice => advice parameter is specified." do
|
1250
|
+
lambda {Aspect.new(:after, :type => Aquarium::AspectInvocationTestClass, :methods => :public_test_method)}.should raise_error(Aquarium::Utils::InvalidOptions)
|
1251
|
+
end
|
1252
|
+
|
1234
1253
|
it "should raise if obsolete |jp, *args| list is used." do
|
1235
1254
|
lambda { Aspect.new :before, :type => Aquarium::AspectInvocationTestClass, :methods => :public_test_method do |jp, *args|; end }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1236
1255
|
end
|
@@ -1282,7 +1301,7 @@ class Exclude1c < Exclude1
|
|
1282
1301
|
def doit3; end
|
1283
1302
|
end
|
1284
1303
|
|
1285
|
-
describe Aspect, ".new with a :type(s) parameter and an :exclude_type(s), and :exclude_type(s)_and_ancestors, or an :exclude_type(s)_and_descendents parameter" do
|
1304
|
+
describe Aspect, ".new (with a :type(s) parameter and an :exclude_type(s), and :exclude_type(s)_and_ancestors, or an :exclude_type(s)_and_descendents parameter)" do
|
1286
1305
|
def do_exclude_types exclude_type_sym
|
1287
1306
|
included_types = [DontExclude1, DontExclude2]
|
1288
1307
|
excluded_types = [Exclude1, Exclude2]
|
@@ -1309,29 +1328,36 @@ describe Aspect, ".new with a :type(s) parameter and an :exclude_type(s), and :e
|
|
1309
1328
|
do_exclude_types :exclude_types
|
1310
1329
|
end
|
1311
1330
|
|
1312
|
-
|
1313
|
-
|
1331
|
+
Aspect::CANONICAL_OPTIONS["exclude_types"].each do |key|
|
1332
|
+
it "should accept :#{key} as a synonym for :exclude_types." do
|
1333
|
+
do_exclude_types key.intern
|
1334
|
+
end
|
1314
1335
|
end
|
1315
1336
|
|
1316
1337
|
it "should accept :type(s) => [T1, ...], :exclude_types_and_ancestors => [T2, ...] and exclude join points in the excluded types" do
|
1317
1338
|
do_exclude_types :exclude_types_and_ancestors
|
1318
1339
|
end
|
1319
1340
|
|
1320
|
-
|
1321
|
-
|
1341
|
+
Aspect::CANONICAL_OPTIONS["exclude_types_and_ancestors"].each do |key|
|
1342
|
+
it "should accept :#{key} as a synonym for :exclude_types_and_ancestors." do
|
1343
|
+
do_exclude_types key.intern
|
1344
|
+
end
|
1322
1345
|
end
|
1323
1346
|
|
1324
1347
|
it "should accept :type(s) => [T1, ...], :exclude_types_and_descendents => [T2, ...] and exclude join points in the excluded types" do
|
1325
1348
|
do_exclude_types :exclude_types_and_descendents
|
1326
1349
|
end
|
1327
1350
|
|
1328
|
-
|
1329
|
-
|
1351
|
+
Aspect::CANONICAL_OPTIONS["exclude_types_and_descendents"].each do |key|
|
1352
|
+
it "should accept :#{key} as a synonym for :exclude_types_and_descendents." do
|
1353
|
+
do_exclude_types key.intern
|
1354
|
+
end
|
1330
1355
|
end
|
1356
|
+
|
1331
1357
|
end
|
1332
1358
|
|
1333
1359
|
|
1334
|
-
describe Aspect, ".new with a :object(s) parameter and an :exclude_object(s) parameter" do
|
1360
|
+
describe Aspect, ".new (with a :object(s) parameter and an :exclude_object(s) parameter)" do
|
1335
1361
|
def do_exclude_objects exclude_object_sym
|
1336
1362
|
dontExclude1 = DontExclude1.new(1)
|
1337
1363
|
dontExclude2 = DontExclude1.new(2)
|
@@ -1362,13 +1388,15 @@ describe Aspect, ".new with a :object(s) parameter and an :exclude_object(s) par
|
|
1362
1388
|
do_exclude_objects :exclude_objects
|
1363
1389
|
end
|
1364
1390
|
|
1365
|
-
|
1366
|
-
|
1391
|
+
Aspect::CANONICAL_OPTIONS["exclude_objects"].each do |key|
|
1392
|
+
it "should accept :#{key} as a synonym for :exclude_objects." do
|
1393
|
+
do_exclude_objects key.intern
|
1394
|
+
end
|
1367
1395
|
end
|
1368
1396
|
end
|
1369
1397
|
|
1370
1398
|
|
1371
|
-
describe Aspect, ".new with a :pointcut(s), :type(s), :type(s)_with_ancestors, :type(s)_with_descendents, :object(s), and :method(s) parameter and an :exclude_join_point(s) parameter" do
|
1399
|
+
describe Aspect, ".new (with a :pointcut(s), :type(s), :type(s)_with_ancestors, :type(s)_with_descendents, :object(s), and :method(s) parameter and an :exclude_join_point(s) parameter)" do
|
1372
1400
|
def do_exclude_join_points exclude_join_points_sym
|
1373
1401
|
dontExclude1 = DontExclude1.new(1)
|
1374
1402
|
dontExclude2 = DontExclude1.new(2)
|
@@ -1399,10 +1427,12 @@ describe Aspect, ".new with a :pointcut(s), :type(s), :type(s)_with_ancestors, :
|
|
1399
1427
|
aspect.unadvise
|
1400
1428
|
end
|
1401
1429
|
|
1402
|
-
|
1403
|
-
|
1430
|
+
Aspect::CANONICAL_OPTIONS["exclude_join_points"].each do |key|
|
1431
|
+
it "should accept :#{key} as a synonym for :exclude_join_points." do
|
1432
|
+
do_exclude_join_points key.intern
|
1433
|
+
end
|
1404
1434
|
end
|
1405
|
-
|
1435
|
+
|
1406
1436
|
it "should accept :object(s) => [o1, ...], :exclude_join_point(s) => [jps], where [jps] are the list of join points for the objects and methods to exclude" do
|
1407
1437
|
do_exclude_join_points :exclude_join_points
|
1408
1438
|
end
|
@@ -1497,7 +1527,7 @@ describe Aspect, ".new with a :pointcut(s), :type(s), :type(s)_with_ancestors, :
|
|
1497
1527
|
end
|
1498
1528
|
end
|
1499
1529
|
|
1500
|
-
describe Aspect, ".new with a :pointcut(s), :type(s), :object(s), and :method(s) parameter and an :exclude_pointcut(s) parameter" do
|
1530
|
+
describe Aspect, ".new (with a :pointcut(s), :type(s), :object(s), and :method(s) parameter and an :exclude_pointcut(s) parameter)" do
|
1501
1531
|
def do_exclude_pointcuts exclude_pointcuts_sym
|
1502
1532
|
dontExclude1 = DontExclude1.new(1)
|
1503
1533
|
dontExclude2 = DontExclude1.new(2)
|
@@ -1528,10 +1558,12 @@ describe Aspect, ".new with a :pointcut(s), :type(s), :object(s), and :method(s)
|
|
1528
1558
|
aspect.unadvise
|
1529
1559
|
end
|
1530
1560
|
|
1531
|
-
|
1532
|
-
|
1561
|
+
Aspect::CANONICAL_OPTIONS["exclude_pointcuts"].each do |key|
|
1562
|
+
it "should accept :#{key} as a synonym for :exclude_pointcuts." do
|
1563
|
+
do_exclude_pointcuts key.intern
|
1564
|
+
end
|
1533
1565
|
end
|
1534
|
-
|
1566
|
+
|
1535
1567
|
it "should accept :object(s) => [o1, ...], :exclude_pointcut(s) => [pcs], where [pcs] are the list of pointcuts for the objects and methods to exclude" do
|
1536
1568
|
do_exclude_pointcuts :exclude_pointcuts
|
1537
1569
|
end
|
@@ -1590,7 +1622,7 @@ describe Aspect, ".new with a :pointcut(s), :type(s), :object(s), and :method(s)
|
|
1590
1622
|
end
|
1591
1623
|
end
|
1592
1624
|
|
1593
|
-
describe Aspect, ".new with type-based :pointcut(s) and :exclude_type(s) parameter" do
|
1625
|
+
describe Aspect, ".new (with type-based :pointcut(s) and :exclude_type(s) parameter)" do
|
1594
1626
|
it "should accept :pointcut(s) => [P1, ...], :exclude_type(s) => [types], where join points with [types] are excluded" do
|
1595
1627
|
included_types = [DontExclude1, DontExclude2]
|
1596
1628
|
excluded_types = [Exclude1, Exclude2]
|
@@ -1617,7 +1649,7 @@ describe Aspect, ".new with type-based :pointcut(s) and :exclude_type(s) paramet
|
|
1617
1649
|
end
|
1618
1650
|
end
|
1619
1651
|
|
1620
|
-
describe Aspect, ".new with type-based :pointcut(s) and :exclude_type(s)_and_ancestors parameter" do
|
1652
|
+
describe Aspect, ".new (with type-based :pointcut(s) and :exclude_type(s)_and_ancestors parameter)" do
|
1621
1653
|
it "should accept :pointcut(s) => [P1, ...], :exclude_type(s)_and_ancestors => [types], where join points with [types] are excluded" do
|
1622
1654
|
excluded_types = [ClassWithPublicInstanceMethod, ModuleWithPublicInstanceMethod]
|
1623
1655
|
types = excluded_types + [ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod]
|
@@ -1633,7 +1665,7 @@ describe Aspect, ".new with type-based :pointcut(s) and :exclude_type(s)_and_anc
|
|
1633
1665
|
end
|
1634
1666
|
end
|
1635
1667
|
|
1636
|
-
describe Aspect, ".new with type-based :pointcut(s) and :exclude_type(s)_and_descendents parameter" do
|
1668
|
+
describe Aspect, ".new (with type-based :pointcut(s) and :exclude_type(s)_and_descendents parameter)" do
|
1637
1669
|
it "should accept :pointcut(s) => [P1, ...], :exclude_type(s)_and_descendents => [types], where join points with [types] are excluded" do
|
1638
1670
|
excluded_types = [ClassWithPublicInstanceMethod, ModuleWithPublicInstanceMethod]
|
1639
1671
|
types = excluded_types + [ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod]
|
@@ -1646,7 +1678,7 @@ describe Aspect, ".new with type-based :pointcut(s) and :exclude_type(s)_and_des
|
|
1646
1678
|
end
|
1647
1679
|
|
1648
1680
|
|
1649
|
-
describe Aspect, ".new with object-based :pointcut(s) and :exclude_object(s) or :exclude_method(s) parameter" do
|
1681
|
+
describe Aspect, ".new (with object-based :pointcut(s) and :exclude_object(s) or :exclude_method(s) parameter)" do
|
1650
1682
|
|
1651
1683
|
it "should accept :pointcut(s) => [P1, ...], :exclude_object(s) => [objects], where join points with [objects] are excluded" do
|
1652
1684
|
dontExclude1 = DontExclude1.new(1)
|
@@ -1677,7 +1709,7 @@ describe Aspect, ".new with object-based :pointcut(s) and :exclude_object(s) or
|
|
1677
1709
|
end
|
1678
1710
|
end
|
1679
1711
|
|
1680
|
-
describe Aspect, ".new with :method(s) and :exclude_method(s) parameter" do
|
1712
|
+
describe Aspect, ".new (with :method(s) and :exclude_method(s) parameter)" do
|
1681
1713
|
before :each do
|
1682
1714
|
@dontExclude1 = DontExclude1.new(1)
|
1683
1715
|
@dontExclude2 = DontExclude1.new(2)
|
@@ -1695,9 +1727,9 @@ describe Aspect, ".new with :method(s) and :exclude_method(s) parameter" do
|
|
1695
1727
|
@pointcut4 = Pointcut.new :types => @excluded_types, :method => /doit/
|
1696
1728
|
end
|
1697
1729
|
|
1698
|
-
def do_method_exclusion parameter_hash, types_were_specified
|
1730
|
+
def do_method_exclusion parameter_hash, types_were_specified, option_key = :exclude_methods
|
1699
1731
|
parameter_hash[:before] = ''
|
1700
|
-
parameter_hash[
|
1732
|
+
parameter_hash[option_key] = :doit3
|
1701
1733
|
aspect = nil
|
1702
1734
|
advice_called = false
|
1703
1735
|
aspect = Aspect.new parameter_hash do |jp, obj, *args|
|
@@ -1729,11 +1761,13 @@ describe Aspect, ".new with :method(s) and :exclude_method(s) parameter" do
|
|
1729
1761
|
aspect.unadvise
|
1730
1762
|
end
|
1731
1763
|
|
1732
|
-
|
1733
|
-
|
1734
|
-
|
1764
|
+
Aspect::CANONICAL_OPTIONS["exclude_methods"].each do |key|
|
1765
|
+
it "should accept :#{key} as a synonym for :exclude_methods." do
|
1766
|
+
parameter_hash = { :pointcuts => [@pointcut1, @pointcut2, @pointcut3, @pointcut4] }
|
1767
|
+
do_method_exclusion parameter_hash, true, key.intern
|
1768
|
+
end
|
1735
1769
|
end
|
1736
|
-
|
1770
|
+
|
1737
1771
|
it "should accept :pointcut(s) => [P1, ...], :exclude_method(s) => [methods], where join points with [methods] are excluded" do
|
1738
1772
|
parameter_hash = { :pointcuts => [@pointcut1, @pointcut2, @pointcut3, @pointcut4] }
|
1739
1773
|
do_method_exclusion parameter_hash, true
|