gobstones 0.0.1.1

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 (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