aquarium 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,12 +1,14 @@
|
|
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/utils'
|
4
4
|
require 'aquarium/extensions'
|
5
5
|
require 'aquarium/aspects/pointcut'
|
6
6
|
require 'aquarium/aspects/pointcut_composition'
|
7
7
|
|
8
|
+
include Aquarium::Utils::HashUtils
|
9
|
+
include Aquarium::Aspects
|
10
|
+
|
8
11
|
describe "Union of Pointcuts", :shared => true do
|
9
|
-
include Aquarium::Utils::HashUtils
|
10
12
|
|
11
13
|
before(:each) do
|
12
14
|
classes = [
|
@@ -22,26 +24,26 @@ describe "Union of Pointcuts", :shared => true do
|
|
22
24
|
@not_matched_jps = Set.new(jps_array)
|
23
25
|
end
|
24
26
|
|
25
|
-
it "should return a
|
26
|
-
pc1 =
|
27
|
-
pc2 =
|
27
|
+
it "should return a Pointcut equal to the second, appended, non-empty Pointcut if self is empty (has no join points)." do
|
28
|
+
pc1 = Pointcut.new
|
29
|
+
pc2 = Pointcut.new :types => /Class.*Method/
|
28
30
|
pc1.or(pc2).should eql(pc2)
|
29
|
-
pc3 =
|
31
|
+
pc3 = Pointcut.new :object => ClassWithPublicInstanceMethod.new
|
30
32
|
pc1.or(pc3).should eql(pc3)
|
31
33
|
end
|
32
34
|
|
33
|
-
it "should return a
|
34
|
-
pc1 =
|
35
|
-
pc2 =
|
35
|
+
it "should return a Pointcut equal to self if the second pointcut is empty." do
|
36
|
+
pc1 = Pointcut.new :types => /Class.*Method/
|
37
|
+
pc2 = Pointcut.new
|
36
38
|
pc1.or(pc2).should eql(pc1)
|
37
|
-
pc3 =
|
39
|
+
pc3 = Pointcut.new :object => ClassWithPublicInstanceMethod.new
|
38
40
|
pc3.or(pc2).should eql(pc3)
|
39
41
|
end
|
40
42
|
|
41
|
-
it "should return a new
|
42
|
-
pc1 =
|
43
|
+
it "should return a new Pointcut whose join points are the union of the left- and right-hand side Pointcuts for type-based Pointcuts." do
|
44
|
+
pc1 = Pointcut.new :types => ClassWithAttribs, :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
|
43
45
|
# "[^F]" excludes the ClassWithFunkyMethodNames ...
|
44
|
-
pc2 =
|
46
|
+
pc2 = Pointcut.new :types => [/ClassWith[^F]+Method/, /ClassDerived/, /ClassIncludingMod/], :method_options => :exclude_ancestor_methods
|
45
47
|
pc = pc1.or pc2
|
46
48
|
jp1 = Aquarium::Aspects::JoinPoint.new :type => ClassWithAttribs, :method => :attrRW_ClassWithAttribs=
|
47
49
|
jp2 = Aquarium::Aspects::JoinPoint.new :type => ClassWithAttribs, :method => :attrW_ClassWithAttribs=
|
@@ -53,11 +55,11 @@ describe "Union of Pointcuts", :shared => true do
|
|
53
55
|
pc.join_points_not_matched.should == @not_matched_jps
|
54
56
|
end
|
55
57
|
|
56
|
-
it "should return a new
|
58
|
+
it "should return a new Pointcut whose join points are the union of the left- and right-hand side Pointcuts for object-based Pointcuts." do
|
57
59
|
cwa = ClassWithAttribs.new
|
58
60
|
pub = ClassWithPublicInstanceMethod.new
|
59
|
-
pc1 =
|
60
|
-
pc2 =
|
61
|
+
pc1 = Pointcut.new :objects => [cwa], :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
|
62
|
+
pc2 = Pointcut.new :object => pub, :method_options => :exclude_ancestor_methods
|
61
63
|
pc = pc1.or pc2
|
62
64
|
jp1 = Aquarium::Aspects::JoinPoint.new :object => cwa, :method => :attrRW_ClassWithAttribs=
|
63
65
|
jp2 = Aquarium::Aspects::JoinPoint.new :object => cwa, :method => :attrW_ClassWithAttribs=
|
@@ -66,56 +68,56 @@ describe "Union of Pointcuts", :shared => true do
|
|
66
68
|
pc.join_points_not_matched.sort.should == []
|
67
69
|
end
|
68
70
|
|
69
|
-
it "should be unitary for type-based
|
70
|
-
pc1 =
|
71
|
-
pc2 =
|
71
|
+
it "should be unitary for type-based Pointcuts." do
|
72
|
+
pc1 = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:writers]
|
73
|
+
pc2 = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:writers]
|
72
74
|
pc = pc1.or pc2
|
73
75
|
pc.should eql(pc1)
|
74
76
|
pc.should eql(pc2)
|
75
77
|
end
|
76
78
|
|
77
|
-
it "should be unitary for object-based
|
79
|
+
it "should be unitary for object-based Pointcuts." do
|
78
80
|
cwa = ClassWithAttribs.new
|
79
|
-
pc1 =
|
80
|
-
pc2 =
|
81
|
+
pc1 = Pointcut.new :object => cwa, :attributes => [/^attr/], :attribute_options => [:writers]
|
82
|
+
pc2 = Pointcut.new :object => cwa, :attributes => [/^attr/], :attribute_options => [:writers]
|
81
83
|
pc = pc1.or pc2
|
82
84
|
pc.should eql(pc1)
|
83
85
|
pc.should eql(pc2)
|
84
86
|
end
|
85
87
|
|
86
|
-
it "should be commutative for type-based
|
87
|
-
pc1 =
|
88
|
-
pc2 =
|
88
|
+
it "should be commutative for type-based Pointcuts." do
|
89
|
+
pc1 = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:writers]
|
90
|
+
pc2 = Pointcut.new :types => /Class.*Method/
|
89
91
|
pc12 = pc1.or pc2
|
90
92
|
pc21 = pc2.or pc1
|
91
93
|
pc12.should eql(pc21)
|
92
94
|
end
|
93
95
|
|
94
|
-
it "should be commutative for object-based
|
96
|
+
it "should be commutative for object-based Pointcuts." do
|
95
97
|
cwa = ClassWithAttribs.new
|
96
98
|
pub = ClassWithPublicInstanceMethod.new
|
97
|
-
pc1 =
|
98
|
-
pc2 =
|
99
|
+
pc1 = Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:writers]
|
100
|
+
pc2 = Pointcut.new :objects => pub, :attributes => [/^attr/], :attribute_options => [:writers]
|
99
101
|
pc12 = pc1.or pc2
|
100
102
|
pc21 = pc2.or pc1
|
101
103
|
pc12.should eql(pc21)
|
102
104
|
end
|
103
105
|
|
104
|
-
it "should be associativity for type-based
|
105
|
-
pc1 =
|
106
|
-
pc2 =
|
107
|
-
pc3 =
|
106
|
+
it "should be associativity for type-based Pointcuts." do
|
107
|
+
pc1 = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:writers]
|
108
|
+
pc2 = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:readers]
|
109
|
+
pc3 = Pointcut.new :types => /Class.*Method/
|
108
110
|
pc123a = (pc1.or(pc2)).or(pc3)
|
109
111
|
pc123b = pc1.or(pc2.or(pc3))
|
110
112
|
pc123a.should eql(pc123b)
|
111
113
|
end
|
112
114
|
|
113
|
-
it "should be associativity for object-based
|
115
|
+
it "should be associativity for object-based Pointcuts." do
|
114
116
|
cwa = ClassWithAttribs.new
|
115
117
|
pub = ClassWithPublicInstanceMethod.new
|
116
|
-
pc1 =
|
117
|
-
pc2 =
|
118
|
-
pc3 =
|
118
|
+
pc1 = Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:writers]
|
119
|
+
pc2 = Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:readers]
|
120
|
+
pc3 = Pointcut.new :objects => pub
|
119
121
|
pc123a = (pc1.or(pc2)).or(pc3)
|
120
122
|
pc123b = pc1.or(pc2.or(pc3))
|
121
123
|
pc123a.should eql(pc123b)
|
@@ -123,30 +125,29 @@ describe "Union of Pointcuts", :shared => true do
|
|
123
125
|
|
124
126
|
end
|
125
127
|
|
126
|
-
describe
|
128
|
+
describe Pointcut, "#or" do
|
127
129
|
it_should_behave_like "Union of Pointcuts"
|
128
130
|
end
|
129
131
|
|
130
|
-
describe
|
131
|
-
include Aquarium::Utils::HashUtils
|
132
|
+
describe Pointcut, "#|" do
|
132
133
|
|
133
134
|
it_should_behave_like "Union of Pointcuts"
|
134
135
|
|
135
|
-
it "should be associativity for type-based
|
136
|
-
pc1 =
|
137
|
-
pc2 =
|
138
|
-
pc3 =
|
136
|
+
it "should be associativity for type-based Pointcuts." do
|
137
|
+
pc1 = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:writers]
|
138
|
+
pc2 = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:readers]
|
139
|
+
pc3 = Pointcut.new :types => /Class.*Method/
|
139
140
|
pc123a = (pc1 | pc2) | pc3
|
140
141
|
pc123b = pc1 | (pc2 | pc3)
|
141
142
|
pc123a.should eql(pc123b)
|
142
143
|
end
|
143
144
|
|
144
|
-
it "should be associativity for object-based
|
145
|
+
it "should be associativity for object-based Pointcuts." do
|
145
146
|
cwa = ClassWithAttribs.new
|
146
147
|
pub = ClassWithPublicInstanceMethod.new
|
147
|
-
pc1 =
|
148
|
-
pc2 =
|
149
|
-
pc3 =
|
148
|
+
pc1 = Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:writers]
|
149
|
+
pc2 = Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:readers]
|
150
|
+
pc3 = Pointcut.new :objects => pub
|
150
151
|
pc123a = (pc1 | pc2) | pc3
|
151
152
|
pc123b = pc1 | (pc2 | pc3)
|
152
153
|
pc123a.should eql(pc123b)
|
@@ -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/utils/invalid_options'
|
4
4
|
require 'aquarium/extensions/hash'
|
@@ -6,28 +6,30 @@ require 'aquarium/aspects/join_point'
|
|
6
6
|
require 'aquarium/aspects/pointcut'
|
7
7
|
require 'aquarium/utils'
|
8
8
|
|
9
|
+
include Aquarium::Aspects
|
10
|
+
|
9
11
|
def before_exclude_spec
|
10
|
-
@jp11 =
|
11
|
-
@jp12 =
|
12
|
-
@jp13 =
|
13
|
-
@jp21 =
|
14
|
-
@jp22 =
|
15
|
-
@jp23 =
|
16
|
-
@jp31 =
|
17
|
-
@jp32 =
|
18
|
-
@jp33 =
|
12
|
+
@jp11 = JoinPoint.new :type => ExcludeTestOne, :method_name => :method11
|
13
|
+
@jp12 = JoinPoint.new :type => ExcludeTestOne, :method_name => :method12
|
14
|
+
@jp13 = JoinPoint.new :type => ExcludeTestOne, :method_name => :method13
|
15
|
+
@jp21 = JoinPoint.new :type => ExcludeTestTwo, :method_name => :method21
|
16
|
+
@jp22 = JoinPoint.new :type => ExcludeTestTwo, :method_name => :method22
|
17
|
+
@jp23 = JoinPoint.new :type => ExcludeTestTwo, :method_name => :method23
|
18
|
+
@jp31 = JoinPoint.new :type => ExcludeTestThree, :method_name => :method31
|
19
|
+
@jp32 = JoinPoint.new :type => ExcludeTestThree, :method_name => :method32
|
20
|
+
@jp33 = JoinPoint.new :type => ExcludeTestThree, :method_name => :method33
|
19
21
|
@et1 = ExcludeTestOne.new
|
20
22
|
@et2 = ExcludeTestTwo.new
|
21
23
|
@et3 = ExcludeTestThree.new
|
22
|
-
@ojp11 =
|
23
|
-
@ojp12 =
|
24
|
-
@ojp13 =
|
25
|
-
@ojp21 =
|
26
|
-
@ojp22 =
|
27
|
-
@ojp23 =
|
28
|
-
@ojp31 =
|
29
|
-
@ojp32 =
|
30
|
-
@ojp33 =
|
24
|
+
@ojp11 = JoinPoint.new :object => @et1, :method_name => :method11
|
25
|
+
@ojp12 = JoinPoint.new :object => @et1, :method_name => :method12
|
26
|
+
@ojp13 = JoinPoint.new :object => @et1, :method_name => :method13
|
27
|
+
@ojp21 = JoinPoint.new :object => @et2, :method_name => :method21
|
28
|
+
@ojp22 = JoinPoint.new :object => @et2, :method_name => :method22
|
29
|
+
@ojp23 = JoinPoint.new :object => @et2, :method_name => :method23
|
30
|
+
@ojp31 = JoinPoint.new :object => @et3, :method_name => :method31
|
31
|
+
@ojp32 = JoinPoint.new :object => @et3, :method_name => :method32
|
32
|
+
@ojp33 = JoinPoint.new :object => @et3, :method_name => :method33
|
31
33
|
@all_type_jps = [@jp11, @jp12, @jp13, @jp21, @jp22, @jp23, @jp31, @jp32, @jp33]
|
32
34
|
@all_object_jps = [@ojp11, @ojp12, @ojp13, @ojp21, @ojp22, @ojp23, @ojp31, @ojp32, @ojp33]
|
33
35
|
@all_jps = @all_type_jps + @all_object_jps
|
@@ -37,16 +39,16 @@ def before_pointcut_class_spec
|
|
37
39
|
@example_classes_without_public_instance_method =
|
38
40
|
[ClassWithProtectedInstanceMethod, ClassWithPrivateInstanceMethod, ClassWithPublicClassMethod, ClassWithPrivateClassMethod]
|
39
41
|
@example_classes = ([ClassWithPublicInstanceMethod] + @example_classes_without_public_instance_method)
|
40
|
-
@pub_jp =
|
41
|
-
@pro_jp =
|
42
|
-
@pri_jp =
|
43
|
-
@cpub_jp =
|
44
|
-
@cpri_jp =
|
45
|
-
@apro_jp =
|
46
|
-
@apri_jp =
|
47
|
-
@acpub_jp =
|
48
|
-
@acpri_jp =
|
49
|
-
@cdcimpub_jp =
|
42
|
+
@pub_jp = JoinPoint.new :type => ClassWithPublicInstanceMethod, :method_name => :public_instance_test_method
|
43
|
+
@pro_jp = JoinPoint.new :type => ClassWithProtectedInstanceMethod, :method_name => :protected_instance_test_method
|
44
|
+
@pri_jp = JoinPoint.new :type => ClassWithPrivateInstanceMethod, :method_name => :private_instance_test_method
|
45
|
+
@cpub_jp = JoinPoint.new :type => ClassWithPublicClassMethod, :method_name => :public_class_test_method, :class_method => true
|
46
|
+
@cpri_jp = JoinPoint.new :type => ClassWithPrivateClassMethod, :method_name => :private_class_test_method, :class_method => true
|
47
|
+
@apro_jp = JoinPoint.new :type => ClassWithProtectedInstanceMethod, :method_name => :all
|
48
|
+
@apri_jp = JoinPoint.new :type => ClassWithPrivateInstanceMethod, :method_name => :all
|
49
|
+
@acpub_jp = JoinPoint.new :type => ClassWithPublicClassMethod, :method_name => :all
|
50
|
+
@acpri_jp = JoinPoint.new :type => ClassWithPrivateClassMethod, :method_name => :all
|
51
|
+
@cdcimpub_jp = JoinPoint.new :type => ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod, :method_name => :public_instance_class_derived_from_class_including_module_test_method
|
50
52
|
@expected_classes_matched_jps = Set.new [@pub_jp]
|
51
53
|
@expected_classes_not_matched_jps = Set.new [@apro_jp, @apri_jp, @acpub_jp, @acpri_jp]
|
52
54
|
end
|
@@ -67,26 +69,26 @@ def before_pointcut_module_spec
|
|
67
69
|
ModuleWithPublicClassMethod,
|
68
70
|
ModuleWithPrivateClassMethod]
|
69
71
|
@example_modules = (@example_modules_with_public_instance_method + @example_modules_without_public_instance_method)
|
70
|
-
@mimpub_jp =
|
71
|
-
@mpub_jp =
|
72
|
-
@mpro_jp =
|
73
|
-
@mpri_jp =
|
74
|
-
@cmpub_jp =
|
75
|
-
@cmpri_jp =
|
76
|
-
@ampro_jp =
|
77
|
-
@ampri_jp =
|
78
|
-
@acmpub_jp =
|
79
|
-
@acmpri_jp =
|
80
|
-
@cdcimpub_jp =
|
81
|
-
@cimpub_jp =
|
82
|
-
@cimpro_jp =
|
83
|
-
@cimpri_jp =
|
84
|
-
@ccimpub_jp =
|
85
|
-
@ccimpri_jp =
|
86
|
-
@acimpro_jp =
|
87
|
-
@acimpri_jp =
|
88
|
-
@accimpub_jp =
|
89
|
-
@accimpri_jp =
|
72
|
+
@mimpub_jp = JoinPoint.new :type => ModuleIncludingModuleWithPublicInstanceMethod, :method_name => :public_instance_module_including_module_test_method
|
73
|
+
@mpub_jp = JoinPoint.new :type => ModuleWithPublicInstanceMethod, :method_name => :public_instance_module_test_method
|
74
|
+
@mpro_jp = JoinPoint.new :type => ModuleWithProtectedInstanceMethod, :method_name => :protected_instance_module_test_method
|
75
|
+
@mpri_jp = JoinPoint.new :type => ModuleWithPrivateInstanceMethod, :method_name => :private_instance_module_test_method
|
76
|
+
@cmpub_jp = JoinPoint.new :type => ModuleWithPublicClassMethod, :method_name => :public_class_module_test_method, :class_method => true
|
77
|
+
@cmpri_jp = JoinPoint.new :type => ModuleWithPrivateClassMethod, :method_name => :private_class_module_test_method, :class_method => true
|
78
|
+
@ampro_jp = JoinPoint.new :type => ModuleWithProtectedInstanceMethod, :method_name => :all
|
79
|
+
@ampri_jp = JoinPoint.new :type => ModuleWithPrivateInstanceMethod, :method_name => :all
|
80
|
+
@acmpub_jp = JoinPoint.new :type => ModuleWithPublicClassMethod, :method_name => :all
|
81
|
+
@acmpri_jp = JoinPoint.new :type => ModuleWithPrivateClassMethod, :method_name => :all
|
82
|
+
@cdcimpub_jp = JoinPoint.new :type => ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod, :method_name => :public_instance_class_derived_from_class_including_module_test_method
|
83
|
+
@cimpub_jp = JoinPoint.new :type => ClassIncludingModuleWithPublicInstanceMethod, :method_name => :public_instance_class_including_module_test_method
|
84
|
+
@cimpro_jp = JoinPoint.new :type => ClassIncludingModuleWithProtectedInstanceMethod, :method_name => :protected_instance_class_including_module_test_method
|
85
|
+
@cimpri_jp = JoinPoint.new :type => ClassIncludingModuleWithPrivateInstanceMethod, :method_name => :private_instance_class_including_module_test_method
|
86
|
+
@ccimpub_jp = JoinPoint.new :type => ClassIncludingModuleWithPublicClassMethod, :method_name => :public_class_class_including_module_test_method, :class_method => true
|
87
|
+
@ccimpri_jp = JoinPoint.new :type => ClassIncludingModuleWithPrivateClassMethod, :method_name => :private_class_class_including_module_test_method, :class_method => true
|
88
|
+
@acimpro_jp = JoinPoint.new :type => ClassIncludingModuleWithProtectedInstanceMethod, :method_name => :all
|
89
|
+
@acimpri_jp = JoinPoint.new :type => ClassIncludingModuleWithPrivateInstanceMethod, :method_name => :all
|
90
|
+
@accimpub_jp = JoinPoint.new :type => ClassIncludingModuleWithPublicClassMethod, :method_name => :all
|
91
|
+
@accimpri_jp = JoinPoint.new :type => ClassIncludingModuleWithPrivateClassMethod, :method_name => :all
|
90
92
|
@expected_modules_matched_jps = Set.new [@mimpub_jp, @mpub_jp, @cdcimpub_jp, @cimpub_jp]
|
91
93
|
@expected_modules_not_matched_jps = Set.new [@ampro_jp, @ampri_jp, @acmpub_jp, @acmpri_jp, @acimpro_jp, @acimpri_jp, @accimpub_jp, @accimpri_jp]
|
92
94
|
end
|
@@ -97,128 +99,125 @@ def ignored_join_point jp
|
|
97
99
|
end
|
98
100
|
|
99
101
|
|
100
|
-
describe
|
102
|
+
describe Pointcut, ".new (invalid arguments)" do
|
101
103
|
it "should raise if an unknown argument is specified" do
|
102
|
-
lambda {
|
104
|
+
lambda { Pointcut.new :foo => :bar }.should raise_error(Aquarium::Utils::InvalidOptions)
|
103
105
|
end
|
104
106
|
end
|
105
107
|
|
106
|
-
describe
|
108
|
+
describe Pointcut, ".new (empty)" do
|
107
109
|
it "should match no join points by default." do
|
108
|
-
pc =
|
110
|
+
pc = Pointcut.new
|
109
111
|
pc.should be_empty
|
110
112
|
end
|
111
113
|
|
112
114
|
it "should match no join points if nil is the only argument specified." do
|
113
|
-
pc =
|
115
|
+
pc = Pointcut.new nil
|
114
116
|
pc.should be_empty
|
115
117
|
end
|
116
118
|
|
117
119
|
it "should match no join points if types = [] specified." do
|
118
|
-
pc =
|
120
|
+
pc = Pointcut.new :types => []
|
119
121
|
pc.should be_empty
|
120
122
|
end
|
121
123
|
|
122
124
|
it "should match no join points if types = nil specified." do
|
123
|
-
pc =
|
125
|
+
pc = Pointcut.new :types => nil
|
124
126
|
pc.should be_empty
|
125
127
|
end
|
126
128
|
|
127
129
|
it "should match no join points if objects = [] specified." do
|
128
|
-
pc =
|
130
|
+
pc = Pointcut.new :objects => []
|
129
131
|
pc.should be_empty
|
130
132
|
end
|
131
133
|
|
132
134
|
it "should match no join points if objects = nil specified." do
|
133
|
-
pc =
|
135
|
+
pc = Pointcut.new :objects => nil
|
134
136
|
pc.should be_empty
|
135
137
|
end
|
136
138
|
|
137
139
|
it "should match no join points if join_points = nil specified." do
|
138
|
-
pc =
|
140
|
+
pc = Pointcut.new :join_points => nil
|
139
141
|
pc.should be_empty
|
140
142
|
end
|
141
143
|
|
142
144
|
it "should match no join points if join_points = [] specified." do
|
143
|
-
pc =
|
145
|
+
pc = Pointcut.new :join_points => []
|
144
146
|
pc.should be_empty
|
145
147
|
end
|
146
148
|
end
|
147
149
|
|
148
|
-
describe
|
149
|
-
it "should be true if there are no matched and no unmatched join points." do
|
150
|
-
pc = Aquarium::Aspects::Pointcut.new
|
151
|
-
pc.join_points_matched.size.should == 0
|
152
|
-
pc.join_points_not_matched.size.should == 0
|
153
|
-
pc.should be_empty
|
154
|
-
end
|
155
|
-
|
156
|
-
it "should be false if there are matched join points." do
|
157
|
-
pc = Aquarium::Aspects::Pointcut.new :types => [ClassWithAttribs], :methods => [/^attr/]
|
158
|
-
pc.join_points_matched.size.should > 0
|
159
|
-
pc.join_points_not_matched.size.should == 0
|
160
|
-
pc.should_not be_empty
|
161
|
-
end
|
162
|
-
|
163
|
-
it "should be false if there are unmatched join points." do
|
164
|
-
pc = Aquarium::Aspects::Pointcut.new :types => [String], :methods => [/^attr/]
|
165
|
-
pc.join_points_matched.size.should == 0
|
166
|
-
pc.join_points_not_matched.size.should > 0
|
167
|
-
pc.should_not be_empty
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
describe Aquarium::Aspects::Pointcut, " (classes specified using regular expressions)" do
|
150
|
+
describe Pointcut, ".new (classes specified using regular expressions)" do
|
172
151
|
before(:each) do
|
173
152
|
before_pointcut_class_spec
|
174
153
|
end
|
175
154
|
|
176
155
|
it "should match multiple classes using regular expressions that cover the full class names." do
|
177
|
-
pc =
|
156
|
+
pc = Pointcut.new :types => /\AClass(?!IncludingModule).*Method\Z/, :method_options => :exclude_ancestor_methods
|
178
157
|
pc.join_points_matched.should == (@expected_classes_matched_jps + [@cdcimpub_jp])
|
179
158
|
pc.join_points_not_matched.should == @expected_classes_not_matched_jps
|
180
159
|
end
|
181
160
|
|
182
161
|
it "should match clases using regular expressions that only cover partial class names." do
|
183
|
-
pc =
|
162
|
+
pc = Pointcut.new :types => /lass(?!IncludingModule).*Pro.*Inst.*Met/, :method_options => [:public, :protected, :exclude_ancestor_methods]
|
184
163
|
pc.join_points_matched.should == Set.new([@pro_jp])
|
185
164
|
pc.join_points_not_matched.size.should == 0
|
186
165
|
end
|
187
166
|
end
|
188
167
|
|
189
|
-
describe
|
168
|
+
describe Pointcut, ".new (classes specified using names)" do
|
190
169
|
before(:each) do
|
191
170
|
before_pointcut_class_spec
|
192
171
|
end
|
193
172
|
|
194
173
|
it "should match multiple classes using names." do
|
195
|
-
pc =
|
174
|
+
pc = Pointcut.new :types => @example_classes.map {|t| t.to_s}, :method_options => :exclude_ancestor_methods
|
196
175
|
pc.join_points_matched.should == @expected_classes_matched_jps
|
197
176
|
pc.join_points_not_matched.should == @expected_classes_not_matched_jps
|
198
177
|
end
|
199
178
|
|
200
179
|
it "should match multiple classes using classes themselves." do
|
201
|
-
pc =
|
180
|
+
pc = Pointcut.new :types => @example_classes, :method_options => :exclude_ancestor_methods
|
202
181
|
pc.join_points_matched.should == @expected_classes_matched_jps
|
203
182
|
pc.join_points_not_matched.should == @expected_classes_not_matched_jps
|
204
183
|
end
|
205
184
|
|
206
185
|
it "should match :all public instance methods for classes by default." do
|
207
|
-
pc =
|
186
|
+
pc = Pointcut.new :types => @example_classes, :method_options => :exclude_ancestor_methods
|
187
|
+
pc.join_points_matched.should == @expected_classes_matched_jps
|
188
|
+
pc.join_points_not_matched.should == @expected_classes_not_matched_jps
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should match all public instance methods for classes if :methods => :all specified." do
|
192
|
+
pc = Pointcut.new :types => @example_classes, :methods => :all, :method_options => :exclude_ancestor_methods
|
193
|
+
pc.join_points_matched.should == @expected_classes_matched_jps
|
194
|
+
pc.join_points_not_matched.should == @expected_classes_not_matched_jps
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should match all public instance methods for classes if :methods => :all_methods specified." do
|
198
|
+
pc = Pointcut.new :types => @example_classes, :methods => :all_methods, :method_options => :exclude_ancestor_methods
|
208
199
|
pc.join_points_matched.should == @expected_classes_matched_jps
|
209
200
|
pc.join_points_not_matched.should == @expected_classes_not_matched_jps
|
210
201
|
end
|
211
202
|
|
212
203
|
it "should support MethodFinder's :exclude_ancestor_methods option when using classes." do
|
213
|
-
pc =
|
204
|
+
pc = Pointcut.new :types => @example_classes, :method_options => :exclude_ancestor_methods
|
214
205
|
pc.join_points_matched.should == @expected_classes_matched_jps
|
215
206
|
pc.join_points_not_matched.should == @expected_classes_not_matched_jps
|
216
207
|
end
|
208
|
+
|
209
|
+
Pointcut::CANONICAL_OPTIONS["types"].each do |key|
|
210
|
+
it "should accept :#{key} as a synonym for :types." do
|
211
|
+
pc = Pointcut.new key.intern => @example_classes, :method_options => :exclude_ancestor_methods
|
212
|
+
pc.join_points_matched.should == @expected_classes_matched_jps
|
213
|
+
pc.join_points_not_matched.should == @expected_classes_not_matched_jps
|
214
|
+
end
|
215
|
+
end
|
217
216
|
end
|
218
217
|
|
219
|
-
describe
|
218
|
+
describe Pointcut, ".new (modules specified using regular expressions)" do
|
220
219
|
it "should match multiple types using regular expressions that cover the full module names." do
|
221
|
-
pc =
|
220
|
+
pc = Pointcut.new :types => /\AModule.*Method\Z/, :method_options => :exclude_ancestor_methods
|
222
221
|
pc.join_points_matched.size.should == 2
|
223
222
|
pc.join_points_matched.each do |jp|
|
224
223
|
[ModuleIncludingModuleWithPublicInstanceMethod, ModuleWithPublicInstanceMethod].should include(jp.target_type)
|
@@ -231,9 +230,9 @@ describe Aquarium::Aspects::Pointcut, " (modules specified using regular express
|
|
231
230
|
end
|
232
231
|
end
|
233
232
|
|
234
|
-
describe
|
233
|
+
describe Pointcut, ".new (modules specified using names)" do
|
235
234
|
def do_module type_spec
|
236
|
-
pc =
|
235
|
+
pc = Pointcut.new :types => type_spec, :method_options => :exclude_ancestor_methods
|
237
236
|
pc.join_points_matched.size.should == 1
|
238
237
|
pc.join_points_matched.each do |jp|
|
239
238
|
jp.target_type.should == ModuleWithPublicInstanceMethod
|
@@ -267,13 +266,13 @@ describe Aquarium::Aspects::Pointcut, " (modules specified using names)" do
|
|
267
266
|
end
|
268
267
|
end
|
269
268
|
|
270
|
-
describe
|
269
|
+
describe Pointcut, ".new (types and their descendents and ancestors)" do
|
271
270
|
before(:each) do
|
272
271
|
before_pointcut_module_spec
|
273
272
|
end
|
274
273
|
|
275
274
|
it "should match classes specified and their ancestor and descendent modules and classes." do
|
276
|
-
pc =
|
275
|
+
pc = Pointcut.new :types_and_ancestors => /^Class(Including|DerivedFrom).*Method/, :types_and_descendents => /^Class(Including|DerivedFrom).*Method/, :methods => :all, :method_options => :exclude_ancestor_methods
|
277
276
|
expected_types = @example_modules_with_public_instance_method + [Kernel, Module, Object]
|
278
277
|
pc.join_points_matched.each do |jp|
|
279
278
|
next if ignored_join_point(jp)
|
@@ -287,59 +286,87 @@ describe Aquarium::Aspects::Pointcut, " (types and their descendents and ancesto
|
|
287
286
|
end
|
288
287
|
|
289
288
|
it "should match modules specified, their ancestor and descendent modules, and including classes." do
|
290
|
-
pc =
|
289
|
+
pc = Pointcut.new :types_and_ancestors => /^Module.*Method/, :types_and_descendents => /^Module.*Method/, :methods => :all, :method_options => :exclude_ancestor_methods
|
291
290
|
pc.join_points_matched.should == (@expected_modules_matched_jps + [@mimpub_jp])
|
292
291
|
pc.join_points_not_matched.should == @expected_modules_not_matched_jps
|
293
292
|
end
|
293
|
+
|
294
|
+
Aspect::CANONICAL_OPTIONS["types_and_ancestors"].each do |key|
|
295
|
+
it "should accept :#{key} as a synonym for :types_and_ancestors." do
|
296
|
+
pc = Pointcut.new key.intern => /^Module.*Method/, :types_and_descendents => /^Module.*Method/, :methods => :all, :method_options => :exclude_ancestor_methods
|
297
|
+
pc.join_points_matched.should == (@expected_modules_matched_jps + [@mimpub_jp])
|
298
|
+
pc.join_points_not_matched.should == @expected_modules_not_matched_jps
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
Aspect::CANONICAL_OPTIONS["types_and_descendents"].each do |key|
|
303
|
+
it "should accept :#{key} as a synonym for :types_and_descendents." do
|
304
|
+
pc = Pointcut.new :types_and_ancestors => /^Module.*Method/, key.intern => /^Module.*Method/, :methods => :all, :method_options => :exclude_ancestor_methods
|
305
|
+
pc.join_points_matched.should == (@expected_modules_matched_jps + [@mimpub_jp])
|
306
|
+
pc.join_points_not_matched.should == @expected_modules_not_matched_jps
|
307
|
+
end
|
308
|
+
end
|
294
309
|
end
|
295
310
|
|
296
|
-
describe
|
311
|
+
describe Pointcut, ".new (objects specified)" do
|
297
312
|
before(:each) do
|
298
313
|
before_pointcut_class_spec
|
299
314
|
end
|
300
315
|
|
301
316
|
it "should match :all public instance methods for objects by default." do
|
302
317
|
pub, pro = ClassWithPublicInstanceMethod.new, ClassWithProtectedInstanceMethod.new
|
303
|
-
pc =
|
304
|
-
pc.join_points_matched.should == Set.new([
|
305
|
-
pc.join_points_not_matched.should == Set.new([
|
318
|
+
pc = Pointcut.new :objects => [pub, pro], :method_options => :exclude_ancestor_methods
|
319
|
+
pc.join_points_matched.should == Set.new([JoinPoint.new(:object => pub, :method_name => :public_instance_test_method)])
|
320
|
+
pc.join_points_not_matched.should == Set.new([JoinPoint.new(:object => pro, :method_name => :all)])
|
306
321
|
end
|
307
322
|
|
308
323
|
it "should support MethodFinder's :exclude_ancestor_methods option when using objects." do
|
309
324
|
pub, pro = ClassWithPublicInstanceMethod.new, ClassWithProtectedInstanceMethod.new
|
310
|
-
pc =
|
311
|
-
pc.join_points_matched.should == Set.new([
|
312
|
-
pc.join_points_not_matched.should == Set.new([
|
325
|
+
pc = Pointcut.new :objects => [pub, pro], :method_options => :exclude_ancestor_methods
|
326
|
+
pc.join_points_matched.should == Set.new([JoinPoint.new(:object => pub, :method_name => :public_instance_test_method)])
|
327
|
+
pc.join_points_not_matched.should == Set.new([JoinPoint.new(:object => pro, :method_name => :all)])
|
313
328
|
end
|
314
329
|
|
315
330
|
it "should match all possible methods on the specified objects." do
|
316
331
|
pub, pro = ClassWithPublicInstanceMethod.new, ClassWithProtectedInstanceMethod.new
|
317
|
-
pc =
|
332
|
+
pc = Pointcut.new :objects => [pub, pro], :methods => :all, :method_options => [:public, :protected, :exclude_ancestor_methods]
|
318
333
|
pc.join_points_matched.size.should == 2
|
319
334
|
pc.join_points_not_matched.size.should == 0
|
320
335
|
pc.join_points_matched.should == Set.new([
|
321
|
-
|
322
|
-
|
336
|
+
JoinPoint.new(:object => pro, :method_name => :protected_instance_test_method),
|
337
|
+
JoinPoint.new(:object => pub, :method_name => :public_instance_test_method)])
|
323
338
|
end
|
324
339
|
|
340
|
+
Aspect::CANONICAL_OPTIONS["objects"].each do |key|
|
341
|
+
it "should accept :#{key} as a synonym for :objects." do
|
342
|
+
pub, pro = ClassWithPublicInstanceMethod.new, ClassWithProtectedInstanceMethod.new
|
343
|
+
pc = Pointcut.new key.intern => [pub, pro], :methods => :all, :method_options => [:public, :protected, :exclude_ancestor_methods]
|
344
|
+
pc.join_points_matched.size.should == 2
|
345
|
+
pc.join_points_not_matched.size.should == 0
|
346
|
+
pc.join_points_matched.should == Set.new([
|
347
|
+
JoinPoint.new(:object => pro, :method_name => :protected_instance_test_method),
|
348
|
+
JoinPoint.new(:object => pub, :method_name => :public_instance_test_method)])
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
325
352
|
it "does confuse strings specified with :objects as type names." do
|
326
353
|
string = "mystring"
|
327
|
-
lambda {
|
354
|
+
lambda { Pointcut.new :object => string, :methods => :capitalize }.should raise_error(NameError)
|
328
355
|
end
|
329
356
|
|
330
357
|
it "does confuse symbols specified with :objects as type names." do
|
331
358
|
symbol = :mystring
|
332
|
-
lambda {
|
359
|
+
lambda { Pointcut.new :object => symbol, :methods => :capitalize }.should raise_error(NameError)
|
333
360
|
end
|
334
361
|
end
|
335
362
|
|
336
|
-
describe
|
363
|
+
describe Pointcut, ".new (:exclude_types => types specified)" do
|
337
364
|
before(:each) do
|
338
365
|
before_exclude_spec
|
339
366
|
end
|
340
367
|
|
341
368
|
it "should remove from a list of explicitly-specified types the set of explicitly-specified excluded types." do
|
342
|
-
pc =
|
369
|
+
pc = Pointcut.new :types => [ExcludeTestOne, ExcludeTestTwo, ExcludeTestThree], :exclude_type => ExcludeTestTwo, :method_options => :exclude_ancestor_methods
|
343
370
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
344
371
|
actual.size.should == 2
|
345
372
|
actual.should include(ExcludeTestOne)
|
@@ -348,7 +375,7 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_types => types specified)" do
|
|
348
375
|
end
|
349
376
|
|
350
377
|
it "should remove from a list of explicitly-specified types the set of excluded types specified by regular expression." do
|
351
|
-
pc =
|
378
|
+
pc = Pointcut.new :types => [ExcludeTestOne, ExcludeTestTwo, ExcludeTestThree], :exclude_types => /Two$/, :method_options => :exclude_ancestor_methods
|
352
379
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
353
380
|
actual.size.should == 2
|
354
381
|
actual.should include(ExcludeTestOne)
|
@@ -357,7 +384,7 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_types => types specified)" do
|
|
357
384
|
end
|
358
385
|
|
359
386
|
it "should remove from a list of explicitly-specified types the set of excluded types specified by name." do
|
360
|
-
pc =
|
387
|
+
pc = Pointcut.new :types => [ExcludeTestOne, ExcludeTestTwo, ExcludeTestThree], :exclude_type => "ExcludeTestTwo", :method_options => :exclude_ancestor_methods
|
361
388
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
362
389
|
actual.size.should == 2
|
363
390
|
actual.should include(ExcludeTestOne)
|
@@ -366,7 +393,7 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_types => types specified)" do
|
|
366
393
|
end
|
367
394
|
|
368
395
|
it "should remove from the types specified by regular expression the explicitly-specified excluded types." do
|
369
|
-
pc =
|
396
|
+
pc = Pointcut.new :types => /ExcludeTest/, :exclude_type => ExcludeTestTwo, :method_options => :exclude_ancestor_methods
|
370
397
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
371
398
|
actual.size.should == 2
|
372
399
|
actual.should include(ExcludeTestOne)
|
@@ -375,7 +402,7 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_types => types specified)" do
|
|
375
402
|
end
|
376
403
|
|
377
404
|
it "should remove from the types specified by regular expression the excluded types specified by regular expression." do
|
378
|
-
pc =
|
405
|
+
pc = Pointcut.new :types => /ExcludeTest/, :exclude_type => /Two$/, :method_options => :exclude_ancestor_methods
|
379
406
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
380
407
|
actual.size.should == 2
|
381
408
|
actual.should include(ExcludeTestOne)
|
@@ -384,7 +411,7 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_types => types specified)" do
|
|
384
411
|
end
|
385
412
|
|
386
413
|
it "should remove from the types specified by regular expression the excluded types specified by name." do
|
387
|
-
pc =
|
414
|
+
pc = Pointcut.new :types => /ExcludeTest/, :exclude_type => "ExcludeTestTwo", :method_options => :exclude_ancestor_methods
|
388
415
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
389
416
|
actual.size.should == 2
|
390
417
|
actual.should include(ExcludeTestOne)
|
@@ -393,7 +420,7 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_types => types specified)" do
|
|
393
420
|
end
|
394
421
|
|
395
422
|
it "should remove from the join points corresponding to the excluded types, specified by name." do
|
396
|
-
pc =
|
423
|
+
pc = Pointcut.new :join_points => @all_type_jps, :exclude_type => "ExcludeTestTwo", :method_options => :exclude_ancestor_methods
|
397
424
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
398
425
|
actual.size.should == 2
|
399
426
|
actual.should include(ExcludeTestOne)
|
@@ -402,7 +429,7 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_types => types specified)" do
|
|
402
429
|
end
|
403
430
|
|
404
431
|
it "should remove the specified join points corresponding to the excluded types, specified by regular expression." do
|
405
|
-
pc =
|
432
|
+
pc = Pointcut.new :join_points => @all_type_jps, :exclude_type => /Exclude.*Two/, :method_options => :exclude_ancestor_methods
|
406
433
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
407
434
|
actual.size.should == 2
|
408
435
|
actual.should include(ExcludeTestOne)
|
@@ -411,21 +438,23 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_types => types specified)" do
|
|
411
438
|
end
|
412
439
|
|
413
440
|
it "should not add excluded types to the #not_matched results." do
|
414
|
-
pc =
|
441
|
+
pc = Pointcut.new :types => /ExcludeTest/, :exclude_type => ExcludeTestTwo, :method_options => :exclude_ancestor_methods
|
415
442
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
416
443
|
pc.join_points_not_matched.size.should == 0
|
417
444
|
end
|
418
445
|
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
446
|
+
Aspect::CANONICAL_OPTIONS["exclude_types"].each do |key|
|
447
|
+
it "should accept :#{key} as a synonym for :exclude_types." do
|
448
|
+
pc = Pointcut.new :types => /ExcludeTest/, key.intern => [ExcludeTestTwo, ExcludeTestThree], :method_options => :exclude_ancestor_methods
|
449
|
+
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
450
|
+
actual.size.should == 1
|
451
|
+
actual.should include(ExcludeTestOne)
|
452
|
+
pc.join_points_not_matched.size.should == 0
|
453
|
+
end
|
454
|
+
end
|
426
455
|
end
|
427
456
|
|
428
|
-
describe
|
457
|
+
describe Pointcut, ".new (exclude types and their descendents and ancestors)" do
|
429
458
|
before(:each) do
|
430
459
|
before_pointcut_module_spec
|
431
460
|
end
|
@@ -451,12 +480,12 @@ describe Aquarium::Aspects::Pointcut, " (exclude types and their descendents and
|
|
451
480
|
end
|
452
481
|
|
453
482
|
it "should exclude modules specified and their included modules when excluding ancestors." do
|
454
|
-
pc =
|
483
|
+
pc = Pointcut.new :types_and_ancestors => /^Class(Including|DerivedFrom).*Method/,
|
455
484
|
:exclude_types_and_ancestors => ModuleIncludingModuleWithPublicInstanceMethod, :methods => :all, :method_options => :exclude_ancestor_methods
|
456
485
|
check_module_ancestors pc
|
457
486
|
end
|
458
487
|
it "should exclude join_points whose types match an excluded ancestor modules." do
|
459
|
-
pc =
|
488
|
+
pc = Pointcut.new :join_point => @mimpub_jp, :types_and_ancestors => /^Class(Including|DerivedFrom).*Method/,
|
460
489
|
:exclude_types_and_ancestors => ModuleIncludingModuleWithPublicInstanceMethod, :methods => :all, :method_options => :exclude_ancestor_methods
|
461
490
|
check_module_ancestors pc
|
462
491
|
end
|
@@ -478,12 +507,12 @@ describe Aquarium::Aspects::Pointcut, " (exclude types and their descendents and
|
|
478
507
|
end
|
479
508
|
|
480
509
|
it "should exclude modules specified and their including modules and classes when excluding descendents." do
|
481
|
-
pc =
|
510
|
+
pc = Pointcut.new :types_and_ancestors => /^Class(Including|DerivedFrom).*Method/,
|
482
511
|
:exclude_types_and_descendents => ModuleWithPublicInstanceMethod, :methods => :all, :method_options => :exclude_ancestor_methods
|
483
512
|
check_module_descendents pc
|
484
513
|
end
|
485
514
|
it "should exclude join_points whose types match an excluded descendent modules." do
|
486
|
-
pc =
|
515
|
+
pc = Pointcut.new :join_point => @mpub_jp, :types_and_ancestors => /^Class(Including|DerivedFrom).*Method/,
|
487
516
|
:exclude_types_and_descendents => ModuleWithPublicInstanceMethod, :methods => :all, :method_options => :exclude_ancestor_methods
|
488
517
|
check_module_descendents pc
|
489
518
|
end
|
@@ -505,12 +534,12 @@ describe Aquarium::Aspects::Pointcut, " (exclude types and their descendents and
|
|
505
534
|
end
|
506
535
|
|
507
536
|
it "should exclude classes specified and their included modules and ancestor classes when excluding ancestors." do
|
508
|
-
pc =
|
537
|
+
pc = Pointcut.new :types_and_ancestors => /^Class(Including|DerivedFrom).*Method/,
|
509
538
|
:exclude_types_and_ancestors => ClassIncludingModuleWithPublicInstanceMethod, :methods => :all, :method_options => :exclude_ancestor_methods
|
510
539
|
check_class_ancestors pc
|
511
540
|
end
|
512
541
|
it "should exclude join_points whose types match an excluded ancestor classes." do
|
513
|
-
pc =
|
542
|
+
pc = Pointcut.new :join_point => @cimpub_jp, :types_and_ancestors => /^Class(Including|DerivedFrom).*Method/,
|
514
543
|
:exclude_types_and_ancestors => ClassIncludingModuleWithPublicInstanceMethod, :methods => :all, :method_options => :exclude_ancestor_methods
|
515
544
|
check_class_ancestors pc
|
516
545
|
end
|
@@ -532,18 +561,18 @@ describe Aquarium::Aspects::Pointcut, " (exclude types and their descendents and
|
|
532
561
|
end
|
533
562
|
|
534
563
|
it "should exclude classes specified and their including modules and descendent classes when excluding descendents." do
|
535
|
-
pc =
|
564
|
+
pc = Pointcut.new :types_and_ancestors => /^Class(Including|DerivedFrom).*Method/,
|
536
565
|
:exclude_types_and_descendents => ClassIncludingModuleWithPublicInstanceMethod, :methods => :all, :method_options => :exclude_ancestor_methods
|
537
566
|
check_class_descendents pc
|
538
567
|
end
|
539
568
|
it "should exclude join_points whose types match an excluded descendent types." do
|
540
|
-
pc =
|
569
|
+
pc = Pointcut.new :join_point => @cimpub_jp, :types_and_ancestors => /^Class(Including|DerivedFrom).*Method/,
|
541
570
|
:exclude_types_and_descendents => ClassIncludingModuleWithPublicInstanceMethod, :methods => :all, :method_options => :exclude_ancestor_methods
|
542
571
|
check_class_descendents pc
|
543
572
|
end
|
544
573
|
end
|
545
574
|
|
546
|
-
describe
|
575
|
+
describe Pointcut, ".new (:exclude_objects => objects specified)" do
|
547
576
|
before(:each) do
|
548
577
|
@e11 = ExcludeTestOne.new
|
549
578
|
@e12 = ExcludeTestOne.new
|
@@ -555,7 +584,7 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_objects => objects specified)"
|
|
555
584
|
end
|
556
585
|
|
557
586
|
it "should remove from the matched objects the excluded objects." do
|
558
|
-
pc =
|
587
|
+
pc = Pointcut.new :objects => @objects, :exclude_objects => [@e22, @e31], :method_options => :exclude_ancestor_methods
|
559
588
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
560
589
|
actual.size.should == 4
|
561
590
|
[@e11, @e12, @e21, @e32].each {|e| actual.should include(e)}
|
@@ -563,12 +592,12 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_objects => objects specified)"
|
|
563
592
|
end
|
564
593
|
|
565
594
|
it "should remove the specified join points corresponding to the excluded objects." do
|
566
|
-
jps11 =
|
567
|
-
jps21 =
|
568
|
-
jps22 =
|
569
|
-
jps31 =
|
595
|
+
jps11 = JoinPoint.new :object => @e11, :method => :method11
|
596
|
+
jps21 = JoinPoint.new :object => @e21, :method => :method21
|
597
|
+
jps22 = JoinPoint.new :object => @e22, :method => :method22
|
598
|
+
jps31 = JoinPoint.new :object => @e31, :method => :method31
|
570
599
|
jps = [jps11, jps21, jps22, jps31]
|
571
|
-
pc =
|
600
|
+
pc = Pointcut.new :join_points => jps, :exclude_objects => [@e22, @e31], :method_options => :exclude_ancestor_methods
|
572
601
|
pc.join_points_matched.size.should == 2
|
573
602
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
574
603
|
[@e11, @e21].each {|e| actual.should include(e)}
|
@@ -576,21 +605,23 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_objects => objects specified)"
|
|
576
605
|
end
|
577
606
|
|
578
607
|
it "should not add excluded objects to the #not_matched results." do
|
579
|
-
pc =
|
608
|
+
pc = Pointcut.new :objects => @objects, :exclude_objects => [@e22, @e31], :method_options => :exclude_ancestor_methods
|
580
609
|
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
581
610
|
pc.join_points_not_matched.size.should == 0
|
582
611
|
end
|
583
612
|
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
613
|
+
Aspect::CANONICAL_OPTIONS["exclude_objects"].each do |key|
|
614
|
+
it "should accept :#{key} as a synonym for :exclude_objects." do
|
615
|
+
pc = Pointcut.new :objects => @objects, key.intern => @e22, :method_options => :exclude_ancestor_methods
|
616
|
+
actual = pc.join_points_matched.collect {|jp| jp.type_or_object}.uniq
|
617
|
+
actual.size.should == 5
|
618
|
+
[@e11, @e12, @e21, @e31, @e32].each {|e| actual.should include(e)}
|
619
|
+
pc.join_points_not_matched.size.should == 0
|
620
|
+
end
|
590
621
|
end
|
591
622
|
end
|
592
623
|
|
593
|
-
describe
|
624
|
+
describe Pointcut, ".new (:exclude_join_points => join_points specified)" do
|
594
625
|
before(:each) do
|
595
626
|
before_exclude_spec
|
596
627
|
end
|
@@ -598,7 +629,7 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_join_points => join_points spe
|
|
598
629
|
it "should remove from a list of explicitly-specified join points the set of explicitly-specified excluded join points." do
|
599
630
|
excluded = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
600
631
|
expected = [@jp11, @jp13, @jp21, @jp22, @jp23, @jp31, @jp32, @ojp12, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33]
|
601
|
-
pc =
|
632
|
+
pc = Pointcut.new :join_points => @all_jps, :exclude_join_points => excluded
|
602
633
|
pc.join_points_matched.should == Set.new(expected)
|
603
634
|
pc.join_points_not_matched.size.should == 0
|
604
635
|
end
|
@@ -606,7 +637,7 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_join_points => join_points spe
|
|
606
637
|
it "should remove from the list of generated, type-based join points the set of explicitly-specified excluded join points." do
|
607
638
|
excluded = [@jp11, @jp22, @jp33]
|
608
639
|
expected = [@jp12, @jp13, @jp21, @jp23, @jp31, @jp32]
|
609
|
-
pc =
|
640
|
+
pc = Pointcut.new :types => /ExcludeTest/, :exclude_join_points => excluded, :method_options => :exclude_ancestor_methods
|
610
641
|
pc.join_points_matched.should == Set.new(expected)
|
611
642
|
pc.join_points_not_matched.size.should == 0
|
612
643
|
end
|
@@ -614,442 +645,681 @@ describe Aquarium::Aspects::Pointcut, " (:exclude_join_points => join_points spe
|
|
614
645
|
it "should remove from the list of generated, object-based join points the set of explicitly-specified excluded join points." do
|
615
646
|
excluded = [@ojp12, @ojp23, @ojp31]
|
616
647
|
expected = [@ojp11, @ojp13, @ojp21, @ojp22, @ojp32, @ojp33]
|
617
|
-
pc =
|
648
|
+
pc = Pointcut.new :objects => [@et1, @et2, @et3], :exclude_join_points => excluded, :method_options => :exclude_ancestor_methods
|
618
649
|
pc.join_points_matched.should == Set.new(expected)
|
619
650
|
pc.join_points_not_matched.size.should == 0
|
620
651
|
end
|
621
652
|
|
622
653
|
it "should not add excluded types to the #not_matched results." do
|
623
654
|
excluded = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
624
|
-
pc =
|
655
|
+
pc = Pointcut.new :join_points => @all_jps, :exclude_join_points => excluded
|
625
656
|
pc.join_points_not_matched.size.should == 0
|
626
657
|
end
|
627
658
|
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
659
|
+
Aspect::CANONICAL_OPTIONS["exclude_join_points"].each do |key|
|
660
|
+
it "should accept :#{key} as a synonym for :exclude_join_points." do
|
661
|
+
excluded = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
662
|
+
expected = [@jp11, @jp13, @jp21, @jp22, @jp23, @jp31, @jp32, @ojp12, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33]
|
663
|
+
pc = Pointcut.new :join_points => @all_jps, key.intern => excluded
|
664
|
+
pc.join_points_matched.should == Set.new(expected)
|
665
|
+
pc.join_points_not_matched.size.should == 0
|
666
|
+
end
|
634
667
|
end
|
635
668
|
end
|
636
669
|
|
637
|
-
|
638
|
-
describe Aquarium::Aspects::Pointcut, " (:exclude_pointcuts => pointcuts specified)" do
|
670
|
+
describe Pointcut, ".new (:exclude_pointcuts => pointcuts specified)" do
|
639
671
|
before(:each) do
|
640
672
|
before_exclude_spec
|
641
673
|
end
|
642
674
|
|
643
675
|
it "should remove from a list of explicitly-specified join points the set of explicitly-specified excluded pointcuts." do
|
644
676
|
excluded_jps = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
645
|
-
excluded =
|
677
|
+
excluded = Pointcut.new :join_points => excluded_jps
|
646
678
|
expected = [@jp11, @jp13, @jp21, @jp22, @jp23, @jp31, @jp32, @ojp12, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33]
|
647
|
-
pc =
|
679
|
+
pc = Pointcut.new :join_points => @all_jps, :exclude_pointcuts => excluded
|
648
680
|
pc.join_points_matched.should == Set.new(expected)
|
649
681
|
pc.join_points_not_matched.size.should == 0
|
650
682
|
end
|
651
683
|
|
652
684
|
it "should remove from the list of generated, type-based join points the set of explicitly-specified excluded pointcuts." do
|
653
685
|
excluded_jps = [@jp11, @jp22, @jp33]
|
654
|
-
excluded =
|
686
|
+
excluded = Pointcut.new :join_points => excluded_jps
|
655
687
|
expected = [@jp12, @jp13, @jp21, @jp23, @jp31, @jp32]
|
656
|
-
pc =
|
688
|
+
pc = Pointcut.new :types => /ExcludeTest/, :exclude_pointcuts => excluded, :method_options => :exclude_ancestor_methods
|
657
689
|
pc.join_points_matched.should == Set.new(expected)
|
658
690
|
pc.join_points_not_matched.size.should == 0
|
659
691
|
end
|
660
692
|
|
661
693
|
it "should remove from the list of generated, object-based join points the set of explicitly-specified excluded pointcuts." do
|
662
694
|
excluded_jps = [@ojp12, @ojp23, @ojp31]
|
663
|
-
excluded =
|
695
|
+
excluded = Pointcut.new :join_points => excluded_jps
|
664
696
|
expected = [@ojp11, @ojp13, @ojp21, @ojp22, @ojp32, @ojp33]
|
665
|
-
pc =
|
697
|
+
pc = Pointcut.new :objects => [@et1, @et2, @et3], :exclude_pointcuts => excluded, :method_options => :exclude_ancestor_methods
|
666
698
|
pc.join_points_matched.should == Set.new(expected)
|
667
699
|
pc.join_points_not_matched.size.should == 0
|
668
700
|
end
|
669
701
|
|
670
702
|
it "should not add excluded types to the #not_matched results." do
|
671
703
|
excluded_jps = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
672
|
-
excluded =
|
673
|
-
pc =
|
704
|
+
excluded = Pointcut.new :join_points => excluded_jps
|
705
|
+
pc = Pointcut.new :join_points => @all_jps, :exclude_pointcuts => excluded
|
674
706
|
pc.join_points_not_matched.size.should == 0
|
675
707
|
end
|
676
708
|
|
677
709
|
it "should result in an empty pointcut if the join points in the :exclude_pointcuts are a superset of the matched join points." do
|
678
|
-
excluded =
|
679
|
-
pc =
|
710
|
+
excluded = Pointcut.new :join_points => @all_jps
|
711
|
+
pc = Pointcut.new :join_points => @all_jps, :exclude_pointcut => excluded
|
680
712
|
pc.join_points_matched.size.should == 0
|
681
713
|
pc.join_points_not_matched.size.should == 0
|
682
714
|
end
|
683
715
|
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
716
|
+
Aspect::CANONICAL_OPTIONS["exclude_pointcuts"].each do |key|
|
717
|
+
it "should accept :#{key} as a synonym for :exclude_pointcuts." do
|
718
|
+
excluded_jps = [@jp12, @jp33, @ojp11, @ojp13, @ojp23]
|
719
|
+
excluded = Pointcut.new :join_points => excluded_jps
|
720
|
+
expected = [@jp11, @jp13, @jp21, @jp22, @jp23, @jp31, @jp32, @ojp12, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33]
|
721
|
+
pc = Pointcut.new :join_points => @all_jps, key.intern => excluded
|
722
|
+
pc.join_points_matched.should == Set.new(expected)
|
723
|
+
pc.join_points_not_matched.size.should == 0
|
724
|
+
end
|
691
725
|
end
|
692
726
|
end
|
693
727
|
|
694
|
-
describe
|
728
|
+
describe Pointcut, ".new (:method_options synonyms)" do
|
729
|
+
before(:each) do
|
730
|
+
before_pointcut_class_spec
|
731
|
+
end
|
732
|
+
|
733
|
+
Aspect::CANONICAL_OPTIONS["method_options"].each do |key|
|
734
|
+
it "should accept :#{key} as a synonym for :method_options." do
|
735
|
+
pc = Pointcut.new :types => ClassWithPublicInstanceMethod, key.intern => [:public, :instance, :exclude_ancestor_methods]
|
736
|
+
pc.join_points_matched.should be_eql(Set.new([@pub_jp]))
|
737
|
+
pc.join_points_not_matched.size.should == 0
|
738
|
+
end
|
739
|
+
end
|
740
|
+
end
|
741
|
+
|
742
|
+
describe Pointcut, ".new (types or objects specified with public instance methods)" do
|
695
743
|
before(:each) do
|
696
744
|
before_pointcut_class_spec
|
697
745
|
end
|
698
746
|
|
699
747
|
it "should support MethodFinder's :public and :instance options for the specified types." do
|
700
|
-
pc =
|
748
|
+
pc = Pointcut.new :types => ClassWithPublicInstanceMethod, :method_options => [:public, :instance, :exclude_ancestor_methods]
|
701
749
|
pc.join_points_matched.should be_eql(Set.new([@pub_jp]))
|
702
750
|
pc.join_points_not_matched.size.should == 0
|
703
751
|
end
|
704
752
|
|
705
753
|
it "should support MethodFinder's :public and :instance options for the specified objects." do
|
706
754
|
pub = ClassWithPublicInstanceMethod.new
|
707
|
-
pc =
|
708
|
-
pc.join_points_matched.should be_eql(Set.new([
|
755
|
+
pc = Pointcut.new :objects => pub, :method_options => [:public, :instance, :exclude_ancestor_methods]
|
756
|
+
pc.join_points_matched.should be_eql(Set.new([JoinPoint.new(:object => pub, :method_name => :public_instance_test_method)]))
|
709
757
|
pc.join_points_not_matched.size.should == 0
|
710
758
|
end
|
711
759
|
end
|
712
760
|
|
713
|
-
describe
|
761
|
+
describe Pointcut, ".new (types or objects specified with protected instance methods)" do
|
714
762
|
before(:each) do
|
715
763
|
before_pointcut_class_spec
|
716
764
|
end
|
717
765
|
|
718
766
|
it "should support MethodFinder's :protected and :instance options for the specified types." do
|
719
|
-
pc =
|
767
|
+
pc = Pointcut.new :types => ClassWithProtectedInstanceMethod, :method_options => [:protected, :instance, :exclude_ancestor_methods]
|
720
768
|
pc.join_points_matched.should be_eql(Set.new([@pro_jp]))
|
721
769
|
pc.join_points_not_matched.size.should == 0
|
722
770
|
end
|
723
771
|
|
724
772
|
it "should support MethodFinder's :protected and :instance options for the specified objects." do
|
725
773
|
pro = ClassWithProtectedInstanceMethod.new
|
726
|
-
pc =
|
727
|
-
pc.join_points_matched.should be_eql(Set.new([
|
774
|
+
pc = Pointcut.new :objects => pro, :method_options => [:protected, :instance, :exclude_ancestor_methods]
|
775
|
+
pc.join_points_matched.should be_eql(Set.new([JoinPoint.new(:object => pro, :method_name => :protected_instance_test_method)]))
|
728
776
|
pc.join_points_not_matched.size.should == 0
|
729
777
|
end
|
730
778
|
end
|
731
779
|
|
732
|
-
describe
|
780
|
+
describe Pointcut, ".new (types or objects specified with private instance methods)" do
|
733
781
|
before(:each) do
|
734
782
|
before_pointcut_class_spec
|
735
783
|
end
|
736
784
|
|
737
785
|
it "should support MethodFinder's :private and :instance options for the specified types." do
|
738
|
-
pc =
|
786
|
+
pc = Pointcut.new :types => ClassWithPrivateInstanceMethod, :method_options => [:private, :instance, :exclude_ancestor_methods]
|
739
787
|
pc.join_points_matched.should be_eql(Set.new([@pri_jp]))
|
740
788
|
pc.join_points_not_matched.size.should == 0
|
741
789
|
end
|
742
790
|
|
743
791
|
it "should support MethodFinder's :private and :instance options for the specified objects." do
|
744
792
|
pro = ClassWithPrivateInstanceMethod.new
|
745
|
-
pc =
|
746
|
-
pc.join_points_matched.should be_eql(Set.new([
|
793
|
+
pc = Pointcut.new :objects => pro, :method_options => [:private, :instance, :exclude_ancestor_methods]
|
794
|
+
pc.join_points_matched.should be_eql(Set.new([JoinPoint.new(:object => pro, :method_name => :private_instance_test_method)]))
|
747
795
|
pc.join_points_not_matched.size.should == 0
|
748
796
|
end
|
749
797
|
end
|
750
798
|
|
751
|
-
describe
|
799
|
+
describe Pointcut, ".new (types or objects specified with public class methods)" do
|
752
800
|
before(:each) do
|
753
801
|
before_pointcut_class_spec
|
754
802
|
end
|
755
803
|
|
756
804
|
it "should support MethodFinder's :public and :class options for the specified types." do
|
757
|
-
pc =
|
805
|
+
pc = Pointcut.new :types => ClassWithPublicClassMethod, :method_options => [:public, :class, :exclude_ancestor_methods]
|
758
806
|
pc.join_points_matched.should be_eql(Set.new([@cpub_jp]))
|
759
807
|
pc.join_points_not_matched.size.should == 0
|
760
808
|
end
|
761
809
|
|
762
810
|
it "should support MethodFinder's :public and :class options for the specified objects, which will return no methods." do
|
763
811
|
pub = ClassWithPublicInstanceMethod.new
|
764
|
-
pc =
|
812
|
+
pc = Pointcut.new :objects => pub, :method_options => [:public, :class, :exclude_ancestor_methods]
|
765
813
|
pc.join_points_matched.size.should == 0
|
766
814
|
pc.join_points_not_matched.size.should == 1
|
767
|
-
pc.join_points_not_matched.should be_eql(Set.new([
|
815
|
+
pc.join_points_not_matched.should be_eql(Set.new([JoinPoint.new(:object => pub, :method_name => :all, :class_method => true)]))
|
768
816
|
end
|
769
817
|
end
|
770
818
|
|
771
|
-
describe
|
819
|
+
describe Pointcut, ".new (types or objects specified with private class methods)" do
|
772
820
|
before(:each) do
|
773
821
|
before_pointcut_class_spec
|
774
822
|
end
|
775
823
|
|
776
824
|
it "should support MethodFinder's :private and :class options for the specified types." do
|
777
|
-
pc =
|
825
|
+
pc = Pointcut.new :types => ClassWithPrivateClassMethod, :method_options => [:private, :class, :exclude_ancestor_methods]
|
778
826
|
pc.join_points_matched.should be_eql(Set.new([@cpri_jp]))
|
779
827
|
pc.join_points_not_matched.size.should == 0
|
780
828
|
end
|
781
829
|
|
782
830
|
it "should support MethodFinder's :private and :class options for the specified objects, which will return no methods." do
|
783
831
|
pri = ClassWithPrivateInstanceMethod.new
|
784
|
-
pc =
|
785
|
-
pc.join_points_not_matched.should be_eql(Set.new([
|
832
|
+
pc = Pointcut.new :objects => pri, :method_options => [:private, :class, :exclude_ancestor_methods]
|
833
|
+
pc.join_points_not_matched.should be_eql(Set.new([JoinPoint.new(:object => pri, :method_name => :all, :class_method => true)]))
|
786
834
|
pc.join_points_not_matched.size.should == 1
|
787
835
|
end
|
788
836
|
end
|
789
837
|
|
790
|
-
describe
|
838
|
+
describe Pointcut, ".new (types or objects specified with method regular expressions)" do
|
791
839
|
before(:each) do
|
792
840
|
before_pointcut_class_spec
|
793
|
-
@jp_rwe =
|
794
|
-
@jp_rw =
|
795
|
-
@jp_we =
|
796
|
-
@jp_r =
|
841
|
+
@jp_rwe = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
|
842
|
+
@jp_rw = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
|
843
|
+
@jp_we = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
|
844
|
+
@jp_r = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrR_ClassWithAttribs
|
797
845
|
@expected_for_types = Set.new([@jp_rw, @jp_rwe, @jp_r, @jp_we])
|
798
846
|
@object_of_ClassWithAttribs = ClassWithAttribs.new
|
799
|
-
@jp_rwe_o =
|
800
|
-
@jp_rw_o =
|
801
|
-
@jp_we_o =
|
802
|
-
@jp_r_o =
|
847
|
+
@jp_rwe_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
|
848
|
+
@jp_rw_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
|
849
|
+
@jp_we_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
|
850
|
+
@jp_r_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrR_ClassWithAttribs
|
803
851
|
@expected_for_objects = Set.new([@jp_rw_o, @jp_rwe_o, @jp_r_o, @jp_we_o])
|
804
852
|
end
|
805
853
|
|
806
854
|
it "should match on public method readers and writers for type names by default." do
|
807
|
-
pc =
|
855
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :methods => [/^attr/]
|
808
856
|
pc.join_points_matched.should == @expected_for_types
|
809
857
|
end
|
810
858
|
|
811
859
|
it "should match on public method readers and writers for types by default." do
|
812
|
-
pc =
|
860
|
+
pc = Pointcut.new :types => ClassWithAttribs, :methods => [/^attr/]
|
813
861
|
pc.join_points_matched.should == @expected_for_types
|
814
862
|
end
|
815
863
|
|
816
864
|
it "should match on public method readers and writers for objects by default." do
|
817
|
-
pc =
|
865
|
+
pc = Pointcut.new :object => @object_of_ClassWithAttribs, :methods => [/^attr/]
|
818
866
|
pc.join_points_matched.should == @expected_for_objects
|
819
867
|
end
|
820
868
|
end
|
821
869
|
|
822
|
-
describe
|
870
|
+
describe Pointcut, ".new (synonyms of :methods)" do
|
871
|
+
before(:each) do
|
872
|
+
before_pointcut_class_spec
|
873
|
+
@jp_rwe = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
|
874
|
+
@jp_rw = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
|
875
|
+
@jp_we = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
|
876
|
+
@jp_r = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrR_ClassWithAttribs
|
877
|
+
@expected_for_types = Set.new([@jp_rw, @jp_rwe, @jp_r, @jp_we])
|
878
|
+
@object_of_ClassWithAttribs = ClassWithAttribs.new
|
879
|
+
@jp_rwe_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
|
880
|
+
@jp_rw_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
|
881
|
+
@jp_we_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
|
882
|
+
@jp_r_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrR_ClassWithAttribs
|
883
|
+
@expected_for_objects = Set.new([@jp_rw_o, @jp_rwe_o, @jp_r_o, @jp_we_o])
|
884
|
+
end
|
885
|
+
|
886
|
+
Aspect::CANONICAL_OPTIONS["methods"].each do |key|
|
887
|
+
it "should accept :#{key} as a synonym for :methods." do
|
888
|
+
pc = Pointcut.new :types => "ClassWithAttribs", key.intern => [/^attr/]
|
889
|
+
pc.join_points_matched.should == @expected_for_types
|
890
|
+
end
|
891
|
+
end
|
892
|
+
end
|
893
|
+
|
894
|
+
describe Pointcut, ".new (:exclude_methods => methods specified)" do
|
823
895
|
before(:each) do
|
824
896
|
before_exclude_spec
|
825
897
|
end
|
826
898
|
|
827
899
|
it "should remove type-specified JoinPoints matching the excluded methods specified by name." do
|
828
|
-
pc =
|
900
|
+
pc = Pointcut.new :types => [ExcludeTestOne, ExcludeTestTwo, ExcludeTestThree], :exclude_methods => [:method11, :method23], :method_options => :exclude_ancestor_methods
|
829
901
|
pc.join_points_matched.size.should == 7
|
830
902
|
pc.join_points_matched.should == Set.new([@jp12, @jp13, @jp21, @jp22, @jp31, @jp32, @jp33])
|
831
903
|
pc.join_points_not_matched.size.should == 0
|
832
904
|
end
|
833
905
|
|
834
906
|
it "should remove type-specified JoinPoints matching the excluded methods specified by regular expression." do
|
835
|
-
pc =
|
907
|
+
pc = Pointcut.new :types => [ExcludeTestOne, ExcludeTestTwo, ExcludeTestThree], :exclude_methods => /method[12][13]/, :method_options => :exclude_ancestor_methods
|
836
908
|
pc.join_points_matched.size.should == 5
|
837
909
|
pc.join_points_matched.should == Set.new([@jp12, @jp22, @jp31, @jp32, @jp33])
|
838
910
|
pc.join_points_not_matched.size.should == 0
|
839
911
|
end
|
840
912
|
|
841
913
|
it "should remove object-specified JoinPoints matching the excluded methods specified by name." do
|
842
|
-
pc =
|
914
|
+
pc = Pointcut.new :objects => [@et1, @et2, @et3], :exclude_methods => [:method11, :method23], :method_options => :exclude_ancestor_methods
|
843
915
|
pc.join_points_matched.size.should == 7
|
844
916
|
pc.join_points_matched.should == Set.new([@ojp12, @ojp13, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33])
|
845
917
|
pc.join_points_not_matched.size.should == 0
|
846
918
|
end
|
847
919
|
|
848
920
|
it "should remove object-specified JoinPoints matching the excluded methods specified by regular expression." do
|
849
|
-
pc =
|
921
|
+
pc = Pointcut.new :objects => [@et1, @et2, @et3], :exclude_methods => /method[12][13]/, :method_options => :exclude_ancestor_methods
|
850
922
|
pc.join_points_matched.size.should == 5
|
851
923
|
pc.join_points_matched.should == Set.new([@ojp12, @ojp22, @ojp31, @ojp32, @ojp33])
|
852
924
|
pc.join_points_not_matched.size.should == 0
|
853
925
|
end
|
854
926
|
|
855
927
|
it "should remove join-point-specified JoinPoints matching the excluded methods specified by name." do
|
856
|
-
pc =
|
928
|
+
pc = Pointcut.new :join_points => @all_jps, :exclude_methods => [:method11, :method23], :method_options => :exclude_ancestor_methods
|
857
929
|
pc.join_points_matched.size.should == 14
|
858
930
|
pc.join_points_matched.should == Set.new([@jp12, @jp13, @jp21, @jp22, @jp31, @jp32, @jp33, @ojp12, @ojp13, @ojp21, @ojp22, @ojp31, @ojp32, @ojp33])
|
859
931
|
pc.join_points_not_matched.size.should == 0
|
860
932
|
end
|
861
933
|
|
862
934
|
it "should remove join-point-specified JoinPoints matching the excluded methods specified by regular expression." do
|
863
|
-
pc =
|
935
|
+
pc = Pointcut.new :join_points => @all_jps, :exclude_methods => /method[12][13]/, :method_options => :exclude_ancestor_methods
|
864
936
|
pc.join_points_matched.size.should == 10
|
865
937
|
pc.join_points_matched.should == Set.new([@jp12, @jp22, @jp31, @jp32, @jp33, @ojp12, @ojp22, @ojp31, @ojp32, @ojp33])
|
866
938
|
pc.join_points_not_matched.size.should == 0
|
867
939
|
end
|
940
|
+
|
941
|
+
Aspect::CANONICAL_OPTIONS["exclude_methods"].each do |key|
|
942
|
+
it "should accept :#{key} as a synonym for :exclude_methods." do
|
943
|
+
pc = Pointcut.new :join_points => @all_jps, key.intern => /method[12][13]/, :method_options => :exclude_ancestor_methods
|
944
|
+
pc.join_points_matched.size.should == 10
|
945
|
+
pc.join_points_matched.should == Set.new([@jp12, @jp22, @jp31, @jp32, @jp33, @ojp12, @ojp22, @ojp31, @ojp32, @ojp33])
|
946
|
+
pc.join_points_not_matched.size.should == 0
|
947
|
+
end
|
948
|
+
end
|
868
949
|
end
|
869
950
|
|
870
|
-
describe
|
951
|
+
describe Pointcut, ".new (types or objects specified with attribute regular expressions)" do
|
871
952
|
before(:each) do
|
872
953
|
before_pointcut_class_spec
|
873
|
-
@jp_rwe =
|
874
|
-
@jp_rw =
|
875
|
-
@jp_we =
|
876
|
-
@jp_r =
|
954
|
+
@jp_rwe = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
|
955
|
+
@jp_rw = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
|
956
|
+
@jp_we = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
|
957
|
+
@jp_r = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrR_ClassWithAttribs
|
877
958
|
@expected_for_types = Set.new([@jp_rw, @jp_rwe, @jp_r, @jp_we])
|
878
959
|
@object_of_ClassWithAttribs = ClassWithAttribs.new
|
879
|
-
@jp_rwe_o =
|
880
|
-
@jp_rw_o =
|
881
|
-
@jp_we_o =
|
882
|
-
@jp_r_o =
|
960
|
+
@jp_rwe_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
|
961
|
+
@jp_rw_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
|
962
|
+
@jp_we_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
|
963
|
+
@jp_r_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrR_ClassWithAttribs
|
883
964
|
@expected_for_objects = Set.new([@jp_rw_o, @jp_rwe_o, @jp_r_o, @jp_we_o])
|
884
965
|
end
|
885
966
|
|
886
967
|
it "should match on public attribute readers and writers for type names by default." do
|
887
|
-
pc =
|
968
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/]
|
888
969
|
pc.join_points_matched.size.should == 4
|
889
970
|
pc.join_points_matched.should == @expected_for_types
|
890
971
|
end
|
891
972
|
|
892
973
|
it "should match on public attribute readers and writers for types by default." do
|
893
|
-
pc =
|
974
|
+
pc = Pointcut.new :types => ClassWithAttribs, :attributes => [/^attr/]
|
894
975
|
pc.join_points_matched.should == @expected_for_types
|
895
976
|
end
|
896
977
|
|
897
978
|
it "should match on public attribute readers and writers for objects by default." do
|
898
|
-
pc =
|
979
|
+
pc = Pointcut.new :object => @object_of_ClassWithAttribs, :attributes => [/^attr/]
|
899
980
|
pc.join_points_matched.should == @expected_for_objects
|
900
981
|
end
|
901
982
|
|
902
983
|
it "should match attribute specifications for types that are prefixed with @." do
|
903
|
-
pc =
|
984
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^@attr.*ClassWithAttribs/]
|
904
985
|
pc.join_points_matched.should == @expected_for_types
|
905
986
|
end
|
906
987
|
|
907
988
|
it "should match attribute specifications for objects that are prefixed with @." do
|
908
|
-
pc =
|
989
|
+
pc = Pointcut.new :object => @object_of_ClassWithAttribs, :attributes => [/^@attr.*ClassWithAttribs/]
|
909
990
|
pc.join_points_matched.should == @expected_for_objects
|
910
991
|
end
|
911
992
|
|
912
993
|
it "should match attribute specifications that are regular expressions of symbols." do
|
913
|
-
pc =
|
994
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^:attr.*ClassWithAttribs/]
|
914
995
|
pc.join_points_matched.should == @expected_for_types
|
915
996
|
end
|
916
997
|
|
917
998
|
it "should match attribute specifications for objects that are regular expressions of symbols." do
|
918
999
|
object = ClassWithAttribs.new
|
919
|
-
pc =
|
1000
|
+
pc = Pointcut.new :object => object, :attributes => [/^:attr.*ClassWithAttribs/]
|
920
1001
|
pc.join_points_matched.should == Set.new([
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
1002
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs),
|
1003
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs=),
|
1004
|
+
JoinPoint.new(:object => object, :method_name => :attrR_ClassWithAttribs),
|
1005
|
+
JoinPoint.new(:object => object, :method_name => :attrW_ClassWithAttribs=)])
|
925
1006
|
end
|
926
1007
|
|
927
1008
|
it "should match public attribute readers and writers for types when both the :readers and :writers options are specified." do
|
928
|
-
pc =
|
1009
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr.*ClassWithAttribs/], :attribute_options => [:readers, :writers]
|
929
1010
|
pc.join_points_matched.should == @expected_for_types
|
930
1011
|
end
|
931
1012
|
|
932
1013
|
it "should match public attribute readers and writers for objects when both the :readers and :writers options are specified." do
|
933
1014
|
object = ClassWithAttribs.new
|
934
|
-
pc =
|
1015
|
+
pc = Pointcut.new :object => object, :attributes => [/^:attr.*ClassWithAttribs/], :attribute_options => [:readers, :writers]
|
935
1016
|
pc.join_points_matched.should == Set.new([
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
1017
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs),
|
1018
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs=),
|
1019
|
+
JoinPoint.new(:object => object, :method_name => :attrR_ClassWithAttribs),
|
1020
|
+
JoinPoint.new(:object => object, :method_name => :attrW_ClassWithAttribs=)])
|
940
1021
|
end
|
941
1022
|
|
942
1023
|
it "should match public attribute readers for types only when the :readers option is specified." do
|
943
|
-
pc =
|
1024
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr.*ClassWithAttribs/], :attribute_options => [:readers]
|
944
1025
|
pc.join_points_matched.should == Set.new([
|
945
|
-
|
946
|
-
|
1026
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs),
|
1027
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrR_ClassWithAttribs)])
|
947
1028
|
end
|
948
1029
|
|
949
1030
|
it "should match public attribute readers for objects only when the :readers option is specified." do
|
950
1031
|
object = ClassWithAttribs.new
|
951
|
-
pc =
|
1032
|
+
pc = Pointcut.new :object => object, :attributes => [/^:attr.*ClassWithAttribs/], :attribute_options => [:readers]
|
952
1033
|
pc.join_points_matched.should == Set.new([
|
953
|
-
|
954
|
-
|
1034
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs),
|
1035
|
+
JoinPoint.new(:object => object, :method_name => :attrR_ClassWithAttribs)])
|
955
1036
|
end
|
956
1037
|
|
957
1038
|
it "should match public attribute writers for types only when the :writers option is specified." do
|
958
|
-
pc =
|
1039
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr.*ClassWithAttribs/], :attribute_options => [:writers]
|
959
1040
|
pc.join_points_matched.should == Set.new([
|
960
|
-
|
961
|
-
|
1041
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs=),
|
1042
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrW_ClassWithAttribs=)])
|
962
1043
|
end
|
963
1044
|
|
964
1045
|
it "should match public attribute writers for objects only when the :writers option is specified." do
|
965
1046
|
object = ClassWithAttribs.new
|
966
|
-
pc =
|
1047
|
+
pc = Pointcut.new :object => object, :attributes => [/^:attr.*ClassWithAttribs/], :attribute_options => [:writers]
|
967
1048
|
pc.join_points_matched.should == Set.new([
|
968
|
-
|
969
|
-
|
1049
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs=),
|
1050
|
+
JoinPoint.new(:object => object, :method_name => :attrW_ClassWithAttribs=)])
|
970
1051
|
end
|
971
1052
|
|
972
1053
|
it "should match attribute writers for types whether or not the attributes specification ends with an equal sign." do
|
973
|
-
pc =
|
1054
|
+
pc = Pointcut.new :types => "ClassWithAttribs",
|
974
1055
|
:attributes => [/^attr[RW]+_ClassWithAttribs=/], :attribute_options => [:writers]
|
975
1056
|
pc.join_points_matched.should == Set.new([
|
976
|
-
|
977
|
-
|
978
|
-
pc2 =
|
1057
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs=),
|
1058
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrW_ClassWithAttribs=)])
|
1059
|
+
pc2 = Pointcut.new :types => "ClassWithAttribs",
|
979
1060
|
:attributes => [/^attr[RW]+_ClassWithAttribs/], :attribute_options => [:writers]
|
980
1061
|
pc2.join_points_matched.should == Set.new([
|
981
|
-
|
982
|
-
|
1062
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs=),
|
1063
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrW_ClassWithAttribs=)])
|
983
1064
|
end
|
984
1065
|
|
985
1066
|
it "should match attribute writers for objects whether or not the attributes specification ends with an equal sign." do
|
986
1067
|
object = ClassWithAttribs.new
|
987
|
-
pc =
|
1068
|
+
pc = Pointcut.new :object => object, :attributes => [/^attr[RW]+_ClassWithAttribs=/], :attribute_options => [:writers]
|
988
1069
|
pc.join_points_matched.should == Set.new([
|
989
|
-
|
990
|
-
|
991
|
-
pc2 =
|
1070
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs=),
|
1071
|
+
JoinPoint.new(:object => object, :method_name => :attrW_ClassWithAttribs=)])
|
1072
|
+
pc2 = Pointcut.new :object => object, :attributes => [/^attr[RW]+_ClassWithAttribs/], :attribute_options => [:writers]
|
992
1073
|
pc2.join_points_matched.should == Set.new([
|
993
|
-
|
994
|
-
|
1074
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs=),
|
1075
|
+
JoinPoint.new(:object => object, :method_name => :attrW_ClassWithAttribs=)])
|
995
1076
|
end
|
996
1077
|
|
997
1078
|
it "should match attribute readers for types when the :readers option is specified even if the attributes specification ends with an equal sign!" do
|
998
|
-
pc =
|
1079
|
+
pc = Pointcut.new :types => "ClassWithAttribs",
|
999
1080
|
:attributes => [/^attr[RW]+_ClassWithAttribs=/], :attribute_options => [:readers]
|
1000
1081
|
pc.join_points_matched.should == Set.new([
|
1001
|
-
|
1002
|
-
|
1003
|
-
pc2 =
|
1082
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs),
|
1083
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrR_ClassWithAttribs)])
|
1084
|
+
pc2 = Pointcut.new :types => "ClassWithAttribs",
|
1004
1085
|
:attributes => [/^attr[RW]+_ClassWithAttribs=/], :attribute_options => [:readers]
|
1005
1086
|
pc2.join_points_matched.should == Set.new([
|
1006
|
-
|
1007
|
-
|
1087
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs),
|
1088
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrR_ClassWithAttribs)])
|
1008
1089
|
end
|
1009
1090
|
|
1010
1091
|
it "should match attribute readers for objects when the :readers option is specified even if the attributes specification ends with an equal sign!" do
|
1011
1092
|
object = ClassWithAttribs.new
|
1012
|
-
pc =
|
1093
|
+
pc = Pointcut.new :object => object, :attributes => [/^attr[RW]+_ClassWithAttribs=/], :attribute_options => [:readers]
|
1013
1094
|
pc.join_points_matched.should == Set.new([
|
1014
|
-
|
1015
|
-
|
1016
|
-
pc2 =
|
1095
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs),
|
1096
|
+
JoinPoint.new(:object => object, :method_name => :attrR_ClassWithAttribs)])
|
1097
|
+
pc2 = Pointcut.new :object => object, :attributes => [/^attr[RW]+_ClassWithAttribs/], :attribute_options => [:readers]
|
1017
1098
|
pc2.join_points_matched.should == Set.new([
|
1018
|
-
|
1019
|
-
|
1099
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs),
|
1100
|
+
JoinPoint.new(:object => object, :method_name => :attrR_ClassWithAttribs)])
|
1020
1101
|
end
|
1021
1102
|
end
|
1022
1103
|
|
1023
|
-
describe
|
1104
|
+
describe Pointcut, ".new (types or objects specified with :accessing regular expressions)" do
|
1105
|
+
before(:each) do
|
1106
|
+
before_pointcut_class_spec
|
1107
|
+
@jp_rwe = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
|
1108
|
+
@jp_rw = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
|
1109
|
+
@jp_we = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
|
1110
|
+
@jp_r = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrR_ClassWithAttribs
|
1111
|
+
@expected_for_types = Set.new([@jp_rw, @jp_rwe, @jp_r, @jp_we])
|
1112
|
+
@object_of_ClassWithAttribs = ClassWithAttribs.new
|
1113
|
+
@jp_rwe_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
|
1114
|
+
@jp_rw_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
|
1115
|
+
@jp_we_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
|
1116
|
+
@jp_r_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrR_ClassWithAttribs
|
1117
|
+
@expected_for_objects = Set.new([@jp_rw_o, @jp_rwe_o, @jp_r_o, @jp_we_o])
|
1118
|
+
end
|
1119
|
+
|
1120
|
+
it "should match on public attribute readers and writers for type names by default." do
|
1121
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :accessing => [/^attr/]
|
1122
|
+
pc.join_points_matched.size.should == 4
|
1123
|
+
pc.join_points_matched.should == @expected_for_types
|
1124
|
+
end
|
1125
|
+
|
1126
|
+
it "should match on public attribute readers and writers for types by default." do
|
1127
|
+
pc = Pointcut.new :types => ClassWithAttribs, :accessing => [/^attr/]
|
1128
|
+
pc.join_points_matched.should == @expected_for_types
|
1129
|
+
end
|
1130
|
+
|
1131
|
+
it "should match on public attribute readers and writers for objects by default." do
|
1132
|
+
pc = Pointcut.new :object => @object_of_ClassWithAttribs, :accessing => [/^attr/]
|
1133
|
+
pc.join_points_matched.should == @expected_for_objects
|
1134
|
+
end
|
1135
|
+
|
1136
|
+
it "should match attribute specifications for types that are prefixed with @." do
|
1137
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :accessing => [/^@attr.*ClassWithAttribs/]
|
1138
|
+
pc.join_points_matched.should == @expected_for_types
|
1139
|
+
end
|
1140
|
+
|
1141
|
+
it "should match attribute specifications for objects that are prefixed with @." do
|
1142
|
+
pc = Pointcut.new :object => @object_of_ClassWithAttribs, :accessing => [/^@attr.*ClassWithAttribs/]
|
1143
|
+
pc.join_points_matched.should == @expected_for_objects
|
1144
|
+
end
|
1145
|
+
|
1146
|
+
it "should match attribute specifications that are regular expressions of symbols." do
|
1147
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :accessing => [/^:attr.*ClassWithAttribs/]
|
1148
|
+
pc.join_points_matched.should == @expected_for_types
|
1149
|
+
end
|
1150
|
+
|
1151
|
+
it "should match attribute specifications for objects that are regular expressions of symbols." do
|
1152
|
+
object = ClassWithAttribs.new
|
1153
|
+
pc = Pointcut.new :object => object, :accessing => [/^:attr.*ClassWithAttribs/]
|
1154
|
+
pc.join_points_matched.should == Set.new([
|
1155
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs),
|
1156
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs=),
|
1157
|
+
JoinPoint.new(:object => object, :method_name => :attrR_ClassWithAttribs),
|
1158
|
+
JoinPoint.new(:object => object, :method_name => :attrW_ClassWithAttribs=)])
|
1159
|
+
end
|
1160
|
+
end
|
1161
|
+
|
1162
|
+
describe Pointcut, ".new (types or objects specified with reading and/or writing regular expressions)" do
|
1163
|
+
before(:each) do
|
1164
|
+
before_pointcut_class_spec
|
1165
|
+
@jp_rwe = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
|
1166
|
+
@jp_rw = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
|
1167
|
+
@jp_we = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
|
1168
|
+
@jp_r = JoinPoint.new :type => ClassWithAttribs, :method_name => :attrR_ClassWithAttribs
|
1169
|
+
@expected_for_types = Set.new([@jp_rw, @jp_rwe, @jp_r, @jp_we])
|
1170
|
+
@object_of_ClassWithAttribs = ClassWithAttribs.new
|
1171
|
+
@jp_rwe_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs=
|
1172
|
+
@jp_rw_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrRW_ClassWithAttribs
|
1173
|
+
@jp_we_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrW_ClassWithAttribs=
|
1174
|
+
@jp_r_o = JoinPoint.new :object => @object_of_ClassWithAttribs, :method_name => :attrR_ClassWithAttribs
|
1175
|
+
@expected_for_objects = Set.new([@jp_rw_o, @jp_rwe_o, @jp_r_o, @jp_we_o])
|
1176
|
+
end
|
1177
|
+
|
1178
|
+
it "should only allow :reading and :writing options together if they specify the same attributes." do
|
1179
|
+
lambda {Pointcut.new :types => "ClassWithAttribs", :reading => [/^attrRW_ClassWithAttribs/], :writing => [/^attr.*ClassWithAttribs/]}.should raise_error(Aquarium::Utils::InvalidOptions)
|
1180
|
+
end
|
1181
|
+
|
1182
|
+
it "should match public attribute readers and writers for types when both the :reading and :writing options are specified." do
|
1183
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :reading => [/^attr.*ClassWithAttribs/], :writing => [/^attr.*ClassWithAttribs/]
|
1184
|
+
pc.join_points_matched.should == @expected_for_types
|
1185
|
+
end
|
1186
|
+
|
1187
|
+
it "should match public attribute readers and writers for types when both the :reading and :changing options are specified." do
|
1188
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :reading => [/^attr.*ClassWithAttribs/], :changing => [/^attr.*ClassWithAttribs/]
|
1189
|
+
pc.join_points_matched.should == @expected_for_types
|
1190
|
+
end
|
1191
|
+
|
1192
|
+
it "should match public attribute readers and writers for objects when both the :reading and :writing options are specified." do
|
1193
|
+
object = ClassWithAttribs.new
|
1194
|
+
pc = Pointcut.new :object => object, :reading => [/^attr.*ClassWithAttribs/], :writing => [/^attr.*ClassWithAttribs/]
|
1195
|
+
pc.join_points_matched.should == Set.new([
|
1196
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs),
|
1197
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs=),
|
1198
|
+
JoinPoint.new(:object => object, :method_name => :attrR_ClassWithAttribs),
|
1199
|
+
JoinPoint.new(:object => object, :method_name => :attrW_ClassWithAttribs=)])
|
1200
|
+
end
|
1201
|
+
|
1202
|
+
it "should match public attribute readers for types only when the :reading option is specified." do
|
1203
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :reading => [/^attr.*ClassWithAttribs/]
|
1204
|
+
pc.join_points_matched.should == Set.new([
|
1205
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs),
|
1206
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrR_ClassWithAttribs)])
|
1207
|
+
end
|
1208
|
+
|
1209
|
+
it "should match public attribute readers for objects only when the :reading option is specified." do
|
1210
|
+
object = ClassWithAttribs.new
|
1211
|
+
pc = Pointcut.new :object => object, :reading => [/^:attr.*ClassWithAttribs/]
|
1212
|
+
pc.join_points_matched.should == Set.new([
|
1213
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs),
|
1214
|
+
JoinPoint.new(:object => object, :method_name => :attrR_ClassWithAttribs)])
|
1215
|
+
end
|
1216
|
+
|
1217
|
+
it "should match public attribute writers for types only when the :writing option is specified." do
|
1218
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :writing => [/^attr.*ClassWithAttribs/]
|
1219
|
+
pc.join_points_matched.should == Set.new([
|
1220
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs=),
|
1221
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrW_ClassWithAttribs=)])
|
1222
|
+
end
|
1223
|
+
|
1224
|
+
it "should match public attribute writers for objects only when the :writing option is specified." do
|
1225
|
+
object = ClassWithAttribs.new
|
1226
|
+
pc = Pointcut.new :object => object, :writing => [/^:attr.*ClassWithAttribs/]
|
1227
|
+
pc.join_points_matched.should == Set.new([
|
1228
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs=),
|
1229
|
+
JoinPoint.new(:object => object, :method_name => :attrW_ClassWithAttribs=)])
|
1230
|
+
end
|
1231
|
+
|
1232
|
+
it "should match attribute writers for types whether or not the attributes specification ends with an equal sign." do
|
1233
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :writing => [/^attr[RW]+_ClassWithAttribs=/]
|
1234
|
+
pc.join_points_matched.should == Set.new([
|
1235
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs=),
|
1236
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrW_ClassWithAttribs=)])
|
1237
|
+
pc2 = Pointcut.new :types => "ClassWithAttribs", :writing => [/^attr[RW]+_ClassWithAttribs/]
|
1238
|
+
pc2.join_points_matched.should == Set.new([
|
1239
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs=),
|
1240
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrW_ClassWithAttribs=)])
|
1241
|
+
end
|
1242
|
+
|
1243
|
+
it "should match attribute writers for objects whether or not the attributes specification ends with an equal sign." do
|
1244
|
+
object = ClassWithAttribs.new
|
1245
|
+
pc = Pointcut.new :object => object, :writing => [/^attr[RW]+_ClassWithAttribs=/]
|
1246
|
+
pc.join_points_matched.should == Set.new([
|
1247
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs=),
|
1248
|
+
JoinPoint.new(:object => object, :method_name => :attrW_ClassWithAttribs=)])
|
1249
|
+
pc2 = Pointcut.new :object => object, :writing => [/^attr[RW]+_ClassWithAttribs/]
|
1250
|
+
pc2.join_points_matched.should == Set.new([
|
1251
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs=),
|
1252
|
+
JoinPoint.new(:object => object, :method_name => :attrW_ClassWithAttribs=)])
|
1253
|
+
end
|
1254
|
+
|
1255
|
+
it "should match attribute readers for types when the :reading option is specified even if the attributes specification ends with an equal sign!" do
|
1256
|
+
pc = Pointcut.new :types => "ClassWithAttribs", :reading => [/^attr[RW]+_ClassWithAttribs=/]
|
1257
|
+
pc.join_points_matched.should == Set.new([
|
1258
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs),
|
1259
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrR_ClassWithAttribs)])
|
1260
|
+
pc2 = Pointcut.new :types => "ClassWithAttribs", :reading => [/^attr[RW]+_ClassWithAttribs=/]
|
1261
|
+
pc2.join_points_matched.should == Set.new([
|
1262
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrRW_ClassWithAttribs),
|
1263
|
+
JoinPoint.new(:type => "ClassWithAttribs", :method_name => :attrR_ClassWithAttribs)])
|
1264
|
+
end
|
1265
|
+
|
1266
|
+
it "should match attribute readers for objects when the :reading option is specified even if the attributes specification ends with an equal sign!" do
|
1267
|
+
object = ClassWithAttribs.new
|
1268
|
+
pc = Pointcut.new :object => object, :reading => [/^attr[RW]+_ClassWithAttribs=/]
|
1269
|
+
pc.join_points_matched.should == Set.new([
|
1270
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs),
|
1271
|
+
JoinPoint.new(:object => object, :method_name => :attrR_ClassWithAttribs)])
|
1272
|
+
pc2 = Pointcut.new :object => object, :reading => [/^attr[RW]+_ClassWithAttribs/]
|
1273
|
+
pc2.join_points_matched.should == Set.new([
|
1274
|
+
JoinPoint.new(:object => object, :method_name => :attrRW_ClassWithAttribs),
|
1275
|
+
JoinPoint.new(:object => object, :method_name => :attrR_ClassWithAttribs)])
|
1276
|
+
end
|
1277
|
+
end
|
1278
|
+
|
1279
|
+
describe Pointcut, ".new (join points specified)" do
|
1024
1280
|
before(:each) do
|
1025
1281
|
before_pointcut_class_spec
|
1026
1282
|
@anClassWithPublicInstanceMethod = ClassWithPublicInstanceMethod.new
|
1027
1283
|
@expected_matched = [@pub_jp, @pro_jp, @pri_jp, @cpub_jp, @cpri_jp,
|
1028
|
-
|
1284
|
+
JoinPoint.new(:object => @anClassWithPublicInstanceMethod, :method => :public_instance_test_method)]
|
1029
1285
|
@expected_not_matched = [
|
1030
|
-
|
1031
|
-
|
1286
|
+
JoinPoint.new(:type => ClassWithPublicInstanceMethod, :method => :foo),
|
1287
|
+
JoinPoint.new(:object => @anClassWithPublicInstanceMethod, :method => :foo)]
|
1032
1288
|
end
|
1033
1289
|
|
1034
1290
|
it "should return matches only for existing join points." do
|
1035
|
-
pc =
|
1291
|
+
pc = Pointcut.new :join_points => (@expected_matched + @expected_not_matched)
|
1036
1292
|
pc.join_points_matched.should == Set.new(@expected_matched)
|
1037
1293
|
end
|
1038
1294
|
|
1039
1295
|
it "should return non-matches for non-existing join points." do
|
1040
|
-
pc =
|
1296
|
+
pc = Pointcut.new :join_points => (@expected_matched + @expected_not_matched)
|
1297
|
+
pc.join_points_not_matched.should == Set.new(@expected_not_matched)
|
1298
|
+
end
|
1299
|
+
|
1300
|
+
it "should ignore :methods and :method_options for the join points specified." do
|
1301
|
+
pc = Pointcut.new :join_points => (@expected_matched + @expected_not_matched),
|
1302
|
+
:methods => :kind_of?, :method_options => [:class]
|
1303
|
+
pc.join_points_matched.should == Set.new(@expected_matched)
|
1304
|
+
pc.join_points_not_matched.should == Set.new(@expected_not_matched)
|
1305
|
+
end
|
1306
|
+
|
1307
|
+
it "should ignore :attributes and :attribute_options for the join points specified." do
|
1308
|
+
pc = Pointcut.new :join_points => (@expected_matched + @expected_not_matched),
|
1309
|
+
:attributes => :name, :attribute_options => [:readers]
|
1310
|
+
pc.join_points_matched.should == Set.new(@expected_matched)
|
1041
1311
|
pc.join_points_not_matched.should == Set.new(@expected_not_matched)
|
1042
1312
|
end
|
1043
1313
|
|
1044
|
-
it "should ignore :
|
1045
|
-
pc =
|
1046
|
-
:
|
1314
|
+
it "should ignore :accessing, :reading, and :writing for the join points specified." do
|
1315
|
+
pc = Pointcut.new :join_points => (@expected_matched + @expected_not_matched),
|
1316
|
+
:accessing => :name, :reading => :name, :writing => :name
|
1047
1317
|
pc.join_points_matched.should == Set.new(@expected_matched)
|
1048
1318
|
pc.join_points_not_matched.should == Set.new(@expected_not_matched)
|
1049
1319
|
end
|
1050
1320
|
end
|
1051
1321
|
|
1052
|
-
describe
|
1322
|
+
describe Pointcut, ".new (methods that end in non-alphanumeric characters)" do
|
1053
1323
|
class ClassWithFunkyMethodNames
|
1054
1324
|
def huh?; true; end
|
1055
1325
|
def yes!; true; end
|
@@ -1064,67 +1334,106 @@ describe Aquarium::Aspects::Pointcut, " (methods that end in non-alphanumeric ch
|
|
1064
1334
|
|
1065
1335
|
{'?' => :huh?, '!' => :yes!, '=' => :x=}.each do |char, method|
|
1066
1336
|
it "should match instance methods for types when searching for names that end with a '#{char}' character." do
|
1067
|
-
pc =
|
1068
|
-
expected_jp =
|
1337
|
+
pc = Pointcut.new :types => ClassWithFunkyMethodNames, :method => method, :method_options => [:exclude_ancestor_methods]
|
1338
|
+
expected_jp = JoinPoint.new :type => ClassWithFunkyMethodNames, :method_name => method
|
1069
1339
|
pc.join_points_matched.should == Set.new([expected_jp])
|
1070
1340
|
end
|
1071
1341
|
|
1072
1342
|
it "should match instance methods for objects when searching for names that end with a '#{char}' character." do
|
1073
|
-
pc =
|
1074
|
-
expected_jp =
|
1343
|
+
pc = Pointcut.new :object => @funky, :method => method, :method_options => [:exclude_ancestor_methods]
|
1344
|
+
expected_jp = JoinPoint.new :object => @funky, :method_name => method
|
1075
1345
|
pc.join_points_matched.should == Set.new([expected_jp])
|
1076
1346
|
end
|
1077
1347
|
|
1078
1348
|
it "should match instance methods for types when searching for names that end with a '#{char}' character, using a regular expressions." do
|
1079
|
-
pc =
|
1080
|
-
expected_jp =
|
1349
|
+
pc = Pointcut.new :types => ClassWithFunkyMethodNames, :methods => /#{Regexp.escape(char)}$/, :method_options => [:exclude_ancestor_methods]
|
1350
|
+
expected_jp = JoinPoint.new :type => ClassWithFunkyMethodNames, :method_name => method
|
1081
1351
|
pc.join_points_matched.should == Set.new([expected_jp])
|
1082
1352
|
end
|
1083
1353
|
|
1084
1354
|
it "should match instance methods for object when searching for names that end with a '#{char}' character, using a regular expressions." do
|
1085
|
-
pc =
|
1086
|
-
expected_jp =
|
1355
|
+
pc = Pointcut.new :object => @funky, :methods => /#{Regexp.escape(char)}$/, :method_options => [:exclude_ancestor_methods]
|
1356
|
+
expected_jp = JoinPoint.new :object => @funky, :method_name => method
|
1087
1357
|
pc.join_points_matched.should == Set.new([expected_jp])
|
1088
1358
|
end
|
1089
1359
|
end
|
1090
1360
|
|
1091
1361
|
{'=' => :==, '~' => :=~}.each do |char, method|
|
1092
1362
|
it "should match the #{method} instance method for types, if you don't suppress ancestor methods, even if the method is defined in the class!" do
|
1093
|
-
pc =
|
1094
|
-
expected_jp =
|
1363
|
+
pc = Pointcut.new :types => ClassWithFunkyMethodNames, :method => method, :method_options => [:instance]
|
1364
|
+
expected_jp = JoinPoint.new :type => ClassWithFunkyMethodNames, :method_name => method
|
1095
1365
|
pc.join_points_matched.should == Set.new([expected_jp])
|
1096
1366
|
end
|
1097
1367
|
|
1098
1368
|
it "should match the #{method} instance method for objects, if you don't suppress ancestor methods, even if the method is defined in the class!" do
|
1099
|
-
pc =
|
1100
|
-
expected_jp =
|
1369
|
+
pc = Pointcut.new :object => @funky, :method => method, :method_options => [:instance]
|
1370
|
+
expected_jp = JoinPoint.new :object => @funky, :method_name => method
|
1101
1371
|
pc.join_points_matched.should == Set.new([expected_jp])
|
1102
1372
|
end
|
1103
1373
|
|
1104
1374
|
it "should match the #{method} instance method for types when using a regular expressions, if you don't suppress ancestor methods, even if the method is defined in the class!" do
|
1105
|
-
pc =
|
1375
|
+
pc = Pointcut.new :types => ClassWithFunkyMethodNames, :methods => /#{Regexp.escape(char)}$/, :method_options => [:instance]
|
1106
1376
|
pc.join_points_matched.any? {|jp| jp.method_name == method}.should be_true
|
1107
1377
|
end
|
1108
1378
|
|
1109
1379
|
it "should match the #{method} instance method for objects when using a regular expressions, if you don't suppress ancestor methods, even if the method is defined in the class!" do
|
1110
|
-
pc =
|
1380
|
+
pc = Pointcut.new :object => @funky, :methods => /#{Regexp.escape(char)}$/, :method_options => [:instance]
|
1111
1381
|
pc.join_points_matched.any? {|jp| jp.method_name == method}.should be_true
|
1112
1382
|
end
|
1113
1383
|
end
|
1114
1384
|
end
|
1115
1385
|
|
1116
|
-
describe
|
1386
|
+
describe Pointcut, ".new (:attributes => :all option not yet supported)" do
|
1387
|
+
it "should raise if :all is used for types (not yet supported)." do
|
1388
|
+
lambda { Pointcut.new :types => "ClassWithAttribs", :attributes => :all }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1389
|
+
end
|
1390
|
+
|
1391
|
+
it "should raise if :all is used for objects (not yet supported)." do
|
1392
|
+
lambda { Pointcut.new :object => ClassWithAttribs.new, :attributes => :all }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1393
|
+
end
|
1394
|
+
end
|
1395
|
+
|
1396
|
+
describe Pointcut, ".new (:accessing => :all option not yet supported)" do
|
1397
|
+
it "should raise if :all is used for types (not yet supported)." do
|
1398
|
+
lambda { Pointcut.new :types => "ClassWithAttribs", :accessing => :all }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1399
|
+
end
|
1400
|
+
|
1401
|
+
it "should raise if :all is used for objects (not yet supported)." do
|
1402
|
+
lambda { Pointcut.new :object => ClassWithAttribs.new, :accessing => :all }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1403
|
+
end
|
1404
|
+
end
|
1405
|
+
|
1406
|
+
describe Pointcut, ".new (:changing => :all option not yet supported)" do
|
1407
|
+
it "should raise if :all is used for types (not yet supported)." do
|
1408
|
+
lambda { Pointcut.new :types => "ClassWithAttribs", :changing => :all }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1409
|
+
end
|
1410
|
+
|
1411
|
+
it "should raise if :all is used for objects (not yet supported)." do
|
1412
|
+
lambda { Pointcut.new :object => ClassWithAttribs.new, :changing => :all }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1413
|
+
end
|
1414
|
+
end
|
1415
|
+
|
1416
|
+
describe Pointcut, ".new (:reading => :all option not yet supported)" do
|
1417
|
+
it "should raise if :all is used for types (not yet supported)." do
|
1418
|
+
lambda { Pointcut.new :types => "ClassWithAttribs", :reading => :all }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1419
|
+
end
|
1117
1420
|
|
1118
|
-
it "should raise if :all is used for
|
1119
|
-
lambda {
|
1421
|
+
it "should raise if :all is used for objects (not yet supported)." do
|
1422
|
+
lambda { Pointcut.new :object => ClassWithAttribs.new, :reading => :all }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1423
|
+
end
|
1424
|
+
end
|
1425
|
+
|
1426
|
+
describe Pointcut, ".new (:writing => :all option not yet supported)" do
|
1427
|
+
it "should raise if :all is used for types (not yet supported)." do
|
1428
|
+
lambda { Pointcut.new :types => "ClassWithAttribs", :writing => :all }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1120
1429
|
end
|
1121
1430
|
|
1122
|
-
it "should raise if :all is used for
|
1123
|
-
lambda {
|
1431
|
+
it "should raise if :all is used for objects (not yet supported)." do
|
1432
|
+
lambda { Pointcut.new :object => ClassWithAttribs.new, :writing => :all }.should raise_error(Aquarium::Utils::InvalidOptions)
|
1124
1433
|
end
|
1125
1434
|
end
|
1126
1435
|
|
1127
|
-
describe
|
1436
|
+
describe Pointcut, ".new (singletons specified)" do
|
1128
1437
|
|
1129
1438
|
before(:each) do
|
1130
1439
|
class Empty; end
|
@@ -1145,151 +1454,173 @@ describe "Aquarium::Aspects::Pointcut" do
|
|
1145
1454
|
end
|
1146
1455
|
|
1147
1456
|
it "should find instance-level singleton method joinpoints for objects when :singleton is specified." do
|
1148
|
-
pc =
|
1149
|
-
pc.join_points_matched.should == Set.new([
|
1150
|
-
pc.join_points_not_matched.should == Set.new([
|
1457
|
+
pc = Pointcut.new :objects => [@notQuiteEmpty, @objectWithSingletonMethod], :methods => :all, :method_options => [:singleton]
|
1458
|
+
pc.join_points_matched.should == Set.new([JoinPoint.new(:object => @objectWithSingletonMethod, :method_name => :a_singleton_method)])
|
1459
|
+
pc.join_points_not_matched.should == Set.new([JoinPoint.new(:object => @notQuiteEmpty, :method_name => :all)])
|
1151
1460
|
end
|
1152
1461
|
|
1153
1462
|
it "should find type-level singleton methods for types when :singleton is specified." do
|
1154
|
-
pc =
|
1155
|
-
pc.join_points_matched.should == Set.new([
|
1156
|
-
pc.join_points_not_matched.should == Set.new([
|
1463
|
+
pc = Pointcut.new :types => [NotQuiteEmpty, Empty], :methods => :all, :method_options => [:singleton, :exclude_ancestor_methods]
|
1464
|
+
pc.join_points_matched.should == Set.new([JoinPoint.new(:type => NotQuiteEmpty, :method_name => :a_class_singleton_method)])
|
1465
|
+
pc.join_points_not_matched.should == Set.new([JoinPoint.new(:type => Empty, :method_name => :all)])
|
1157
1466
|
end
|
1158
1467
|
|
1159
1468
|
it "should raise when specifying method options :singleton with :class, :public, :protected, or :private." do
|
1160
|
-
lambda {
|
1161
|
-
lambda {
|
1162
|
-
lambda {
|
1163
|
-
lambda {
|
1469
|
+
lambda { Pointcut.new :types => [NotQuiteEmpty, Empty], :methods => :all, :method_options => [:singleton, :class]}.should raise_error(Aquarium::Utils::InvalidOptions)
|
1470
|
+
lambda { Pointcut.new :types => [NotQuiteEmpty, Empty], :methods => :all, :method_options => [:singleton, :public]}.should raise_error(Aquarium::Utils::InvalidOptions)
|
1471
|
+
lambda { Pointcut.new :types => [NotQuiteEmpty, Empty], :methods => :all, :method_options => [:singleton, :protected]}.should raise_error(Aquarium::Utils::InvalidOptions)
|
1472
|
+
lambda { Pointcut.new :types => [NotQuiteEmpty, Empty], :methods => :all, :method_options => [:singleton, :private]}.should raise_error(Aquarium::Utils::InvalidOptions)
|
1164
1473
|
end
|
1165
1474
|
end
|
1166
1475
|
|
1476
|
+
describe Pointcut, "#empty?" do
|
1477
|
+
it "should be true if there are no matched and no unmatched join points." do
|
1478
|
+
pc = Pointcut.new
|
1479
|
+
pc.join_points_matched.size.should == 0
|
1480
|
+
pc.join_points_not_matched.size.should == 0
|
1481
|
+
pc.should be_empty
|
1482
|
+
end
|
1483
|
+
|
1484
|
+
it "should be false if there are matched join points." do
|
1485
|
+
pc = Pointcut.new :types => [ClassWithAttribs], :methods => [/^attr/]
|
1486
|
+
pc.join_points_matched.size.should > 0
|
1487
|
+
pc.join_points_not_matched.size.should == 0
|
1488
|
+
pc.should_not be_empty
|
1489
|
+
end
|
1490
|
+
|
1491
|
+
it "should be false if there are unmatched join points." do
|
1492
|
+
pc = Pointcut.new :types => [String], :methods => [/^attr/]
|
1493
|
+
pc.join_points_matched.size.should == 0
|
1494
|
+
pc.join_points_not_matched.size.should > 0
|
1495
|
+
pc.should_not be_empty
|
1496
|
+
end
|
1497
|
+
end
|
1167
1498
|
|
1168
|
-
describe
|
1169
|
-
it "should return true for the same
|
1170
|
-
pc =
|
1499
|
+
describe Pointcut, "#eql?" do
|
1500
|
+
it "should return true for the same Pointcut object." do
|
1501
|
+
pc = Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
|
1171
1502
|
pc.should be_eql(pc)
|
1172
|
-
pc1 =
|
1503
|
+
pc1 = Pointcut.new :object => ClassWithPublicClassMethod.new, :methods => /_test_method$/
|
1173
1504
|
pc1.should be_eql(pc1)
|
1174
1505
|
end
|
1175
1506
|
|
1176
|
-
it "should return true for
|
1177
|
-
pc1 =
|
1178
|
-
pc2 =
|
1507
|
+
it "should return true for Pointcuts that specify the same types and methods." do
|
1508
|
+
pc1 = Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
|
1509
|
+
pc2 = Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
|
1179
1510
|
pc1.should be_eql(pc2)
|
1180
1511
|
end
|
1181
1512
|
|
1182
1513
|
it "should return false if the matched types are different." do
|
1183
|
-
pc1 =
|
1184
|
-
pc2 =
|
1514
|
+
pc1 = Pointcut.new :types => /ClassWithPublicMethod/
|
1515
|
+
pc2 = Pointcut.new :types => /Class.*Method/
|
1185
1516
|
pc1.should_not eql(pc2)
|
1186
1517
|
end
|
1187
1518
|
|
1188
|
-
it "should return false for
|
1189
|
-
pc1 =
|
1190
|
-
pc2 =
|
1519
|
+
it "should return false for Pointcuts that specify different types, even if no methods match." do
|
1520
|
+
pc1 = Pointcut.new :types => /ClassWithPublicMethod/, :methods => /foobar/
|
1521
|
+
pc2 = Pointcut.new :types => /Class.*Method/ , :methods => /foobar/
|
1191
1522
|
pc1.should_not eql(pc2)
|
1192
1523
|
end
|
1193
1524
|
|
1194
|
-
it "should return false for
|
1195
|
-
pc1 =
|
1196
|
-
pc2 =
|
1525
|
+
it "should return false for Pointcuts that specify different methods." do
|
1526
|
+
pc1 = Pointcut.new :types => /ClassWithPublicMethod/, :methods =>/^private/
|
1527
|
+
pc2 = Pointcut.new :types => /ClassWithPublicMethod/, :methods =>/^public/
|
1197
1528
|
pc1.should_not eql(pc2)
|
1198
1529
|
end
|
1199
1530
|
|
1200
|
-
it "should return false for
|
1201
|
-
pc1 =
|
1202
|
-
pc2 =
|
1531
|
+
it "should return false for Pointcuts that specify equivalent objects that are not the same object." do
|
1532
|
+
pc1 = Pointcut.new :object => ClassWithPublicClassMethod.new, :methods => /_test_method$/
|
1533
|
+
pc2 = Pointcut.new :object => ClassWithPublicClassMethod.new, :methods => /_test_method$/
|
1203
1534
|
pc1.should_not eql(pc2)
|
1204
1535
|
end
|
1205
1536
|
|
1206
|
-
it "should return false for
|
1207
|
-
pc1 =
|
1208
|
-
pc2 =
|
1537
|
+
it "should return false for Pointcuts that specify equivalent objects that are not the same object, even if no methods match." do
|
1538
|
+
pc1 = Pointcut.new :object => ClassWithPublicClassMethod.new, :methods => /foobar/
|
1539
|
+
pc2 = Pointcut.new :object => ClassWithPublicClassMethod.new, :methods => /foobar/
|
1209
1540
|
pc1.should_not eql(pc2)
|
1210
1541
|
end
|
1211
1542
|
|
1212
1543
|
it "should return false if the matched objects are different objects." do
|
1213
|
-
pc1 =
|
1214
|
-
pc2 =
|
1544
|
+
pc1 = Pointcut.new :object => ClassWithPublicClassMethod.new, :methods => /_test_method$/
|
1545
|
+
pc2 = Pointcut.new :object => ClassWithPrivateClassMethod.new, :methods => /_test_method$/
|
1215
1546
|
pc1.should_not eql(pc2)
|
1216
1547
|
end
|
1217
1548
|
|
1218
1549
|
it "should return true if the matched objects are the same object." do
|
1219
1550
|
object = ClassWithPublicClassMethod.new
|
1220
|
-
pc1 =
|
1221
|
-
pc2 =
|
1551
|
+
pc1 = Pointcut.new :object => object, :methods => /_test_method$/
|
1552
|
+
pc2 = Pointcut.new :object => object, :methods => /_test_method$/
|
1222
1553
|
pc1.should eql(pc2)
|
1223
1554
|
end
|
1224
1555
|
|
1225
1556
|
it "should return false if the not_matched types are different." do
|
1226
|
-
pc1 =
|
1227
|
-
pc2 =
|
1557
|
+
pc1 = Pointcut.new :types => :UnknownFoo
|
1558
|
+
pc2 = Pointcut.new :types => :UnknownBar
|
1228
1559
|
pc1.should_not eql(pc2)
|
1229
1560
|
end
|
1230
1561
|
|
1231
1562
|
it "should return false if the matched methods for the same types are different." do
|
1232
|
-
pc1 =
|
1233
|
-
pc2 =
|
1563
|
+
pc1 = Pointcut.new :types => /Class.*Method/, :methods => /public.*_test_method$/
|
1564
|
+
pc2 = Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
|
1234
1565
|
pc1.should_not == pc2
|
1235
1566
|
end
|
1236
1567
|
|
1237
1568
|
it "should return false if the matched methods for the same objects are different." do
|
1238
1569
|
pub = ClassWithPublicInstanceMethod.new
|
1239
1570
|
pri = ClassWithPrivateInstanceMethod.new
|
1240
|
-
pc1 =
|
1241
|
-
pc2 =
|
1571
|
+
pc1 = Pointcut.new :objects => [pub, pri], :methods => /public.*_test_method$/
|
1572
|
+
pc2 = Pointcut.new :objects => [pub, pri], :methods => /_test_method$/
|
1242
1573
|
pc1.should_not == pc2
|
1243
1574
|
end
|
1244
1575
|
|
1245
1576
|
it "should return false if the not_matched methods for the same types are different." do
|
1246
|
-
pc1 =
|
1247
|
-
pc2 =
|
1577
|
+
pc1 = Pointcut.new :types => /Class.*Method/, :methods => /foo/
|
1578
|
+
pc2 = Pointcut.new :types => /Class.*Method/, :methods => /bar/
|
1248
1579
|
pc1.should_not == pc2
|
1249
1580
|
end
|
1250
1581
|
|
1251
1582
|
it "should return false if the not_matched methods for the same objects are different." do
|
1252
1583
|
pub = ClassWithPublicInstanceMethod.new
|
1253
1584
|
pri = ClassWithPrivateInstanceMethod.new
|
1254
|
-
pc1 =
|
1255
|
-
pc2 =
|
1585
|
+
pc1 = Pointcut.new :objects => [pub, pri], :methods => /foo/
|
1586
|
+
pc2 = Pointcut.new :objects => [pub, pri], :methods => /bar/
|
1256
1587
|
pc1.should_not == pc2
|
1257
1588
|
end
|
1258
1589
|
|
1259
1590
|
it "should return false if the matched attributes for the same types are different." do
|
1260
|
-
pc1 =
|
1261
|
-
pc2 =
|
1591
|
+
pc1 = Pointcut.new :types => /Class.*Method/, :attributes => /attrRW/
|
1592
|
+
pc2 = Pointcut.new :types => /Class.*Method/, :attributes => /attrR/
|
1262
1593
|
pc1.should_not == pc2
|
1263
1594
|
end
|
1264
1595
|
|
1265
1596
|
it "should return false if the matched attributes for the same objects are different." do
|
1266
1597
|
pub = ClassWithPublicInstanceMethod.new
|
1267
1598
|
pri = ClassWithPrivateInstanceMethod.new
|
1268
|
-
pc1 =
|
1269
|
-
pc2 =
|
1599
|
+
pc1 = Pointcut.new :objects => [pub, pri], :attributes => /attrRW/
|
1600
|
+
pc2 = Pointcut.new :objects => [pub, pri], :attributes => /attrR/
|
1270
1601
|
pc1.should_not == pc2
|
1271
1602
|
end
|
1272
1603
|
|
1273
1604
|
it "should return false if the not_matched attributes for the same types are different." do
|
1274
|
-
pc1 =
|
1275
|
-
pc2 =
|
1605
|
+
pc1 = Pointcut.new :types => /Class.*Method/, :attributes => /foo/
|
1606
|
+
pc2 = Pointcut.new :types => /Class.*Method/, :attributes => /bar/
|
1276
1607
|
pc1.should_not == pc2
|
1277
1608
|
end
|
1278
1609
|
|
1279
1610
|
it "should return false if the not_matched attributes for the same objects are different." do
|
1280
1611
|
pub = ClassWithPublicInstanceMethod.new
|
1281
1612
|
pri = ClassWithPrivateInstanceMethod.new
|
1282
|
-
pc1 =
|
1283
|
-
pc2 =
|
1613
|
+
pc1 = Pointcut.new :objects => [pub, pri], :attributes => /foo/
|
1614
|
+
pc2 = Pointcut.new :objects => [pub, pri], :attributes => /bar/
|
1284
1615
|
pc1.should_not == pc2
|
1285
1616
|
end
|
1286
1617
|
end
|
1287
1618
|
|
1288
|
-
describe "
|
1619
|
+
describe "Pointcut#eql?" do
|
1289
1620
|
it "should be an alias for #==" do
|
1290
|
-
pc1 =
|
1291
|
-
pc2 =
|
1292
|
-
pc3 =
|
1621
|
+
pc1 = Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
|
1622
|
+
pc2 = Pointcut.new :types => /Class.*Method/, :methods => /_test_method$/
|
1623
|
+
pc3 = Pointcut.new :objects => [ClassWithPublicInstanceMethod.new, ClassWithPublicInstanceMethod.new]
|
1293
1624
|
pc1.should be_eql(pc1)
|
1294
1625
|
pc1.should be_eql(pc2)
|
1295
1626
|
pc1.should_not eql(pc3)
|
@@ -1297,44 +1628,44 @@ describe "Aquarium::Aspects::Pointcut#eql?" do
|
|
1297
1628
|
end
|
1298
1629
|
end
|
1299
1630
|
|
1300
|
-
describe
|
1631
|
+
describe Pointcut, "#candidate_types" do
|
1301
1632
|
before(:each) do
|
1302
1633
|
before_pointcut_class_spec
|
1303
1634
|
end
|
1304
1635
|
|
1305
1636
|
it "should return only candidate matching types when the input types exist." do
|
1306
|
-
pc =
|
1637
|
+
pc = Pointcut.new :types => @example_classes
|
1307
1638
|
pc.candidate_types.matched_keys.sort {|x,y| x.to_s <=> y.to_s}.should == @example_classes.sort {|x,y| x.to_s <=> y.to_s}
|
1308
1639
|
pc.candidate_types.not_matched_keys.should == []
|
1309
1640
|
end
|
1310
1641
|
|
1311
1642
|
it "should return only candidate matching types when the input type names correspond to existing types." do
|
1312
|
-
pc =
|
1643
|
+
pc = Pointcut.new :types => @example_classes.map {|t| t.to_s}
|
1313
1644
|
pc.candidate_types.matched_keys.sort {|x,y| x.to_s <=> y.to_s}.should == @example_classes.sort {|x,y| x.to_s <=> y.to_s}
|
1314
1645
|
pc.candidate_types.not_matched_keys.should == []
|
1315
1646
|
end
|
1316
1647
|
|
1317
1648
|
it "should return only candidate non-matching types when the input types do not exist." do
|
1318
|
-
pc =
|
1649
|
+
pc = Pointcut.new :types => 'NonExistentClass'
|
1319
1650
|
pc.candidate_types.matched_keys.should == []
|
1320
1651
|
pc.candidate_types.not_matched_keys.should == ['NonExistentClass']
|
1321
1652
|
end
|
1322
1653
|
|
1323
1654
|
it "should return no candidate matching or non-matching types when only objects are input." do
|
1324
|
-
pc =
|
1655
|
+
pc = Pointcut.new :objects => @example_classes.map {|t| t.new}
|
1325
1656
|
pc.candidate_types.matched_keys.should == []
|
1326
1657
|
pc.candidate_types.not_matched_keys.should == []
|
1327
1658
|
end
|
1328
1659
|
end
|
1329
1660
|
|
1330
|
-
describe
|
1661
|
+
describe Pointcut, "#candidate_objects" do
|
1331
1662
|
before(:each) do
|
1332
1663
|
before_pointcut_class_spec
|
1333
1664
|
end
|
1334
1665
|
|
1335
1666
|
it "should return only candidate matching objects when the input are objects." do
|
1336
1667
|
example_objs = @example_classes.map {|t| t.new}
|
1337
|
-
pc =
|
1668
|
+
pc = Pointcut.new :objects => example_objs
|
1338
1669
|
example_objs.each do |obj|
|
1339
1670
|
pc.candidate_objects.matched[obj].should_not be(nil?)
|
1340
1671
|
end
|
@@ -1342,7 +1673,7 @@ describe Aquarium::Aspects::Pointcut, "#candidate_objects" do
|
|
1342
1673
|
end
|
1343
1674
|
end
|
1344
1675
|
|
1345
|
-
describe
|
1676
|
+
describe Pointcut, "#candidate_join_points" do
|
1346
1677
|
before(:each) do
|
1347
1678
|
before_pointcut_class_spec
|
1348
1679
|
end
|
@@ -1350,9 +1681,9 @@ describe Aquarium::Aspects::Pointcut, "#candidate_join_points" do
|
|
1350
1681
|
it "should return only candidate non-matching join points for the input join points that do not exist." do
|
1351
1682
|
anClassWithPublicInstanceMethod = ClassWithPublicInstanceMethod.new
|
1352
1683
|
example_jps = [
|
1353
|
-
|
1354
|
-
|
1355
|
-
pc =
|
1684
|
+
JoinPoint.new(:type => ClassWithPublicInstanceMethod, :method => :foo),
|
1685
|
+
JoinPoint.new(:object => anClassWithPublicInstanceMethod, :method => :foo)]
|
1686
|
+
pc = Pointcut.new :join_points => example_jps
|
1356
1687
|
pc.candidate_join_points.matched.size.should == 0
|
1357
1688
|
pc.candidate_join_points.not_matched[example_jps[0]].should_not be_nil
|
1358
1689
|
pc.candidate_join_points.not_matched[example_jps[1]].should_not be_nil
|
@@ -1361,9 +1692,9 @@ describe Aquarium::Aspects::Pointcut, "#candidate_join_points" do
|
|
1361
1692
|
it "should return only candidate matching join points for the input join points that do exist." do
|
1362
1693
|
anClassWithPublicInstanceMethod = ClassWithPublicInstanceMethod.new
|
1363
1694
|
example_jps = [
|
1364
|
-
|
1365
|
-
|
1366
|
-
pc =
|
1695
|
+
JoinPoint.new(:type => ClassWithPublicInstanceMethod, :method => :public_instance_test_method),
|
1696
|
+
JoinPoint.new(:object => anClassWithPublicInstanceMethod, :method => :public_instance_test_method)]
|
1697
|
+
pc = Pointcut.new :join_points => example_jps
|
1367
1698
|
pc.candidate_join_points.matched.size.should == 2
|
1368
1699
|
pc.candidate_join_points.matched[example_jps[0]].should_not be_nil
|
1369
1700
|
pc.candidate_join_points.matched[example_jps[1]].should_not be_nil
|
@@ -1371,7 +1702,7 @@ describe Aquarium::Aspects::Pointcut, "#candidate_join_points" do
|
|
1371
1702
|
end
|
1372
1703
|
end
|
1373
1704
|
|
1374
|
-
describe
|
1705
|
+
describe Pointcut, "#specification" do
|
1375
1706
|
before(:each) do
|
1376
1707
|
before_pointcut_class_spec
|
1377
1708
|
@empty_set = Set.new
|
@@ -1379,7 +1710,7 @@ describe Aquarium::Aspects::Pointcut, "#specification" do
|
|
1379
1710
|
:types => @empty_set, :objects => @empty_set, :join_points => @empty_set,
|
1380
1711
|
:types_and_ancestors => @empty_set,
|
1381
1712
|
:types_and_descendents => @empty_set,
|
1382
|
-
:methods => @empty_set, :method_options =>
|
1713
|
+
:methods => @empty_set, :method_options => Set.new([:instance]),
|
1383
1714
|
:attributes => @empty_set, :attribute_options => @empty_set,
|
1384
1715
|
:exclude_types => @empty_set,
|
1385
1716
|
:exclude_types_calculated => @empty_set,
|
@@ -1389,66 +1720,52 @@ describe Aquarium::Aspects::Pointcut, "#specification" do
|
|
1389
1720
|
:exclude_join_points => @empty_set,
|
1390
1721
|
:exclude_pointcuts => @empty_set,
|
1391
1722
|
:exclude_methods => @empty_set,
|
1392
|
-
:default_objects => @empty_set
|
1723
|
+
:default_objects => @empty_set,
|
1724
|
+
:log => Set.new([""]),
|
1725
|
+
:verbose => Set.new([0]),
|
1726
|
+
:noop => Set.new([false])
|
1727
|
+
}
|
1393
1728
|
@default_specification_all_methods = { :methods => Set.new([:all]) } | @default_specification
|
1394
1729
|
end
|
1395
1730
|
|
1396
1731
|
it "should return ':attribute_options => []', by default, if no arguments are given." do
|
1397
|
-
pc =
|
1732
|
+
pc = Pointcut.new
|
1398
1733
|
pc.specification.should == @default_specification_all_methods
|
1399
1734
|
end
|
1400
1735
|
|
1401
1736
|
it "should return the input :types and :type arguments combined into an array keyed by :types." do
|
1402
|
-
pc =
|
1737
|
+
pc = Pointcut.new :types => @example_classes, :type => String
|
1403
1738
|
pc.specification.should == { :types => Set.new(@example_classes + [String]) } | @default_specification_all_methods
|
1404
1739
|
end
|
1405
1740
|
|
1406
1741
|
it "should return the input :objects and :object arguments combined into an array keyed by :objects." do
|
1407
1742
|
example_objs = @example_classes.map {|t| t.new}
|
1408
1743
|
s1234 = "1234"
|
1409
|
-
pc =
|
1744
|
+
pc = Pointcut.new :objects => example_objs, :object => s1234
|
1410
1745
|
pc.specification.should == { :objects => Set.new(example_objs + [s1234]) } | @default_specification_all_methods
|
1411
1746
|
end
|
1412
1747
|
|
1413
1748
|
it "should return the input :methods and :method arguments combined into an array keyed by :methods." do
|
1414
|
-
pc =
|
1749
|
+
pc = Pointcut.new :types => @example_classes, :methods => /^get/, :method => "dup"
|
1415
1750
|
pc.specification.should == { :types => Set.new(@example_classes), :methods => Set.new([/^get/, "dup"]) } | @default_specification
|
1416
1751
|
end
|
1417
1752
|
|
1418
1753
|
it "should return the input :method_options verbatim." do
|
1419
|
-
pc =
|
1754
|
+
pc = Pointcut.new :types => @example_classes, :methods => /^get/, :method => "dup", :method_options => [:instance, :public]
|
1420
1755
|
pc.specification.should == { :types => Set.new(@example_classes), :methods => Set.new([/^get/, "dup"]),
|
1421
1756
|
:method_options => Set.new([:instance, :public]), :default_objects => @empty_set } | @default_specification
|
1422
1757
|
end
|
1423
1758
|
|
1424
1759
|
it "should return the input :methods and :method arguments combined into an array keyed by :methods." do
|
1425
|
-
pc =
|
1760
|
+
pc = Pointcut.new :types => @example_classes, :attributes => /^state/, :attribute => "name"
|
1426
1761
|
pc.specification.should == { :types => Set.new(@example_classes), :objects => @empty_set, :join_points => @empty_set,
|
1427
1762
|
:methods => @empty_set, :method_options => Set.new([]), :default_objects => @empty_set,
|
1428
1763
|
:attributes => Set.new([/^state/, "name"]), :attribute_options => @empty_set } | @default_specification
|
1429
1764
|
end
|
1430
1765
|
|
1431
1766
|
it "should return the input :attributes, :attribute and :attribute_options arguments, verbatim." do
|
1432
|
-
pc =
|
1767
|
+
pc = Pointcut.new :types => @example_classes, :attributes => /^state/, :attribute => "name", :attribute_options => :reader
|
1433
1768
|
pc.specification.should == { :types => Set.new(@example_classes), :attributes => Set.new([/^state/, "name"]),
|
1434
1769
|
:attribute_options => Set.new([:reader]) } | @default_specification
|
1435
1770
|
end
|
1436
1771
|
end
|
1437
|
-
|
1438
|
-
describe "Aquarium::Aspects::Pointcut.make_attribute_method_names" do
|
1439
|
-
before do
|
1440
|
-
@expected_attribs = Set.new(%w[a a= b b= c c= d d=])
|
1441
|
-
end
|
1442
|
-
|
1443
|
-
it "should generate attribute reader and writer method names when the attribute name is prefixed with @." do
|
1444
|
-
Aquarium::Aspects::Pointcut.make_attribute_method_names(%w[@a @b @c @d]).should == @expected_attribs
|
1445
|
-
end
|
1446
|
-
|
1447
|
-
it "should generate attribute reader and writer method names when the attribute name is not prefixed with @." do
|
1448
|
-
Aquarium::Aspects::Pointcut.make_attribute_method_names(%w[a b c d]).should == @expected_attribs
|
1449
|
-
end
|
1450
|
-
|
1451
|
-
it "should generate attribute reader and writer method names when the attribute name is a symbol." do
|
1452
|
-
Aquarium::Aspects::Pointcut.make_attribute_method_names([:a, :b, :c, :d]).should == @expected_attribs
|
1453
|
-
end
|
1454
|
-
end
|