fact_checker 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,31 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module FactChecker
4
- def self.included(klass)
5
- klass.extend ClassMethods
6
- end
7
-
8
- module ClassMethods
9
- def inherited(child)
10
- child.instance_variable_set('@fact_checker', fact_checker.dup)
11
- end
12
-
13
- def def_fact(*opts)
14
- symbolic_fact_name = fact_checker.def_fact(*opts)
15
- fact_name = symbolic_fact_name.to_s + '?'
16
- unless fact_name.start_with? '_'
17
- define_method(fact_name) { fact_accomplished?(symbolic_fact_name) }
18
- end
19
- end
20
-
21
- def fact_checker
22
- @fact_checker ||= FactChecker::Base.new
23
- end
24
- end
25
-
26
- # Delegate methods to self.class.fact_checker
27
- [:fact_accomplished?, :fact_possible?, :accomplished_facts, :possible_facts].each do |name|
28
- define_method(name) { |*opts| self.class.fact_checker.send(name, self, *opts) }
29
- end
30
- def facts; self.class.fact_checker.facts; end
31
- end
@@ -1,272 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe FactChecker::Base do
6
-
7
- describe "#initialize" do
8
- context "called with all arguments (fact_list, dependencies_hash, requirements_hash), its " do
9
- subject { FactChecker::Base.new([:f1, :f2], {:f1 => :f2}, {:f1 => :nil?}) }
10
- specify("facts == fact_list") { subject.facts.should == [:f1, :f2] }
11
- specify("dependencies == dependencies_hash") { subject.dependencies.should == {:f1 => :f2} }
12
- specify("requirements == requirements_hash") { subject.requirements.should == {:f1 => :nil?} }
13
- end
14
-
15
- context "called" do
16
- specify("without fact_list, its facts == [] by default") { subject.facts.should == [] }
17
- specify("without dependencies_hash, its dependencies == {} by default") { subject.dependencies.should == {} }
18
- specify("without requirements_hash, its requirements == {} by default") { subject.requirements.should == {} }
19
- end
20
- end
21
-
22
- describe "#requirement_satisfied_for?(context, fact)" do
23
- context "when no requirement defined for the fact" do
24
- subject { FactChecker::Base.new([:f1]) }
25
- it "returns true for any object" do
26
- subject.requirement_satisfied_for?(1, :f1).should be_true
27
- subject.requirement_satisfied_for?(nil, :f1).should be_true
28
- end
29
- end
30
-
31
- context "when requirement for the fact was defined as symbol" do
32
- subject { FactChecker::Base.new([:f1], nil, {:f1 => :nil?}) }
33
- it "returns false if fact is unknown" do
34
- subject.requirement_satisfied_for?(1, :f2).should be_false
35
- end
36
- it "returns false if context.symbol() == false" do
37
- subject.requirement_satisfied_for?(1, :f1).should be_false
38
- end
39
- it "returns true if context.symbol() == true" do
40
- subject.requirement_satisfied_for?(nil, :f1).should be_true
41
- end
42
- end
43
-
44
- context "when requirement was defined as Proc with arity == 1" do
45
- subject { FactChecker::Base.new([:f1], nil, {:f1 => lambda{|t| t.nil?}}) }
46
- it "returns false if proc(context) == false" do
47
- subject.requirement_satisfied_for?(1, :f1).should be_false
48
- end
49
- it "returns true if proc(context) == true" do
50
- subject.requirement_satisfied_for?(nil, :f1).should be_true
51
- end
52
- end
53
-
54
- context "when requirement was defined as Proc with arity == 0" do
55
- it "returns false if proc() == false" do
56
- subject = FactChecker::Base.new([:f1], nil, {:f1 => lambda{false}})
57
- subject.requirement_satisfied_for?(nil, :f1).should be_false
58
- end
59
- it "returns true if proc() == true" do
60
- subject = FactChecker::Base.new([:f1], nil, {:f1 => lambda{true}})
61
- subject.requirement_satisfied_for?(nil, :f1).should be_true
62
- end
63
- end
64
-
65
- context "when requirement was defined as something else" do
66
- subject { FactChecker::Base.new([:f1], nil, {:f1 => "wrong"}) }
67
- it "raises RuntimeError" do
68
- lambda{ subject.requirement_satisfied_for?(nil, :f1) }.should raise_error(RuntimeError)
69
- end
70
- end
71
- end
72
-
73
- describe "#fact_accomplished?" do
74
- context "when fact is unknown" do
75
- subject { FactChecker::Base.new([:f2], nil, {:f1 => :nil?}) }
76
- it("always returns false") { subject.fact_accomplished?(nil, :f1).should be_false }
77
- end
78
-
79
- context "when fact is known and" do
80
- context "has no dependencies" do
81
- subject { FactChecker::Base.new([:f1], nil, {:f1 => lambda{|o| o.size > 3}}) }
82
- it("returns true if requirement satisfied") do
83
- subject.fact_accomplished?("String", :f1).should be_true
84
- end
85
- it "returns false if requirement not satisfied" do
86
- subject.fact_accomplished?("Str", :f1).should be_false
87
- end
88
- end
89
-
90
- context "has only unsatisfied dependencies" do
91
- subject { FactChecker::Base.new([:f1, :f2], {:f1 => :f2}, {:f1 => lambda{true}, :f2 => :nil?}) }
92
- it "returns false" do
93
- subject.fact_accomplished?("something", :f1).should be_false
94
- end
95
- end
96
-
97
- context "has both satisfied and unsatisfied dependencies" do
98
- subject { FactChecker::Base.new([:f1, :f2, :f3, :f4], {:f1 => [:f2, :f3], :f3 => :f4}, {:f2 => :size, :f3 => :size, :f4 => :nil?}) }
99
- it "returns false" do
100
- subject.fact_accomplished?("something", :f1).should be_false
101
- end
102
- end
103
-
104
- context "has only satisfied dependencies" do
105
- subject {
106
- FactChecker::Base.new(
107
- [:f1, :f2, :f3, :f4],
108
- {:f1 => [:f2, :f3], :f3 => :f4},
109
- {:f1 => lambda{|o| o.size == 4}, :f2 => lambda{|o| o.size < 5}, :f3 => lambda{|o| o.size > 2} }
110
- )
111
- }
112
-
113
- it "returns true if fact has no requirements" do
114
- subject.fact_accomplished?("something", :f4).should be_true
115
- end
116
-
117
- it "returns false if requirements not satisfied" do
118
- subject.fact_accomplished?("somet", :f1).should be_false
119
- end
120
-
121
- it "returns true if all requirements are satisfied" do
122
- subject.fact_accomplished?("some", :f1).should be_true
123
- end
124
- end
125
- end
126
- end
127
-
128
- describe "#fact_possible?" do
129
- context "when fact is unknown" do
130
- it "returns true" do
131
- subject.fact_possible?(nil, :x).should be_true
132
- end
133
- end
134
-
135
- context "when fact is known" do
136
- it "returns true if dependencies satisfied (even if requirement is not satisfied)" do
137
- subject = FactChecker::Base.new([:f1, :f2], {:f1 => :f2}, {:f1 => :nil?, :f2 => :to_i})
138
- subject.fact_possible?(1, :f1).should be_true
139
- end
140
-
141
- it "returns false if dependencies unsatisfied (even if requirement is satisfied)" do
142
- subject = FactChecker::Base.new([:f1, :f2], {:f1 => :f2}, {:f1 => :to_i, :f2 => :nil?})
143
- subject.fact_possible?(1, :f1).should be_false
144
- end
145
- end
146
- end
147
-
148
- describe "#def_fact" do
149
- context "called with (:fact_name)" do
150
- it "adds :fact_name to facts" do
151
- subject.def_fact(:f1)
152
- subject.def_fact(:f2)
153
- subject.facts.should == [:f1, :f2]
154
- end
155
-
156
- it "returns :fact_name" do
157
- subject.def_fact(:f1).should be :f1
158
- end
159
- end
160
-
161
- context "called with (:fact_name, :if => :requirement)" do
162
- it "adds :fact_name to facts" do
163
- subject.def_fact(:f1)
164
- subject.def_fact(:f2, :if => :nil?)
165
- subject.facts.should == [:f1, :f2]
166
- end
167
-
168
- it "adds :requirement to requirements" do
169
- subject.def_fact(:f2, :if => :nil?)
170
- subject.requirements[:f2].should == :nil?
171
- end
172
- end
173
-
174
- context "called with (:fact_name => :dependency)" do
175
- it "adds :fact_name to facts" do
176
- subject.def_fact(:f1)
177
- subject.def_fact(:f2 => :f1)
178
- subject.facts.should == [:f1, :f2]
179
- end
180
-
181
- it "adds :dependency to dependencies" do
182
- subject.def_fact(:f2 => :f1)
183
- subject.dependencies[:f2].should == :f1
184
- end
185
- end
186
-
187
- context "called with (:fact_name => :dependency, :if => :requirement)" do
188
- subject do
189
- FactChecker::Base.new.tap do |checker|
190
- checker.def_fact(:f1)
191
- checker.def_fact(:f2 => :f1, :if => :to_i)
192
- end
193
- end
194
-
195
- it "adds :fact_name to facts" do
196
- subject.facts.should == [:f1, :f2]
197
- end
198
-
199
- it "adds :requirement to requirements" do
200
- subject.requirements[:f2].should == :to_i
201
- end
202
-
203
- it "adds :dependency to dependencies" do
204
- subject.dependencies[:f2].should == :f1
205
- end
206
- end
207
-
208
- context "called again for the same fact_name" do
209
- subject do
210
- FactChecker::Base.new.tap do |checker|
211
- checker.def_fact(:f1 => :f2, :if => :nil?)
212
- checker.def_fact(:f1)
213
- end
214
- end
215
-
216
- it "doesn't add 2nd fact_name to facts" do
217
- subject.facts.should == [:f1]
218
- end
219
-
220
- it "overwrites fact_name's dependency" do
221
- subject.dependencies[:f1].should be_nil
222
- end
223
-
224
- it "overwrites fact_name's requirement" do
225
- subject.requirements[:f1].should be_nil
226
- end
227
- end
228
-
229
- context "called with wrong arguments it RAISES ERROR, for example" do
230
- specify "#def_fact() raises error" do
231
- expect { subject.def_fact() }.to raise_error ArgumentError
232
- end
233
-
234
- specify "#def_fact(:fact_name, {:if => :requirement}, something_else) raises error" do
235
- expect { subject.def_fact(:f1, {:if => :nil?}, 1) }.to raise_error ArgumentError
236
- end
237
-
238
- specify "#def_fact(:fact_name, some_scalar_value) raises error" do
239
- expect { subject.def_fact(:f1, 1)}.to raise_error ArgumentError
240
- end
241
-
242
- specify "#def_fact({:if => :requirement}, something_else) raises error" do
243
- expect { subject.def_fact({:if => :nil?}, :f1) }.to raise_error ArgumentError
244
- end
245
-
246
- specify "#def_fact(:fact_name => :dependency, :if => :requirement, :some_other_key => something_else) raises error" do
247
- expect { subject.def_fact(:f1 => :f2, :if => :nil?, :something_else => true) }.to raise_error ArgumentError
248
- end
249
- end
250
- end
251
-
252
- context "has 3 *_facts methods, i.e." do
253
- subject { FactChecker::Base.new([:f1, :f2, :f3], {:f1 => :f2}, {:f2 => :nil?, :f3 => lambda{false} }) }
254
-
255
- describe "#accomplished_facts" do
256
- it "returns accomplished facts - ones with both dependencies and requirements satisfied" do
257
- subject.accomplished_facts(nil).should == [:f1, :f2]
258
- end
259
- end
260
-
261
- describe "#possible_facts" do
262
- it "returns possible facts - ones with dependencies but not requirements satisfied" do
263
- subject.possible_facts("SomeString").should == [:f2, :f3]
264
- end
265
- end
266
-
267
- describe "#facts" do
268
- it("returns all defined facts") { subject.facts.should == [:f1, :f2, :f3] }
269
- end
270
- end
271
-
272
- end
@@ -1,7 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe FactChecker::VERSION do
6
- it { should =~ /\A\d+\.\d+\.\d+\z/ }
7
- end
@@ -1,63 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe 'FactCheckerInheritance' do
6
- describe ChildOfClassWithFacts do
7
- subject { ChildOfClassWithFacts }
8
-
9
- it { should respond_to :def_fact }
10
- its(:fact_checker) { should be_kind_of FactChecker::Base }
11
-
12
- describe 'context for inherited facts' do
13
- let(:target) { ChildOfClassWithFacts.new }
14
-
15
- context 'inherited bare fact', fact: :bare_fact do
16
- it_behaves_like 'an accomplished fact', true
17
- it_behaves_like 'a possible fact', true
18
- end
19
-
20
- context 'inherited true fact with no dependencies', fact: :true_fact_with_no_dependencies do
21
- it_behaves_like 'an accomplished fact', true
22
- it_behaves_like 'a possible fact', true
23
- end
24
-
25
- context 'inherited true fact with true dependencies', fact: :true_fact_with_true_dependencies do
26
- it_behaves_like 'an accomplished fact', true
27
- it_behaves_like 'a possible fact', true
28
- end
29
-
30
- context 'inherited true fact with false dependencies', fact: :true_fact_with_false_dependencies do
31
- it_behaves_like 'an accomplished fact', false
32
- it_behaves_like 'a possible fact', false
33
- end
34
-
35
- context 'inherited false fact with no dependencies', fact: :false_fact_with_no_dependencies do
36
- it_behaves_like 'an accomplished fact', false
37
- it_behaves_like 'a possible fact', true
38
- end
39
-
40
- context 'inherited false fact with true dependencies', fact: :false_fact_with_true_dependencies do
41
- it_behaves_like 'an accomplished fact', false
42
- it_behaves_like 'a possible fact', true
43
- end
44
-
45
- context 'inherited false fact with false dependencies', fact: :false_fact_with_false_dependencies do
46
- it_behaves_like 'an accomplished fact', false
47
- it_behaves_like 'a possible fact', false
48
- end
49
-
50
- specify '#facts' do
51
- target.facts.size.should == 8
52
- end
53
-
54
- specify '#accomplished_facts' do
55
- target.accomplished_facts.should == [ :bare_fact, :true_fact_with_no_dependencies, :true_fact_with_true_dependencies, :_private_fact ]
56
- end
57
-
58
- specify '#possible_facts' do
59
- target.possible_facts.should == target.facts - [ :true_fact_with_false_dependencies, :false_fact_with_false_dependencies ]
60
- end
61
- end
62
- end
63
- end
@@ -1,87 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe FactChecker do
6
- describe ClassWithNoFacts do
7
- subject { ClassWithNoFacts.new }
8
-
9
- its(:facts) { should == [] }
10
- its(:possible_facts) { should == [] }
11
- its(:accomplished_facts) { should == [] }
12
-
13
- specify '#fact_possible? and #fact_accomplished?' do
14
- subject.fact_possible?(:unknown_fact).should be_true
15
- subject.fact_accomplished?(:unknown_fact).should be_false
16
- end
17
- end
18
-
19
- describe ClassWithFacts do
20
- subject { ClassWithFacts }
21
-
22
- it { should respond_to :def_fact }
23
- its(:fact_checker) { should be_kind_of FactChecker::Base }
24
-
25
- describe 'context for facts' do
26
- let(:target) { ClassWithFacts.new }
27
-
28
- context 'given private fact', fact: :_private_fact do
29
- specify 'private fact included in #facts' do
30
- target.facts.should include example.metadata[:fact]
31
- end
32
-
33
- specify 'private fact does not have a predicate method' do
34
- target.methods(true).should_not include example.metadata[:fact]
35
- -> { target.send(example.metadata[:fact].to_s + '?') }.should raise_error NoMethodError
36
- end
37
- end
38
-
39
- context 'given bare fact', fact: :bare_fact do
40
- it_behaves_like 'an accomplished fact', true
41
- it_behaves_like 'a possible fact', true
42
- end
43
-
44
- context 'given true fact with no dependencies', fact: :true_fact_with_no_dependencies do
45
- it_behaves_like 'an accomplished fact', true
46
- it_behaves_like 'a possible fact', true
47
- end
48
-
49
- context 'given true fact with true dependencies', fact: :true_fact_with_true_dependencies do
50
- it_behaves_like 'an accomplished fact', true
51
- it_behaves_like 'a possible fact', true
52
- end
53
-
54
- context 'given true fact with false dependencies', fact: :true_fact_with_false_dependencies do
55
- it_behaves_like 'an accomplished fact', false
56
- it_behaves_like 'a possible fact', false
57
- end
58
-
59
- context 'given false fact with no dependencies', fact: :false_fact_with_no_dependencies do
60
- it_behaves_like 'an accomplished fact', false
61
- it_behaves_like 'a possible fact', true
62
- end
63
-
64
- context 'given false fact with true dependencies', fact: :false_fact_with_true_dependencies do
65
- it_behaves_like 'an accomplished fact', false
66
- it_behaves_like 'a possible fact', true
67
- end
68
-
69
- context 'given false fact with false dependencies', fact: :false_fact_with_false_dependencies do
70
- it_behaves_like 'an accomplished fact', false
71
- it_behaves_like 'a possible fact', false
72
- end
73
-
74
- specify '#facts' do
75
- target.facts.size.should be 8
76
- end
77
-
78
- specify '#accomplished_facts' do
79
- target.accomplished_facts.should == [ :bare_fact, :true_fact_with_no_dependencies, :true_fact_with_true_dependencies, :_private_fact ]
80
- end
81
-
82
- specify '#possible_facts' do
83
- target.possible_facts.should == target.facts - [ :true_fact_with_false_dependencies, :false_fact_with_false_dependencies ]
84
- end
85
- end
86
- end
87
- end