aquarium 0.3.0 → 0.3.1

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.
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