gobstones 0.0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +3 -0
  4. data/.ruby-version +1 -0
  5. data/.simplecov +3 -0
  6. data/.travis.yml +4 -0
  7. data/CHANGELOG +4 -0
  8. data/Gemfile +12 -0
  9. data/Gemfile.lock +47 -0
  10. data/LICENSE +675 -0
  11. data/README.md +17 -0
  12. data/Rakefile +4 -0
  13. data/bin/gobstones +12 -0
  14. data/gobstones.gemspec +24 -0
  15. data/lib/gobstones/cli/board_template +39 -0
  16. data/lib/gobstones/cli/printer.rb +106 -0
  17. data/lib/gobstones/cli/runner.rb +52 -0
  18. data/lib/gobstones/extensions/all.rb +2 -0
  19. data/lib/gobstones/extensions/boolean.rb +17 -0
  20. data/lib/gobstones/extensions/fixnum.rb +9 -0
  21. data/lib/gobstones/lang/all.rb +5 -0
  22. data/lib/gobstones/lang/commands/all.rb +13 -0
  23. data/lib/gobstones/lang/commands/assignments.rb +29 -0
  24. data/lib/gobstones/lang/commands/boom_cmd.rb +28 -0
  25. data/lib/gobstones/lang/commands/command_block.rb +37 -0
  26. data/lib/gobstones/lang/commands/conditional_cmd.rb +27 -0
  27. data/lib/gobstones/lang/commands/if_cmd.rb +38 -0
  28. data/lib/gobstones/lang/commands/ir_al_origen_cmd.rb +19 -0
  29. data/lib/gobstones/lang/commands/mover_cmd.rb +25 -0
  30. data/lib/gobstones/lang/commands/poner_cmd.rb +31 -0
  31. data/lib/gobstones/lang/commands/procedure_call.rb +23 -0
  32. data/lib/gobstones/lang/commands/repeat_with_cmd.rb +73 -0
  33. data/lib/gobstones/lang/commands/sacar_cmd.rb +31 -0
  34. data/lib/gobstones/lang/commands/skip_cmd.rb +19 -0
  35. data/lib/gobstones/lang/commands/vaciar_tablero_cmd.rb +19 -0
  36. data/lib/gobstones/lang/commands/while_cmd.rb +25 -0
  37. data/lib/gobstones/lang/definitions/all.rb +4 -0
  38. data/lib/gobstones/lang/definitions/definition.rb +32 -0
  39. data/lib/gobstones/lang/definitions/definition_call.rb +24 -0
  40. data/lib/gobstones/lang/definitions/function.rb +14 -0
  41. data/lib/gobstones/lang/definitions/main.rb +26 -0
  42. data/lib/gobstones/lang/definitions/no_return_statement.rb +15 -0
  43. data/lib/gobstones/lang/definitions/procedure.rb +44 -0
  44. data/lib/gobstones/lang/definitions/return_from_function.rb +22 -0
  45. data/lib/gobstones/lang/definitions/return_from_main.rb +22 -0
  46. data/lib/gobstones/lang/definitions/var_tuple.rb +26 -0
  47. data/lib/gobstones/lang/expressions/all.rb +8 -0
  48. data/lib/gobstones/lang/expressions/arithmetic_expressions.rb +52 -0
  49. data/lib/gobstones/lang/expressions/boolean_expressions.rb +29 -0
  50. data/lib/gobstones/lang/expressions/comparison_expressions.rb +45 -0
  51. data/lib/gobstones/lang/expressions/function_call.rb +15 -0
  52. data/lib/gobstones/lang/expressions/one_arg_expression.rb +21 -0
  53. data/lib/gobstones/lang/expressions/parentheses_expression.rb +13 -0
  54. data/lib/gobstones/lang/expressions/primitive_functions.rb +68 -0
  55. data/lib/gobstones/lang/expressions/two_arg_expression.rb +34 -0
  56. data/lib/gobstones/lang/expressions/type_bound_functions.rb +66 -0
  57. data/lib/gobstones/lang/expressions/var_name.rb +31 -0
  58. data/lib/gobstones/lang/literals/all.rb +4 -0
  59. data/lib/gobstones/lang/literals/booleans.rb +109 -0
  60. data/lib/gobstones/lang/literals/colors.rb +94 -0
  61. data/lib/gobstones/lang/literals/directions.rb +137 -0
  62. data/lib/gobstones/lang/literals/literal.rb +63 -0
  63. data/lib/gobstones/lang/literals/number.rb +49 -0
  64. data/lib/gobstones/lang/program.rb +32 -0
  65. data/lib/gobstones/modules/equal_by_class.rb +13 -0
  66. data/lib/gobstones/parser/ast/ast.rb +210 -0
  67. data/lib/gobstones/parser/grammar/gobstones.treetop +316 -0
  68. data/lib/gobstones/parser/parse_error.rb +17 -0
  69. data/lib/gobstones/parser/treetop_parser.rb +73 -0
  70. data/lib/gobstones/runner/all.rb +6 -0
  71. data/lib/gobstones/runner/board.rb +57 -0
  72. data/lib/gobstones/runner/cell.rb +60 -0
  73. data/lib/gobstones/runner/errors/all.rb +8 -0
  74. data/lib/gobstones/runner/errors/boom_error.rb +11 -0
  75. data/lib/gobstones/runner/errors/definition_not_found_error.rb +19 -0
  76. data/lib/gobstones/runner/errors/empty_cell_error.rb +11 -0
  77. data/lib/gobstones/runner/errors/gobstones_runtime_error.rb +11 -0
  78. data/lib/gobstones/runner/errors/gobstones_type_error.rb +11 -0
  79. data/lib/gobstones/runner/errors/out_of_board_error.rb +11 -0
  80. data/lib/gobstones/runner/errors/undefined_variable_error.rb +11 -0
  81. data/lib/gobstones/runner/errors/wrong_arguments_error.rb +11 -0
  82. data/lib/gobstones/runner/execution_context.rb +89 -0
  83. data/lib/gobstones/runner/head.rb +101 -0
  84. data/lib/gobstones/type_check_result.rb +16 -0
  85. data/spec/lang/commands/assignments_spec.rb +13 -0
  86. data/spec/lang/commands/boom_cmd_spec.rb +8 -0
  87. data/spec/lang/commands/cmd_block_spec.rb +21 -0
  88. data/spec/lang/commands/if_cmd_spec.rb +49 -0
  89. data/spec/lang/commands/ir_al_origen_cmd_spec.rb +16 -0
  90. data/spec/lang/commands/mover_cmd_spec.rb +38 -0
  91. data/spec/lang/commands/poner_cmd_spec.rb +29 -0
  92. data/spec/lang/commands/procedure_call_spec.rb +44 -0
  93. data/spec/lang/commands/procedure_spec.rb +67 -0
  94. data/spec/lang/commands/repeat_with_cmd_spec.rb +41 -0
  95. data/spec/lang/commands/sacar_cmd_spec.rb +34 -0
  96. data/spec/lang/commands/skip_cmd_spec.rb +12 -0
  97. data/spec/lang/commands/vaciar_tablero_cmd_spec.rb +13 -0
  98. data/spec/lang/commands/while_cmd_spec.rb +37 -0
  99. data/spec/lang/expressions/arithmetic_expressions_spec.rb +108 -0
  100. data/spec/lang/expressions/boolean_expressions_spec.rb +56 -0
  101. data/spec/lang/expressions/comparison_expressions_spec.rb +285 -0
  102. data/spec/lang/expressions/primitive_functions_spec.rb +126 -0
  103. data/spec/lang/expressions/type_bound_functions_spec.rb +39 -0
  104. data/spec/lang/expressions/var_name_spec.rb +16 -0
  105. data/spec/lang/literals/booleans_spec.rb +13 -0
  106. data/spec/lang/literals/colors_spec.rb +13 -0
  107. data/spec/lang/literals/directions_spec.rb +45 -0
  108. data/spec/lang/literals/numbers_spec.rb +8 -0
  109. data/spec/matchers/parse_matcher.rb +84 -0
  110. data/spec/parser/arithmetic_expressions_spec.rb +129 -0
  111. data/spec/parser/assignments_spec.rb +39 -0
  112. data/spec/parser/boolean_expressions_spec.rb +111 -0
  113. data/spec/parser/command_block_spec.rb +50 -0
  114. data/spec/parser/data_types_spec.rb +67 -0
  115. data/spec/parser/function_calls_spec.rb +37 -0
  116. data/spec/parser/function_definitions_spec.rb +50 -0
  117. data/spec/parser/gobstones_program_spec.rb +55 -0
  118. data/spec/parser/if_command_spec.rb +46 -0
  119. data/spec/parser/main_definition_spec.rb +42 -0
  120. data/spec/parser/nested_expressions_spec.rb +39 -0
  121. data/spec/parser/primitive_expressions_spec.rb +105 -0
  122. data/spec/parser/procedure_calls_spec.rb +36 -0
  123. data/spec/parser/procedure_definitions_spec.rb +39 -0
  124. data/spec/parser/repeat_with_command_spec.rb +23 -0
  125. data/spec/parser/simple_commands_spec.rb +62 -0
  126. data/spec/parser/treetop_parser_spec.rb +109 -0
  127. data/spec/parser/var_tuple_spec.rb +30 -0
  128. data/spec/parser/while_command_spec.rb +30 -0
  129. data/spec/runner/board_spec.rb +85 -0
  130. data/spec/runner/cell_spec.rb +72 -0
  131. data/spec/runner/execution_context_spec.rb +64 -0
  132. data/spec/runner/head_spec.rb +139 -0
  133. data/spec/spec_helper.rb +15 -0
  134. data/spec/type_checker_spec.rb +37 -0
  135. metadata +242 -0
@@ -0,0 +1,108 @@
1
+ describe "arithmetic expressions" do
2
+
3
+ describe Add do
4
+
5
+ it "should evaluate with two numbers" do
6
+ add = Add.new(42.to_gbs_num, 23.to_gbs_num)
7
+ expect(add.evaluate).to eq(65.to_gbs_num)
8
+ end
9
+
10
+ it "should evaluate nested add expressions" do
11
+ add_4_8 = Add.new 4.to_gbs_num, 8.to_gbs_num
12
+ add_12_15 = Add.new add_4_8, 15.to_gbs_num
13
+ add_27_16 = Add.new add_12_15, 16.to_gbs_num
14
+ add_43_23 = Add.new add_27_16, 23.to_gbs_num
15
+ add_66_42 = Add.new add_43_23, 42.to_gbs_num
16
+
17
+ expect(add_66_42.evaluate).to eq(108.to_gbs_num)
18
+ end
19
+
20
+ end
21
+
22
+ describe Sub do
23
+
24
+ it "should evaluate with two numbers" do
25
+ sub = Sub.new(42.to_gbs_num, 15.to_gbs_num)
26
+ expect(sub.evaluate).to eq(27.to_gbs_num)
27
+ end
28
+
29
+ it "should evaluate and return a negative result" do
30
+ sub = Sub.new(15.to_gbs_num, 42.to_gbs_num)
31
+ expect(sub.evaluate).to eq(-27.to_gbs_num)
32
+ end
33
+
34
+ it "should evaluate nested sub expressions" do
35
+ sub_n1_n2 = Sub.new 42.to_gbs_num, 15.to_gbs_num
36
+ sub = Sub.new sub_n1_n2, 8.to_gbs_num
37
+
38
+ expect(sub.evaluate).to eq(19.to_gbs_num)
39
+ end
40
+
41
+ end
42
+
43
+ describe Mul do
44
+
45
+ it "should evaluate a simple mul" do
46
+ mul = Mul.new(4.to_gbs_num, 8.to_gbs_num)
47
+ expect(mul.evaluate).to eq(32.to_gbs_num)
48
+ end
49
+
50
+ it "should evaluate a nested mul expression" do
51
+ mul = Mul.new(-2.to_gbs_num, 4.to_gbs_num)
52
+ expect(Mul.new(mul, 5.to_gbs_num).evaluate).to eq(-40.to_gbs_num)
53
+ end
54
+
55
+ end
56
+
57
+ describe Div do
58
+
59
+ it "should evaluate a simple div" do
60
+ div = Div.new(12.to_gbs_num, 3.to_gbs_num)
61
+ expect(div.evaluate).to eq(4.to_gbs_num)
62
+ end
63
+
64
+ it "should evaluate to an integer division" do
65
+ div = Div.new(10.to_gbs_num, 3.to_gbs_num)
66
+ expect(div.evaluate).to eq(3.to_gbs_num)
67
+ end
68
+
69
+ it "should raise an error when dividing by zero" do
70
+ expect {
71
+ Div.new(42.to_gbs_num, 0.to_gbs_num).evaluate
72
+ }.to raise_error(GobstonesRuntimeError, 'zero division')
73
+ end
74
+
75
+ end
76
+
77
+ describe Mod do
78
+
79
+ it "should evaluate a mod with result 0" do
80
+ mod = Mod.new(4.to_gbs_num, 4.to_gbs_num)
81
+ expect(mod.evaluate).to eq(0.to_gbs_num)
82
+ end
83
+
84
+ it "should evaluate a mod with result > 0" do
85
+ mod = Mod.new(10.to_gbs_num, 3.to_gbs_num)
86
+ expect(mod.evaluate).to eq(1.to_gbs_num)
87
+ end
88
+
89
+ end
90
+
91
+ describe Pow do
92
+
93
+ it "should give 1 as a result if the power is 0" do
94
+ pow_1 = Pow.new(1.to_gbs_num, 0.to_gbs_num)
95
+ pow_42 = Pow.new(42.to_gbs_num, 0.to_gbs_num)
96
+
97
+ expect(pow_1.evaluate).to eq(1.to_gbs_num)
98
+ expect(pow_42.evaluate).to eq(1.to_gbs_num)
99
+ end
100
+
101
+ it "should calculate 2 raised to 4" do
102
+ pow = Pow.new(2.to_gbs_num, 4.to_gbs_num)
103
+ expect(pow.evaluate).to eq(16.to_gbs_num)
104
+ end
105
+
106
+ end
107
+
108
+ end
@@ -0,0 +1,56 @@
1
+ describe "boolean expressions" do
2
+
3
+ let(:false_value) { False.new }
4
+ let(:true_value) { True.new }
5
+
6
+ # TODO test/implement short-circuit?
7
+
8
+ describe And do
9
+
10
+ it "should evaluate a simple and expression" do
11
+ expect(And.new(false_value, false_value).evaluate).to eq(false_value)
12
+ expect(And.new(false_value, true_value).evaluate).to eq(false_value)
13
+ expect(And.new(true_value, false_value).evaluate).to eq(false_value)
14
+ expect(And.new(true_value, true_value).evaluate).to eq(true_value)
15
+ end
16
+
17
+ end
18
+
19
+ describe Or do
20
+
21
+ it "should evaluate a simple or expression" do
22
+ expect(Or.new(false_value, false_value).evaluate).to eq(false_value)
23
+ expect(Or.new(false_value, true_value).evaluate).to eq(true_value)
24
+ expect(Or.new(true_value, false_value).evaluate).to eq(true_value)
25
+ expect(Or.new(true_value, true_value).evaluate).to eq(true_value)
26
+ end
27
+
28
+ end
29
+
30
+ describe Not do
31
+
32
+ it "should evaluate a simple not expression" do
33
+ expect(Not.new(false_value).evaluate).to eq(true_value)
34
+ expect(Not.new(true_value).evaluate).to eq(false_value)
35
+ end
36
+
37
+ it "should evaluate a not not expression" do
38
+ expect(Not.new(Not.new(false_value)).evaluate).to eq(false_value)
39
+ expect(Not.new(Not.new(true_value)).evaluate).to eq(true_value)
40
+ end
41
+
42
+ end
43
+
44
+ describe "nested" do
45
+
46
+ it "should evaluate and's and or's" do
47
+ expect(And.new(Or.new(false_value, true_value), true_value).evaluate).to eq(true_value)
48
+ end
49
+
50
+ it "should evaluate and's, or's, and not's" do
51
+ expect(Not.new(Or.new(false_value, And.new(true_value, true_value))).evaluate).to eq(false_value)
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,285 @@
1
+ describe "comparison expressions" do
2
+
3
+ let(:false_value) { False.new }
4
+ let(:true_value) { True.new }
5
+
6
+ describe Equal do
7
+
8
+ it "should evaluate same booleans as equal" do
9
+ expect(Equal.new(false_value, false_value).evaluate).to eq(true_value)
10
+ expect(Equal.new(true_value, true_value).evaluate).to eq(true_value)
11
+ expect(Equal.new(false_value, true_value).evaluate).to eq(false_value)
12
+ expect(Equal.new(true_value, false_value).evaluate).to eq(false_value)
13
+ end
14
+
15
+ it "should evaluate same colors as equal" do
16
+ color_classes = [Azul, Negro, Rojo, Verde]
17
+ color_classes.each do |color_class|
18
+ expect(Equal.new(color_class.new, color_class.new).
19
+ evaluate).to eq(true_value)
20
+ (color_classes - [color_class]).each do |different_color_class|
21
+ expect(Equal.new(color_class.new, different_color_class.new).
22
+ evaluate).to eq(false_value)
23
+ end
24
+ end
25
+ end
26
+
27
+ it "should evaluate same directions as equal" do
28
+ dir_classes = [Norte, Sur, Este, Oeste]
29
+ dir_classes.each do |dir_class|
30
+ expect(Equal.new(dir_class.new, dir_class.new).
31
+ evaluate).to eq(true_value)
32
+ (dir_classes - [dir_class]).each do |different_dir_class|
33
+ expect(Equal.new(dir_class.new, different_dir_class.new).
34
+ evaluate).to eq(false_value)
35
+ end
36
+ end
37
+ end
38
+
39
+ it "should evaluate same numbers as equal" do
40
+ expect(Equal.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(true_value)
41
+ expect(Equal.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(false_value)
42
+ end
43
+
44
+ end
45
+
46
+ describe NotEqual do
47
+
48
+ it "should evaluate booleans as not equal" do
49
+ expect(NotEqual.new(false_value, false_value).evaluate).to eq(false_value)
50
+ expect(NotEqual.new(true_value, true_value).evaluate).to eq(false_value)
51
+ expect(NotEqual.new(false_value, true_value).evaluate).to eq(true_value)
52
+ expect(NotEqual.new(true_value, false_value).evaluate).to eq(true_value)
53
+ end
54
+
55
+ it "should evaluate same colors as equal" do
56
+ color_classes = [Azul, Negro, Rojo, Verde]
57
+ color_classes.each do |color_class|
58
+ expect(NotEqual.new(color_class.new, color_class.new).
59
+ evaluate).to eq(false_value)
60
+ (color_classes - [color_class]).each do |different_color_class|
61
+ expect(NotEqual.new(color_class.new, different_color_class.new).
62
+ evaluate).to eq(true_value)
63
+ end
64
+ end
65
+ end
66
+
67
+ it "should evaluate same directions as equal" do
68
+ dir_classes = [Norte, Sur, Este, Oeste]
69
+ dir_classes.each do |dir_class|
70
+ expect(NotEqual.new(dir_class.new, dir_class.new).
71
+ evaluate).to eq(false_value)
72
+ (dir_classes - [dir_class]).each do |different_dir_class|
73
+ expect(NotEqual.new(dir_class.new, different_dir_class.new).
74
+ evaluate).to eq(true_value)
75
+ end
76
+ end
77
+ end
78
+
79
+ it "should evaluate same numbers as equal" do
80
+ expect(NotEqual.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(false_value)
81
+ expect(NotEqual.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(true_value)
82
+ end
83
+
84
+ end
85
+
86
+ describe LessThan do
87
+
88
+ it "should evaluate for booleans" do
89
+ expect(LessThan.new(false_value, false_value).evaluate).to eq(false_value)
90
+ expect(LessThan.new(false_value, true_value).evaluate).to eq(true_value)
91
+ expect(LessThan.new(true_value, false_value).evaluate).to eq(false_value)
92
+ expect(LessThan.new(true_value, true_value).evaluate).to eq(false_value)
93
+ end
94
+
95
+ it "should evaluate for numbers" do
96
+ expect(LessThan.new(15.to_gbs_num, 42.to_gbs_num).evaluate).to eq(true_value)
97
+ expect(LessThan.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(false_value)
98
+ expect(LessThan.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(false_value)
99
+ end
100
+
101
+ it "should evaluate for colors" do
102
+ color_classes = Color.order
103
+ color_classes.each_with_index do |color_class, index|
104
+ # should not be less than itself
105
+ expect(LessThan.new(color_class.new, color_class.new).
106
+ evaluate).to eq(false_value)
107
+ color_classes.take(index).each do |previous_color_class|
108
+ # should not be less than any previous value
109
+ expect(LessThan.new(color_class.new, previous_color_class.new).
110
+ evaluate).to eq(false_value)
111
+ end
112
+ color_classes.drop(index+1).each do |next_color_class|
113
+ # should be less than any next value
114
+ expect(LessThan.new(color_class.new, next_color_class.new).
115
+ evaluate).to eq(true_value)
116
+ end
117
+ end
118
+ end
119
+
120
+ it "should evaluate for directions" do
121
+ dir_classes = Direction.order
122
+ dir_classes.each_with_index do |dir_class, index|
123
+ expect(LessThan.new(dir_class.new, dir_class.new).
124
+ evaluate).to eq(false_value)
125
+ dir_classes.take(index).each do |previous_dir_class|
126
+ expect(LessThan.new(dir_class.new, previous_dir_class.new).
127
+ evaluate).to eq(false_value)
128
+ end
129
+ dir_classes.drop(index+1).each do |next_dir_class|
130
+ expect(LessThan.new(dir_class.new, next_dir_class.new).
131
+ evaluate).to eq(true_value)
132
+ end
133
+ end
134
+ end
135
+
136
+ end
137
+
138
+ describe LessEqual do
139
+
140
+ it "should evaluate for booleans" do
141
+ expect(LessEqual.new(false_value, false_value).evaluate).to eq(true_value)
142
+ expect(LessEqual.new(false_value, true_value).evaluate).to eq(true_value)
143
+ expect(LessEqual.new(true_value, false_value).evaluate).to eq(false_value)
144
+ expect(LessEqual.new(true_value, true_value).evaluate).to eq(true_value)
145
+ end
146
+
147
+ it "should evaluate for numbers" do
148
+ expect(LessEqual.new(15.to_gbs_num, 42.to_gbs_num).evaluate).to eq(true_value)
149
+ expect(LessEqual.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(false_value)
150
+ expect(LessEqual.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(true_value)
151
+ end
152
+
153
+ it "should evaluate for colors" do
154
+ color_classes = Color.order
155
+ color_classes.each_with_index do |color_class, index|
156
+ expect(LessEqual.new(color_class.new, color_class.new).
157
+ evaluate).to eq(true_value)
158
+ color_classes.take(index).each do |previous_color_class|
159
+ expect(LessEqual.new(color_class.new, previous_color_class.new).
160
+ evaluate).to eq(false_value)
161
+ end
162
+ color_classes.drop(index+1).each do |next_color_class|
163
+ expect(LessEqual.new(color_class.new, next_color_class.new).
164
+ evaluate).to eq(true_value)
165
+ end
166
+ end
167
+ end
168
+
169
+ it "should evaluate for directions" do
170
+ dir_classes = Direction.order
171
+ dir_classes.each_with_index do |dir_class, index|
172
+ expect(LessEqual.new(dir_class.new, dir_class.new).
173
+ evaluate).to eq(true_value)
174
+ dir_classes.take(index).each do |previous_dir_class|
175
+ expect(LessEqual.new(dir_class.new, previous_dir_class.new).
176
+ evaluate).to eq(false_value)
177
+ end
178
+ dir_classes.drop(index+1).each do |next_dir_class|
179
+ expect(LessEqual.new(dir_class.new, next_dir_class.new).
180
+ evaluate).to eq(true_value)
181
+ end
182
+ end
183
+ end
184
+
185
+ end
186
+
187
+ describe GreaterThan do
188
+
189
+ it "should evaluate for booleans" do
190
+ expect(GreaterThan.new(false_value, false_value).evaluate).to eq(false_value)
191
+ expect(GreaterThan.new(false_value, true_value).evaluate).to eq(false_value)
192
+ expect(GreaterThan.new(true_value, false_value).evaluate).to eq(true_value)
193
+ expect(GreaterThan.new(true_value, true_value).evaluate).to eq(false_value)
194
+ end
195
+
196
+ it "should evaluate for numbers" do
197
+ expect(GreaterThan.new(15.to_gbs_num, 42.to_gbs_num).evaluate).to eq(false_value)
198
+ expect(GreaterThan.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(true_value)
199
+ expect(GreaterThan.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(false_value)
200
+ end
201
+
202
+ it "should evaluate for colors" do
203
+ color_classes = Color.order
204
+ color_classes.each_with_index do |color_class, index|
205
+ expect(GreaterThan.new(color_class.new, color_class.new).
206
+ evaluate).to eq(false_value)
207
+ color_classes.take(index).each do |previous_color_class|
208
+ expect(GreaterThan.new(color_class.new, previous_color_class.new).
209
+ evaluate).to eq(true_value)
210
+ end
211
+ color_classes.drop(index+1).each do |next_color_class|
212
+ expect(GreaterThan.new(color_class.new, next_color_class.new).
213
+ evaluate).to eq(false_value)
214
+ end
215
+ end
216
+ end
217
+
218
+ it "should evaluate for directions" do
219
+ dir_classes = Direction.order
220
+ dir_classes.each_with_index do |dir_class, index|
221
+ expect(GreaterThan.new(dir_class.new, dir_class.new).
222
+ evaluate).to eq(false_value)
223
+ dir_classes.take(index).each do |previous_dir_class|
224
+ expect(GreaterThan.new(dir_class.new, previous_dir_class.new).
225
+ evaluate).to eq(true_value)
226
+ end
227
+ dir_classes.drop(index+1).each do |next_dir_class|
228
+ expect(GreaterThan.new(dir_class.new, next_dir_class.new).
229
+ evaluate).to eq(false_value)
230
+ end
231
+ end
232
+ end
233
+
234
+ end
235
+
236
+ describe GreaterEqual do
237
+
238
+ it "should evaluate for booleans" do
239
+ expect(GreaterEqual.new(false_value, false_value).evaluate).to eq(true_value)
240
+ expect(GreaterEqual.new(false_value, true_value).evaluate).to eq(false_value)
241
+ expect(GreaterEqual.new(true_value, false_value).evaluate).to eq(true_value)
242
+ expect(GreaterEqual.new(true_value, true_value).evaluate).to eq(true_value)
243
+ end
244
+
245
+ it "should evaluate for numbers" do
246
+ expect(GreaterEqual.new(15.to_gbs_num, 42.to_gbs_num).evaluate).to eq(false_value)
247
+ expect(GreaterEqual.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(true_value)
248
+ expect(GreaterEqual.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(true_value)
249
+ end
250
+
251
+ it "should evaluate for colors" do
252
+ color_classes = Color.order
253
+ color_classes.each_with_index do |color_class, index|
254
+ expect(GreaterEqual.new(color_class.new, color_class.new).
255
+ evaluate).to eq(true_value)
256
+ color_classes.take(index).each do |previous_color_class|
257
+ expect(GreaterEqual.new(color_class.new, previous_color_class.new).
258
+ evaluate).to eq(true_value)
259
+ end
260
+ color_classes.drop(index+1).each do |next_color_class|
261
+ expect(GreaterEqual.new(color_class.new, next_color_class.new).
262
+ evaluate).to eq(false_value)
263
+ end
264
+ end
265
+ end
266
+
267
+ it "should evaluate for directions" do
268
+ dir_classes = Direction.order
269
+ dir_classes.each_with_index do |dir_class, index|
270
+ expect(GreaterEqual.new(dir_class.new, dir_class.new).
271
+ evaluate).to eq(true_value)
272
+ dir_classes.take(index).each do |previous_dir_class|
273
+ expect(GreaterEqual.new(dir_class.new, previous_dir_class.new).
274
+ evaluate).to eq(true_value)
275
+ end
276
+ dir_classes.drop(index+1).each do |next_dir_class|
277
+ expect(GreaterEqual.new(dir_class.new, next_dir_class.new).
278
+ evaluate).to eq(false_value)
279
+ end
280
+ end
281
+ end
282
+
283
+ end
284
+
285
+ end