dither 0.1.5-java → 0.2.0-java
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +6 -1
- data/README.md +3 -0
- data/Rakefile +4 -0
- data/dither.gemspec +5 -1
- data/ext/dither/README.md +2 -0
- data/ext/dither/base_constraint_handler.h +36 -0
- data/ext/dither/combinations.h +127 -0
- data/ext/dither/dither.cc +47 -0
- data/ext/dither/dither.h +31 -0
- data/ext/dither/dither_types.h +32 -0
- data/ext/dither/extconf.rb +4 -0
- data/ext/dither/ipog.cc +451 -0
- data/ext/dither/ipog.h +128 -0
- data/ext/dither/simple_constraint_handler.cc +105 -0
- data/ext/dither/simple_constraint_handler.h +39 -0
- data/lib/dither/api.rb +21 -0
- data/lib/dither/version.rb +1 -1
- data/lib/{dither-0.1.3.jar → dither-0.1.4.jar} +0 -0
- data/lib/dither.rb +65 -14
- data/spec/dither/dither_spec.rb +28 -97
- metadata +42 -22
- data/lib/dither/ipog.rb +0 -58
- data/lib/dither/ipog_helper.rb +0 -161
- data/lib/dither/mipog.rb +0 -85
- data/lib/dither/param.rb +0 -19
- data/lib/dither/test_case.rb +0 -80
- data/lib/dither/unbound_param.rb +0 -17
@@ -0,0 +1,39 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright (C) 2015 Jason Gowan
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* This software may be modified and distributed under the terms
|
7
|
+
* of the BSD license. See the LICENSE file for details.
|
8
|
+
*/
|
9
|
+
|
10
|
+
#ifndef SIMPLE_CONSTRAINT_HANDLER_H_
|
11
|
+
#define SIMPLE_CONSTRAINT_HANDLER_H_
|
12
|
+
|
13
|
+
#include <vector>
|
14
|
+
#include <utility>
|
15
|
+
#include <algorithm>
|
16
|
+
#include "dither_types.h"
|
17
|
+
#include "base_constraint_handler.h"
|
18
|
+
|
19
|
+
namespace dither {
|
20
|
+
|
21
|
+
class SimpleConstraintHandler : public BaseConstraintHandler {
|
22
|
+
protected:
|
23
|
+
std::vector<std::vector<std::pair<std::size_t, dval>>> constraints;
|
24
|
+
std::vector<dval> params;
|
25
|
+
std::vector<dval> scratch;
|
26
|
+
|
27
|
+
inline bool violate_constraint(const dtest_case& test_case, const std::vector<std::pair<std::size_t, dval>>& constraint);
|
28
|
+
inline bool violate_constraints_(const dtest_case &test_case);
|
29
|
+
|
30
|
+
public:
|
31
|
+
SimpleConstraintHandler(std::vector<dval>& ranges, std::vector<std::vector<dval>>& pconstraints);
|
32
|
+
bool violate_constraints(const dtest_case &test_case);
|
33
|
+
bool violate_constraints(const std::vector<param> &test_case);
|
34
|
+
bool ground(dtest_case &test_case);
|
35
|
+
};
|
36
|
+
}
|
37
|
+
|
38
|
+
#endif // SIMPLE_CONSTRAINT_HANDLER_H_
|
39
|
+
|
data/lib/dither/api.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
require 'ffi'
|
3
|
+
|
4
|
+
# Interface to the c++ api.
|
5
|
+
module Dither
|
6
|
+
module API
|
7
|
+
extend FFI::Library
|
8
|
+
LIB_DIR = File.expand_path('../..', __FILE__)
|
9
|
+
ffi_lib %W[#{LIB_DIR}/dither.so #{LIB_DIR}/dither.dll]
|
10
|
+
|
11
|
+
attach_function :dither_ipog_new, [:int], :pointer
|
12
|
+
attach_function :dither_ipog_add_parameter_int, [:pointer, :int, :pointer, :int], :void
|
13
|
+
attach_function :dither_ipog_run, [:pointer], :void
|
14
|
+
attach_function :dither_ipog_size, [:pointer], :int
|
15
|
+
attach_function :dither_ipog_display_raw_solution, [:pointer], :void
|
16
|
+
attach_function :dither_ipog_fill, [:pointer, :pointer], :void
|
17
|
+
attach_function :dither_ipog_add_constraint, [:pointer, :pointer, :int], :void
|
18
|
+
attach_function :dither_ipog_add_previously_tested, [:pointer, :pointer, :int], :void
|
19
|
+
# attach_function :dither_ipog_delete, [:pointer], :void
|
20
|
+
end
|
21
|
+
end
|
data/lib/dither/version.rb
CHANGED
Binary file
|
data/lib/dither.rb
CHANGED
@@ -12,18 +12,73 @@ module Dither
|
|
12
12
|
# deprecated
|
13
13
|
def self.all_pairs(params, t = 2, opts = {})
|
14
14
|
opts[:t] = t
|
15
|
-
|
15
|
+
ipog(params, opts)
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.ipog(params, opts = {})
|
19
19
|
opts = DEFUALT_OPTS.dup.merge(opts)
|
20
|
-
|
21
|
-
|
20
|
+
t = opts[:t] || 2
|
21
|
+
if t < 2
|
22
|
+
raise Dither::Error,'t must be >= 2'
|
23
|
+
end
|
24
|
+
raise Dither::Error, 'param length must be > 1' if params.any? { |a| a.size <= 1 }
|
25
|
+
if t > params.size
|
26
|
+
raise Dither::Error, 't must be <= params.length'
|
27
|
+
end
|
22
28
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
29
|
+
pointer = Dither::API.dither_ipog_new(t)
|
30
|
+
c_params = (0..params.max { |a| a.size }.size).to_a
|
31
|
+
c_int_params = FFI::MemoryPointer.new(:int, c_params.size)
|
32
|
+
c_int_params.write_array_of_int(c_params)
|
33
|
+
|
34
|
+
params.each_with_index do |param, i|
|
35
|
+
Dither::API.dither_ipog_add_parameter_int(pointer, i, c_int_params, param.size)
|
36
|
+
end
|
37
|
+
|
38
|
+
if opts[:constraints]
|
39
|
+
constraint_scratch = FFI::MemoryPointer.new(:int, params.size)
|
40
|
+
opts[:constraints].each do |constraint|
|
41
|
+
arr = Array.new(params.size, -1)
|
42
|
+
constraint.each do |k, v|
|
43
|
+
if k >= params.size
|
44
|
+
raise Dither::Error, "Invalid constraint #{k} > #{params.size}"
|
45
|
+
end
|
46
|
+
if v >= params[k].size
|
47
|
+
raise Dither::Error, "Invalid constraint #{k} > #{params[k].size}"
|
48
|
+
|
49
|
+
end
|
50
|
+
arr[k] = v
|
51
|
+
end
|
52
|
+
constraint_scratch.write_array_of_int(arr)
|
53
|
+
Dither::API.dither_ipog_add_constraint(pointer, constraint_scratch, params.size)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if opts[:previously_tested]
|
58
|
+
tested_scratch = FFI::MemoryPointer.new(:int, params.size)
|
59
|
+
opts[:previously_tested].each do |test_case|
|
60
|
+
if test_case.size != params.size
|
61
|
+
raise Dither::Error
|
62
|
+
end
|
63
|
+
arr = Array.new(params.size)
|
64
|
+
(0...params.size).each do |i|
|
65
|
+
arr[i] = params[i].find_index(test_case[i])
|
66
|
+
end
|
67
|
+
tested_scratch.write_array_of_int(arr)
|
68
|
+
Dither::API.dither_ipog_add_previously_tested(pointer, tested_scratch, params.size)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
Dither::API.dither_ipog_run(pointer)
|
73
|
+
result_size = Dither::API.dither_ipog_size(pointer)
|
74
|
+
solution = FFI::MemoryPointer.new(:int, params.size * result_size)
|
75
|
+
Dither::API.dither_ipog_fill(pointer, solution)
|
76
|
+
|
77
|
+
results = solution.read_array_of_int(params.size * result_size)
|
78
|
+
.enum_for(:each_slice, params.size)
|
79
|
+
.map do |test_case|
|
80
|
+
test_case.zip(params).map { |a, b| b[a] }
|
81
|
+
end
|
27
82
|
end
|
28
83
|
|
29
84
|
def self.aetg(params, opts = {})
|
@@ -34,12 +89,6 @@ module Dither
|
|
34
89
|
class << self; alias_method :ateg, :aetg end
|
35
90
|
end # Dither
|
36
91
|
|
37
|
-
require 'dither/param'
|
38
|
-
require 'dither/unbound_param'
|
39
|
-
require 'dither/test_case'
|
40
|
-
require 'dither/ipog_helper'
|
41
|
-
require 'dither/ipog'
|
42
|
-
require 'dither/mipog'
|
43
92
|
require 'dither/chinese_postman_problem'
|
44
93
|
require 'dither/aetg'
|
45
94
|
require 'dither/aetg_pairwise'
|
@@ -48,7 +97,9 @@ require 'dither/graph'
|
|
48
97
|
if RUBY_PLATFORM =~ /java/
|
49
98
|
require 'java'
|
50
99
|
require 'choco-solver-3.3.1-with-dependencies.jar'
|
51
|
-
require 'dither-0.1.
|
100
|
+
require 'dither-0.1.4.jar'
|
52
101
|
|
53
102
|
require 'dither/java_ext/dither'
|
103
|
+
else
|
104
|
+
require 'dither/api'
|
54
105
|
end
|
data/spec/dither/dither_spec.rb
CHANGED
@@ -2,10 +2,6 @@ require File.expand_path('../../spec_helper.rb', __FILE__)
|
|
2
2
|
|
3
3
|
describe Dither do
|
4
4
|
|
5
|
-
it 'mipog does not support constraints' do
|
6
|
-
expect { Dither.mipog([[1,1],[1,2]], 2, :constraints => []) }.to raise_error(Dither::Error, 'mipog does not support constraints')
|
7
|
-
end
|
8
|
-
|
9
5
|
it 't must be >= 2' do
|
10
6
|
expect { Dither.ipog([], :t => 0) }.to raise_error(Dither::Error, 't must be >= 2')
|
11
7
|
end
|
@@ -20,63 +16,15 @@ describe Dither do
|
|
20
16
|
|
21
17
|
it 'can compute 2-way ipog using symbols' do
|
22
18
|
params = [[:a, :b, :c], [:d, :e, :f], [:h, :i]]
|
23
|
-
expect(Dither.
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'can compute 3-way mipog' do
|
35
|
-
params = [(0...2).to_a, (0...2).to_a, (0..3).to_a]
|
36
|
-
expect(Dither.mipog(params, 3)).to eq([[0, 0, 0],
|
37
|
-
[1, 0, 0],
|
38
|
-
[0, 1, 0],
|
39
|
-
[1, 1, 0],
|
40
|
-
[0, 0, 1],
|
41
|
-
[1, 0, 1],
|
42
|
-
[0, 1, 1],
|
43
|
-
[1, 1, 1],
|
44
|
-
[0, 0, 2],
|
45
|
-
[1, 0, 2],
|
46
|
-
[0, 1, 2],
|
47
|
-
[1, 1, 2],
|
48
|
-
[0, 0, 3],
|
49
|
-
[1, 0, 3],
|
50
|
-
[0, 1, 3],
|
51
|
-
[1, 1, 3],
|
52
|
-
])
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'can compute 2-way mipog using symbols' do
|
56
|
-
params = [[:a, :b, :c], [:d, :e, :f], [:h, :i]]
|
57
|
-
expect(Dither.mipog(params).to_set).to eq([[:a, :d, :h],
|
58
|
-
[:a, :e, :i],
|
59
|
-
[:a, :f, :h],
|
60
|
-
[:b, :d, :i],
|
61
|
-
[:b, :e, :h],
|
62
|
-
[:b, :f, :i],
|
63
|
-
[:c, :d, :h],
|
64
|
-
[:c, :e, :i],
|
65
|
-
[:c, :f, :h]].to_set)
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'can compute 2-way mipog' do
|
69
|
-
params = [(0...2).to_a, (0..3).to_a]
|
70
|
-
expect(Dither.mipog(params)).to eq([
|
71
|
-
[0, 0],
|
72
|
-
[1, 0],
|
73
|
-
[0, 1],
|
74
|
-
[1, 1],
|
75
|
-
[0, 2],
|
76
|
-
[1, 2],
|
77
|
-
[0, 3],
|
78
|
-
[1, 3],
|
79
|
-
])
|
19
|
+
expect(Dither.all_pairs(params)).to eq([[:c, :f, :h],
|
20
|
+
[:b, :f, :i],
|
21
|
+
[:a, :f, :h],
|
22
|
+
[:c, :e, :i],
|
23
|
+
[:b, :e, :h],
|
24
|
+
[:a, :e, :i],
|
25
|
+
[:c, :d, :h],
|
26
|
+
[:b, :d, :i],
|
27
|
+
[:a, :d, :h]])
|
80
28
|
end
|
81
29
|
|
82
30
|
it 'can compute 2-way ipog' do
|
@@ -90,7 +38,7 @@ describe Dither do
|
|
90
38
|
[1, 2],
|
91
39
|
[0, 3],
|
92
40
|
[1, 3],
|
93
|
-
|
41
|
+
].reverse)
|
94
42
|
end
|
95
43
|
|
96
44
|
it 'can compute 3-way ipog' do
|
@@ -115,55 +63,38 @@ describe Dither do
|
|
115
63
|
end
|
116
64
|
|
117
65
|
it 'can compute 3-way ipog with constraints' do
|
118
|
-
params = [
|
119
|
-
|
66
|
+
params = [[:a, :b], (0...2).to_a, (0..3).to_a]
|
67
|
+
results = Dither.ipog(params, :t => 3,
|
120
68
|
:constraints => [
|
121
69
|
{0 => 0,
|
122
70
|
2 => 2},
|
123
71
|
{0 => 0,
|
124
72
|
1 => 1,
|
125
73
|
2 => 0}],
|
126
|
-
:previously_tested => [[
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
[0, 1, 3],
|
138
|
-
[1, 1, 3],
|
139
|
-
].to_set)
|
74
|
+
:previously_tested => [[:a, 0, 0]]
|
75
|
+
)
|
76
|
+
results.each do |result|
|
77
|
+
expect(result[0] == :a && result[1] == 1 && result[2] == 0).to be false
|
78
|
+
end
|
79
|
+
results.each do |result|
|
80
|
+
expect(result[0] == :a && result[1] == 2).to be false
|
81
|
+
end
|
82
|
+
results.each do |result|
|
83
|
+
expect(result[0] == :a && result[1] == 0 && result[2] == 0).to be false
|
84
|
+
end
|
140
85
|
end
|
141
86
|
|
142
87
|
it 'another 3-way ipog with constraints' do
|
143
88
|
params = [(0...2).to_a, (0...2).to_a, (0...2).to_a, (0..3).to_a]
|
144
|
-
|
89
|
+
results = Dither.ipog(params, :t => 3,
|
145
90
|
:constraints => [
|
146
91
|
{0 => 0,
|
147
92
|
1 => 1,
|
148
93
|
2 => 0}
|
149
|
-
])
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
[1, 0, 0, 1],
|
154
|
-
[1, 1, 0, 1],
|
155
|
-
[0, 0, 1, 1],
|
156
|
-
[1, 1, 1, 1],
|
157
|
-
[0, 0, 0, 2],
|
158
|
-
[1, 1, 0, 2],
|
159
|
-
[1, 0, 1, 2],
|
160
|
-
[0, 1, 1, 2],
|
161
|
-
[0, 0, 0, 3],
|
162
|
-
[1, 1, 0, 3],
|
163
|
-
[1, 0, 1, 3],
|
164
|
-
[0, 1, 1, 3],
|
165
|
-
[0, 0, 0, 1],
|
166
|
-
[0, 1, 1, 1]].to_set)
|
94
|
+
])
|
95
|
+
results.each do |result|
|
96
|
+
expect(result[0] == 0 && result[1] == 1 && result[2] == 0).to be false
|
97
|
+
end
|
167
98
|
end
|
168
99
|
|
169
100
|
it 'can run 2-way aetg' do
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dither
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Jason Gowan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
|
-
- - ~>
|
16
|
+
- - "~>"
|
17
17
|
- !ruby/object:Gem::Version
|
18
18
|
version: '3.2'
|
19
19
|
name: rspec
|
@@ -21,13 +21,13 @@ dependencies:
|
|
21
21
|
type: :development
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
29
29
|
requirements:
|
30
|
-
- - ~>
|
30
|
+
- - "~>"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 0.9.2
|
33
33
|
name: rake
|
@@ -35,13 +35,27 @@ dependencies:
|
|
35
35
|
type: :development
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.9.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- -
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
name: rake-compiler
|
48
|
+
prerelease: false
|
49
|
+
type: :development
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
45
59
|
- !ruby/object:Gem::Version
|
46
60
|
version: '0'
|
47
61
|
name: coveralls
|
@@ -49,7 +63,7 @@ dependencies:
|
|
49
63
|
type: :development
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
description: Efficient test generation strategies
|
@@ -59,34 +73,40 @@ executables: []
|
|
59
73
|
extensions: []
|
60
74
|
extra_rdoc_files: []
|
61
75
|
files:
|
62
|
-
- .gitignore
|
63
|
-
- .ruby-version
|
64
|
-
- .travis.yml
|
76
|
+
- ".gitignore"
|
77
|
+
- ".ruby-version"
|
78
|
+
- ".travis.yml"
|
65
79
|
- Gemfile
|
66
80
|
- Gemfile.lock
|
67
81
|
- LICENSE
|
68
82
|
- README.md
|
69
83
|
- Rakefile
|
70
84
|
- dither.gemspec
|
85
|
+
- ext/dither/README.md
|
86
|
+
- ext/dither/base_constraint_handler.h
|
87
|
+
- ext/dither/combinations.h
|
88
|
+
- ext/dither/dither.cc
|
89
|
+
- ext/dither/dither.h
|
90
|
+
- ext/dither/dither_types.h
|
91
|
+
- ext/dither/extconf.rb
|
92
|
+
- ext/dither/ipog.cc
|
93
|
+
- ext/dither/ipog.h
|
94
|
+
- ext/dither/simple_constraint_handler.cc
|
95
|
+
- ext/dither/simple_constraint_handler.h
|
96
|
+
- lib/choco-solver-3.3.1-with-dependencies.jar
|
97
|
+
- lib/dither-0.1.4.jar
|
71
98
|
- lib/dither.rb
|
72
99
|
- lib/dither/aetg.rb
|
73
100
|
- lib/dither/aetg_pairwise.rb
|
101
|
+
- lib/dither/api.rb
|
74
102
|
- lib/dither/chinese_postman_problem.rb
|
75
103
|
- lib/dither/graph.rb
|
76
|
-
- lib/dither/ipog.rb
|
77
|
-
- lib/dither/ipog_helper.rb
|
78
104
|
- lib/dither/java_ext/dither.rb
|
79
|
-
- lib/dither/mipog.rb
|
80
|
-
- lib/dither/param.rb
|
81
|
-
- lib/dither/test_case.rb
|
82
|
-
- lib/dither/unbound_param.rb
|
83
105
|
- lib/dither/version.rb
|
84
106
|
- spec/dither/chinese_postman_problem_spec.rb
|
85
107
|
- spec/dither/dither_spec.rb
|
86
108
|
- spec/dither/graph_spec.rb
|
87
109
|
- spec/spec_helper.rb
|
88
|
-
- lib/dither-0.1.3.jar
|
89
|
-
- lib/choco-solver-3.3.1-with-dependencies.jar
|
90
110
|
homepage: https://github.com/jesg/dither
|
91
111
|
licenses:
|
92
112
|
- MIT
|
@@ -97,17 +117,17 @@ require_paths:
|
|
97
117
|
- lib
|
98
118
|
required_ruby_version: !ruby/object:Gem::Requirement
|
99
119
|
requirements:
|
100
|
-
- -
|
120
|
+
- - ">="
|
101
121
|
- !ruby/object:Gem::Version
|
102
122
|
version: '0'
|
103
123
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
124
|
requirements:
|
105
|
-
- -
|
125
|
+
- - ">="
|
106
126
|
- !ruby/object:Gem::Version
|
107
127
|
version: '0'
|
108
128
|
requirements: []
|
109
129
|
rubyforge_project: dither
|
110
|
-
rubygems_version: 2.
|
130
|
+
rubygems_version: 2.4.8
|
111
131
|
signing_key:
|
112
132
|
specification_version: 4
|
113
133
|
summary: Collection of test generation strategies
|
data/lib/dither/ipog.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module Dither
|
4
|
-
class IPOG
|
5
|
-
include IPOGHelper
|
6
|
-
|
7
|
-
def run
|
8
|
-
# add into test set a test for each combination of values
|
9
|
-
# of the first t parameter
|
10
|
-
test_set = comb
|
11
|
-
|
12
|
-
(t...params.length).each do |i|
|
13
|
-
# let pi
|
14
|
-
# be the set of t-way combinations of values involving
|
15
|
-
# parameter Pi and t -1 parameters among the first i – 1
|
16
|
-
# parameters
|
17
|
-
pi = comb_i(i)
|
18
|
-
|
19
|
-
# horizontal extension for parameter i
|
20
|
-
test_set.each do |test_case|
|
21
|
-
cover = maximize_coverage(i, test_case, pi)
|
22
|
-
|
23
|
-
if cover.nil?
|
24
|
-
test_set.delete(test_case)
|
25
|
-
else
|
26
|
-
pi -= cover
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# vertical extension for parameter i
|
31
|
-
pi.each do |a|
|
32
|
-
if test_set.any? { |b| a.subset?(b) }
|
33
|
-
pi.delete(a)
|
34
|
-
else
|
35
|
-
|
36
|
-
test_case = nil
|
37
|
-
test_set.each do |b|
|
38
|
-
test_case = b.merge_without_conflict(i, a) do |a|
|
39
|
-
violates_constraints?(a)
|
40
|
-
end
|
41
|
-
break unless test_case.nil?
|
42
|
-
end
|
43
|
-
|
44
|
-
if test_case.nil?
|
45
|
-
test_set << a.create_unbound(i)
|
46
|
-
end
|
47
|
-
pi.delete(a)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
@test_set = test_set.map { |a| fill_unbound(a) }
|
53
|
-
.delete_if(&:nil?)
|
54
|
-
.to_a
|
55
|
-
@test_set
|
56
|
-
end
|
57
|
-
end # IPOG
|
58
|
-
end # Dither
|