gecoder-with-gecode 0.7.1-mswin32

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