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,24 +1,22 @@
1
- describe Gobstones::Parser, "procedure definitions" do
1
+ RSpec.describe Gobstones::Parser, 'procedure definitions' do
2
+ it 'parses an empty procedure def without args' do
3
+ proc_def = Procedure.new('MyProc', no_arguments, empty_body)
2
4
 
3
- it "parses an empty procedure def without args" do
4
- proc_def = Procedure.new 'MyProc', no_arguments, empty_body
5
-
6
- expect('procedure MyProc() {}').
7
- to be_parsed_as(:definition).and_return(proc_def)
5
+ expect('procedure MyProc() {}').to be_parsed_as(:definition).and_return(proc_def)
8
6
  end
9
7
 
10
- it "parses an empty procedure with some args" do
11
- args = VarTuple.new ['firstArg'.to_var_name, 'secondArg'.to_var_name, 'thirdArg'.to_var_name]
12
- proc_def = Procedure.new 'MyProc', args, empty_body
8
+ it 'parses an empty procedure with some args' do
9
+ args = VarTuple.with_names(%w[firstArg secondArg thirdArg])
10
+ proc_def = Procedure.new('MyProc', args, empty_body)
13
11
 
14
12
  expect('procedure MyProc (firstArg, secondArg, thirdArg) {}').
15
13
  to be_parsed_as(:definition).and_return(proc_def)
16
14
  end
17
15
 
18
- it "parses a procedure with some statements" do
19
- args = VarTuple.new ['arg'.to_var_name]
20
- body = CommandBlock.new [Poner.new(verde)]
21
- proc_def = Procedure.new 'MyProc', args, body
16
+ it 'parses a procedure with some statements' do
17
+ args = VarTuple.with_names(%w[arg])
18
+ body = CommandBlock.with_just(Poner.new(verde))
19
+ proc_def = Procedure.new('MyProc', args, body)
22
20
 
23
21
  expect('procedure MyProc(arg)
24
22
  {
@@ -26,8 +24,7 @@ describe Gobstones::Parser, "procedure definitions" do
26
24
  }').to be_parsed_as(:definition).and_return(proc_def)
27
25
  end
28
26
 
29
- it "does not parse a procedure without a valid identifier" do
27
+ it 'does not parse a procedure without a valid identifier' do
30
28
  expect('procedure myWrongProc() {}').to be_parsed_as(:definition).and_fail
31
29
  end
32
-
33
30
  end
@@ -1,20 +1,20 @@
1
- describe Gobstones::Parser, "repeatWith statements" do
2
-
3
- it "parses an empty statement" do
4
- min_range, max_range = 1.to_gbs_num, 10.to_gbs_num
5
- rw_cmd = RepeatWithCmd.new 'i'.to_var_name, min_range, max_range, empty_body
1
+ RSpec.describe Gobstones::Parser, 'repeatWith statements' do
2
+ it 'parses an empty statement' do
3
+ min_range = 1.to_gbs_num
4
+ max_range = 10.to_gbs_num
5
+ rw_cmd = RepeatWith.new('i'.to_var_name, min_range, max_range, empty_body)
6
6
 
7
7
  expect('repeatWith i in 1..10 {}').to be_parsed_as(:command).and_return(rw_cmd)
8
8
  end
9
9
 
10
- it "parses an statement with any expressions in the range" do
11
- min_range, max_range = MinDir.new, Siguiente.new(rojo)
12
- cmd_block = CommandBlock.new [Poner.new(verde)]
13
- rw_cmd = RepeatWithCmd.new 'myDir'.to_var_name, min_range, max_range, cmd_block
10
+ it 'parses an statement with any expressions in the range' do
11
+ min_range = MinDir.new
12
+ max_range = Siguiente.new(rojo)
13
+ cmd_block = CommandBlock.with_just(Poner.new(verde))
14
+ rw_cmd = RepeatWith.new('myDir'.to_var_name, min_range, max_range, cmd_block)
14
15
 
15
16
  expect('repeatWith myDir in minDir() .. siguiente(Rojo) {
16
17
  Poner(Verde)
17
18
  }').to be_parsed_as(:command).and_return(rw_cmd)
18
19
  end
19
-
20
20
  end
@@ -1,62 +1,48 @@
1
- require 'gobstones/lang/commands/ir_al_origen_cmd'
2
- require 'gobstones/lang/commands/vaciar_tablero_cmd'
3
-
4
- describe Gobstones::Parser, "simple commands" do
5
-
6
- describe "primitives" do
7
-
8
- it "parses a Skip cmd" do
9
- skip_cmd = Skip.new
10
- expect('Skip').to be_parsed_as(:command).and_return(skip_cmd)
1
+ RSpec.describe Gobstones::Parser, 'simple commands' do
2
+ describe 'primitives' do
3
+ it 'parses a Skip cmd' do
4
+ expect('Skip').to be_parsed_as(:command).and_return(Skip.new)
11
5
  end
12
6
 
13
- it "parses a BOOM cmd" do
14
- boom_cmd = Boom.new 'the message'
7
+ it 'parses a BOOM cmd' do
8
+ boom_cmd = Boom.new('the message')
9
+
15
10
  expect('BOOM("the message")').to be_parsed_as(:command).and_return(boom_cmd)
16
11
  expect('BOOM ("the message")').to be_parsed_as(:command).and_return(boom_cmd)
17
12
  expect('BOOM( "the message" )').to be_parsed_as(:command).and_return(boom_cmd)
18
13
  end
19
14
 
20
- ['Poner', 'Sacar', 'Mover'].each do |command|
21
-
15
+ %w[Poner Sacar Mover].each do |command|
22
16
  describe "#{command}() cmd" do
17
+ it 'is parsed ok with a primitive as argument' do
18
+ cmd = Kernel.const_get(command).new(verde)
23
19
 
24
- it "is parsed ok with a primitive as argument" do
25
- cmd = Kernel.const_get(command).new verde
26
20
  expect("#{command}(Verde)").to be_parsed_as(:command).and_return(cmd)
27
21
  expect("#{command} (Verde)").to be_parsed_as(:command).and_return(cmd)
28
22
  expect("#{command}( Verde )").to be_parsed_as(:command).and_return(cmd)
29
23
  end
30
24
 
31
- it "is parsed ok with a simple expression as argument" do
32
- cmd = Kernel.const_get(command).new MinColor.new
33
- expect("#{command}(minColor())").
34
- to be_parsed_as(:command).and_return(cmd)
35
- end
25
+ it 'is parsed ok with a simple expression as argument' do
26
+ cmd = Kernel.const_get(command).new(MinColor.new)
36
27
 
37
- it "is parsed ok with a complex expression as argument" do
38
- func_call = FunctionCall.new 'funcCall', [norte, 42.to_gbs_num]
39
- cmd = Kernel.const_get(command).new Opuesto.new(func_call)
40
- expect("#{command}(opuesto(funcCall(Norte, 42)))").
41
- to be_parsed_as(:command).and_return(cmd)
28
+ expect("#{command}(minColor())").to be_parsed_as(:command).and_return(cmd)
42
29
  end
43
30
 
44
- end
31
+ it 'is parsed ok with a complex expression as argument' do
32
+ func_call = FunctionCall.new('funcCall', [norte, 42.to_gbs_num])
33
+ cmd = Kernel.const_get(command).new(Opuesto.new(func_call))
45
34
 
35
+ expect("#{command}(opuesto(funcCall(Norte, 42)))").to be_parsed_as(:command).and_return(cmd)
36
+ end
37
+ end
46
38
  end
47
39
 
48
- it "parses a IrAlOrigen cmd" do
49
- ir_al_origen_cmd = IrAlOrigen.new
50
- expect('IrAlOrigen()').to be_parsed_as(:command).
51
- and_return(ir_al_origen_cmd)
40
+ it 'parses a IrAlOrigen cmd' do
41
+ expect('IrAlOrigen()').to be_parsed_as(:command).and_return(IrAlOrigen.new)
52
42
  end
53
43
 
54
- it "parses a VaciarTablero cmd" do
55
- vaciar_tablero_cmd = VaciarTablero.new
56
- expect('VaciarTablero()').to be_parsed_as(:command).
57
- and_return(vaciar_tablero_cmd)
44
+ it 'parses a VaciarTablero cmd' do
45
+ expect('VaciarTablero()').to be_parsed_as(:command).and_return(VaciarTablero.new)
58
46
  end
59
-
60
47
  end
61
-
62
48
  end
@@ -1,110 +1,114 @@
1
- describe Gobstones::Parser do
1
+ RSpec.describe Gobstones::Parser do
2
+ let_it_be(:parser) { TreetopParser.new }
2
3
 
3
- before(:all) { @parser = TreetopParser.new }
4
-
5
- describe "removing comments of a gobstones piece of code" do
6
-
7
- it "removes a one-line comment with // characters for a single line" do
4
+ describe 'removing comments of a gobstones piece of code' do
5
+ it 'removes a one-line comment with // characters for a single line' do
8
6
  code_with_comments = 'Poner(Verde) // put a green ball on the board'
9
- code_without_comments = @parser.remove_comments_from code_with_comments
7
+ code_without_comments = parser.remove_comments_from(code_with_comments)
8
+
10
9
  expect(code_without_comments).to eq('Poner(Verde) ')
11
10
  end
12
11
 
13
- it "removes many one-line comments with //" do
14
- code_with_comments = <<CODE
15
- Poner(Verde) // put a green ball on the board
16
- Poner(Azul) // and a blue one
17
- // and this is just an entire comment line
18
- CODE
19
- code_without_comments = @parser.remove_comments_from code_with_comments
20
- expect(code_without_comments).to eq <<CODE
21
- Poner(Verde)
22
- Poner(Azul)
23
-
24
- CODE
12
+ it 'removes many one-line comments with //' do
13
+ code_with_comments = <<~CODE
14
+ Poner(Verde) // put a green ball on the board
15
+ Poner(Azul) // and a blue one
16
+ // and this is just an entire comment line
17
+ CODE
18
+ code_without_comments = parser.remove_comments_from(code_with_comments)
19
+
20
+ expect(code_without_comments).to eq <<~CODE
21
+ Poner(Verde)
22
+ Poner(Azul)
23
+
24
+ CODE
25
25
  end
26
26
 
27
- it "removes a one-line comment with -- for a single line" do
27
+ it 'removes a one-line comment with -- for a single line' do
28
28
  code_with_comments = 'Poner(Verde) -- put a green ball on the board'
29
- code_without_comments = @parser.remove_comments_from code_with_comments
29
+ code_without_comments = parser.remove_comments_from(code_with_comments)
30
+
30
31
  expect(code_without_comments).to eq('Poner(Verde) ')
31
32
  end
32
33
 
33
- it "removes many one-line comments with --" do
34
- code_with_comments = <<CODE
35
- Poner(Verde) -- put a green ball on the board
36
- Poner(Azul) -- and a blue one
37
- -- and this is just an entire comment line
38
- CODE
39
- code_without_comments = @parser.remove_comments_from code_with_comments
40
- expect(code_without_comments).to eq <<CODE
41
- Poner(Verde)
42
- Poner(Azul)
43
-
44
- CODE
34
+ it 'removes many one-line comments with --' do
35
+ code_with_comments = <<~CODE
36
+ Poner(Verde) -- put a green ball on the board
37
+ Poner(Azul) -- and a blue one
38
+ -- and this is just an entire comment line
39
+ CODE
40
+ code_without_comments = parser.remove_comments_from(code_with_comments)
41
+
42
+ expect(code_without_comments).to eq <<~CODE
43
+ Poner(Verde)
44
+ Poner(Azul)
45
+
46
+ CODE
45
47
  end
46
48
 
47
- it "removes many one-line comments with // and --" do
48
- code_with_comments = <<CODE
49
- Poner(Verde) // put a green ball on the board
50
- Poner(Azul) -- and a blue one
51
- // and this is just an entire comment line
52
- if (puedeMover(Norte)) { Mover(Norte) } -- another -- comment
53
- CODE
54
- code_without_comments = @parser.remove_comments_from code_with_comments
55
- expect(code_without_comments).to eq <<CODE
56
- Poner(Verde)
57
- Poner(Azul)
58
-
59
- if (puedeMover(Norte)) { Mover(Norte) }
60
- CODE
49
+ it 'removes many one-line comments with // and --' do
50
+ code_with_comments = <<~CODE
51
+ Poner(Verde) // put a green ball on the board
52
+ Poner(Azul) -- and a blue one
53
+ // and this is just an entire comment line
54
+ if (puedeMover(Norte)) { Mover(Norte) } -- another -- comment
55
+ CODE
56
+ code_without_comments = parser.remove_comments_from(code_with_comments)
57
+
58
+ expect(code_without_comments).to eq <<~CODE
59
+ Poner(Verde)
60
+ Poner(Azul)
61
+
62
+ if (puedeMover(Norte)) { Mover(Norte) }
63
+ CODE
61
64
  end
62
65
 
63
- it "removes a multiline comment with {- -}" do
66
+ it 'removes a multiline comment with {- -}' do
64
67
  code_with_comments = 'Poner(Verde) {- this is a comment -}'
65
- code_without_comments = @parser.remove_comments_from code_with_comments
66
- expect(code_without_comments).to eq('Poner(Verde) ')
68
+ code_without_comments = parser.remove_comments_from(code_with_comments)
67
69
 
70
+ expect(code_without_comments).to eq('Poner(Verde) ')
68
71
  end
69
72
 
70
- it "removes many multiline comments with {- -}, in same and different lines" do
71
- code_with_comments = <<CODE
72
- Poner(Verde) {- comment 1 -}
73
- Poner(Azul) {- start comment 2
74
- // and this is just an entire comment line
75
- if (puedeMover(Norte)) { Mover(Norte) -}
76
- Poner(Rojo)
77
- CODE
78
- code_without_comments = @parser.remove_comments_from code_with_comments
79
- expect(code_without_comments).to eq <<CODE
80
- Poner(Verde)
81
- Poner(Azul)
82
- Poner(Rojo)
83
- CODE
73
+ it 'removes many multiline comments with {- -}, in same and different lines' do
74
+ code_with_comments = <<~CODE
75
+ Poner(Verde) {- comment 1 -}
76
+ Poner(Azul) {- start comment 2
77
+ // and this is just an entire comment line
78
+ if (puedeMover(Norte)) { Mover(Norte) -}
79
+ Poner(Rojo)
80
+ CODE
81
+ code_without_comments = parser.remove_comments_from(code_with_comments)
82
+
83
+ expect(code_without_comments).to eq <<~CODE
84
+ Poner(Verde)
85
+ Poner(Azul)
86
+ Poner(Rojo)
87
+ CODE
84
88
  end
85
89
 
86
- it "removes a multiline comment with /* */" do
90
+ it 'removes a multiline comment with /* */' do
87
91
  code_with_comments = 'Poner(Verde) /* this is a comment */'
88
- code_without_comments = @parser.remove_comments_from code_with_comments
89
- expect(code_without_comments).to eq('Poner(Verde) ')
92
+ code_without_comments = parser.remove_comments_from(code_with_comments)
90
93
 
91
- end
92
- it "removes many multiline comments with /* */, in same and different lines" do
93
- code_with_comments = <<CODE
94
- Poner(Verde) /* comment 1 */
95
- Poner(Azul) /* start comment 2
96
- // and this is just an entire comment line
97
- if (puedeMover(Norte)) { Mover(Norte) */
98
- Poner(Rojo)
99
- CODE
100
- code_without_comments = @parser.remove_comments_from code_with_comments
101
- expect(code_without_comments).to eq <<CODE
102
- Poner(Verde)
103
- Poner(Azul)
104
- Poner(Rojo)
105
- CODE
94
+ expect(code_without_comments).to eq('Poner(Verde) ')
106
95
  end
107
96
 
97
+ it 'removes many multiline comments with /* */, in same and different lines' do
98
+ code_with_comments = <<~CODE
99
+ Poner(Verde) /* comment 1 */
100
+ Poner(Azul) /* start comment 2
101
+ // and this is just an entire comment line
102
+ if (puedeMover(Norte)) { Mover(Norte) */
103
+ Poner(Rojo)
104
+ CODE
105
+ code_without_comments = parser.remove_comments_from(code_with_comments)
106
+
107
+ expect(code_without_comments).to eq <<~CODE
108
+ Poner(Verde)
109
+ Poner(Azul)
110
+ Poner(Rojo)
111
+ CODE
112
+ end
108
113
  end
109
-
110
114
  end
@@ -1,26 +1,22 @@
1
- describe Gobstones::Parser, "var tuples" do
2
-
3
- it "parses an empty var tuple" do
1
+ RSpec.describe Gobstones::Parser, 'var tuples' do
2
+ it 'parses an empty var tuple' do
4
3
  var_tuple = VarTuple.empty
5
4
 
6
5
  expect('()').to be_parsed_as(:var_tuple).and_return(var_tuple)
7
6
  expect('( )').to be_parsed_as(:var_tuple).and_return(var_tuple)
8
7
  end
9
8
 
10
- it "parses a var tuple with one arg" do
11
- var_tuple = VarTuple.new ['myVar'.to_var_name]
9
+ it 'parses a var tuple with one arg' do
10
+ var_tuple = VarTuple.with_names(%w[myVar])
12
11
 
13
12
  expect('(myVar)').to be_parsed_as(:var_tuple).and_return(var_tuple)
14
13
  expect('( myVar )').to be_parsed_as(:var_tuple).and_return(var_tuple)
15
14
  end
16
15
 
17
- it "parses a var tuple with many args" do
18
- var_tuple = VarTuple.new ['firstVar'.to_var_name, 'secondVar'.to_var_name, 'thirdVar'.to_var_name]
16
+ it 'parses a var tuple with many args' do
17
+ var_tuple = VarTuple.with_names(%w[firstVar secondVar thirdVar])
19
18
 
20
- expect('(firstVar, secondVar, thirdVar)').
21
- to be_parsed_as(:var_tuple).and_return(var_tuple)
22
- expect('( firstVar , secondVar,thirdVar )').
23
- to be_parsed_as(:var_tuple).and_return(var_tuple)
19
+ expect('(firstVar, secondVar, thirdVar)').to be_parsed_as(:var_tuple).and_return(var_tuple)
20
+ expect('( firstVar , secondVar,thirdVar )').to be_parsed_as(:var_tuple).and_return(var_tuple)
24
21
  end
25
-
26
22
  end
@@ -1,7 +1,6 @@
1
- describe Gobstones::Parser, "while statements" do
2
-
3
- it "parses a statement with a simple boolean and an empty block" do
4
- while_cmd = WhileCmd.new true_value, empty_body
1
+ RSpec.describe Gobstones::Parser, 'while statements' do
2
+ it 'parses a statement with a simple boolean and an empty block' do
3
+ while_cmd = While.new(true_value, empty_body)
5
4
 
6
5
  expect('while (True) {}').to be_parsed_as(:command).and_return(while_cmd)
7
6
  expect('while (True) {
@@ -10,21 +9,19 @@ describe Gobstones::Parser, "while statements" do
10
9
  {}').to be_parsed_as(:command).and_return(while_cmd)
11
10
  end
12
11
 
13
- it "parses a statement with a simple boolean and a block with commands" do
14
- cmd_block = CommandBlock.new [Poner.new(verde), Skip.new]
15
- while_cmd = WhileCmd.new false_value, cmd_block
12
+ it 'parses a statement with a simple boolean and a block with commands' do
13
+ cmd_block = CommandBlock.new([Poner.new(verde), Skip.new])
14
+ while_cmd = While.new(false_value, cmd_block)
16
15
 
17
- expect('while(False){Poner(Verde); Skip}').
18
- to be_parsed_as(:command).and_return(while_cmd)
16
+ expect('while(False){Poner(Verde); Skip}').to be_parsed_as(:command).and_return(while_cmd)
19
17
  end
20
18
 
21
- it "parses a statement with a complex boolean expression" do
22
- and_expr = And.new 'a'.to_var_name, false_value
23
- exp = Or.new PuedeMover.new(norte), EnclosedByParensExpression.new(and_expr)
24
- while_cmd = WhileCmd.new exp, empty_body
19
+ it 'parses a statement with a complex boolean expression' do
20
+ and_expr = And.new('a'.to_var_name, false_value)
21
+ exp = Or.new(PuedeMover.new(norte), EnclosedByParensExpression.new(and_expr))
22
+ while_cmd = While.new(exp, empty_body)
25
23
 
26
24
  expect('while (puedeMover(Norte) || (a && False)) {}').
27
25
  to be_parsed_as(:command).and_return(while_cmd)
28
26
  end
29
-
30
27
  end
@@ -1,31 +1,29 @@
1
- describe Board do
1
+ RSpec.describe Board do
2
+ it 'can be created with a number of rows and columns' do
3
+ board = described_class.new(8, 5)
2
4
 
3
- let(:colors) { [azul, negro, rojo, verde] }
4
-
5
- it "can be created with a number of rows and columns" do
6
- board = Board.new 8, 5
7
5
  expect(board.rows).to eq(8)
8
6
  expect(board.columns).to eq(5)
9
7
  end
10
8
 
11
- it "has cells in every position" do
12
- board = Board.new 3, 3
9
+ it 'has cells in every position' do
10
+ board = described_class.new(3, 3)
13
11
 
14
12
  board.each_cell { |cell| expect(cell).to be_a(Cell) }
15
13
  end
16
14
 
17
- it "accesses cells in a x&y dimension" do
18
- board = Board.new 3, 5
15
+ it 'accesses cells in a x&y dimension' do
16
+ board = described_class.new(3, 5)
19
17
 
20
18
  3.times do |x|
21
19
  5.times do |y|
22
- expect(board.cell_at(x, y)).to be
20
+ expect(board.cell_at(x, y)).not_to be_nil
23
21
  end
24
22
  end
25
23
  end
26
24
 
27
- it "raises errors if it is accessed out of the bounds" do
28
- board = Board.new 9, 6
25
+ it 'raises errors if it is accessed out of the bounds' do
26
+ board = described_class.new(9, 6)
29
27
 
30
28
  expect { board.cell_at(9, 4) }.to raise_error(OutOfBoardError)
31
29
  expect { board.cell_at(3, 6) }.to raise_error(OutOfBoardError)
@@ -33,49 +31,46 @@ describe Board do
33
31
  expect { board.cell_at(8, -1) }.to raise_error(OutOfBoardError)
34
32
  end
35
33
 
36
- it "puts balls in a given position" do
37
- board = Board.new 5, 5
34
+ it 'puts balls in a given position' do
35
+ board = described_class.new(5, 5)
38
36
 
39
37
  2.times { board.put 0, 0, azul }
40
38
  10.times { board.put 2, 3, rojo }
41
39
 
42
- expect(board.are_there_balls?(0, 0, azul)).to be true
40
+ expect(board.are_there_balls?(0, 0, azul)).to be(true)
43
41
  expect(board.number_of_balls(0, 0, azul)).to eq(2)
44
- expect(board.are_there_balls?(2, 3, rojo)).to be true
42
+ expect(board.are_there_balls?(2, 3, rojo)).to be(true)
45
43
  expect(board.number_of_balls(2, 3, rojo)).to eq(10)
46
44
  end
47
45
 
48
- it "puts and takes out balls in a given position" do
49
- board = Board.new 2, 2
46
+ it 'puts and takes out balls in a given position' do
47
+ board = described_class.new(2, 2)
50
48
 
51
49
  3.times { board.put 1, 1, verde }
52
50
  3.times { board.take_out 1, 1, verde }
53
51
 
54
- expect(board.are_there_balls?(1, 1, verde)).to be false
52
+ expect(board.are_there_balls?(1, 1, verde)).to be(false)
55
53
  end
56
54
 
57
- it "clears the entire board" do
58
- board = Board.new 3, 4
55
+ it 'clears the entire board' do
56
+ board = described_class.new(3, 4)
59
57
  board.each_cell { |cell| cell.put colors.sample }
60
58
 
61
59
  board.empty!
62
60
 
63
- board.each_cell do |cell|
64
- colors.each do |color|
65
- expect(cell.are_there_balls?(color)).to be false
66
- end
67
- end
61
+ board.each_cell { |cell| expect_no_balls(*colors, on: cell) }
68
62
  end
69
63
 
70
- it "is empty if there are no balls" do
71
- board = Board.new 3, 4
72
- expect(board.empty?).to be true
64
+ it 'is empty if there are no balls' do
65
+ board = described_class.new(3, 4)
66
+
67
+ expect(board).to be_empty
73
68
  end
74
69
 
75
- it "is not empty if there are balls" do
76
- board = Board.new 3, 4
70
+ it 'is not empty if there are balls' do
71
+ board = described_class.new(3, 4)
77
72
  board.put 0, 0, negro
78
- expect(board.empty?).to be false
79
- end
80
73
 
74
+ expect(board).not_to be_empty
75
+ end
81
76
  end