aquarium 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/Aquarium.ipr +253 -0
  2. data/Aquarium.iws +629 -0
  3. data/CHANGES +43 -0
  4. data/UPGRADE +13 -7
  5. data/examples/method_tracing_example_spec.rb +4 -1
  6. data/lib/aquarium/aspects/aspect.rb +28 -11
  7. data/lib/aquarium/aspects/exclusion_handler.rb +1 -1
  8. data/lib/aquarium/aspects/join_point.rb +58 -14
  9. data/lib/aquarium/aspects/pointcut.rb +5 -6
  10. data/lib/aquarium/extras/design_by_contract.rb +1 -1
  11. data/lib/aquarium/finders/method_finder.rb +1 -4
  12. data/lib/aquarium/finders/type_finder.rb +8 -1
  13. data/lib/aquarium/utils.rb +1 -0
  14. data/lib/aquarium/utils/default_logger.rb +20 -0
  15. data/lib/aquarium/utils/options_utils.rb +74 -12
  16. data/lib/aquarium/utils/type_utils.rb +1 -7
  17. data/lib/aquarium/version.rb +1 -1
  18. data/spec/aquarium/aspects/advice_chain_node_spec.rb +1 -1
  19. data/spec/aquarium/aspects/advice_spec.rb +1 -1
  20. data/spec/aquarium/aspects/aspect_invocation_spec.rb +1531 -1465
  21. data/spec/aquarium/aspects/aspect_spec.rb +22 -27
  22. data/spec/aquarium/aspects/aspect_with_nested_types_spec.rb +1 -1
  23. data/spec/aquarium/aspects/aspect_with_subtypes_spec.rb +1 -1
  24. data/spec/aquarium/aspects/concurrent_aspects_spec.rb +1 -1
  25. data/spec/aquarium/aspects/concurrent_aspects_with_objects_and_types_spec.rb +1 -1
  26. data/spec/aquarium/aspects/dsl/aspect_dsl_spec.rb +434 -424
  27. data/spec/aquarium/aspects/join_point_spec.rb +27 -4
  28. data/spec/aquarium/aspects/pointcut_and_composition_spec.rb +98 -102
  29. data/spec/aquarium/aspects/pointcut_or_composition_spec.rb +95 -107
  30. data/spec/aquarium/aspects/pointcut_spec.rb +1365 -1382
  31. data/spec/aquarium/extensions/hash_spec.rb +1 -1
  32. data/spec/aquarium/extensions/set_spec.rb +1 -1
  33. data/spec/aquarium/finders/finder_result_spec.rb +1 -1
  34. data/spec/aquarium/finders/method_finder_spec.rb +1 -1
  35. data/spec/aquarium/finders/type_finder_with_descendents_and_ancestors_spec.rb +63 -145
  36. data/spec/aquarium/{spec_example_classes.rb → spec_example_types.rb} +35 -0
  37. data/spec/aquarium/utils/default_logger_spec.rb +28 -0
  38. data/spec/aquarium/utils/hash_utils_spec.rb +1 -1
  39. data/spec/aquarium/utils/logic_error_spec.rb +1 -1
  40. data/spec/aquarium/utils/name_utils_spec.rb +1 -1
  41. data/spec/aquarium/utils/nil_object_spec.rb +1 -1
  42. data/spec/aquarium/utils/options_utils_spec.rb +122 -0
  43. data/spec/aquarium/utils/set_utils_spec.rb +1 -1
  44. metadata +9 -4
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/../spec_example_classes'
2
+ require File.dirname(__FILE__) + '/../spec_example_types'
3
3
  require 'aquarium/extensions/hash'
4
4
  require 'aquarium/utils/array_utils'
5
5
  require 'aquarium/utils/hash_utils'
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/../spec_example_classes'
2
+ require File.dirname(__FILE__) + '/../spec_example_types'
3
3
  require 'aquarium/extensions/set'
4
4
 
5
5
  class Foo
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/../spec_example_classes'
2
+ require File.dirname(__FILE__) + '/../spec_example_types'
3
3
 
4
4
  require 'aquarium/finders/finder_result'
5
5
  require 'aquarium/extensions/set'
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/../spec_example_classes'
2
+ require File.dirname(__FILE__) + '/../spec_example_types'
3
3
  require 'aquarium/finders/method_finder'
4
4
 
5
5
  # :stopdoc:
@@ -2,220 +2,138 @@ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../utils/type_utils_sample_classes'
3
3
  require 'aquarium/finders/type_finder'
4
4
 
5
- # TODO Mock out type_utils to speed it up!
5
+ include Aquarium::Utils
6
6
 
7
7
  def purge_actuals actuals
8
8
  # Remove extra stuff inserted by RSpec, Aquarium, and "pretty printer" (rake?), possibly in other specs! (TODO undo those when finished...)
9
9
  actuals.matched_keys.reject do |t2|
10
- t2.name.include?("Spec::") or t2.name =~ /Aquarium::(Utils|Extras|Examples|Aspects)/ or t2.name =~ /^PP/
10
+ t2.name.include?("Spec::") or t2.name =~ /Aquarium::(Utils|Extras|Examples|Aspects)/ or t2.name =~ /^PP/
11
11
  end
12
12
  end
13
13
 
14
- variant = ''
15
- describe "#find with types, including descendents", :shared => true do
14
+ describe "#find types and their descendents, using :types_and_descendents" do
16
15
  it "should find the matching types and their descendent subclasses, even in different nested modules." do
17
- option = "#{variant}_and_descendents".intern
18
- Aquarium::Utils::TypeUtils.sample_types.each do |t|
19
- actual = Aquarium::Finders::TypeFinder.new.find option => (t.name)
16
+ TypeUtils.sample_types.each do |t|
17
+ actual = Aquarium::Finders::TypeFinder.new.find :types_and_descendents => (t.name)
20
18
  actual_keys = purge_actuals actual
21
- actual_keys.sort{|x,y| x.name <=> y.name}.should == Aquarium::Utils::TypeUtils.sample_types_descendents[t].sort{|x,y| x.name <=> y.name}
19
+ actual_keys.sort{|x,y| x.name <=> y.name}.should == TypeUtils.sample_types_descendents[t].sort{|x,y| x.name <=> y.name}
22
20
  actual.not_matched_keys.should == []
23
21
  end
24
22
  end
25
- end
26
23
 
27
- %w[type types name names].each do |n|
28
- instance_eval <<-EOF
29
- describe Aquarium::Finders::TypeFinder, "#find with :#{n}_and_descendents used to specify one or more names" do
30
- variant = "#{n}"
31
- it_should_behave_like "#find with types, including descendents"
24
+ Aquarium::Finders::TypeFinder::TYPES_SYNONYMS.reject{|t| t == :types}.each do |n|
25
+ it "should accept :#{n}_and_descendents as a synonym for :types_and_descendents" do
26
+ lambda {Aquarium::Finders::TypeFinder.new.find "#{n}_and_descendents".intern => TypeUtils.sample_types, :noop => true}.should_not raise_error(InvalidOptions)
32
27
  end
33
- EOF
28
+ end
34
29
  end
35
30
 
36
- describe "#find with excluded types, including descendents", :shared => true do
31
+ describe "#find types subtracting out excluded types and descendents, using :exclude_types_and_descendents" do
37
32
  it "should find the matching types and their descendent subclasses, minus the excluded type hierarchies." do
38
- option = "#{variant}_and_descendents".intern
39
- exclude_option = "exclude_#{variant}_and_descendents".intern
40
- actual = Aquarium::Finders::TypeFinder.new.find option => ModuleForDescendents, exclude_option => D1ForDescendents
33
+ actual = Aquarium::Finders::TypeFinder.new.find :types_and_descendents => ModuleForDescendents, :exclude_types_and_descendents => D1ForDescendents
41
34
  actual_keys = purge_actuals actual
42
- expected = Aquarium::Utils::TypeUtils.sample_types_descendents[ModuleForDescendents].reject do |c|
43
- Aquarium::Utils::TypeUtils.sample_types_descendents[D1ForDescendents].include? c
35
+ expected = TypeUtils.sample_types_descendents[ModuleForDescendents].reject do |c|
36
+ TypeUtils.sample_types_descendents[D1ForDescendents].include? c
44
37
  end
38
+ actual_keys.sort{|x,y| x.name <=> y.name}.should == expected.sort{|x,y| x.name <=> y.name}
45
39
  actual.not_matched_keys.should == []
46
40
  end
47
- end
48
41
 
49
- %w[type types name names].each do |n|
50
- instance_eval <<-EOF
51
- describe Aquarium::Finders::TypeFinder, "#find with :exclude_#{n}_and_descendents used to specify one or more names" do
52
- variant = "#{n}"
53
- it_should_behave_like "#find with excluded types, including descendents"
42
+ Aquarium::Finders::TypeFinder::TYPES_SYNONYMS.reject{|t| t == :types}.each do |n|
43
+ it "should accept :exclude_#{n}_and_descendents as a synonym for :exclude_types_and_descendents" do
44
+ lambda {Aquarium::Finders::TypeFinder.new.find :types_and_descendents => ModuleForDescendents, "exclude_#{n}_and_descendents".intern => D1ForDescendents, :noop => true}.should_not raise_error(InvalidOptions)
54
45
  end
55
- EOF
46
+ end
56
47
  end
57
48
 
58
49
 
59
- describe "#find with types, including ancestors", :shared => true do
50
+ describe "#find types and their ancestors, using :types_and_ancestors" do
60
51
  it "should find the matching types and their ancestors, even in different nested modules." do
61
- option = "#{variant}_and_ancestors".intern
62
- Aquarium::Utils::TypeUtils.sample_types.each do |t|
63
- actual = Aquarium::Finders::TypeFinder.new.find option => (t.name)
52
+ TypeUtils.sample_types.each do |t|
53
+ actual = Aquarium::Finders::TypeFinder.new.find :types_and_ancestors => (t.name)
64
54
  actual_keys = purge_actuals actual
65
- actual_keys.sort{|x,y| x.name <=> y.name}.should == Aquarium::Utils::TypeUtils.sample_types_ancestors[t].sort{|x,y| x.name <=> y.name}
55
+ actual_keys.sort{|x,y| x.name <=> y.name}.should == TypeUtils.sample_types_ancestors[t].sort{|x,y| x.name <=> y.name}
66
56
  actual.not_matched_keys.should == []
67
57
  end
68
58
  end
69
- end
70
59
 
71
- %w[type types name names].each do |n|
72
- instance_eval <<-EOF
73
- describe Aquarium::Finders::TypeFinder, "#find with :#{n}_and_ancestors used to specify one or more names" do
74
- variant = "#{n}"
75
- it_should_behave_like "#find with types, including ancestors"
60
+ Aquarium::Finders::TypeFinder::TYPES_SYNONYMS.reject{|t| t == :types}.each do |n|
61
+ it "should accept :#{n}_and_ancestors as a synonym for :types_and_ancestors" do
62
+ lambda {Aquarium::Finders::TypeFinder.new.find "#{n}_and_ancestors".intern => TypeUtils.sample_types, :noop => true}.should_not raise_error(InvalidOptions)
76
63
  end
77
- EOF
64
+ end
78
65
  end
79
66
 
80
67
 
81
- describe "#find with excluded types, including ancestors", :shared => true do
68
+ describe "#find types subtracting out excluded types and ancestors, using :exclude_types_and_ancestors" do
82
69
  it "should find the matching types and their ancestors, minus the excluded types and ancestors." do
83
- option = "#{variant}_and_ancestors".intern
84
- exclude_option = "exclude_#{variant}_and_ancestors".intern
85
- actual = Aquarium::Finders::TypeFinder.new.find option => D1ForDescendents, exclude_option => ModuleForDescendents
70
+ actual = Aquarium::Finders::TypeFinder.new.find :types_and_ancestors => D1ForDescendents, :exclude_types_and_ancestors => ModuleForDescendents
86
71
  actual_keys = purge_actuals actual
87
- expected = Aquarium::Utils::TypeUtils.sample_types_ancestors[D1ForDescendents].reject do |c|
88
- Aquarium::Utils::TypeUtils.sample_types_ancestors[ModuleForDescendents].include? c
72
+ expected = TypeUtils.sample_types_ancestors[D1ForDescendents].reject do |c|
73
+ TypeUtils.sample_types_ancestors[ModuleForDescendents].include? c
89
74
  end
75
+ actual_keys.sort{|x,y| x.name <=> y.name}.should == expected.sort{|x,y| x.name <=> y.name}
90
76
  actual.not_matched_keys.should == []
91
77
  end
92
- end
93
78
 
94
- %w[type types name names].each do |n|
95
- instance_eval <<-EOF
96
- describe Aquarium::Finders::TypeFinder, "#find with :exclude_#{n}_and_ancestors used to specify one or more names" do
97
- variant = "#{n}"
98
- it_should_behave_like "#find with excluded types, including ancestors"
79
+ Aquarium::Finders::TypeFinder::TYPES_SYNONYMS.reject{|t| t == :types}.each do |n|
80
+ it "should accept :exclude_#{n}_and_ancestors as a synonym for :exclude_types_and_ancestors" do
81
+ lambda {Aquarium::Finders::TypeFinder.new.find :types_and_ancestors => D1ForDescendents, "exclude_#{n}_and_ancestors".intern => ModuleForDescendents, :noop => true}.should_not raise_error(InvalidOptions)
99
82
  end
100
- EOF
83
+ end
101
84
  end
102
85
 
103
86
 
104
- describe "#find with types, including descendents and ancestors", :shared => true do
105
- it "should find the matching types, including their descendents and ancestors, even in different nested modules." do
106
- doption = "#{variant}_and_descendents".intern
107
- aoption = "#{variant}_and_ancestors".intern
108
- Aquarium::Utils::TypeUtils.sample_types.each do |t|
109
- actual = Aquarium::Finders::TypeFinder.new.find aoption => (t.name), doption => (t.name)
87
+ describe "#find types and their descendents and ancestors" do
88
+ it "should find the matching types and their descendents and ancestors, even in different nested modules." do
89
+ TypeUtils.sample_types.each do |t|
90
+ actual = Aquarium::Finders::TypeFinder.new.find :types_and_ancestors => (t.name), :types_and_descendents => (t.name)
110
91
  actual_keys = purge_actuals actual
111
- expected = Aquarium::Utils::TypeUtils.sample_types_ancestors[t] + Aquarium::Utils::TypeUtils.sample_types_descendents[t]
92
+ expected = TypeUtils.sample_types_ancestors[t] + TypeUtils.sample_types_descendents[t]
112
93
  actual_keys.sort{|x,y| x.name <=> y.name}.should == expected.sort{|x,y| x.name <=> y.name}.uniq
113
94
  actual.not_matched_keys.should == []
114
95
  end
115
96
  end
116
97
  end
117
98
 
118
- %w[type types name names].each do |n|
119
- instance_eval <<-EOF
120
- describe Aquarium::Finders::TypeFinder, "#find with :#{n}_and_ancestors and :#{n}_and_descendents used to specify one or more names" do
121
- variant = "#{n}"
122
- it_should_behave_like "#find with types, including descendents and ancestors"
123
- end
124
- EOF
125
- end
126
-
127
- describe "#find with excluded types, including descendents and ancestors", :shared => true do
128
- it "should find the matching types, their descendents and ancestors, minus the excluded types, descendents and ancestors." do
129
- doption = "#{variant}_and_descendents".intern
130
- aoption = "#{variant}_and_ancestors".intern
131
- exclude_doption = "exclude_#{variant}_and_descendents".intern
132
- exclude_aoption = "exclude_#{variant}_and_ancestors".intern
133
- actual = Aquarium::Finders::TypeFinder.new.find aoption => Aquarium::ForDescendents::NestedD1ForDescendents,
134
- doption => Aquarium::ForDescendents::NestedD1ForDescendents,
135
- exclude_aoption => Aquarium::ForDescendents::NestedD2ForDescendents,
136
- exclude_doption => Aquarium::ForDescendents::NestedD2ForDescendents
99
+ describe "#find types subtracting out excluded types and their descendents and ancestors" do
100
+ it "should find the matching types and their descendents and ancestors, minus the excluded types and their descendents and ancestors." do
101
+ actual = Aquarium::Finders::TypeFinder.new.find \
102
+ :types_and_ancestors => Aquarium::ForDescendents::NestedD1ForDescendents,
103
+ :types_and_descendents => Aquarium::ForDescendents::NestedD1ForDescendents,
104
+ :exclude_types_and_ancestors => Aquarium::ForDescendents::NestedD2ForDescendents,
105
+ :exclude_types_and_descendents => Aquarium::ForDescendents::NestedD2ForDescendents
137
106
  actual_keys = purge_actuals actual
138
- expected = Aquarium::Utils::TypeUtils.sample_types_ancestors[D1ForDescendents].reject do |c|
139
- Aquarium::Utils::TypeUtils.sample_types_ancestors[ModuleForDescendents].include? c
140
- end
107
+ expected = [Aquarium::ForDescendents::NestedD1ForDescendents, Aquarium::ForDescendents::NestedD11ForDescendents, Aquarium::ForDescendents::NestedModuleForDescendents]
108
+ actual_keys.sort{|x,y| x.name <=> y.name}.should == expected.sort{|x,y| x.name <=> y.name}.uniq
141
109
  actual.not_matched_keys.should == []
142
110
  end
143
111
  end
144
112
 
145
- %w[type types name names].each do |n|
146
- instance_eval <<-EOF
147
- describe Aquarium::Finders::TypeFinder, "#find with :exclude_#{n}_and_ancestors and :exclude_#{n}_and_descendents used to specify one or more names" do
148
- variant = "#{n}"
149
- it_should_behave_like "#find with excluded types, including descendents and ancestors"
150
- end
151
- EOF
152
- end
153
-
154
- describe "#find with regular expressions, including descendents and ancestors" do
155
- it "should find the matching types, including their descendents and ancestors, even in different nested modules." do
156
- doption = "types_and_descendents".intern
157
- aoption = "types_and_ancestors".intern
113
+ describe "#find types and their descendents and ancestors, specified with regular expressions" do
114
+ it "should find the matching types and their descendents and ancestors, even in different nested modules." do
158
115
  regexs = [/ForDescendents$/, /Aquarium::ForDescendents::.*ForDescendents/]
159
- actual = Aquarium::Finders::TypeFinder.new.find aoption => regexs, doption => regexs
116
+ actual = Aquarium::Finders::TypeFinder.new.find :types_and_ancestors => regexs, :types_and_descendents => regexs
160
117
  actual_keys = purge_actuals actual
161
- expected = Aquarium::Utils::TypeUtils.sample_types_descendents_and_ancestors.keys + [Kernel, Object]
118
+ expected = TypeUtils.sample_types_descendents_and_ancestors.keys + [Kernel, Object]
162
119
  actual_keys.size.should == expected.size
163
120
  expected.each do |t|
164
121
  actual_keys.should include(t)
165
122
  end
123
+ actual_keys.sort{|x,y| x.name <=> y.name}.should == expected.sort{|x,y| x.name <=> y.name}
166
124
  actual.not_matched_keys.should == []
167
125
  end
168
126
  end
169
127
 
170
- describe "#find with regular expressions, including descendents and ancestors", :shared => true do
171
- it "should find the matching types, including their descendents and ancestors, even in different nested modules." do
172
- doption = "#{variant}_and_descendents".intern
173
- aoption = "#{variant}_and_ancestors".intern
174
- regexs = [/ForDescendents$/, /Aquarium::ForDescendents::.*ForDescendents/]
175
- actual = Aquarium::Finders::TypeFinder.new.find aoption => regexs, doption => regexs
128
+ describe "#find types and their descendents and ancestors, subtracting out excluded types and their descendents and ancestors, specified using regular expressions" do
129
+ it "should find the matching types and their descendents and ancestors, minus the excluded types and their descendents and ancestors." do
130
+ actual = Aquarium::Finders::TypeFinder.new.find :types_and_ancestors => /Aquarium::ForDescendents::.*D1ForDescendents/,
131
+ :types_and_descendents => /Aquarium::ForDescendents::.*D1ForDescendents/,
132
+ :exclude_types_and_ancestors => /Aquarium::ForDescendents::.*D2ForDescendents/,
133
+ :exclude_types_and_descendents => /Aquarium::ForDescendents::.*D2ForDescendents/
176
134
  actual_keys = purge_actuals actual
177
- expected = Aquarium::Utils::TypeUtils.sample_types_descendents_and_ancestors.keys + [Kernel, Object]
178
- actual_keys.size.should == expected.size
179
- expected.each do |t|
180
- actual_keys.should include(t)
181
- end
182
- actual.not_matched_keys.should == []
183
- end
184
- end
185
-
186
- %w[type types name names].each do |n|
187
- instance_eval <<-EOF
188
- describe Aquarium::Finders::TypeFinder, "#find regexps with :#{n}_and_ancestors and :#{n}_and_descendents used to specify one or more names" do
189
- variant = "#{n}"
190
- it_should_behave_like "#find with regular expressions, including descendents and ancestors"
191
- end
192
- EOF
193
- end
194
-
195
-
196
- describe "#find with excluded regular expressions, including descendents and ancestors", :shared => true do
197
- it "should find the matching types, their descendents and ancestors, minus the excluded types, descendents and ancestors." do
198
- doption = "#{variant}_and_descendents".intern
199
- aoption = "#{variant}_and_ancestors".intern
200
- exclude_doption = "exclude_#{variant}_and_descendents".intern
201
- exclude_aoption = "exclude_#{variant}_and_ancestors".intern
202
- actual = Aquarium::Finders::TypeFinder.new.find aoption => /Aquarium::ForDescendents::.*D1ForDescendents/,
203
- doption => /Aquarium::ForDescendents::.*D1ForDescendents/,
204
- exclude_aoption => /Aquarium::ForDescendents::.*D2ForDescendents/,
205
- exclude_doption => /Aquarium::ForDescendents::.*D2ForDescendents/
206
- actual_keys = purge_actuals actual
207
- expected = Aquarium::Utils::TypeUtils.sample_types_ancestors[D1ForDescendents].reject do |c|
208
- Aquarium::Utils::TypeUtils.sample_types_ancestors[ModuleForDescendents].include? c
209
- end
135
+ expected = [Aquarium::ForDescendents::NestedD1ForDescendents, Aquarium::ForDescendents::NestedD11ForDescendents, Aquarium::ForDescendents::NestedModuleForDescendents]
136
+ actual_keys.sort{|x,y| x.name <=> y.name}.should == expected.sort{|x,y| x.name <=> y.name}
210
137
  actual.not_matched_keys.should == []
211
138
  end
212
139
  end
213
-
214
- %w[type types name names].each do |n|
215
- instance_eval <<-EOF
216
- describe Aquarium::Finders::TypeFinder, "#find regexps with :exclude_#{n}_and_ancestors and :exclude_#{n}_and_descendents used to specify one or more names" do
217
- variant = "#{n}"
218
- it_should_behave_like "#find with excluded regular expressions, including descendents and ancestors"
219
- end
220
- EOF
221
- end
@@ -198,4 +198,39 @@ end
198
198
  class TestableClassIncludingTestableModule1
199
199
  include TestableModule1
200
200
  def instance_method1; end
201
+ end
202
+
203
+ # Used to mock the expensive computation of descendents in some examples.
204
+ module Aquarium
205
+ module SpecExampleTypes
206
+ def descendents
207
+ {Watchful => [Watchful, WatchfulChild],
208
+ TestableModule2 => [TestableModule2, TestableModule1],
209
+ ExampleParentClass => [ExampleParentClass, ClassWithAttribs,
210
+ ClassWithPublicInstanceMethod, ClassWithPublicInstanceMethod2, ClassWithProtectedInstanceMethod,
211
+ ClassWithPrivateInstanceMethod, ClassWithPublicClassMethod, ClassWithPrivateClassMethod],
212
+ ModuleWithPublicInstanceMethod => [ModuleWithPublicInstanceMethod, ModuleIncludingModuleWithPublicInstanceMethod,
213
+ ClassIncludingModuleWithPublicInstanceMethod, ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod],
214
+ ModuleWithProtectedInstanceMethod => [ModuleWithProtectedInstanceMethod, ClassIncludingModuleWithProtectedInstanceMethod],
215
+ ModuleWithPrivateInstanceMethod => [ModuleWithPrivateInstanceMethod, ClassIncludingModuleWithPrivateInstanceMethod],
216
+ ModuleWithPublicClassMethod => [ModuleWithPublicClassMethod, ClassIncludingModuleWithPublicClassMethod],
217
+ ModuleWithPrivateClassMethod => [ModuleWithPrivateClassMethod, ClassIncludingModuleWithPrivateClassMethod],
218
+ ClassIncludingModuleWithPublicInstanceMethod => [ClassIncludingModuleWithPublicInstanceMethod, ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod],
219
+ ModuleIncludingModuleWithPublicInstanceMethod => [ModuleIncludingModuleWithPublicInstanceMethod, ClassDerivedFromClassIncludingModuleWithPublicInstanceMethod]
220
+ }
221
+ end
222
+ end
223
+
224
+ module TypeUtilsStub
225
+ include SpecExampleTypes
226
+
227
+ def stub_type_utils_descendents
228
+ @stubbed_type_utils_descendents = Aspect.new :around, :calls_to => :descendents, :on_type => Aquarium::Utils::TypeUtils, :restricting_methods_to => :class_methods do |jp, object, *args|
229
+ descendents[args[0]]
230
+ end
231
+ end
232
+ def unstub_type_utils_descendents
233
+ @stubbed_type_utils_descendents.unadvise
234
+ end
235
+ end
201
236
  end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require 'aquarium/utils/default_logger'
3
+ require 'logger'
4
+
5
+ include Aquarium::Utils
6
+
7
+ describe DefaultLogger, ".logger=" do
8
+ before :each do
9
+ @saved_logger = DefaultLogger.logger
10
+ end
11
+ after :each do
12
+ DefaultLogger.logger= @saved_logger # restore the original!
13
+ end
14
+
15
+ it "should set the global logger." do
16
+ test_logger = Logger.new STDOUT
17
+ DefaultLogger.logger = test_logger
18
+ DefaultLogger.logger.should be_eql(test_logger)
19
+ end
20
+ end
21
+
22
+ describe DefaultLogger, ".logger" do
23
+ it "should get the global logger." do
24
+ test_logger = Logger.new STDOUT
25
+ DefaultLogger.logger = test_logger
26
+ DefaultLogger.logger.should be_eql(test_logger)
27
+ end
28
+ end
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/../spec_example_classes'
2
+ require File.dirname(__FILE__) + '/../spec_example_types'
3
3
  require 'aquarium/utils/hash_utils'
4
4
 
5
5
  describe Aquarium::Utils::HashUtils, "#make_hash" do
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/../spec_example_classes'
2
+ require File.dirname(__FILE__) + '/../spec_example_types'
3
3
  require 'aquarium/utils/logic_error'
4
4
 
5
5
  # This doesn't do much..., except make rcov happy, since this exception is essentially for catching bugs.
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/../spec_example_classes'
2
+ require File.dirname(__FILE__) + '/../spec_example_types'
3
3
  require 'aquarium/utils/name_utils'
4
4
 
5
5
  describe Aquarium::Utils::NameUtils, ".make_valid_attr_name_from_method_name" do
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/../spec_example_classes'
2
+ require File.dirname(__FILE__) + '/../spec_example_types'
3
3
  require 'aquarium/utils/nil_object'
4
4
 
5
5
  describe Aquarium::Utils::NilObject, " (when a message is sent to it)" do
@@ -0,0 +1,122 @@
1
+
2
+ require File.dirname(__FILE__) + '/../spec_helper'
3
+ require 'aquarium/utils'
4
+
5
+ include Aquarium::Utils
6
+
7
+ module Aquarium
8
+ class OptionsUtilsUser
9
+ include OptionsUtils
10
+ def initialize hash = {}
11
+ init_specification hash, {}
12
+ end
13
+ def all_allowed_option_symbols
14
+ []
15
+ end
16
+ end
17
+ end
18
+
19
+ describe OptionsUtils, "with no 'universal' options specified" do
20
+ it "should use the default logger." do
21
+ object = Aquarium::OptionsUtilsUser.new
22
+ object.logger.should == DefaultLogger.logger
23
+ end
24
+
25
+ it "should set noop to false." do
26
+ object = Aquarium::OptionsUtilsUser.new
27
+ object.noop.should be_false
28
+ end
29
+ end
30
+
31
+ describe OptionsUtils, ":logger option" do
32
+ it "should set the object's logger to the specified logger." do
33
+ logger = Logger.new STDOUT
34
+ object = Aquarium::OptionsUtilsUser.new :logger => logger
35
+ object.logger.should == logger
36
+ end
37
+ end
38
+
39
+ describe OptionsUtils, ":severity option" do
40
+ it "should set the level on the object's logger to the :severity value." do
41
+ logger = Logger.new STDOUT
42
+ object = Aquarium::OptionsUtilsUser.new :logger => logger, :severity => Logger::Severity::WARN
43
+ object.logger.level.should == Logger::Severity::WARN
44
+ end
45
+
46
+ it "should cause the creation of a unique logger if one was not specified." do
47
+ object = Aquarium::OptionsUtilsUser.new :severity => Logger::Severity::WARN
48
+ object.logger.should_not eql(DefaultLogger.logger)
49
+ end
50
+ end
51
+
52
+ describe OptionsUtils, ":logger_stream option" do
53
+ it "should set the output stream on the object's logger to the :logger_stream value." do
54
+ stringio = StringIO.new
55
+ object = Aquarium::OptionsUtilsUser.new :logger_stream => stringio
56
+ object.logger << "message"
57
+ stringio.string.should eql("message")
58
+ end
59
+
60
+ it "should cause the creation of a unique logger if one was not specified." do
61
+ stringio = StringIO.new
62
+ object = Aquarium::OptionsUtilsUser.new :logger_stream => stringio
63
+ object.logger.should_not eql(DefaultLogger.logger)
64
+ end
65
+ end
66
+
67
+ describe OptionsUtils, ":logger_stream option" do
68
+ it "should set the output stream on the object's logger to the :logger_stream value." do
69
+ logger = Logger.new STDOUT
70
+ object = Aquarium::OptionsUtilsUser.new :logger => logger, :severity => Logger::Severity::WARN
71
+ object.logger.level.should == Logger::Severity::WARN
72
+ end
73
+
74
+ it "should cause the creation of a unique logger if one was not specified." do
75
+ object = Aquarium::OptionsUtilsUser.new :severity => Logger::Severity::WARN
76
+ object.logger.should_not eql(DefaultLogger.logger)
77
+ end
78
+ end
79
+
80
+ describe OptionsUtils, "#logger" do
81
+ it "should return the logger specified with the :logger => ... option." do
82
+ logger = Logger.new STDOUT
83
+ object = Aquarium::OptionsUtilsUser.new :logger => logger
84
+ object.logger.should == logger
85
+ end
86
+
87
+ it "should return the default logger if no :logger => ... option was specified." do
88
+ logger = Logger.new STDOUT
89
+ object = Aquarium::OptionsUtilsUser.new
90
+ object.logger.should == DefaultLogger.logger
91
+ end
92
+ end
93
+
94
+ describe OptionsUtils, "#logger=" do
95
+ it "should set a new logger." do
96
+ logger1 = Logger.new STDOUT
97
+ logger2 = Logger.new STDERR
98
+ object = Aquarium::OptionsUtilsUser.new :logger => logger1
99
+ object.logger = logger2
100
+ object.logger.should == logger2
101
+ end
102
+ end
103
+
104
+ describe OptionsUtils, "#noop" do
105
+ it "should return false if :noop was not specified." do
106
+ object = Aquarium::OptionsUtilsUser.new
107
+ object.noop.should be_false
108
+ end
109
+
110
+ it "should return the value specified with :noop." do
111
+ object = Aquarium::OptionsUtilsUser.new :noop => true
112
+ object.noop.should be_true
113
+ end
114
+ end
115
+
116
+ describe OptionsUtils, "#noop=" do
117
+ it "should set the noop value." do
118
+ object = Aquarium::OptionsUtilsUser.new :noop => true
119
+ object.noop = false
120
+ object.noop.should be_false
121
+ end
122
+ end