gobstones 0.0.2 → 0.0.3

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 (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,26 +1,19 @@
1
- describe Cell do
1
+ RSpec.describe Cell do
2
+ subject(:cell) { described_class.new }
2
3
 
3
- let(:colors) { [azul, negro, rojo, verde] }
4
- let(:cell) { Cell.new }
5
-
6
- it "answers that there are no balls of a given color" do
7
- expect(cell.are_there_balls?(azul)).to be false
8
- expect(cell.are_there_balls?(negro)).to be false
9
- expect(cell.are_there_balls?(rojo)).to be false
10
- expect(cell.are_there_balls?(verde)).to be false
4
+ it 'answers that there are no balls of a given color' do
5
+ expect_no_balls(*colors, on: cell)
11
6
  end
12
7
 
13
- it "answers that there are balls of a given color when adding some" do
8
+ it 'answers that there are balls of a given color when adding some' do
14
9
  cell.put azul
15
10
  cell.put rojo
16
11
 
17
- expect(cell.are_there_balls?(azul)).to be true
18
- expect(cell.are_there_balls?(negro)).to be false
19
- expect(cell.are_there_balls?(rojo)).to be true
20
- expect(cell.are_there_balls?(verde)).to be false
12
+ expect_balls(azul, rojo, on: cell)
13
+ expect_no_balls(verde, negro, on: cell)
21
14
  end
22
15
 
23
- it "answers the number of balls of a given color" do
16
+ it 'answers the number of balls of a given color' do
24
17
  5.times { cell.put verde }
25
18
 
26
19
  expect(cell.number_of_balls(azul)).to eq(0)
@@ -29,11 +22,11 @@ describe Cell do
29
22
  expect(cell.number_of_balls(verde)).to eq(5)
30
23
  end
31
24
 
32
- it "allows to take out some balls" do
25
+ it 'allows to take out some balls' do
33
26
  5.times { cell.put azul }
34
27
  3.times { cell.take_out azul }
35
28
 
36
- expect(cell.are_there_balls?(azul)).to be true
29
+ expect(cell.are_there_balls?(azul)).to be(true)
37
30
  expect(cell.number_of_balls(azul)).to eq(2)
38
31
  end
39
32
 
@@ -41,28 +34,28 @@ describe Cell do
41
34
  expect { cell.take_out rojo }.to raise_error(EmptyCellError)
42
35
  end
43
36
 
44
- it "fails passing something that is not a color" do
45
- expect { cell.put("not a color") }.to raise_error
46
- expect { cell.take_out(42) }.to raise_error
47
- expect { cell.are_there_balls?(Norte) }.to raise_error
48
- expect { cell.number_of_balls(nil) }.to raise_error
37
+ it 'fails passing something that is not a color' do
38
+ expect { cell.put('not a color') }.to raise_error(/is not a color/)
39
+ expect { cell.take_out(42) }.to raise_error(/is not a color/)
40
+ expect { cell.are_there_balls?(Norte) }.to raise_error(/is not a color/)
41
+ expect { cell.number_of_balls(nil) }.to raise_error(/is not a color/)
49
42
  end
50
43
 
51
- it "clears its contents" do
44
+ it 'clears its contents' do
52
45
  colors.each { |color| cell.put color }
53
46
 
54
47
  cell.empty!
55
48
 
56
- colors.each { |color| expect(cell.are_there_balls?(color)).to be false }
49
+ expect_no_balls(*colors, on: cell)
57
50
  end
58
51
 
59
52
  it "is empty if it doesn't have any balls" do
60
- expect(cell.empty?).to be true
53
+ expect(cell).to be_empty
61
54
  end
62
55
 
63
- it "is not empty it it has some balls" do
56
+ it 'is not empty it it has some balls' do
64
57
  colors.each { |color| cell.put color }
65
- expect(cell.empty?).to be false
66
- end
67
58
 
59
+ expect(cell).not_to be_empty
60
+ end
68
61
  end
@@ -1,16 +1,14 @@
1
- describe ExecutionContext do
2
-
1
+ RSpec.describe ExecutionContext do
3
2
  let(:context) { clean_context }
4
3
 
5
- describe "variables context" do
6
-
7
- it "allows to set/get a variable" do
4
+ describe 'variables context' do
5
+ it 'allows to set/get a variable' do
8
6
  context.set 'myColor', negro
9
7
 
10
8
  expect(context.get('myColor')).to eq(negro)
11
9
  end
12
10
 
13
- it "allows to set/get more than one variable" do
11
+ it 'allows to set/get more than one variable' do
14
12
  context.set 'dir', norte
15
13
  context.set 'bool', true_value
16
14
 
@@ -18,61 +16,46 @@ describe ExecutionContext do
18
16
  expect(context.get('bool')).to eq(true_value)
19
17
  end
20
18
 
21
- it "raises an error when trying to get an undefined variable" do
19
+ it 'raises an error when trying to get an undefined variable' do
22
20
  expect { context.get('undefined') }.to raise_error(UndefinedVariableError)
23
21
  end
24
-
25
22
  end
26
23
 
27
24
  describe ProgramExecutionContext do
28
-
29
- it "is the program context itself" do
25
+ it 'is the program context itself' do
30
26
  expect(context.program_context).to eq(context)
31
27
  end
32
-
33
- it "has a head" do
34
- expect(context.head).to be_a Head
35
- end
36
-
37
- it "has a board" do
38
- expect(context.board).to be_a Board
39
- end
40
-
41
28
  end
42
29
 
43
30
  describe ProcedureExecutionContext do
31
+ let(:procedure_context) { described_class.based_on(context) }
44
32
 
45
- let(:procedure_context) { ProcedureExecutionContext.based_on context }
46
-
47
- it "returns the program context in which it is based" do
33
+ it 'returns the program context in which it is based' do
48
34
  expect(procedure_context.program_context).to eq(context)
49
35
  end
50
36
 
51
- it "shares the head with the outer context" do
37
+ it 'shares the head with the outer context' do
52
38
  expect(procedure_context.head).to eq(context.head)
53
39
  end
54
-
55
40
  end
56
41
 
57
42
  describe FunctionExecutionContext do
43
+ it 'returns the program context in which it is based' do
44
+ function_context = described_class.based_on(context)
58
45
 
59
- it "returns the program context in which it is based" do
60
- function_context = FunctionExecutionContext.based_on context
61
46
  expect(function_context.program_context).to eq(context)
62
47
  end
63
48
 
64
49
  it "has a new head, a copy of the outer context's head" do
65
- context.head.put azul
66
- function_context = FunctionExecutionContext.based_on context
67
- function_context.head.put verde
50
+ context.head.put(azul)
51
+ function_context = described_class.based_on(context)
52
+ function_context.head.put(verde)
68
53
 
69
54
  expect(function_context.head).not_to eq(context.head)
70
- expect(context.head.are_there_balls?(azul)).to be true
71
- expect(function_context.head.are_there_balls?(azul)).to be true
72
- expect(context.head.are_there_balls?(verde)).to be false
73
- expect(function_context.head.are_there_balls?(verde)).to be true
55
+ expect_balls(azul)
56
+ expect_no_balls(verde)
57
+ expect_balls(azul, on: function_context.head)
58
+ expect_balls(verde, on: function_context.head)
74
59
  end
75
-
76
60
  end
77
-
78
61
  end
@@ -1,130 +1,124 @@
1
- describe Head do
1
+ RSpec.describe Head do
2
+ subject(:head) { described_class.new }
2
3
 
3
- let(:head) { Head.new }
4
-
5
- it "has a position, default 0;0" do
4
+ it 'has a position, default 0;0' do
6
5
  expect(head.x_pos).to eq(0)
7
6
  expect(head.y_pos).to eq(0)
8
7
  end
9
8
 
10
- it "answers the max size" do
11
- expect(Head::MAX_ROWS).to eq(9)
12
- expect(Head::MAX_COLS).to eq(9)
9
+ it 'answers the max size' do
10
+ expect(described_class::MAX_ROWS).to eq(9)
11
+ expect(described_class::MAX_COLS).to eq(9)
13
12
  end
14
13
 
15
- it "allows to be created at a random position" do
16
- head = Head.at_random
14
+ it 'allows to be created at a random position' do
15
+ head = described_class.at_random
17
16
 
18
- 100.times { expect(head.x_pos.between?(0, Head::MAX_ROWS-1)).to be true }
19
- 100.times { expect(head.y_pos.between?(0, Head::MAX_COLS-1)).to be true }
17
+ expect(head.x_pos.between?(0, described_class::MAX_ROWS - 1)).to be(true)
18
+ expect(head.y_pos.between?(0, described_class::MAX_COLS - 1)).to be(true)
20
19
  end
21
20
 
22
- describe "movements" do
23
-
24
- context "valid" do
25
-
26
- it "moves north" do
27
- expect(head.can_move?(norte)).to be true
28
- expect { head.move(norte) }.to_not raise_error
21
+ describe 'movements' do
22
+ context 'valid' do
23
+ it 'moves north' do
24
+ expect(head.can_move?(norte)).to be(true)
25
+ expect { head.move(norte) }.not_to raise_error
29
26
  expect(head.x_pos).to eq(0)
30
27
  expect(head.y_pos).to eq(1)
31
28
  end
32
29
 
33
- it "moves south" do
30
+ it 'moves south' do
34
31
  head.move norte
35
- expect(head.can_move?(sur)).to be true
36
- expect { head.move(sur) }.to_not raise_error
32
+
33
+ expect(head.can_move?(sur)).to be(true)
34
+ expect { head.move(sur) }.not_to raise_error
37
35
  expect(head.x_pos).to eq(0)
38
36
  expect(head.y_pos).to eq(0)
39
37
  end
40
38
 
41
- it "moves east" do
42
- expect(head.can_move?(este)).to be true
43
- expect { head.move(este) }.to_not raise_error
39
+ it 'moves east' do
40
+ expect(head.can_move?(este)).to be(true)
41
+ expect { head.move(este) }.not_to raise_error
44
42
  expect(head.x_pos).to eq(1)
45
43
  expect(head.y_pos).to eq(0)
46
44
  end
47
45
 
48
- it "moves west" do
46
+ it 'moves west' do
49
47
  head.move este
50
- expect(head.can_move?(oeste)).to be true
51
- expect { head.move(oeste) }.to_not raise_error
48
+
49
+ expect(head.can_move?(oeste)).to be(true)
50
+ expect { head.move(oeste) }.not_to raise_error
52
51
  expect(head.x_pos).to eq(0)
53
52
  expect(head.y_pos).to eq(0)
54
53
  end
55
54
 
56
- it "goes to the origin" do
55
+ it 'goes to the origin' do
57
56
  head.move este
58
57
  head.move norte
59
58
  head.go_to_origin
59
+
60
60
  expect(head.x_pos).to eq(0)
61
61
  expect(head.y_pos).to eq(0)
62
62
  end
63
-
64
63
  end
65
64
 
66
- context "non valid" do
65
+ context 'non valid' do
66
+ it 'fails moving north' do
67
+ (Head::MAX_COLS - 1).times { head.move norte }
67
68
 
68
- it "fails moving north" do
69
- (Head::MAX_COLS-1).times { head.move norte }
70
-
71
- expect(head.can_move?(norte)).to be false
69
+ expect(head.can_move?(norte)).to be(false)
72
70
  expect { head.move norte }.to raise_error(OutOfBoardError)
73
71
  end
74
72
 
75
- it "fails moving south" do
76
- expect(head.can_move?(sur)).to be false
73
+ it 'fails moving south' do
74
+ expect(head.can_move?(sur)).to be(false)
77
75
  expect { head.move sur }.to raise_error(OutOfBoardError)
78
76
  end
79
77
 
80
- it "fails moving east" do
81
- (Head::MAX_ROWS-1).times { head.move este }
78
+ it 'fails moving east' do
79
+ (described_class::MAX_ROWS - 1).times { head.move este }
82
80
 
83
- expect(head.can_move?(este)).to be false
81
+ expect(head.can_move?(este)).to be(false)
84
82
  expect { head.move este }.to raise_error(OutOfBoardError)
85
83
  end
86
84
 
87
- it "fails moving west" do
88
- expect(head.can_move?(oeste)).to be false
85
+ it 'fails moving west' do
86
+ expect(head.can_move?(oeste)).to be(false)
89
87
  expect { head.move oeste }.to raise_error(OutOfBoardError)
90
88
  end
91
89
 
92
- it "fails if the argument is not a direction" do
93
- expect { head.move azul }.
94
- to raise_error(GobstonesTypeError, /is not a direction/)
95
- expect { head.move "not a direction" }.
96
- to raise_error(GobstonesTypeError, /is not a direction/)
97
- expect { head.move true_value }.
98
- to raise_error(GobstonesTypeError, /is not a direction/)
99
- expect { head.move 42 }.
100
- to raise_error(GobstonesTypeError, /is not a direction/)
90
+ it 'fails if the argument is not a direction' do
91
+ expect { head.move azul }.to raise_error(GobstonesTypeError, /is not a direction/)
92
+ expect { head.move 'not a direction' }.to raise_error(GobstonesTypeError, /is not a direction/)
93
+ expect { head.move true_value }.to raise_error(GobstonesTypeError, /is not a direction/)
94
+ expect { head.move 42 }.to raise_error(GobstonesTypeError, /is not a direction/)
101
95
  end
102
-
103
96
  end
104
-
105
97
  end
106
98
 
107
- describe "board actions" do
108
-
109
- it "puts balls across the board" do
99
+ describe 'board actions' do
100
+ it 'puts balls across the board' do
110
101
  3.times { head.put negro }
111
- expect(head.are_there_balls?(negro)).to be true
102
+
103
+ expect(head.are_there_balls?(negro)).to be(true)
112
104
  expect(head.number_of_balls(negro)).to eq(3)
105
+
113
106
  head.move norte
114
107
  2.times { head.put negro }
108
+
115
109
  expect(head.number_of_balls(negro)).to eq(2)
110
+
116
111
  head.move este
117
112
  5.times { head.put negro }
113
+
118
114
  expect(head.number_of_balls(negro)).to eq(5)
119
115
  end
120
116
 
121
- it "takes out balls across the board" do
117
+ it 'takes out balls across the board' do
122
118
  4.times { head.put negro }
123
119
  4.times { head.take_out negro }
124
120
 
125
- expect(head.are_there_balls?(negro)).to be false
121
+ expect(head.are_there_balls?(negro)).to be(false)
126
122
  end
127
-
128
123
  end
129
-
130
124
  end
@@ -2,6 +2,8 @@ require 'coveralls'
2
2
  Coveralls.wear!
3
3
 
4
4
  require 'simplecov'
5
+ require 'test_prof'
6
+ require 'test_prof/recipes/rspec/let_it_be'
5
7
 
6
8
  require 'matchers/parse_matcher'
7
9
 
@@ -11,8 +13,15 @@ require 'gobstones/runner/all'
11
13
  require 'gobstones/parser/treetop_parser'
12
14
 
13
15
  include Gobstones::Lang
16
+ include Gobstones::Lang::Commands
14
17
  include Gobstones::Runner
15
18
  include Gobstones::Parser
16
19
 
17
- require 'gobstones_lang_test_objects'
20
+ require 'support/gobstones_lang_test_objects'
18
21
  include GobstonesLangTestObjects
22
+ require 'support/board_assertions'
23
+ include BoardAssertions
24
+
25
+ RSpec.configure(&:disable_monkey_patching!)
26
+
27
+ TestProf::BeforeAll.adapter = OpenStruct.new(begin_transaction: nil, rollback_transaction: nil)
@@ -0,0 +1,18 @@
1
+ module BoardAssertions
2
+ def expect_balls(*colors, on: context.head)
3
+ colors.each do |color|
4
+ expect(on.are_there_balls?(color)).to be(true)
5
+ end
6
+ end
7
+
8
+ def expect_no_balls(*colors, on: context.head)
9
+ colors.each do |color|
10
+ expect(on.are_there_balls?(color)).to be(false)
11
+ end
12
+ end
13
+
14
+ def expect_positioned_at(x_pos, y_pos)
15
+ expect(context.head.x_pos).to eq(x_pos)
16
+ expect(context.head.y_pos).to eq(y_pos)
17
+ end
18
+ end
@@ -1,17 +1,16 @@
1
1
  module GobstonesLangTestObjects
2
-
3
2
  # Programs, contexts and definitions
4
3
 
5
4
  def clean_context
6
- program_context_for empty_program
5
+ program_context_for(empty_program)
7
6
  end
8
7
 
9
8
  def program_context_for(program)
10
- ProgramExecutionContext.for program
9
+ ProgramExecutionContext.for(program)
11
10
  end
12
11
 
13
12
  def empty_program
14
- Program.new no_definitions, no_return_statement
13
+ Program.new(no_definitions, no_return_statement)
15
14
  end
16
15
 
17
16
  def no_definitions
@@ -72,4 +71,7 @@ module GobstonesLangTestObjects
72
71
  Oeste.new
73
72
  end
74
73
 
74
+ def colors
75
+ [azul, negro, rojo, verde]
76
+ end
75
77
  end
@@ -1,37 +1,31 @@
1
- describe Gobstones, "type checker" do
1
+ RSpec.describe Gobstones, 'type checker' do
2
+ describe 'board expressions' do
3
+ describe 'puedeMover()' do
4
+ it 'allows a direction as argument' do
5
+ [norte, sur, este, oeste].each do |dir|
6
+ result = PuedeMover.new(dir).type_check
2
7
 
3
- describe "board expressions" do
8
+ expect(result.ok?).to be(true)
9
+ end
10
+ end
4
11
 
5
- describe "puedeMover()" do
12
+ it 'does not allow a number as argument' do
13
+ result = PuedeMover.new(42.to_gbs_num).type_check
6
14
 
7
- it "allows a direction as argument" do
8
- [norte, sur, este, oeste].each do |dir|
9
- puede_mover_dir = PuedeMover.new dir
10
- result = puede_mover_dir.type_check
11
- expect(result.ok?).to be true
12
- end
15
+ expect(result.ok?).to be(false)
13
16
  end
14
17
 
15
- it "does not allow a number as argument" do
16
- puede_mover_number = PuedeMover.new 42.to_gbs_num
17
- result = puede_mover_number.type_check
18
- expect(result.ok?).to be false
19
- end
18
+ it 'does not allow a color as argument' do
19
+ result = PuedeMover.new(verde).type_check
20
20
 
21
- it "does not allow a color as argument" do
22
- puede_mover_color = PuedeMover.new verde
23
- result = puede_mover_color.type_check
24
- expect(result.ok?).to be false
21
+ expect(result.ok?).to be(false)
25
22
  end
26
23
 
27
- it "does not allow a boolean as argument" do
28
- puede_mover_bool = PuedeMover.new true_value
29
- result = puede_mover_bool.type_check
30
- expect(result.ok?).to be false
31
- end
24
+ it 'does not allow a boolean as argument' do
25
+ result = PuedeMover.new(true_value).type_check
32
26
 
27
+ expect(result.ok?).to be(false)
28
+ end
33
29
  end
34
-
35
30
  end
36
-
37
31
  end