gobstones 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +133 -0
  3. data/.rubocop_todo.yml +75 -0
  4. data/.simplecov +1 -3
  5. data/.tool-versions +1 -0
  6. data/.travis.yml +9 -2
  7. data/Gemfile +11 -5
  8. data/Gemfile.lock +65 -39
  9. data/README.md +8 -1
  10. data/Rakefile +1 -1
  11. data/bin/gobstones +1 -1
  12. data/gobstones.gemspec +12 -11
  13. data/lib/gobstones/cli/printer.rb +41 -28
  14. data/lib/gobstones/cli/runner.rb +50 -15
  15. data/lib/gobstones/extensions/all.rb +1 -1
  16. data/lib/gobstones/extensions/boolean.rb +1 -5
  17. data/lib/gobstones/extensions/{fixnum.rb → integer.rb} +2 -4
  18. data/lib/gobstones/extensions/string.rb +1 -3
  19. data/lib/gobstones/lang/all.rb +3 -3
  20. data/lib/gobstones/lang/commands/all.rb +11 -10
  21. data/lib/gobstones/lang/commands/boom.rb +26 -0
  22. data/lib/gobstones/lang/commands/command_block.rb +23 -23
  23. data/lib/gobstones/lang/commands/conditional.rb +26 -0
  24. data/lib/gobstones/lang/commands/if.rb +13 -0
  25. data/lib/gobstones/lang/commands/if_then_else.rb +26 -0
  26. data/lib/gobstones/lang/commands/ir_al_origen.rb +15 -0
  27. data/lib/gobstones/lang/commands/mover.rb +23 -0
  28. data/lib/gobstones/lang/commands/multiple_assignment.rb +34 -21
  29. data/lib/gobstones/lang/commands/poner.rb +31 -0
  30. data/lib/gobstones/lang/commands/procedure_call.rb +8 -8
  31. data/lib/gobstones/lang/commands/repeat_with.rb +69 -0
  32. data/lib/gobstones/lang/commands/sacar.rb +29 -0
  33. data/lib/gobstones/lang/commands/single_assignment.rb +15 -20
  34. data/lib/gobstones/lang/commands/skip.rb +15 -0
  35. data/lib/gobstones/lang/commands/vaciar_tablero.rb +15 -0
  36. data/lib/gobstones/lang/commands/while.rb +20 -0
  37. data/lib/gobstones/lang/definitions/definition.rb +16 -23
  38. data/lib/gobstones/lang/definitions/definition_call.rb +7 -15
  39. data/lib/gobstones/lang/definitions/function.rb +1 -7
  40. data/lib/gobstones/lang/definitions/main.rb +1 -8
  41. data/lib/gobstones/lang/definitions/no_return_statement.rb +2 -8
  42. data/lib/gobstones/lang/definitions/procedure.rb +1 -7
  43. data/lib/gobstones/lang/definitions/return_from_function.rb +6 -13
  44. data/lib/gobstones/lang/definitions/return_from_main.rb +15 -10
  45. data/lib/gobstones/lang/definitions/var_tuple.rb +10 -12
  46. data/lib/gobstones/lang/expressions/arithmetic_expressions.rb +17 -27
  47. data/lib/gobstones/lang/expressions/boolean_expressions.rb +4 -10
  48. data/lib/gobstones/lang/expressions/comparison_expressions.rb +0 -16
  49. data/lib/gobstones/lang/expressions/enclosed_by_parens_expression.rb +3 -5
  50. data/lib/gobstones/lang/expressions/expression.rb +18 -0
  51. data/lib/gobstones/lang/expressions/function_call.rb +9 -6
  52. data/lib/gobstones/lang/expressions/one_arg_expression.rb +8 -16
  53. data/lib/gobstones/lang/expressions/primitive_functions.rb +24 -16
  54. data/lib/gobstones/lang/expressions/two_arg_expression.rb +9 -16
  55. data/lib/gobstones/lang/expressions/type_bound_functions.rb +30 -25
  56. data/lib/gobstones/lang/expressions/var_name.rb +9 -13
  57. data/lib/gobstones/lang/literals/all.rb +3 -3
  58. data/lib/gobstones/lang/literals/{booleans.rb → boolean.rb} +24 -22
  59. data/lib/gobstones/lang/literals/{colors.rb → color.rb} +4 -14
  60. data/lib/gobstones/lang/literals/{directions.rb → direction.rb} +3 -13
  61. data/lib/gobstones/lang/literals/literal.rb +35 -27
  62. data/lib/gobstones/lang/literals/number.rb +6 -8
  63. data/lib/gobstones/lang/program.rb +9 -16
  64. data/lib/gobstones/modules/equality_definition.rb +23 -0
  65. data/lib/gobstones/parser/ast/ast.rb +48 -70
  66. data/lib/gobstones/parser/parse_error.rb +2 -7
  67. data/lib/gobstones/parser/treetop_parser.rb +9 -14
  68. data/lib/gobstones/runner/board.rb +12 -15
  69. data/lib/gobstones/runner/cell.rb +14 -20
  70. data/lib/gobstones/runner/errors/all.rb +1 -1
  71. data/lib/gobstones/runner/errors/boom_error.rb +0 -5
  72. data/lib/gobstones/runner/errors/definition_not_found_error.rb +7 -7
  73. data/lib/gobstones/runner/errors/empty_cell_error.rb +0 -5
  74. data/lib/gobstones/runner/errors/gobstones_runtime_error.rb +0 -5
  75. data/lib/gobstones/runner/errors/gobstones_type_error.rb +2 -7
  76. data/lib/gobstones/runner/errors/out_of_board_error.rb +0 -5
  77. data/lib/gobstones/runner/errors/undefined_variable_error.rb +6 -4
  78. data/lib/gobstones/runner/errors/wrong_arguments_error.rb +0 -5
  79. data/lib/gobstones/runner/execution_context.rb +16 -33
  80. data/lib/gobstones/runner/head.rb +17 -20
  81. data/lib/gobstones/runner/program_result.rb +12 -0
  82. data/lib/gobstones/type_check_result.rb +0 -4
  83. data/spec/lang/commands/boom_spec.rb +7 -0
  84. data/spec/lang/commands/command_block_spec.rb +15 -0
  85. data/spec/lang/commands/if_spec.rb +32 -0
  86. data/spec/lang/commands/if_then_else_spec.rb +19 -0
  87. data/spec/lang/commands/ir_al_origen_spec.rb +11 -0
  88. data/spec/lang/commands/mover_spec.rb +30 -0
  89. data/spec/lang/commands/multiple_assignment_spec.rb +39 -22
  90. data/spec/lang/commands/poner_spec.rb +27 -0
  91. data/spec/lang/commands/procedure_call_spec.rb +26 -28
  92. data/spec/lang/commands/procedure_spec.rb +32 -32
  93. data/spec/lang/commands/repeat_with_spec.rb +64 -0
  94. data/spec/lang/commands/sacar_spec.rb +32 -0
  95. data/spec/lang/commands/single_assignment_spec.rb +5 -6
  96. data/spec/lang/commands/skip_spec.rb +10 -0
  97. data/spec/lang/commands/vaciar_tablero_spec.rb +10 -0
  98. data/spec/lang/commands/while_spec.rb +39 -0
  99. data/spec/lang/definitions/main_spec.rb +34 -0
  100. data/spec/lang/definitions/no_return_statement_spec.rb +4 -5
  101. data/spec/lang/definitions/var_tuple_spec.rb +4 -7
  102. data/spec/lang/expressions/arithmetic_expressions_spec.rb +37 -64
  103. data/spec/lang/expressions/boolean_expressions_spec.rb +25 -34
  104. data/spec/lang/expressions/comparison_expressions_spec.rb +109 -155
  105. data/spec/lang/expressions/enclosed_by_parens_expression_spec.rb +3 -7
  106. data/spec/lang/expressions/function_call_spec.rb +24 -20
  107. data/spec/lang/expressions/primitive_functions_spec.rb +28 -39
  108. data/spec/lang/expressions/type_bound_functions_spec.rb +10 -18
  109. data/spec/lang/expressions/var_name_spec.rb +8 -12
  110. data/spec/lang/literals/{booleans_spec.rb → boolean_spec.rb} +3 -5
  111. data/spec/lang/literals/color_spec.rb +19 -0
  112. data/spec/lang/literals/direction_spec.rb +46 -0
  113. data/spec/lang/literals/{numbers_spec.rb → number_spec.rb} +3 -4
  114. data/spec/matchers/parse_matcher.rb +9 -11
  115. data/spec/parser/arithmetic_expressions_spec.rb +51 -61
  116. data/spec/parser/assignments_spec.rb +21 -31
  117. data/spec/parser/boolean_expressions_spec.rb +35 -43
  118. data/spec/parser/command_block_spec.rb +18 -20
  119. data/spec/parser/data_types_spec.rb +9 -19
  120. data/spec/parser/function_calls_spec.rb +19 -19
  121. data/spec/parser/function_definitions_spec.rb +17 -22
  122. data/spec/parser/gobstones_program_spec.rb +30 -30
  123. data/spec/parser/if_command_spec.rb +19 -28
  124. data/spec/parser/main_definition_spec.rb +13 -16
  125. data/spec/parser/nested_expressions_spec.rb +20 -24
  126. data/spec/parser/primitive_expressions_spec.rb +33 -38
  127. data/spec/parser/procedure_calls_spec.rb +17 -18
  128. data/spec/parser/procedure_definitions_spec.rb +12 -15
  129. data/spec/parser/repeat_with_command_spec.rb +10 -10
  130. data/spec/parser/simple_commands_spec.rb +23 -37
  131. data/spec/parser/treetop_parser_spec.rb +87 -83
  132. data/spec/parser/var_tuple_spec.rb +8 -12
  133. data/spec/parser/while_command_spec.rb +11 -14
  134. data/spec/runner/board_spec.rb +28 -33
  135. data/spec/runner/cell_spec.rb +21 -28
  136. data/spec/runner/execution_context_spec.rb +18 -35
  137. data/spec/runner/head_spec.rb +54 -60
  138. data/spec/spec_helper.rb +10 -1
  139. data/spec/support/board_assertions.rb +18 -0
  140. data/spec/{gobstones_lang_test_objects.rb → support/gobstones_lang_test_objects.rb} +6 -4
  141. data/spec/type_checker_spec.rb +19 -25
  142. metadata +80 -56
  143. data/.ruby-version +0 -1
  144. data/lib/gobstones/lang/commands/boom_cmd.rb +0 -31
  145. data/lib/gobstones/lang/commands/conditional_cmd.rb +0 -31
  146. data/lib/gobstones/lang/commands/if_cmd.rb +0 -38
  147. data/lib/gobstones/lang/commands/ir_al_origen_cmd.rb +0 -19
  148. data/lib/gobstones/lang/commands/mover_cmd.rb +0 -27
  149. data/lib/gobstones/lang/commands/poner_cmd.rb +0 -35
  150. data/lib/gobstones/lang/commands/repeat_with_cmd.rb +0 -77
  151. data/lib/gobstones/lang/commands/sacar_cmd.rb +0 -33
  152. data/lib/gobstones/lang/commands/skip_cmd.rb +0 -19
  153. data/lib/gobstones/lang/commands/vaciar_tablero_cmd.rb +0 -19
  154. data/lib/gobstones/lang/commands/while_cmd.rb +0 -25
  155. data/lib/gobstones/modules/equal_by_class.rb +0 -13
  156. data/spec/lang/commands/boom_cmd_spec.rb +0 -8
  157. data/spec/lang/commands/cmd_block_spec.rb +0 -21
  158. data/spec/lang/commands/if_cmd_spec.rb +0 -50
  159. data/spec/lang/commands/ir_al_origen_cmd_spec.rb +0 -16
  160. data/spec/lang/commands/mover_cmd_spec.rb +0 -36
  161. data/spec/lang/commands/poner_cmd_spec.rb +0 -28
  162. data/spec/lang/commands/repeat_with_cmd_spec.rb +0 -60
  163. data/spec/lang/commands/sacar_cmd_spec.rb +0 -35
  164. data/spec/lang/commands/skip_cmd_spec.rb +0 -12
  165. data/spec/lang/commands/vaciar_tablero_cmd_spec.rb +0 -14
  166. data/spec/lang/commands/while_cmd_spec.rb +0 -43
  167. data/spec/lang/literals/colors_spec.rb +0 -13
  168. data/spec/lang/literals/directions_spec.rb +0 -45
@@ -1,33 +0,0 @@
1
- require 'gobstones/lang/expressions/one_arg_expression'
2
- require 'gobstones/lang/commands/poner_cmd'
3
- require 'gobstones/runner/errors/gobstones_type_error'
4
-
5
- module Gobstones
6
-
7
- module Lang
8
-
9
- class Sacar < OneArgExpression
10
-
11
- def evaluate(context)
12
- with_evaluated_argument_in(context) do |result|
13
- context.head.take_out result
14
- end
15
- rescue RuntimeError => e
16
- raise Gobstones::Runner::GobstonesTypeError, e.message
17
- end
18
-
19
- def undo(context)
20
- with_evaluated_argument_in(context) do |result|
21
- context.head.put result
22
- end
23
- end
24
-
25
- def opposite
26
- Poner.new argument
27
- end
28
-
29
- end
30
-
31
- end
32
-
33
- end
@@ -1,19 +0,0 @@
1
- require 'gobstones/modules/equal_by_class'
2
-
3
- module Gobstones
4
-
5
- module Lang
6
-
7
- class Skip
8
-
9
- include Gobstones::EqualByClass
10
-
11
- def evaluate(context)
12
- # do nothing, that's my job :-)
13
- end
14
-
15
- end
16
-
17
- end
18
-
19
- end
@@ -1,19 +0,0 @@
1
- require 'gobstones/modules/equal_by_class'
2
-
3
- module Gobstones
4
-
5
- module Lang
6
-
7
- class VaciarTablero
8
-
9
- include Gobstones::EqualByClass
10
-
11
- def evaluate(context)
12
- context.board.empty!
13
- end
14
-
15
- end
16
-
17
- end
18
-
19
- end
@@ -1,25 +0,0 @@
1
- require 'gobstones/lang/commands/conditional_cmd'
2
- require 'gobstones/runner/errors/gobstones_runtime_error'
3
-
4
- module Gobstones
5
-
6
- module Lang
7
-
8
- class WhileCmd < ConditionalCmd
9
-
10
- STACK_LIMIT = 10000
11
-
12
- def evaluate(context)
13
- stack_acc = 0
14
- while evaluate_condition(context).is_true?
15
- raise Gobstones::Runner::GobstonesRuntimeError, 'stack overflow' if stack_acc == STACK_LIMIT
16
- then_block.evaluate context
17
- stack_acc += 1
18
- end
19
- end
20
-
21
- end
22
-
23
- end
24
-
25
- end
@@ -1,13 +0,0 @@
1
- module Gobstones
2
-
3
- module EqualByClass
4
-
5
- def ==(other)
6
- self.class == other.class
7
- end
8
-
9
- alias_method :eql?, :==
10
-
11
- end
12
-
13
- end
@@ -1,8 +0,0 @@
1
- describe Boom do
2
-
3
- it "raises an error when evaluating, with the message specified" do
4
- msg = 'This is a program error'
5
- expect { Boom.new(msg).evaluate(clean_context) }.to raise_error(BoomError, msg)
6
- end
7
-
8
- end
@@ -1,21 +0,0 @@
1
- describe CommandBlock do
2
-
3
- let(:context) { clean_context }
4
-
5
- it "evaluates all inner commands" do
6
- cmd_block = CommandBlock.new [
7
- Poner.new(rojo), Poner.new(verde),
8
- Poner.new(negro), Poner.new(azul)]
9
- cmd_block.evaluate context
10
- expect(context.head.are_there_balls?(azul)).to be true
11
- expect(context.head.are_there_balls?(negro)).to be true
12
- expect(context.head.are_there_balls?(rojo)).to be true
13
- expect(context.head.are_there_balls?(verde)).to be true
14
- end
15
-
16
- it "builds an empty command block" do
17
- expect(CommandBlock.new []).to be_empty
18
- expect(CommandBlock.empty).to be_empty
19
- end
20
-
21
- end
@@ -1,50 +0,0 @@
1
- describe "if command" do
2
-
3
- let(:context) { clean_context }
4
- let(:then_block) { CommandBlock.new [Poner.new(verde)] }
5
- let(:else_block) { CommandBlock.new [Poner.new(rojo)] }
6
-
7
- describe "if-then" do
8
-
9
- it "evaluates the 'then' command block if the condition is true" do
10
- if_cmd = IfCmd.new true_value, then_block
11
- if_cmd.evaluate context
12
- expect(context.head.are_there_balls?(verde)).to be true
13
- end
14
-
15
- it "does not evaluate the 'then' command block if the condition is false" do
16
- if_cmd = IfCmd.new false_value, then_block
17
- if_cmd.evaluate context
18
- expect(context.head.are_there_balls?(verde)).to be false
19
- end
20
-
21
- it "raises a type error if the condition is not boolean" do
22
- [42.to_gbs_num, norte, verde].each do |value|
23
- if_cmd = IfCmd.new value, then_block
24
- expect { if_cmd.evaluate context }
25
- .to raise_error(GobstonesTypeError, /is not a boolean/)
26
- end
27
-
28
- end
29
-
30
- end
31
-
32
- describe "if-then-else" do
33
-
34
- it "evaluates the 'then' block and it does not evaluate the 'else' block" do
35
- if_cmd = IfElseCmd.new true_value, then_block, else_block
36
- if_cmd.evaluate context
37
- expect(context.head.are_there_balls?(verde)).to be true
38
- expect(context.head.are_there_balls?(rojo)).to be false
39
- end
40
-
41
- it "does not evaluate the 'then' block and it evaluates the 'else' block" do
42
- if_cmd = IfElseCmd.new false_value, then_block, else_block
43
- if_cmd.evaluate context
44
- expect(context.head.are_there_balls?(verde)).to be false
45
- expect(context.head.are_there_balls?(rojo)).to be true
46
- end
47
-
48
- end
49
-
50
- end
@@ -1,16 +0,0 @@
1
- describe IrAlOrigen do
2
-
3
- let(:context) { clean_context }
4
-
5
- it "puts the head in 0, 0 when evaluating" do
6
- context.head.move_north
7
- context.head.move_east
8
- ir_al_origen = IrAlOrigen.new
9
-
10
- ir_al_origen.evaluate context
11
-
12
- expect(context.head.x_pos).to eq(0)
13
- expect(context.head.y_pos).to eq(0)
14
- end
15
-
16
- end
@@ -1,36 +0,0 @@
1
- describe Mover do
2
-
3
- let(:context) { clean_context }
4
-
5
- it "moves the head to the specified direction when evaluating" do
6
- Mover.new(norte).evaluate(context)
7
-
8
- expect(context.head.x_pos).to eq(0)
9
- expect(context.head.y_pos).to eq(1)
10
- end
11
-
12
- it "undoes the given movement" do
13
- cmd = Mover.new norte
14
-
15
- cmd.evaluate context
16
- cmd.undo context
17
-
18
- expect(context.head.x_pos).to eq(0)
19
- expect(context.head.y_pos).to eq(0)
20
- end
21
-
22
- it "returns the opposite command" do
23
- expect(Mover.new(norte).opposite).to eq(Mover.new(sur))
24
- end
25
-
26
- it "fails if the argument is not a direction" do
27
- expect { Mover.new(verde).evaluate(context) }.
28
- to raise_error(GobstonesTypeError, /is not a direction/)
29
- end
30
-
31
- it "fails when the resulting position is out of board" do
32
- expect { Mover.new(sur).evaluate(context) }.
33
- to raise_error(OutOfBoardError)
34
- end
35
-
36
- end
@@ -1,28 +0,0 @@
1
- describe Poner do
2
-
3
- let(:context) { clean_context }
4
-
5
- it "puts a ball of the given color in the current cell when evaluating" do
6
- Poner.new(verde).evaluate(context)
7
-
8
- expect(context.head.number_of_balls(verde)).to eq(1)
9
- end
10
-
11
- it "undoes the command" do
12
- context.head.put verde
13
-
14
- Poner.new(verde).undo context
15
-
16
- expect(context.head.number_of_balls(verde)).to eq(0)
17
- end
18
-
19
- it "returns the opposite command" do
20
- expect(Poner.new(verde).opposite).to eq(Sacar.new(verde))
21
- end
22
-
23
- it "fails if the argument is not a color" do
24
- expect { Poner.new(norte).evaluate(context) }.
25
- to raise_error(GobstonesTypeError, /is not a color/)
26
- end
27
-
28
- end
@@ -1,60 +0,0 @@
1
- describe RepeatWithCmd do
2
-
3
- let(:context) { clean_context }
4
- let(:var_name) { 'var'.to_var_name }
5
-
6
- it "iterates over numbers when evaluating" do
7
- command_block = CommandBlock.new [Poner.new(rojo)]
8
- repeat_with = RepeatWithCmd.new var_name, 1.to_gbs_num, 10.to_gbs_num, command_block
9
-
10
- repeat_with.evaluate context
11
-
12
- expect(context.head.number_of_balls(rojo)).to eq(10)
13
- end
14
-
15
- it "raises an error if the range values have not the same type" do
16
- repeat_with = RepeatWithCmd.new var_name, 1.to_gbs_num, este, empty_body
17
-
18
- expect { repeat_with.evaluate context }
19
- .to raise_error(GobstonesTypeError, /types don't match in range values/)
20
- end
21
-
22
- it "raises an error if the index variable is previously defined" do
23
- repeat_with = RepeatWithCmd.new var_name, 1.to_gbs_num, 5.to_gbs_num, empty_body
24
-
25
- context.set var_name, 42.to_gbs_num
26
-
27
- expect { repeat_with.evaluate context }
28
- .to raise_error(GobstonesRuntimeError, /index variable can't be used because it's already defined/)
29
- end
30
-
31
- it "removes the index variable assignment after execution" do
32
- repeat_with = RepeatWithCmd.new var_name, azul, verde, empty_body
33
-
34
- repeat_with.evaluate context
35
-
36
- expect(context.has_variable_named?('var')).to be false
37
- end
38
-
39
- it "allows to use the index variable inside the command block" do
40
- cmd_block = CommandBlock.new [Poner.new(var_name)]
41
- repeat_with = RepeatWithCmd.new var_name, azul, verde, cmd_block
42
-
43
- repeat_with.evaluate context
44
-
45
- expect(context.head.are_there_balls?(azul)).to be true
46
- expect(context.head.are_there_balls?(negro)).to be true
47
- expect(context.head.are_there_balls?(rojo)).to be true
48
- expect(context.head.are_there_balls?(verde)).to be true
49
- end
50
-
51
- it "does no iterations if the from is higher than the to" do
52
- cmd_block = CommandBlock.new [Poner.new(verde)]
53
- repeat_with = RepeatWithCmd.new var_name, 8.to_gbs_num, 4.to_gbs_num, cmd_block
54
-
55
- repeat_with.evaluate context
56
-
57
- expect(context.head.are_there_balls?(verde)).to be false
58
- end
59
-
60
- end
@@ -1,35 +0,0 @@
1
- describe Sacar do
2
-
3
- let(:context) { clean_context }
4
-
5
- it "take off balls from the board when evaluating" do
6
- 3.times { context.head.put rojo }
7
-
8
- Sacar.new(rojo).evaluate context
9
-
10
- expect(context.head.number_of_balls(rojo)).to eq(2)
11
- end
12
-
13
- it "undoes a command" do
14
- Sacar.new(rojo).undo context
15
-
16
- expect(context.head.number_of_balls(rojo)).to eq(1)
17
- end
18
-
19
- it "returns the opposite command" do
20
- opposite_command = Sacar.new(rojo).opposite
21
-
22
- expect(opposite_command).to eq(Poner.new(rojo))
23
- end
24
-
25
- it "fails if there are no balls in the board" do
26
- expect { Sacar.new(rojo).evaluate(context) }.
27
- to raise_error(EmptyCellError)
28
- end
29
-
30
- it "fails if the argument is not a color" do
31
- expect { Sacar.new(true_value).evaluate(context) }.
32
- to raise_error(GobstonesTypeError, /is not a color/)
33
- end
34
-
35
- end
@@ -1,12 +0,0 @@
1
- describe Skip do
2
-
3
- let(:context) { clean_context }
4
-
5
- it "evaluates and does nothing" do
6
- Skip.new.evaluate context
7
- expect(context.head.x_pos).to eq(0)
8
- expect(context.head.y_pos).to eq(0)
9
- expect(context.head.board).to be_empty
10
- end
11
-
12
- end
@@ -1,14 +0,0 @@
1
- describe VaciarTablero do
2
-
3
- let(:context) { clean_context }
4
-
5
- it "empties the board in the context" do
6
- context.head.put rojo
7
- vaciar_tablero = VaciarTablero.new
8
-
9
- vaciar_tablero.evaluate context
10
-
11
- expect(context.board.empty?).to be true
12
- end
13
-
14
- end
@@ -1,43 +0,0 @@
1
- describe WhileCmd do
2
-
3
- let(:context) { clean_context }
4
- let(:while_block) { CommandBlock.new [Poner.new(verde)] }
5
-
6
- def condition(times)
7
- double('while condition').tap do |condition|
8
- expected_values = [true_value] * times + [false_value]
9
- allow(condition).to receive(:evaluate).and_return(*expected_values)
10
- end
11
- end
12
-
13
- it "evaluates the command block until the condition is not satisfied" do
14
- while_cmd = WhileCmd.new condition(3), while_block
15
-
16
- while_cmd.evaluate context
17
-
18
- expect(context.head.number_of_balls(verde)).to eq(3)
19
- end
20
-
21
- it "does not evaluate the command block if the condition is false" do
22
- while_cmd = WhileCmd.new condition(0), while_block
23
-
24
- while_cmd.evaluate context
25
-
26
- expect(context.head.are_there_balls?(verde)).to be false
27
- end
28
-
29
- it "fails by type error if the condition is not boolean" do
30
- while_cmd = WhileCmd.new sur, while_block
31
-
32
- expect { while_cmd.evaluate context }
33
- .to raise_error(GobstonesTypeError, /is not a boolean/)
34
- end
35
-
36
- it "fails by stack overflow if the condition is always true" do
37
- while_cmd = WhileCmd.new true_value, while_block
38
-
39
- expect { while_cmd.evaluate context }
40
- .to raise_error(GobstonesRuntimeError, /stack overflow/)
41
- end
42
-
43
- end