gecoder-with-gecode 0.7.1-mswin32

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.
Files changed (159) hide show
  1. data/CHANGES +81 -0
  2. data/COPYING +17 -0
  3. data/LGPL-LICENSE +458 -0
  4. data/README +45 -0
  5. data/Rakefile +13 -0
  6. data/example/example_helper.rb +1 -0
  7. data/example/magic_sequence.rb +43 -0
  8. data/example/queens.rb +43 -0
  9. data/example/raw_bindings.rb +42 -0
  10. data/example/send_more_money.rb +43 -0
  11. data/example/send_most_money.rb +58 -0
  12. data/example/square_tiling.rb +84 -0
  13. data/example/sudoku-set.rb +110 -0
  14. data/example/sudoku.rb +61 -0
  15. data/lib/gecode.dll +0 -0
  16. data/lib/gecoder.rb +5 -0
  17. data/lib/gecoder/bindings.rb +54 -0
  18. data/lib/gecoder/bindings/bindings.rb +2210 -0
  19. data/lib/gecoder/interface.rb +8 -0
  20. data/lib/gecoder/interface/binding_changes.rb +313 -0
  21. data/lib/gecoder/interface/branch.rb +152 -0
  22. data/lib/gecoder/interface/constraints.rb +397 -0
  23. data/lib/gecoder/interface/constraints/bool/boolean.rb +246 -0
  24. data/lib/gecoder/interface/constraints/bool/linear.rb +29 -0
  25. data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +84 -0
  26. data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +8 -0
  27. data/lib/gecoder/interface/constraints/bool_var_constraints.rb +75 -0
  28. data/lib/gecoder/interface/constraints/int/arithmetic.rb +71 -0
  29. data/lib/gecoder/interface/constraints/int/domain.rb +78 -0
  30. data/lib/gecoder/interface/constraints/int/linear.rb +295 -0
  31. data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +72 -0
  32. data/lib/gecoder/interface/constraints/int_enum/channel.rb +100 -0
  33. data/lib/gecoder/interface/constraints/int_enum/count.rb +92 -0
  34. data/lib/gecoder/interface/constraints/int_enum/distinct.rb +69 -0
  35. data/lib/gecoder/interface/constraints/int_enum/element.rb +82 -0
  36. data/lib/gecoder/interface/constraints/int_enum/equality.rb +38 -0
  37. data/lib/gecoder/interface/constraints/int_enum/sort.rb +126 -0
  38. data/lib/gecoder/interface/constraints/int_enum_constraints.rb +37 -0
  39. data/lib/gecoder/interface/constraints/int_var_constraints.rb +58 -0
  40. data/lib/gecoder/interface/constraints/reifiable_constraints.rb +78 -0
  41. data/lib/gecoder/interface/constraints/set/cardinality.rb +75 -0
  42. data/lib/gecoder/interface/constraints/set/connection.rb +193 -0
  43. data/lib/gecoder/interface/constraints/set/domain.rb +109 -0
  44. data/lib/gecoder/interface/constraints/set/operation.rb +132 -0
  45. data/lib/gecoder/interface/constraints/set/relation.rb +178 -0
  46. data/lib/gecoder/interface/constraints/set_enum/channel.rb +18 -0
  47. data/lib/gecoder/interface/constraints/set_enum/distinct.rb +80 -0
  48. data/lib/gecoder/interface/constraints/set_enum/operation.rb +60 -0
  49. data/lib/gecoder/interface/constraints/set_enum/selection.rb +217 -0
  50. data/lib/gecoder/interface/constraints/set_enum_constraints.rb +34 -0
  51. data/lib/gecoder/interface/constraints/set_var_constraints.rb +72 -0
  52. data/lib/gecoder/interface/enum_matrix.rb +64 -0
  53. data/lib/gecoder/interface/enum_wrapper.rb +153 -0
  54. data/lib/gecoder/interface/model.rb +251 -0
  55. data/lib/gecoder/interface/search.rb +123 -0
  56. data/lib/gecoder/interface/variables.rb +254 -0
  57. data/lib/gecoder/version.rb +4 -0
  58. data/specs/binding_changes.rb +76 -0
  59. data/specs/bool_var.rb +74 -0
  60. data/specs/branch.rb +170 -0
  61. data/specs/constraints/arithmetic.rb +266 -0
  62. data/specs/constraints/bool_enum.rb +140 -0
  63. data/specs/constraints/boolean.rb +232 -0
  64. data/specs/constraints/cardinality.rb +154 -0
  65. data/specs/constraints/channel.rb +126 -0
  66. data/specs/constraints/connection.rb +373 -0
  67. data/specs/constraints/constraint_helper.rb +180 -0
  68. data/specs/constraints/constraints.rb +74 -0
  69. data/specs/constraints/count.rb +139 -0
  70. data/specs/constraints/distinct.rb +218 -0
  71. data/specs/constraints/element.rb +106 -0
  72. data/specs/constraints/equality.rb +31 -0
  73. data/specs/constraints/int_domain.rb +69 -0
  74. data/specs/constraints/int_relation.rb +78 -0
  75. data/specs/constraints/linear.rb +332 -0
  76. data/specs/constraints/reification_sugar.rb +96 -0
  77. data/specs/constraints/selection.rb +292 -0
  78. data/specs/constraints/set_domain.rb +181 -0
  79. data/specs/constraints/set_operation.rb +285 -0
  80. data/specs/constraints/set_relation.rb +201 -0
  81. data/specs/constraints/sort.rb +175 -0
  82. data/specs/distribution.rb +14 -0
  83. data/specs/enum_matrix.rb +43 -0
  84. data/specs/enum_wrapper.rb +122 -0
  85. data/specs/int_var.rb +144 -0
  86. data/specs/logging.rb +24 -0
  87. data/specs/model.rb +190 -0
  88. data/specs/search.rb +246 -0
  89. data/specs/set_var.rb +68 -0
  90. data/specs/spec_helper.rb +93 -0
  91. data/tasks/all_tasks.rb +1 -0
  92. data/tasks/building.howto +65 -0
  93. data/tasks/distribution.rake +156 -0
  94. data/tasks/rcov.rake +17 -0
  95. data/tasks/specs.rake +15 -0
  96. data/tasks/svn.rake +11 -0
  97. data/tasks/website.rake +51 -0
  98. data/vendor/gecode/win32/lib/libgecodeint.dll +0 -0
  99. data/vendor/gecode/win32/lib/libgecodekernel.dll +0 -0
  100. data/vendor/gecode/win32/lib/libgecodeminimodel.dll +0 -0
  101. data/vendor/gecode/win32/lib/libgecodesearch.dll +0 -0
  102. data/vendor/gecode/win32/lib/libgecodeset.dll +0 -0
  103. data/vendor/rust/README +28 -0
  104. data/vendor/rust/bin/cxxgenerator.rb +93 -0
  105. data/vendor/rust/include/rust_checks.hh +115 -0
  106. data/vendor/rust/include/rust_conversions.hh +102 -0
  107. data/vendor/rust/rust.rb +67 -0
  108. data/vendor/rust/rust/attribute.rb +51 -0
  109. data/vendor/rust/rust/bindings.rb +172 -0
  110. data/vendor/rust/rust/class.rb +339 -0
  111. data/vendor/rust/rust/constants.rb +48 -0
  112. data/vendor/rust/rust/container.rb +110 -0
  113. data/vendor/rust/rust/cppifaceparser.rb +129 -0
  114. data/vendor/rust/rust/cwrapper.rb +72 -0
  115. data/vendor/rust/rust/cxxclass.rb +98 -0
  116. data/vendor/rust/rust/element.rb +81 -0
  117. data/vendor/rust/rust/enum.rb +63 -0
  118. data/vendor/rust/rust/function.rb +407 -0
  119. data/vendor/rust/rust/namespace.rb +61 -0
  120. data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +17 -0
  121. data/vendor/rust/rust/templates/AttributeInitBinding.rusttpl +9 -0
  122. data/vendor/rust/rust/templates/BindingsHeader.rusttpl +24 -0
  123. data/vendor/rust/rust/templates/BindingsUnit.rusttpl +46 -0
  124. data/vendor/rust/rust/templates/CWrapperClassDefinitions.rusttpl +64 -0
  125. data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +7 -0
  126. data/vendor/rust/rust/templates/ClassInitialize.rusttpl +6 -0
  127. data/vendor/rust/rust/templates/ConstructorStub.rusttpl +21 -0
  128. data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +91 -0
  129. data/vendor/rust/rust/templates/CxxMethodStub.rusttpl +12 -0
  130. data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +26 -0
  131. data/vendor/rust/rust/templates/EnumDeclarations.rusttpl +3 -0
  132. data/vendor/rust/rust/templates/EnumDefinitions.rusttpl +29 -0
  133. data/vendor/rust/rust/templates/FunctionDefinition.rusttpl +9 -0
  134. data/vendor/rust/rust/templates/FunctionInitAlias.rusttpl +5 -0
  135. data/vendor/rust/rust/templates/FunctionInitBinding.rusttpl +9 -0
  136. data/vendor/rust/rust/templates/MethodInitBinding.rusttpl +9 -0
  137. data/vendor/rust/rust/templates/ModuleDeclarations.rusttpl +3 -0
  138. data/vendor/rust/rust/templates/ModuleDefinitions.rusttpl +3 -0
  139. data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +7 -0
  140. data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +14 -0
  141. data/vendor/rust/rust/type.rb +98 -0
  142. data/vendor/rust/test/Makefile +4 -0
  143. data/vendor/rust/test/constants.rb +36 -0
  144. data/vendor/rust/test/cppclass.cc +45 -0
  145. data/vendor/rust/test/cppclass.hh +67 -0
  146. data/vendor/rust/test/cppclass.rb +59 -0
  147. data/vendor/rust/test/cwrapper.c +74 -0
  148. data/vendor/rust/test/cwrapper.h +41 -0
  149. data/vendor/rust/test/cwrapper.rb +56 -0
  150. data/vendor/rust/test/dummyclass.hh +31 -0
  151. data/vendor/rust/test/lib/extension-test.rb +98 -0
  152. data/vendor/rust/test/operators.cc +41 -0
  153. data/vendor/rust/test/operators.hh +39 -0
  154. data/vendor/rust/test/operators.rb +39 -0
  155. data/vendor/rust/test/test-constants.rb +43 -0
  156. data/vendor/rust/test/test-cppclass.rb +82 -0
  157. data/vendor/rust/test/test-cwrapper.rb +80 -0
  158. data/vendor/rust/test/test-operators.rb +42 -0
  159. metadata +293 -0
@@ -0,0 +1,175 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require File.dirname(__FILE__) + '/constraint_helper'
3
+
4
+ class SortSampleProblem < Gecode::Model
5
+ attr :vars
6
+ attr :sorted
7
+ attr :indices
8
+
9
+ def initialize
10
+ @vars = int_var_array(4, 10..19)
11
+ @sorted = int_var_array(4, 10..19)
12
+ @indices = int_var_array(4, 0..9)
13
+
14
+ # To make it more interesting
15
+ @vars.must_be.distinct
16
+
17
+ branch_on @vars
18
+ end
19
+ end
20
+
21
+ describe Gecode::Constraints::IntEnum::Sort, ' (without :as and :order)' do
22
+ before do
23
+ @model = SortSampleProblem.new
24
+ @vars = @model.vars
25
+ @sorted = @model.sorted
26
+
27
+ @invoke_options = lambda do |hash|
28
+ @vars.must_be.sorted(hash)
29
+ @model.solve!
30
+ end
31
+ @expect_options = lambda do |strength, reif_var|
32
+ if reif_var.nil?
33
+ Gecode::Raw.should_receive(:rel).exactly(@vars.size - 1).times.with(
34
+ an_instance_of(Gecode::Raw::Space),
35
+ an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_LQ,
36
+ an_instance_of(Gecode::Raw::IntVar), strength)
37
+ else
38
+ Gecode::Raw.should_receive(:rel).exactly(@vars.size - 1).times.with(
39
+ an_instance_of(Gecode::Raw::Space),
40
+ an_instance_of(Gecode::Raw::IntVar), Gecode::Raw::IRT_LQ,
41
+ an_instance_of(Gecode::Raw::IntVar),
42
+ an_instance_of(Gecode::Raw::BoolVar), strength)
43
+ end
44
+ end
45
+ end
46
+
47
+ it 'should translate into n relation constraints' do
48
+ @expect_options.call(Gecode::Raw::ICL_DEF, nil)
49
+ @invoke_options.call({})
50
+ end
51
+
52
+ it 'should constraint variables to be sorted' do
53
+ @vars.must_be.sorted
54
+ values = @model.solve!.vars.values
55
+ values.should == values.sort
56
+ end
57
+
58
+ it 'should allow negation' do
59
+ @vars.must_not_be.sorted
60
+ @model.solve!
61
+ values = @vars.values
62
+ values.should_not == values.sort
63
+ end
64
+
65
+ it_should_behave_like 'constraint with options'
66
+ end
67
+
68
+ describe Gecode::Constraints::IntEnum::Sort, ' (with :as)' do
69
+ before do
70
+ @model = SortSampleProblem.new
71
+ @vars = @model.vars
72
+ @sorted = @model.sorted
73
+
74
+ # Make it a bit more interesting.
75
+ @vars[0].must > @vars[3] + 1
76
+
77
+ @invoke_options = lambda do |hash|
78
+ @vars.must_be.sorted hash.update(:as => @sorted)
79
+ @model.solve!
80
+ end
81
+ @expect_options = lambda do |strength, reif_var|
82
+ Gecode::Raw.should_receive(:sortedness).once.with(
83
+ an_instance_of(Gecode::Raw::Space),
84
+ an_instance_of(Gecode::Raw::IntVarArray),
85
+ an_instance_of(Gecode::Raw::IntVarArray), strength)
86
+ end
87
+ end
88
+
89
+ it 'should translate into a sortedness constraints' do
90
+ @expect_options.call(Gecode::Raw::ICL_DEF, nil)
91
+ @invoke_options.call({})
92
+ end
93
+
94
+ it 'should constraint variables to be sorted' do
95
+ @vars.must_be.sorted(:as => @sorted)
96
+ @model.solve!
97
+ values = @sorted.values
98
+ values.should == values.sort
99
+ end
100
+
101
+ it 'should not allow targets that are not int var enums' do
102
+ lambda{ @vars.must_be.sorted(:as => 'hello') }.should raise_error(TypeError)
103
+ end
104
+
105
+ it 'should not allow negation' do
106
+ lambda{ @vars.must_not_be.sorted(:as => @sorted) }.should raise_error(
107
+ Gecode::MissingConstraintError)
108
+ end
109
+
110
+ it_should_behave_like 'constraint with strength option'
111
+ end
112
+
113
+ describe Gecode::Constraints::IntEnum::Sort, ' (with :order)' do
114
+ before do
115
+ @model = SortSampleProblem.new
116
+ @vars = @model.vars
117
+ @sorted = @model.sorted
118
+ @indices = @model.indices
119
+
120
+ # Make it a bit more interesting.
121
+ @vars[0].must > @vars[3] + 1
122
+
123
+ @invoke_options = lambda do |hash|
124
+ @vars.must_be.sorted hash.update(:order => @indices, :as => @sorted)
125
+ @model.solve!
126
+ end
127
+ @expect_options = lambda do |strength, reif_var|
128
+ Gecode::Raw.should_receive(:sortedness).once.with(
129
+ an_instance_of(Gecode::Raw::Space),
130
+ an_instance_of(Gecode::Raw::IntVarArray),
131
+ an_instance_of(Gecode::Raw::IntVarArray),
132
+ an_instance_of(Gecode::Raw::IntVarArray), strength)
133
+ end
134
+ end
135
+
136
+ it 'should translate into a sortedness constraints' do
137
+ @expect_options.call(Gecode::Raw::ICL_DEF, nil)
138
+ @invoke_options.call({})
139
+ end
140
+
141
+ it 'should translate into a sortedness constraints, even without a target' do
142
+ @expect_options.call(Gecode::Raw::ICL_DEF, nil)
143
+ @vars.must_be.sorted(:order => @indices)
144
+ @model.solve!
145
+ end
146
+
147
+ it 'should constraint variables to be sorted with the specified indices' do
148
+ @vars.must_be.sorted(:as => @sorted, :order => @indices)
149
+ @model.solve!
150
+ sorted_values = @sorted.values
151
+ sorted_values.should == sorted_values.sort
152
+ expected_indices = @vars.map{ |v| sorted_values.index(v.value) }
153
+ @indices.values.should == expected_indices
154
+ end
155
+
156
+ it 'should not allow targets that are not int var enums' do
157
+ lambda do
158
+ @vars.must_be.sorted(:as => 'hello', :order => @indices)
159
+ end.should raise_error(TypeError)
160
+ end
161
+
162
+ it 'should not allow order that are not int var enums' do
163
+ lambda do
164
+ @vars.must_be.sorted(:as => @sorted, :order => 'hello')
165
+ end.should raise_error(TypeError)
166
+ end
167
+
168
+ it 'should not allow negation' do
169
+ lambda do
170
+ @vars.must_not_be.sorted(:as => @sorted, :order => @indices)
171
+ end.should raise_error(Gecode::MissingConstraintError)
172
+ end
173
+
174
+ it_should_behave_like 'constraint with strength option'
175
+ end
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe 'Interface installed on win32 systems' do
4
+ it 'should be able to load the libraries' do
5
+ # Admittably this is not an especially good test for the library loading
6
+ # under Windows. It only makes sure that there are no execution errors. This
7
+ # has to be tested in a proper Windows environment to tell whether library
8
+ # loading actually works.
9
+ RUBY_PLATFORM = 'i386-mswin32'
10
+ lambda do
11
+ Gecode.load_bindings_lib
12
+ end.should_not raise_error
13
+ end
14
+ end
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Gecode::Util::EnumMatrix do
4
+ before do
5
+ @matrix = Gecode::Util::EnumMatrix[[0, 1], [1, 0]]
6
+ end
7
+
8
+ it 'should be enumerable' do
9
+ @matrix.should be_kind_of(Enumerable)
10
+ end
11
+
12
+ it 'should produce rows that are enumerable' do
13
+ @matrix.row(0).should be_kind_of(Enumerable)
14
+ @matrix.row(0).inject([]){ |arr, e| arr << e }.should == [0, 1]
15
+ end
16
+
17
+ it 'should produce columns that are enumerable' do
18
+ @matrix.column(0).should be_kind_of(Enumerable)
19
+ end
20
+
21
+ it 'should produce submatrices that are enumerable' do
22
+ @matrix.minor(0,1,0,1).should be_kind_of(Enumerable)
23
+ end
24
+ end
25
+
26
+ describe Gecode::Util::EnumMatrix, ' (when wrapped)' do
27
+ before do
28
+ @model = Gecode::Model.new
29
+ @matrix = @model.wrap_enum(Gecode::Util::EnumMatrix[[0, 1], [1, 0]])
30
+ end
31
+
32
+ it 'should produce rows that are wrapped' do
33
+ @matrix.row(0).should respond_to(:model)
34
+ end
35
+
36
+ it 'should produce columns that are enumerable' do
37
+ @matrix.column(0).should respond_to(:model)
38
+ end
39
+
40
+ it 'should produce submatrices that are enumerable' do
41
+ @matrix.minor(0,1,0,1).should respond_to(:model)
42
+ end
43
+ end
@@ -0,0 +1,122 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Gecode::Model, ' (enum wrapping)' do
4
+ before do
5
+ @model = Gecode::Model.new
6
+ @bool = @model.bool_var
7
+ @int = @model.int_var(1..2)
8
+ end
9
+
10
+ it 'should only allow enumerables to be wrapped' do
11
+ lambda do
12
+ @model.wrap_enum(17)
13
+ end.should raise_error(TypeError)
14
+ end
15
+
16
+ it 'should allow enumerables of bool variables to be wrapped' do
17
+ lambda do
18
+ enum = [@bool]
19
+ @model.wrap_enum(enum)
20
+ end.should_not raise_error
21
+ end
22
+
23
+ it 'should allow enumerables of int variables to be wrapped' do
24
+ lambda do
25
+ enum = [@int]
26
+ @model.wrap_enum(enum)
27
+ end.should_not raise_error
28
+ end
29
+
30
+ it 'should allow enumerables of fixnums to be wrapped' do
31
+ lambda do
32
+ enum = [17]
33
+ @model.wrap_enum(enum)
34
+ end.should_not raise_error
35
+ end
36
+
37
+ it 'should not allow empty enumerables to be wrapped' do
38
+ lambda do
39
+ @model.wrap_enum([])
40
+ end.should raise_error(ArgumentError)
41
+ end
42
+
43
+ it 'should not allow enumerables without variables or fixnums to be wrapped' do
44
+ lambda do
45
+ @model.wrap_enum(['foo'])
46
+ end.should raise_error(TypeError)
47
+ end
48
+
49
+ it 'should not allow enumerables with only some variables to be wrapped' do
50
+ lambda do
51
+ enum = [@bool, 'foo']
52
+ @model.wrap_enum(enum)
53
+ end.should raise_error(TypeError)
54
+ end
55
+
56
+ it 'should not allow enumerables with mixed types of variables to be wrapped' do
57
+ lambda do
58
+ enum = [@bool, @int]
59
+ @model.wrap_enum(enum)
60
+ end.should raise_error(TypeError)
61
+ end
62
+ end
63
+
64
+ describe Gecode::IntEnumMethods do
65
+ before do
66
+ @model = Gecode::Model.new
67
+ @int_enum = @model.int_var_array(3, 0..1)
68
+ end
69
+
70
+ it 'should convert to an int var array' do
71
+ @model.allow_space_access do
72
+ @int_enum.to_int_var_array.should be_kind_of(Gecode::Raw::IntVarArray)
73
+ end
74
+ end
75
+
76
+ it 'should compute the smallest domain range' do
77
+ @int_enum.domain_range.should == (0..1)
78
+ (@int_enum << @model.int_var(-4..4)).domain_range.should == (-4..4)
79
+ end
80
+ end
81
+
82
+ describe Gecode::BoolEnumMethods do
83
+ before do
84
+ @model = Gecode::Model.new
85
+ @bool_enum = @model.bool_var_array(3)
86
+ end
87
+
88
+ it 'should convert to a bool var array' do
89
+ @model.allow_space_access do
90
+ @bool_enum.to_bool_var_array.should be_kind_of(Gecode::Raw::BoolVarArray)
91
+ end
92
+ end
93
+ end
94
+
95
+ describe Gecode::SetEnumMethods do
96
+ before do
97
+ @model = Gecode::Model.new
98
+ @set_enum = @model.set_var_array(3, [0], 0..1)
99
+ end
100
+
101
+ it 'should convert to a set var array' do
102
+ @model.allow_space_access do
103
+ @set_enum.to_set_var_array.should be_kind_of(Gecode::Raw::SetVarArray)
104
+ end
105
+ end
106
+
107
+ it 'should compute the smallest upper bound union range' do
108
+ @set_enum.upper_bound_range.should == (0..1)
109
+ (@set_enum << @model.set_var([], -4..4)).upper_bound_range.should == (-4..4)
110
+ end
111
+ end
112
+
113
+ describe Gecode::FixnumEnumMethods do
114
+ before do
115
+ @model = Gecode::Model.new
116
+ @enum = @model.instance_eval{ wrap_enum([7, 14, 17, 4711]) }
117
+ end
118
+
119
+ it 'should compute the smallest domain range' do
120
+ @enum.domain_range.should == (7..4711)
121
+ end
122
+ end
data/specs/int_var.rb ADDED
@@ -0,0 +1,144 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe 'non-empty int variable', :shared => true do
4
+ it 'should have min equal to the lower domain bound' do
5
+ @var.min.should equal(@domain.min)
6
+ end
7
+
8
+ it 'should have max equal to the upper domain bound' do
9
+ @var.max.should equal(@domain.max)
10
+ end
11
+
12
+ it 'should have size equal to the domain size' do
13
+ @var.size.should equal(@domain.size)
14
+ end
15
+
16
+ it 'should contain every element in its domain' do
17
+ @domain.each do |i|
18
+ @var.should include(i)
19
+ end
20
+ end
21
+
22
+ it 'should not contain elements outside its domain' do
23
+ @var.should_not include(@domain.min - 1)
24
+ @var.should_not include(@domain.max + 1)
25
+ end
26
+
27
+ it 'should have a width equal to the domain width' do
28
+ @var.width.should equal(@domain.max - @domain.min + 1)
29
+ end
30
+
31
+ it 'should give a NoMethodError when calling a method that doesn\'t exist' do
32
+ lambda{ @var.this_method_does_not_exists }.should raise_error(NoMethodError)
33
+ end
34
+
35
+ it 'should have a zero degree' do
36
+ @var.degree.should be_zero
37
+ end
38
+ end
39
+
40
+ describe Gecode::FreeIntVar, ' (with range domain of size > 1)' do
41
+ before do
42
+ @range = -4..3
43
+ @domain = @range.to_a
44
+ model = Gecode::Model.new
45
+ @var = model.int_var(@range)
46
+ end
47
+
48
+ it_should_behave_like 'non-empty int variable'
49
+
50
+ it 'should not be assigned' do
51
+ @var.should_not be_assigned
52
+ end
53
+
54
+ it 'should have a range domain' do
55
+ @var.should be_range
56
+ end
57
+
58
+ it 'should raise error when trying to access assigned value' do
59
+ lambda{ @var.value }.should raise_error(RuntimeError)
60
+ end
61
+ end
62
+
63
+ describe Gecode::FreeIntVar, ' (defined with three-dot range)' do
64
+ before do
65
+ @range = -4...3
66
+ @domain = @range.to_a
67
+ model = Gecode::Model.new
68
+ @var = model.int_var(@range)
69
+ end
70
+
71
+ it_should_behave_like 'non-empty int variable'
72
+ end
73
+
74
+ describe Gecode::FreeIntVar, ' (with non-range domain of size > 1)' do
75
+ before do
76
+ @domain = [-3, -2, -1, 1]
77
+ model = Gecode::Model.new
78
+ @var = model.int_var(@domain)
79
+ end
80
+
81
+ it_should_behave_like 'non-empty int variable'
82
+
83
+ it 'should not be assigned' do
84
+ @var.should_not be_assigned
85
+ end
86
+
87
+ it 'should not be a range domain' do
88
+ @var.should_not be_range
89
+ end
90
+
91
+ it 'should not contain the domain\'s holes' do
92
+ @var.should_not include(0)
93
+ end
94
+ end
95
+
96
+ describe Gecode::FreeIntVar, ' (with a domain of size 1)' do
97
+ before do
98
+ @domain = [1]
99
+ model = Gecode::Model.new
100
+ @var = model.int_var(*@domain)
101
+ end
102
+
103
+ it_should_behave_like 'non-empty int variable'
104
+
105
+ it 'should be assigned' do
106
+ @var.should be_assigned
107
+ end
108
+
109
+ it 'should be a range domain' do
110
+ @var.should be_range
111
+ end
112
+ end
113
+
114
+ describe Gecode::FreeIntVar, ' (assigned)' do
115
+ before do
116
+ @domain = 1
117
+ model = Gecode::Model.new
118
+ @var = model.int_var(*@domain)
119
+ end
120
+
121
+ it 'should be assigned' do
122
+ @var.should be_assigned
123
+ end
124
+
125
+ it 'should give the assigned number when inspecting' do
126
+ @var.inspect.should include(" #{@domain[0]}>")
127
+ end
128
+ end
129
+
130
+ describe Gecode::FreeIntVar, ' (not assigned)' do
131
+ before do
132
+ @domain = 1..2
133
+ model = Gecode::Model.new
134
+ @var = model.int_var(@domain)
135
+ end
136
+
137
+ it 'should not be assigned' do
138
+ @var.should_not be_assigned
139
+ end
140
+
141
+ it 'should give the domain range when inspecting' do
142
+ @var.inspect.should include(" #{@domain.first}..#{@domain.last}>")
143
+ end
144
+ end