C0 code coverage information
Generated on Sun Oct 26 11:18:06 -0500 2008 with rcov 0.8.1.2
Code reported as executed by Ruby looks like this...
and this: this line is also marked as covered.
Lines considered as run by rcov, but not reported by Ruby, look like this,
and this: these lines were inferred by rcov (using simple heuristics).
Finally, here's a line marked as not executed.
1 require File.dirname(__FILE__) + '/../spec_helper'
2 require 'aquarium/spec_example_types'
3 require 'aquarium/utils'
4 require 'aquarium/extensions'
5 require 'aquarium/aspects/pointcut'
6 require 'aquarium/aspects/pointcut_composition'
7
8 include Aquarium::Utils::HashUtils
9 include Aquarium::Aspects
10
11 describe Pointcut, "#or" do
12
13 before :all do
14 @pc1 = Pointcut.new
15 @pc2 = Pointcut.new :types => /Class.*Public.*Method/, :method_options => [:exclude_ancestor_methods]
16 @pc3 = Pointcut.new :object => ClassWithProtectedInstanceMethod.new, :method_options => [:protected, :exclude_ancestor_methods]
17 end
18
19 it "should return a new Pointcut equal to the second, appended, non-empty Pointcut if self is empty (has no join points)." do
20 @pc1.or(@pc2).should eql(@pc2)
21 @pc1.or(@pc3).should eql(@pc3)
22 end
23
24 it "should return a new Pointcut equal to self if the second pointcut is empty." do
25 @pc2.or(@pc1).should eql(@pc2)
26 @pc3.or(@pc1).should eql(@pc3)
27 end
28 end
29
30 describe Pointcut, "#or (with two non-empty pointcuts)" do
31
32 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
33 pc4 = Pointcut.new :type => ClassWithPublicInstanceMethod, :method_options => :exclude_ancestor_methods
34 pc5 = Pointcut.new :type => ClassWithAttribs, :methods => /^attr.*=$/, :method_options => :exclude_ancestor_methods
35 jp_np1 = JoinPoint.new :type => ClassIncludingModuleWithPublicInstanceMethod, :method => :public_instance_class_including_module_test_method
36 jp_np2 = JoinPoint.new :type => ModuleWithPublicInstanceMethod, :method => :public_instance_module_test_method
37 pc4.join_points_not_matched << jp_np1
38 pc5.join_points_not_matched << jp_np2
39 pc = pc4.or pc5
40 jp1 = JoinPoint.new :type => ClassWithAttribs, :method => :attrRW_ClassWithAttribs=
41 jp2 = JoinPoint.new :type => ClassWithAttribs, :method => :attrW_ClassWithAttribs=
42 jp3 = JoinPoint.new :type => ClassWithPublicInstanceMethod, :method => :public_instance_test_method
43 pc.join_points_matched.should == Set.new([jp1, jp2, jp3])
44 pc.join_points_not_matched.should == Set.new([jp_np1, jp_np2])
45 end
46
47 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
48 cwa = ClassWithAttribs.new
49 pub = ClassWithPublicInstanceMethod.new
50 pc4 = Pointcut.new :objects => [cwa], :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
51 pc5 = Pointcut.new :object => pub, :method_options => :exclude_ancestor_methods
52 pc = pc4.or pc5
53 jp1 = JoinPoint.new :object => cwa, :method => :attrRW_ClassWithAttribs=
54 jp2 = JoinPoint.new :object => cwa, :method => :attrW_ClassWithAttribs=
55 jp3 = JoinPoint.new :object => pub, :method => :public_instance_test_method
56 pc.join_points_matched.sort.should == [jp1, jp2, jp3].sort
57 pc.join_points_not_matched.sort.should == []
58 end
59 end
60
61 describe Pointcut, "#or (algebraic properties for type-based pointcuts)" do
62 before :all do
63 @pc1 = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
64 @pc2 = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
65 @pc3 = Pointcut.new :types => /Class.*Public.*Method/, :method_options => [:public, :exclude_ancestor_methods]
66 end
67
68 it "should be unitary for type-based Pointcuts." do
69 pc = @pc1.or @pc2
70 pc.should eql(@pc1)
71 pc.should eql(@pc2)
72 end
73
74 it "should be commutative for type-based Pointcuts." do
75 pc13 = @pc1.or @pc3
76 pc31 = @pc3.or @pc1
77 pc13.should eql(pc31)
78 end
79
80 it "should be associativity for type-based Pointcuts." do
81 pc123a = (@pc1.or(@pc2)).or(@pc3)
82 pc123b = @pc1.or(@pc2.or(@pc3))
83 pc123a.should eql(pc123b)
84 end
85 end
86
87 describe Pointcut, "#or (algebraic properties for object-based pointcuts)" do
88 before :all do
89 cwa = ClassWithAttribs.new
90 pub = ClassWithPublicInstanceMethod.new
91 @pc1 = Pointcut.new :object => cwa, :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
92 @pc2 = Pointcut.new :object => cwa, :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
93 @pc3 = Pointcut.new :objects => pub, :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
94 end
95
96 it "should be unitary for object-based Pointcuts." do
97 pc12 = @pc1.or @pc2
98 pc12.should eql(@pc1)
99 pc12.should eql(@pc2)
100 end
101
102 it "should be commutative for object-based Pointcuts." do
103 pc13 = @pc1.or @pc3
104 pc31 = @pc3.or @pc1
105 pc13.should eql(pc31)
106 end
107
108 it "should be associativity for object-based Pointcuts." do
109 pc123a = (@pc1.or(@pc2)).or(@pc3)
110 pc123b = @pc1.or(@pc2.or(@pc3))
111 pc123a.should eql(pc123b)
112 end
113 end
114
115
116 describe Pointcut, "#|" do
117 it "should be a synonym for #or." do
118 pc1 = Pointcut.new
119 pc2 = Pointcut.new :types => /Class.*Public.*Method/, :method_options => [:public, :exclude_ancestor_methods]
120 pc3 = Pointcut.new :object => ClassWithPublicInstanceMethod.new, :method_options => [:exclude_ancestor_methods]
121 pc12 = pc1 | pc2
122 pc32 = pc3 | pc2
123 pc23 = pc2 | pc3
124 pc12.should_not equal(pc1)
125 pc12.should_not equal(pc2)
126 pc12.should eql(pc2)
127 pc32.should eql(pc23)
128 pca = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
129 pcb = Pointcut.new :types => "ClassWithAttribs", :attributes => [/^attr/], :attribute_options => [:readers, :exclude_ancestor_methods]
130 pcc = Pointcut.new :types => /Class.*Method/, :method_options => [:exclude_ancestor_methods]
131 pcabc1 = (pca | pcb) | pcc
132 pcabc2 = pca | (pcb | pcc)
133 pcabc1.should eql(pcabc2)
134 cwa = ClassWithAttribs.new
135 pub = ClassWithPublicInstanceMethod.new
136 pcd = Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:writers, :exclude_ancestor_methods]
137 pce = Pointcut.new :objects => cwa, :attributes => [/^attr/], :attribute_options => [:readers, :exclude_ancestor_methods]
138 pcf = Pointcut.new :objects => pub, :method_options => [:exclude_ancestor_methods]
139 pcdef1 = (pcd | pce) | pcf
140 pcdef2 = pcd | (pce | pcf)
141 pcdef1.should eql(pcdef2)
142 end
143 end
Generated using the rcov code coverage analysis tool for Ruby version 0.8.1.2.