cudd-rb 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|