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