cudd-rb 0.0.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.
- data/CHANGELOG.md +5 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +26 -0
- data/LICENCE.md +22 -0
- data/Manifest.txt +15 -0
- data/README.md +7 -0
- data/Rakefile +11 -0
- data/cudd-rb.gemspec +188 -0
- data/cudd-rb.noespec +30 -0
- data/lib/cudd-rb/bdd.rb +68 -0
- data/lib/cudd-rb/cube.rb +94 -0
- data/lib/cudd-rb/errors.rb +4 -0
- data/lib/cudd-rb/interfaces/bdd.rb +334 -0
- data/lib/cudd-rb/interfaces/root.rb +35 -0
- data/lib/cudd-rb/loader.rb +1 -0
- data/lib/cudd-rb/manager.rb +78 -0
- data/lib/cudd-rb/version.rb +14 -0
- data/lib/cudd-rb/wrapper.rb +58 -0
- data/lib/cudd-rb.rb +46 -0
- data/spec/cube/test_equality.rb +22 -0
- data/spec/cube/test_hash.rb +34 -0
- data/spec/cube/test_new.rb +49 -0
- data/spec/cube/test_to_a012.rb +34 -0
- data/spec/cube/test_to_bdd.rb +42 -0
- data/spec/cube/test_to_cube.rb +18 -0
- data/spec/cube/test_to_dnf.rb +55 -0
- data/spec/cube/test_to_hash.rb +34 -0
- data/spec/cube/test_to_truths.rb +34 -0
- data/spec/cudd/test_manager.rb +35 -0
- data/spec/interfaces/bdd/test_and.rb +14 -0
- data/spec/interfaces/bdd/test_bdd2cube.rb +32 -0
- data/spec/interfaces/bdd/test_bdd2dnf.rb +39 -0
- data/spec/interfaces/bdd/test_cofactor.rb +44 -0
- data/spec/interfaces/bdd/test_cube.rb +61 -0
- data/spec/interfaces/bdd/test_cube2bdd.rb +22 -0
- data/spec/interfaces/bdd/test_each_cube.rb +79 -0
- data/spec/interfaces/bdd/test_eval.rb +76 -0
- data/spec/interfaces/bdd/test_exist.rb +24 -0
- data/spec/interfaces/bdd/test_forall.rb +24 -0
- data/spec/interfaces/bdd/test_is_complement.rb +26 -0
- data/spec/interfaces/bdd/test_ite.rb +18 -0
- data/spec/interfaces/bdd/test_ith_var.rb +34 -0
- data/spec/interfaces/bdd/test_ith_vars.rb +40 -0
- data/spec/interfaces/bdd/test_new_var.rb +36 -0
- data/spec/interfaces/bdd/test_new_vars.rb +45 -0
- data/spec/interfaces/bdd/test_not.rb +18 -0
- data/spec/interfaces/bdd/test_one.rb +26 -0
- data/spec/interfaces/bdd/test_one_cube.rb +35 -0
- data/spec/interfaces/bdd/test_or.rb +14 -0
- data/spec/interfaces/bdd/test_restrict.rb +26 -0
- data/spec/interfaces/bdd/test_satisfiable.rb +33 -0
- data/spec/interfaces/bdd/test_satisfied.rb +40 -0
- data/spec/interfaces/bdd/test_size.rb +33 -0
- data/spec/interfaces/bdd/test_support.rb +66 -0
- data/spec/interfaces/bdd/test_var_index.rb +26 -0
- data/spec/interfaces/bdd/test_var_name.rb +32 -0
- data/spec/interfaces/bdd/test_var_names.rb +25 -0
- data/spec/interfaces/bdd/test_zero.rb +26 -0
- data/spec/manager/test_interface.rb +49 -0
- data/spec/shared/a_bdd.rb +15 -0
- data/spec/spec_helper.rb +45 -0
- data/spec/test_cudd-rb.rb +8 -0
- data/spec/wrapper/test_assumptions.rb +28 -0
- data/tasks/gem.rake +73 -0
- data/tasks/spec_test.rake +71 -0
- data/tasks/unit_test.rake +76 -0
- data/tasks/yard.rake +51 -0
- metadata +218 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'is_complement' do
|
4
|
+
|
5
|
+
context 'on ZERO' do
|
6
|
+
subject{ zero.is_complement? }
|
7
|
+
it{ should be_true }
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'on ONE' do
|
11
|
+
subject{ one.is_complement? }
|
12
|
+
it{ should be_false }
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'on x' do
|
16
|
+
subject{ x.is_complement? }
|
17
|
+
it{ should be_false }
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'on !x' do
|
21
|
+
subject{ !x.is_complement? }
|
22
|
+
it{ should be_true }
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'ite' do
|
4
|
+
|
5
|
+
subject{ bdd_interface.ite(x,y,z) }
|
6
|
+
|
7
|
+
it_behaves_like "a BDD"
|
8
|
+
|
9
|
+
it 'is equal (x & y) | (!x & z)' do
|
10
|
+
subject.should eq((x & y) | (!x & z))
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'is equal to x.ite(y, z)' do
|
14
|
+
subject.should eq(x.ite(y,z))
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'ith_var' do
|
4
|
+
|
5
|
+
subject{ bdd_interface.ith_var(1) }
|
6
|
+
|
7
|
+
it_behaves_like "a BDD"
|
8
|
+
|
9
|
+
it 'has the correct index' do
|
10
|
+
subject.var_index.should eq(1)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'is not one' do
|
14
|
+
subject.should_not be_one
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'is not zero' do
|
18
|
+
subject.should_not be_zero
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'is equal to itself' do
|
22
|
+
subject.should eq(bdd_interface.ith_var(1))
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'is not equal to another one' do
|
26
|
+
subject.should_not eq(bdd_interface.ith_var(0))
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'is satisfiable and not a tautology' do
|
30
|
+
subject.should be_satisfiable
|
31
|
+
subject.should_not be_tautology
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'ith_vars' do
|
4
|
+
|
5
|
+
subject{ bdd_interface.ith_vars(*Array(arg)) }
|
6
|
+
|
7
|
+
context "with a single Integer" do
|
8
|
+
let(:arg){ 2 }
|
9
|
+
|
10
|
+
it 'returns [ z ]' do
|
11
|
+
subject.should eq([ z ])
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "with multiple Integers" do
|
16
|
+
let(:arg){ [ 0, 2 ] }
|
17
|
+
|
18
|
+
it 'returns [ x, z ]' do
|
19
|
+
subject.should eq([ x, z ])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "with multiple Integers in an Array" do
|
24
|
+
let(:arg){ [[ 0, 2 ]] }
|
25
|
+
|
26
|
+
it 'returns [ x, z ]' do
|
27
|
+
subject.should eq([ x, z ])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "with multiple Integers in a Range" do
|
32
|
+
let(:arg){ 0..1 }
|
33
|
+
|
34
|
+
it 'returns [ x, y ]' do
|
35
|
+
subject.should eq([ x, y ])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'new_var' do
|
4
|
+
|
5
|
+
context 'without argument' do
|
6
|
+
subject{ bdd_interface.new_var }
|
7
|
+
|
8
|
+
it_behaves_like "a BDD"
|
9
|
+
|
10
|
+
it 'has the last index' do
|
11
|
+
next_index = bdd_interface.size
|
12
|
+
subject.var_index.should eq(next_index)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'has a default name' do
|
16
|
+
subject.var_name.should eq(:"v#{subject.var_index}")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with a name as argument' do
|
21
|
+
subject{ bdd_interface.new_var(:foo) }
|
22
|
+
|
23
|
+
it_behaves_like "a BDD"
|
24
|
+
|
25
|
+
it 'has the last index' do
|
26
|
+
next_index = bdd_interface.size
|
27
|
+
subject.var_index.should eq(next_index)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'has the provided name' do
|
31
|
+
subject.var_name.should eq(:foo)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'new_vars' do
|
4
|
+
|
5
|
+
context "with a number of variables" do
|
6
|
+
subject{ bdd_interface.new_vars(5) }
|
7
|
+
|
8
|
+
it 'returns an Array of 5 BDDs' do
|
9
|
+
subject.should be_a(Array)
|
10
|
+
subject.size.should eq(5)
|
11
|
+
subject.each{|bdd| bdd.should be_a(Cudd::BDD) }
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns 5 variables of different indexes' do
|
15
|
+
start = bdd_interface.size
|
16
|
+
subject.map(&:index).should eq((start...start+5).to_a)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with a single name' do
|
21
|
+
subject{ bdd_interface.new_vars(:foo) }
|
22
|
+
|
23
|
+
it 'returns an Array of 1 BDD with correct name' do
|
24
|
+
subject.map(&:var_name).should eq([:foo])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'with an array of names' do
|
29
|
+
subject{ bdd_interface.new_vars([:foo, :bar]) }
|
30
|
+
|
31
|
+
it 'returns an array of 2 BDDs with correct names' do
|
32
|
+
subject.map(&:var_name).should eq([:foo, :bar])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'with a varargs of names' do
|
37
|
+
subject{ bdd_interface.new_vars(:foo, :bar) }
|
38
|
+
|
39
|
+
it 'returns an array of 2 BDDs with correct names' do
|
40
|
+
subject.map(&:var_name).should eq([:foo, :bar])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'not' do
|
4
|
+
|
5
|
+
subject{ bdd_interface.not(x) }
|
6
|
+
|
7
|
+
it_behaves_like "a BDD"
|
8
|
+
|
9
|
+
it 'yields its origin if negated' do
|
10
|
+
bdd_interface.not(subject).should eq(x)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'is equal to !x' do
|
14
|
+
subject.should eq(!x)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'one' do
|
4
|
+
|
5
|
+
subject{ one }
|
6
|
+
|
7
|
+
it_behaves_like "a BDD"
|
8
|
+
|
9
|
+
it 'is one' do
|
10
|
+
subject.should be_one
|
11
|
+
subject.true?.should eq(true)
|
12
|
+
subject.should be_tautology
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'is not zero' do
|
16
|
+
subject.should_not be_zero
|
17
|
+
subject.should_not be_contradiction
|
18
|
+
subject.false?.should eq(false)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'is satisfiable' do
|
22
|
+
subject.should be_satisfiable
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
module Interfaces
|
4
|
+
describe BDD, "one_cube" do
|
5
|
+
|
6
|
+
subject{ formula.one_cube }
|
7
|
+
|
8
|
+
before do
|
9
|
+
formula.ref
|
10
|
+
subject.should be_a(Cube)
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
formula.deref if formula
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'on (x & y)' do
|
18
|
+
let(:formula){ x & y }
|
19
|
+
|
20
|
+
it 'returns an assignment x => true & y => true' do
|
21
|
+
subject.should eq(cube(x => true, y => true))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'on (x | y)' do
|
26
|
+
let(:formula){ x | y }
|
27
|
+
|
28
|
+
it 'returns a bdd satisfied by x => false, y => true' do
|
29
|
+
subject.should eq(cube(x => false, y => true))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'restrict' do
|
4
|
+
|
5
|
+
subject{ f.restrict(g) }
|
6
|
+
|
7
|
+
context 'when g is a cube' do
|
8
|
+
let(:f){ x & y }
|
9
|
+
let(:g){ {x => true} }
|
10
|
+
|
11
|
+
it_behaves_like "a BDD"
|
12
|
+
|
13
|
+
it{ should eq(f.cofactor(g)) }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when it is a complex bdd' do
|
17
|
+
let(:f){ (x & y) | z }
|
18
|
+
let(:g){ x.xor(y) }
|
19
|
+
|
20
|
+
it_behaves_like "a BDD"
|
21
|
+
|
22
|
+
it { should eq(z) }
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'satisfiable?' do
|
4
|
+
|
5
|
+
subject{ bdd.satisfiable? }
|
6
|
+
|
7
|
+
context 'on ZERO' do
|
8
|
+
let(:bdd){ zero }
|
9
|
+
it{ should be_false }
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'on ONE' do
|
13
|
+
let(:bdd){ one }
|
14
|
+
it{ should be_true }
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'on a variable' do
|
18
|
+
let(:bdd){ x }
|
19
|
+
it{ should be_true }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'on a satisfiable formula' do
|
23
|
+
let(:bdd){ x & y }
|
24
|
+
it{ should be_true }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'on a non satisfiable formula' do
|
28
|
+
let(:bdd){ x & !x }
|
29
|
+
it{ should be_false }
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'satisfied?' do
|
4
|
+
|
5
|
+
let(:assignment){ { x => true, y => false } }
|
6
|
+
|
7
|
+
subject{ bdd.satisfied?(assignment) }
|
8
|
+
|
9
|
+
context 'on ZERO' do
|
10
|
+
let(:bdd){ zero }
|
11
|
+
it{ should be_false }
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'on ONE' do
|
15
|
+
let(:bdd){ one }
|
16
|
+
it{ should be_true }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'on the variable x' do
|
20
|
+
let(:bdd){ x }
|
21
|
+
it{ should be_true }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'on the variable y' do
|
25
|
+
let(:bdd){ y }
|
26
|
+
it{ should be_false }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'on a non satisfied formula' do
|
30
|
+
let(:bdd){ x & y }
|
31
|
+
it{ should be_false }
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'on a satisfied formula' do
|
35
|
+
let(:bdd){ x | y }
|
36
|
+
it{ should be_true }
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'size' do
|
4
|
+
|
5
|
+
after do
|
6
|
+
interface.close if interface
|
7
|
+
end
|
8
|
+
subject{ interface.size }
|
9
|
+
|
10
|
+
context 'when built without size' do
|
11
|
+
let(:interface){ Cudd.manager.interface(:BDD) }
|
12
|
+
|
13
|
+
it 'starts at zero by default' do
|
14
|
+
subject.should eq(0)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'counts the number of declared variables' do
|
18
|
+
interface.new_var
|
19
|
+
interface.new_var
|
20
|
+
subject.should eq(2)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when built with an initialize bdd size' do
|
25
|
+
let(:interface){ Cudd.manager(:numVars => 10).interface(:BDD) }
|
26
|
+
|
27
|
+
it 'starts at ten by default' do
|
28
|
+
subject.should eq(10)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
module Interfaces
|
4
|
+
describe BDD, "support" do
|
5
|
+
|
6
|
+
subject{ formula.support }
|
7
|
+
|
8
|
+
before do
|
9
|
+
formula.ref
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
formula.deref if formula
|
14
|
+
end
|
15
|
+
|
16
|
+
context "on ZERO" do
|
17
|
+
let(:formula){ zero }
|
18
|
+
|
19
|
+
it 'returns ONE' do
|
20
|
+
subject.should eq(one)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "on ONE" do
|
25
|
+
let(:formula){ one }
|
26
|
+
|
27
|
+
it 'returns ONE' do
|
28
|
+
subject.should eq(one)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "on x" do
|
33
|
+
let(:formula){ x }
|
34
|
+
|
35
|
+
it 'returns x' do
|
36
|
+
subject.should eq(x)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "on !x" do
|
41
|
+
let(:formula){ !x }
|
42
|
+
|
43
|
+
it 'returns x' do
|
44
|
+
subject.should eq(x)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'on (x & y)' do
|
49
|
+
let(:formula){ x & y }
|
50
|
+
|
51
|
+
it 'returns x & y' do
|
52
|
+
subject.should eq(x & y)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'on (x | !y)' do
|
57
|
+
let(:formula){ x | !y }
|
58
|
+
|
59
|
+
it 'returns x & y' do
|
60
|
+
subject.should eq(x & y)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'var_index' do
|
4
|
+
|
5
|
+
it 'returns nil on zero' do
|
6
|
+
zero.var_index.should be_nil
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'returns nil on one' do
|
10
|
+
one.var_index.should be_nil
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'returns 0 on x' do
|
14
|
+
x.var_index.should eq(0)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'returns 1 on y' do
|
18
|
+
y.var_index.should eq(1)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns 2 on z' do
|
22
|
+
z.var_index.should eq(2)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'var_name' do
|
4
|
+
|
5
|
+
subject{ bdd_interface.var_name(bdd) }
|
6
|
+
|
7
|
+
context 'on zero' do
|
8
|
+
let(:bdd){ zero }
|
9
|
+
|
10
|
+
it{ should eq(:zero) }
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'on one' do
|
14
|
+
let(:bdd){ one }
|
15
|
+
|
16
|
+
it{ should eq(:one) }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'on an unnamed variable' do
|
20
|
+
let(:bdd){ x }
|
21
|
+
|
22
|
+
it { should eq(:v0) }
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'on an named variable' do
|
26
|
+
let(:bdd){ bdd_interface.new_var(:foo) }
|
27
|
+
|
28
|
+
it { should eq(:foo) }
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'var_names' do
|
4
|
+
|
5
|
+
subject{ bdd_interface.var_names }
|
6
|
+
|
7
|
+
context 'when no variables have been declared at all' do
|
8
|
+
it{ should eq([]) }
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when some variables have been declared but not named' do
|
12
|
+
before{ x; y }
|
13
|
+
it{ should eq([ :v0, :v1 ]) }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when some variables have even been named' do
|
17
|
+
before{
|
18
|
+
x; y
|
19
|
+
bdd_interface.var_names = [ :x ]
|
20
|
+
}
|
21
|
+
it{ should eq([ :x, :v1 ]) }
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Interface::BDD, 'zero' do
|
4
|
+
|
5
|
+
subject{ zero }
|
6
|
+
|
7
|
+
it_behaves_like "a BDD"
|
8
|
+
|
9
|
+
it 'is zero' do
|
10
|
+
subject.should be_zero
|
11
|
+
subject.should be_contradiction
|
12
|
+
subject.false?.should eq(true)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'is not one' do
|
16
|
+
subject.should_not be_one
|
17
|
+
subject.true?.should eq(false)
|
18
|
+
subject.should_not be_tautology
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'is not satisfiable' do
|
22
|
+
subject.should_not be_satisfiable
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Cudd
|
3
|
+
describe Manager, "#interface" do
|
4
|
+
|
5
|
+
it 'serves itself as Root interface' do
|
6
|
+
with_manager do |m|
|
7
|
+
i = m.interface(:Root)
|
8
|
+
|
9
|
+
i.should be_a(Manager)
|
10
|
+
i.should be_root_manager
|
11
|
+
|
12
|
+
i.should be_a(Interface::Root)
|
13
|
+
i.should eq(m)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'serves the BDD interface without error' do
|
18
|
+
with_manager do |m|
|
19
|
+
manager = m
|
20
|
+
i = m.interface(:BDD)
|
21
|
+
|
22
|
+
i.should be_a(Manager)
|
23
|
+
i.should_not be_root_manager
|
24
|
+
|
25
|
+
i.should be_a(Interface::Root)
|
26
|
+
i.should be_a(Interface::BDD)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'always serves the same Root' do
|
31
|
+
with_manager do |m|
|
32
|
+
root1 = m.interface(:Root)
|
33
|
+
bdd1 = m.interface(:BDD)
|
34
|
+
bdd1.interface(:Root).should eq(root1)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'always serves the same names interface' do
|
39
|
+
with_manager do |m|
|
40
|
+
bdd1 = m.interface(:BDD)
|
41
|
+
bdd2 = m.interface(:BDD)
|
42
|
+
bdd3 = bdd1.interface(:BDD)
|
43
|
+
bdd1.should eq(bdd2)
|
44
|
+
bdd2.should eq(bdd3)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
shared_examples_for "a BDD" do
|
2
|
+
|
3
|
+
it 'is a FFI::Pointer' do
|
4
|
+
subject.should be_a(FFI::Pointer)
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'includes the Cudd::BDD module' do
|
8
|
+
subject.should be_a(Cudd::BDD)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'has a manager, which is a Cudd::Manager' do
|
12
|
+
subject.manager.should be_a(Cudd::Manager)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|