logic 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/logic_operations.rb +1 -5
- data/lib/test_case_set.rb +23 -11
- data/lib/truth_table.rb +10 -6
- data/spec/logic_parser_spec.rb +16 -42
- data/spec/test_case_set_spec.rb +3 -12
- metadata +2 -2
data/lib/logic_operations.rb
CHANGED
@@ -5,7 +5,7 @@ require 'truth_table'
|
|
5
5
|
module LogicStatement
|
6
6
|
|
7
7
|
def test_cases
|
8
|
-
@test_cases ||= TestCaseSet.new(
|
8
|
+
@test_cases ||= TestCaseSet.new(condition_identifiers, self)
|
9
9
|
end
|
10
10
|
|
11
11
|
def truth_table
|
@@ -16,10 +16,6 @@ module LogicStatement
|
|
16
16
|
test_cases.mcdc_pairs
|
17
17
|
end
|
18
18
|
|
19
|
-
def condition_count
|
20
|
-
condition_identifiers.count
|
21
|
-
end
|
22
|
-
|
23
19
|
end
|
24
20
|
|
25
21
|
module Condition
|
data/lib/test_case_set.rb
CHANGED
@@ -2,24 +2,32 @@ require 'test_case'
|
|
2
2
|
|
3
3
|
class TestCaseSet
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
@
|
5
|
+
def initialize(condition_identifiers, decision)
|
6
|
+
@condition_identifiers = condition_identifiers
|
7
7
|
@decision = decision
|
8
8
|
@test_cases = create_cases
|
9
9
|
end
|
10
10
|
|
11
11
|
def create_cases
|
12
12
|
case_numbers.map do |case_number|
|
13
|
-
TestCase.new(case_number,
|
13
|
+
TestCase.new(case_number, condition_count, @decision)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
def case_numbers
|
18
|
-
1..2
|
18
|
+
1..2**condition_count
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
|
21
|
+
def condition_count
|
22
|
+
@condition_identifiers.count
|
23
|
+
end
|
24
|
+
|
25
|
+
def input_to_condition_mapping
|
26
|
+
input_identifiers.zip(@condition_identifiers)
|
27
|
+
end
|
28
|
+
|
29
|
+
def input_identifiers
|
30
|
+
identifier_range.take(condition_count)
|
23
31
|
end
|
24
32
|
|
25
33
|
def identifier_range
|
@@ -27,7 +35,7 @@ class TestCaseSet
|
|
27
35
|
end
|
28
36
|
|
29
37
|
def mcdc_pairs
|
30
|
-
|
38
|
+
input_identifiers.map do |condition_identifier|
|
31
39
|
"#{condition_identifier} => #{mcdc_pairs_for(condition_identifier)}"
|
32
40
|
end
|
33
41
|
end
|
@@ -44,12 +52,16 @@ class TestCaseSet
|
|
44
52
|
identifier_range.to_a.index(condition_identifier)
|
45
53
|
end
|
46
54
|
|
47
|
-
def
|
48
|
-
|
55
|
+
def formatted_input_to_condition_maping(format)
|
56
|
+
input_to_condition_mapping.inject("") do |output, input_condition_pair|
|
57
|
+
output += format % input_condition_pair
|
58
|
+
end
|
49
59
|
end
|
50
60
|
|
51
|
-
def
|
52
|
-
@test_cases.inject(
|
61
|
+
def formatted(format)
|
62
|
+
@test_cases.inject("") do |output, test_case|
|
63
|
+
output += test_case.formatted(format)
|
64
|
+
end
|
53
65
|
end
|
54
66
|
|
55
67
|
end
|
data/lib/truth_table.rb
CHANGED
@@ -5,17 +5,21 @@ class TruthTable
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def to_s
|
8
|
-
|
8
|
+
formatted_input_to_condition_maping + "\n" +
|
9
|
+
table_header + "\n" +
|
10
|
+
formatted_cases + "\n"
|
9
11
|
end
|
10
12
|
|
11
|
-
def
|
12
|
-
"
|
13
|
+
def formatted_input_to_condition_maping
|
14
|
+
@test_cases.formatted_input_to_condition_maping("%s <= %s\n")
|
15
|
+
end
|
16
|
+
|
17
|
+
def table_header
|
18
|
+
" %s | output" % @test_cases.input_identifiers.join(" ")
|
13
19
|
end
|
14
20
|
|
15
21
|
def formatted_cases
|
16
|
-
@test_cases.
|
17
|
-
output += test_case.formatted("%2d) %s | %3d\n")
|
18
|
-
end
|
22
|
+
@test_cases.formatted("%2d) %s | %3d\n")
|
19
23
|
end
|
20
24
|
|
21
25
|
end
|
data/spec/logic_parser_spec.rb
CHANGED
@@ -3,76 +3,51 @@ require 'treetop'
|
|
3
3
|
require 'logic_parser'
|
4
4
|
require 'logic_operations'
|
5
5
|
|
6
|
-
describe LogicParser do
|
6
|
+
describe LogicParser, :parsing do
|
7
7
|
|
8
8
|
let(:parser) { LogicParser.new }
|
9
9
|
|
10
|
-
describe "
|
11
|
-
|
12
|
-
let(:decision) { parser.parse('Hello') }
|
13
|
-
|
10
|
+
describe "a single condition" do
|
11
|
+
|
14
12
|
it "identifies the condition" do
|
13
|
+
decision = parser.parse('Hello')
|
15
14
|
decision.condition_identifiers.should == ['Hello']
|
16
15
|
end
|
17
16
|
|
18
|
-
it "has 1 condition" do
|
19
|
-
decision.condition_count.should == 1
|
20
|
-
end
|
21
|
-
|
22
17
|
end
|
23
18
|
|
24
|
-
describe "
|
25
|
-
|
26
|
-
let(:decision) { parser.parse('A or B') }
|
19
|
+
describe "'A or B'" do
|
27
20
|
|
28
21
|
it "condition identifiers are ['A','B']" do
|
22
|
+
decision = parser.parse('A or B')
|
29
23
|
decision.condition_identifiers.should == ['A','B']
|
30
24
|
end
|
31
25
|
|
32
|
-
it "has 2 conditions" do
|
33
|
-
decision.condition_count.should == 2
|
34
|
-
end
|
35
|
-
|
36
26
|
end
|
37
27
|
|
38
|
-
describe "
|
39
|
-
|
40
|
-
let(:decision) { parser.parse('A or B or C') }
|
28
|
+
describe "'A or B or C'" do
|
41
29
|
|
42
30
|
it "condition identifiers are ['A','B','C']" do
|
43
|
-
decision
|
44
|
-
|
45
|
-
|
46
|
-
it "has 3 conditions" do
|
47
|
-
decision.condition_count.should == 3
|
31
|
+
decision = parser.parse('A or B or C')
|
32
|
+
decision.condition_identifiers.should == ['A','B','C']
|
48
33
|
end
|
49
34
|
|
50
35
|
end
|
51
36
|
|
52
|
-
describe "
|
53
|
-
|
54
|
-
let(:decision) { parser.parse('A and B') }
|
37
|
+
describe "'A and B'" do
|
55
38
|
|
56
39
|
it "conditions are ['A','B']" do
|
40
|
+
decision = parser.parse('A and B')
|
57
41
|
decision.condition_identifiers.should == ['A','B']
|
58
42
|
end
|
59
43
|
|
60
|
-
it "has 2 conditions" do
|
61
|
-
decision.condition_count.should == 2
|
62
|
-
end
|
63
|
-
|
64
44
|
end
|
65
45
|
|
66
|
-
describe "
|
67
|
-
|
68
|
-
let(:decision) { parser.parse('A and B and C') }
|
46
|
+
describe "'A and B and C'" do
|
69
47
|
|
70
48
|
it "condition identifiers are ['A','B','C']" do
|
71
|
-
decision
|
72
|
-
|
73
|
-
|
74
|
-
it "has 3 conditions" do
|
75
|
-
decision.condition_count.should == 3
|
49
|
+
decision = parser.parse('A and B and C')
|
50
|
+
decision.condition_identifiers.should == ['A','B','C']
|
76
51
|
end
|
77
52
|
|
78
53
|
end
|
@@ -116,12 +91,11 @@ describe LogicParser do
|
|
116
91
|
[0, 1, 1] => 0
|
117
92
|
}
|
118
93
|
}.each do |logic, cases|
|
119
|
-
describe "
|
120
|
-
|
121
|
-
let(:decision) { parser.parse(logic) }
|
94
|
+
describe "'#{logic}'" do
|
122
95
|
|
123
96
|
cases.each do |conditions, result|
|
124
97
|
it "'#{conditions}' evaluates to '#{result}'" do
|
98
|
+
decision = parser.parse(logic)
|
125
99
|
decision.evaluate(conditions).should == result
|
126
100
|
end
|
127
101
|
end
|
data/spec/test_case_set_spec.rb
CHANGED
@@ -3,21 +3,12 @@ require 'test_case_set'
|
|
3
3
|
describe TestCaseSet do
|
4
4
|
|
5
5
|
describe "with 1 condition" do
|
6
|
-
|
7
|
-
let(:test_case_set) { TestCaseSet.new(1, nil) }
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
test_case_set.condition_identifiers.should include('a')
|
13
|
-
end
|
14
|
-
|
7
|
+
it "input_dentifiers includes 'a'" do
|
8
|
+
test_case_set = TestCaseSet.new(['hello'], nil)
|
9
|
+
test_case_set.input_identifiers.should include('a')
|
15
10
|
end
|
16
11
|
|
17
|
-
it "has 2 test cases" do
|
18
|
-
test_case_set.count.should == 2
|
19
|
-
end
|
20
|
-
|
21
12
|
end
|
22
13
|
|
23
14
|
end
|