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,55 +1,55 @@
1
- describe Gobstones::Parser, "program definitions" do
2
-
3
- it "parses a simple program with a single main" do
4
- main_def = Main.new empty_body, no_return_statement
5
- program = Program.new no_definitions, main_def
1
+ RSpec.describe Gobstones::Parser, 'program definitions' do
2
+ it 'parses a simple program with a single main' do
3
+ main_def = Main.new(empty_body, no_return_statement)
4
+ program = Program.new(no_definitions, main_def)
6
5
 
7
6
  expect('procedure Main(){}').to be_parsed_as(:program).and_return(program)
8
7
  end
9
8
 
10
- it "parses a program with Main and procedures" do
11
- main_def = Main.new empty_body, no_return_statement
12
- proc_1 = Procedure.new 'Procedure1', no_arguments, empty_body
13
- proc_2 = Procedure.new 'Procedure2', no_arguments, empty_body
14
- program = Program.new [proc_1, proc_2], main_def
9
+ it 'parses a program with Main and procedures' do
10
+ main_def = Main.new(empty_body, no_return_statement)
11
+ proc_1 = Procedure.new('Procedure1', no_arguments, empty_body)
12
+ proc_2 = Procedure.new('Procedure2', no_arguments, empty_body)
13
+ program = Program.new([proc_1, proc_2], main_def)
14
+
15
+ gbs_code = <<~GBS
16
+ procedure Procedure1(){ }
15
17
 
16
- gbs_code = <<GBS
17
- procedure Procedure1(){ }
18
+ procedure Procedure2 () {}
18
19
 
19
- procedure Procedure2 () {}
20
+ procedure Main() {}
21
+ GBS
20
22
 
21
- procedure Main() {}
22
- GBS
23
23
  expect(gbs_code).to be_parsed_as(:program).and_return(program)
24
24
  end
25
25
 
26
- it "parses a program with Main, procedures and functions" do
27
- main_def = Main.new empty_body, NoReturnStatement.new
28
- proc_1 = Procedure.new 'Procedure1', no_arguments, empty_body
29
- func_1 = Function.new 'function1', no_arguments, empty_body, ReturnFromFunction.new([42.to_gbs_num])
30
- proc_2 = Procedure.new 'Procedure2', no_arguments, empty_body
31
- program = Program.new [proc_1, func_1, proc_2], main_def
32
- gbs_code = <<GBS
33
- procedure Procedure1(){ }
26
+ it 'parses a program with Main, procedures and functions' do
27
+ main_def = Main.new(empty_body, no_return_statement)
28
+ proc_1 = Procedure.new('Procedure1', no_arguments, empty_body)
29
+ func_1 = Function.new('function1', no_arguments, empty_body, ReturnFromFunction.new([42.to_gbs_num]))
30
+ proc_2 = Procedure.new('Procedure2', no_arguments, empty_body)
31
+ program = Program.new([proc_1, func_1, proc_2], main_def)
32
+ gbs_code = <<~GBS
33
+ procedure Procedure1(){ }
34
34
 
35
- function function1() { return (42) }
35
+ function function1() { return (42) }
36
36
 
37
- procedure Procedure2 () {}
37
+ procedure Procedure2 () {}
38
+
39
+ procedure Main() {}
40
+ GBS
38
41
 
39
- procedure Main() {}
40
- GBS
41
42
  expect(gbs_code).to be_parsed_as(:program).and_return(program)
42
43
  end
43
44
 
44
- it "does not parse a program without a Main definition" do
45
+ it 'does not parse a program without a Main definition' do
45
46
  expect('procedure Procedure1(){}
46
47
  procedure Procedure2() {}').to be_parsed_as(:program).and_fail
47
48
  end
48
49
 
49
- it "does not parse a program if Main is not the last definition" do
50
+ it 'does not parse a program if Main is not the last definition' do
50
51
  expect('procedure Procedure1() {}
51
52
  procedure Main() {}
52
53
  procedure Procedure2() {}').to be_parsed_as(:program).and_fail
53
54
  end
54
-
55
55
  end
@@ -1,9 +1,7 @@
1
- describe Gobstones::Parser, "if statements" do
2
-
3
- describe "if" do
4
-
5
- it "parses a statement with a simple boolean and an empty block" do
6
- if_cmd = IfCmd.new true_value, empty_body
1
+ RSpec.describe Gobstones::Parser, 'if statements' do
2
+ describe 'if' do
3
+ it 'parses a statement with a simple boolean and an empty block' do
4
+ if_cmd = If.new(true_value, empty_body)
7
5
 
8
6
  expect('if (True) {}').to be_parsed_as(:command).and_return(if_cmd)
9
7
  expect('if (True) {
@@ -12,36 +10,29 @@ describe Gobstones::Parser, "if statements" do
12
10
  {}').to be_parsed_as(:command).and_return(if_cmd)
13
11
  end
14
12
 
15
- it "parses a statement with a simple boolean and a block with commands" do
16
- cmd_block = CommandBlock.new [Poner.new(verde), Skip.new]
17
- if_cmd = IfCmd.new false_value, cmd_block
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
+ if_cmd = If.new(false_value, cmd_block)
18
16
 
19
- expect('if(False){Poner(Verde); Skip}').
20
- to be_parsed_as(:command).and_return(if_cmd)
17
+ expect('if(False){Poner(Verde); Skip}').to be_parsed_as(:command).and_return(if_cmd)
21
18
  end
22
19
 
23
- it "parses a statement with a complex boolean expression" do
24
- and_expr = And.new 'a'.to_var_name, false_value
25
- inner_and = EnclosedByParensExpression.new and_expr
26
- exp = Or.new PuedeMover.new(norte), inner_and
27
- if_cmd = IfCmd.new exp, empty_body
20
+ it 'parses a statement with a complex boolean expression' do
21
+ and_expr = And.new('a'.to_var_name, false_value)
22
+ inner_and = EnclosedByParensExpression.new(and_expr)
23
+ exp = Or.new(PuedeMover.new(norte), inner_and)
24
+ if_cmd = If.new(exp, empty_body)
28
25
 
29
- expect('if (puedeMover(Norte) || (a && False)) {}').
30
- to be_parsed_as(:command).and_return(if_cmd)
26
+ expect('if (puedeMover(Norte) || (a && False)) {}').to be_parsed_as(:command).and_return(if_cmd)
31
27
  end
32
-
33
28
  end
34
29
 
35
- describe "if-else" do
30
+ describe 'if-else' do
31
+ it 'parses a statement with an else block' do
32
+ else_block = CommandBlock.with_just(Mover.new(norte))
33
+ if_else_cmd = IfThenElse.new(false_value, empty_body, else_block)
36
34
 
37
- it "parses a statement with an else block" do
38
- else_block = CommandBlock.new [Mover.new(norte)]
39
- if_else_cmd = IfElseCmd.new false_value, empty_body, else_block
40
-
41
- expect('if (False) { } else { Mover(Norte) }').
42
- to be_parsed_as(:command).and_return(if_else_cmd)
35
+ expect('if (False) { } else { Mover(Norte) }').to be_parsed_as(:command).and_return(if_else_cmd)
43
36
  end
44
-
45
37
  end
46
-
47
38
  end
@@ -1,24 +1,22 @@
1
- describe Gobstones::Parser, "main definition" do
1
+ RSpec.describe Gobstones::Parser, 'main definition' do
2
+ let(:return_tuple) { VarTuple.with_names(%w[x y]) }
2
3
 
3
- let(:return_tuple) { VarTuple.new ['x'.to_var_name, 'y'.to_var_name] }
4
-
5
- it "parses a valid Main definition without return nor commands" do
6
- main = Main.new empty_body, no_return_statement
4
+ it 'parses a valid Main definition without return nor commands' do
5
+ main = Main.new(empty_body, no_return_statement)
7
6
 
8
7
  expect('procedure Main() {}').to be_parsed_as(:definition).and_fail
9
8
  expect('procedure Main() {}').to be_parsed_as(:main).and_return(main)
10
9
  end
11
10
 
12
- it "parses a valid main procedure with a return of var names" do
13
- main = Main.new empty_body, ReturnFromMain.new(return_tuple)
11
+ it 'parses a valid main procedure with a return of var names' do
12
+ main = Main.new(empty_body, ReturnFromMain.new(return_tuple))
14
13
 
15
- expect('procedure Main() { return (x, y); }').
16
- to be_parsed_as(:main).and_return(main)
14
+ expect('procedure Main() { return (x, y); }').to be_parsed_as(:main).and_return(main)
17
15
  end
18
16
 
19
- it "parses a valid main procedure with commands and return" do
20
- cmd_block = CommandBlock.new [Mover.new(oeste), Skip.new]
21
- main = Main.new cmd_block, ReturnFromMain.new(return_tuple)
17
+ it 'parses a valid main procedure with commands and return' do
18
+ cmd_block = CommandBlock.new([Mover.new(oeste), Skip.new])
19
+ main = Main.new(cmd_block, ReturnFromMain.new(return_tuple))
22
20
 
23
21
  expect('procedure Main() {
24
22
  Mover(Oeste)
@@ -27,16 +25,15 @@ describe Gobstones::Parser, "main definition" do
27
25
  }').to be_parsed_as(:main).and_return(main)
28
26
  end
29
27
 
30
- it "does not parse a main procedure with an invalid identifier" do
28
+ it 'does not parse a main procedure with an invalid identifier' do
31
29
  expect('procedure NotMain() {}').to be_parsed_as(:main).and_fail
32
30
  end
33
31
 
34
- it "does not parse a main procedure with a return of expressions" do
32
+ it 'does not parse a main procedure with a return of expressions' do
35
33
  expect('procedure Main() { return (3+4) }').to be_parsed_as(:main).and_fail
36
34
  end
37
35
 
38
- it "does not parse a main procedure with args" do
36
+ it 'does not parse a main procedure with args' do
39
37
  expect('procedure Main(arg1, arg2) {}').to be_parsed_as(:main).and_fail
40
38
  end
41
-
42
39
  end
@@ -1,35 +1,31 @@
1
- describe Gobstones::Parser, "nested expressions" do
2
-
3
- it "parses literals between ()" do
4
- expect('( 42 )').to be_parsed_as(:expression).
5
- and_return(EnclosedByParensExpression.new(42.to_gbs_num))
6
- expect('(True )').to be_parsed_as(:expression).
7
- and_return(EnclosedByParensExpression.new(true_value))
8
- expect('(Rojo )').to be_parsed_as(:expression).
9
- and_return(EnclosedByParensExpression.new(rojo))
10
- expect('(Verde)').to be_parsed_as(:expression).
11
- and_return(EnclosedByParensExpression.new(verde))
1
+ RSpec.describe Gobstones::Parser, 'nested expressions' do
2
+ it 'parses literals between ()' do
3
+ expect('( 42 )').to be_parsed_as(:expression).and_return(EnclosedByParensExpression.new(42.to_gbs_num))
4
+ expect('(True )').to be_parsed_as(:expression).and_return(EnclosedByParensExpression.new(true_value))
5
+ expect('(Rojo )').to be_parsed_as(:expression).and_return(EnclosedByParensExpression.new(rojo))
6
+ expect('(Verde)').to be_parsed_as(:expression).and_return(EnclosedByParensExpression.new(verde))
12
7
  end
13
8
 
14
- it "parses primitive functions between ()" do
9
+ it 'parses primitive functions between ()' do
15
10
  puede_mover = EnclosedByParensExpression.new(PuedeMover.new(norte))
16
- expect('(puedeMover(Norte))').
17
- to be_parsed_as(:expression).and_return(puede_mover)
11
+
12
+ expect('(puedeMover(Norte))').to be_parsed_as(:expression).and_return(puede_mover)
18
13
  end
19
14
 
20
- it "parses nested arithmetic expressions between ()" do
21
- paren_expr = EnclosedByParensExpression.new Add.new(3.to_gbs_num, 5.to_gbs_num)
22
- expected = Mul.new paren_expr, 6.to_gbs_num
15
+ it 'parses nested arithmetic expressions between ()' do
16
+ paren_expr = EnclosedByParensExpression.new(Add.new(3.to_gbs_num, 5.to_gbs_num))
17
+ expected = Mul.new(paren_expr, 6.to_gbs_num)
18
+
23
19
  expect('(3 + 5) * 6').to be_parsed_as(:expression).and_return(expected)
24
20
  end
25
21
 
26
- it "parses a nested expressions with many ()" do
27
- or_expr = Or.new 'b'.to_var_name, 'c'.to_var_name
28
- inner_paren = EnclosedByParensExpression.new or_expr
29
- and_expr = And.new 'a'.to_var_name, inner_paren
30
- outer_paren = EnclosedByParensExpression.new and_expr
31
- result = And.new outer_paren, 'd'.to_var_name
22
+ it 'parses a nested expressions with many ()' do
23
+ or_expr = Or.new('b'.to_var_name, 'c'.to_var_name)
24
+ inner_paren = EnclosedByParensExpression.new(or_expr)
25
+ and_expr = And.new('a'.to_var_name, inner_paren)
26
+ outer_paren = EnclosedByParensExpression.new(and_expr)
27
+ result = And.new(outer_paren, 'd'.to_var_name)
28
+
32
29
  expect('(a && (b || c)) && d').to be_parsed_as(:expression).and_return(result)
33
30
  end
34
-
35
31
  end
@@ -1,99 +1,94 @@
1
- describe Gobstones::Parser, "primitive expressions" do
2
-
3
- describe "variable identifiers" do
4
-
5
- it "parses valid var names" do
1
+ RSpec.describe Gobstones::Parser, 'primitive expressions' do
2
+ describe 'variable identifiers' do
3
+ it 'parses valid var names' do
6
4
  expect('v').to be_parsed_as(:expression).and_return('v'.to_var_name)
7
5
  expect('var1').to be_parsed_as(:expression).and_return('var1'.to_var_name)
8
6
  expect('a_var').to be_parsed_as(:expression).and_return('a_var'.to_var_name)
9
7
  expect('vAR').to be_parsed_as(:expression).and_return('vAR'.to_var_name)
10
8
  end
11
9
 
12
- it "does not parse invalid var names" do
10
+ it 'does not parse invalid var names' do
13
11
  expect('1').not_to be_parsed_as(:expression).and_return('1'.to_var_name)
14
12
  expect('_var').to be_parsed_as(:expression).and_fail
15
13
  expect('Var').to be_parsed_as(:expression).and_fail
16
14
  end
17
15
 
18
- it "does not parse reserved words as var names" do
19
- literals = %w{True False Rojo Negro Azul Verde Norte Oeste Este Sur}
20
- (RESERVED_IDS - literals).each do |id|
21
- expect(id).to be_parsed_as(:expression).and_fail
22
- end
23
- end
16
+ it 'does not parse reserved words as var names' do
17
+ literals = %w[True False Rojo Negro Azul Verde Norte Oeste Este Sur]
24
18
 
19
+ expect(RESERVED_IDS - literals).to all(be_parsed_as(:expression).and_fail)
20
+ end
25
21
  end
26
22
 
27
- describe "type bounds functions" do
28
-
29
- it "parses the minBool() function" do
23
+ describe 'type bounds functions' do
24
+ it 'parses the minBool() function' do
30
25
  expect('minBool()').to be_parsed_as(:expression).and_return(MinBool.new)
31
26
  end
32
27
 
33
- it "parses the maxBool() function" do
28
+ it 'parses the maxBool() function' do
34
29
  expect('maxBool()').to be_parsed_as(:expression).and_return(MaxBool.new)
35
30
  end
36
31
 
37
- it "parses the minColor() function" do
32
+ it 'parses the minColor() function' do
38
33
  expect('minColor()').to be_parsed_as(:expression).and_return(MinColor.new)
39
34
  end
40
35
 
41
- it "parses the maxColor() function" do
36
+ it 'parses the maxColor() function' do
42
37
  expect('maxColor()').to be_parsed_as(:expression).and_return(MaxColor.new)
43
38
  end
44
39
 
45
- it "parses the minDir() function" do
40
+ it 'parses the minDir() function' do
46
41
  expect('minDir()').to be_parsed_as(:expression).and_return(MinDir.new)
47
42
  end
48
43
 
49
- it "parses the maxDir() function" do
44
+ it 'parses the maxDir() function' do
50
45
  expect('maxDir()').to be_parsed_as(:expression).and_return(MaxDir.new)
51
46
  end
52
-
53
47
  end
54
48
 
55
- describe "other type functions" do
49
+ describe 'other type functions' do
50
+ it 'parses the siguiente() function ' do
51
+ func = Siguiente.new('x'.to_var_name)
56
52
 
57
- it "parses the siguiente() function " do
58
- func = Siguiente.new 'x'.to_var_name
59
53
  expect('siguiente(x)').to be_parsed_as(:expression).and_return(func)
60
54
  expect('siguiente(x )').to be_parsed_as(:expression).and_return(func)
61
55
  end
62
56
 
63
- it "parses the previo() function" do
64
- func = Previo.new 'y'.to_var_name
57
+ it 'parses the previo() function' do
58
+ func = Previo.new('y'.to_var_name)
59
+
65
60
  expect('previo(y)').to be_parsed_as(:expression).and_return(func)
66
61
  expect('previo( y )').to be_parsed_as(:expression).and_return(func)
67
62
  end
68
63
 
69
- it "parses the opuesto() function" do
70
- func = Opuesto.new 'z'.to_var_name
64
+ it 'parses the opuesto() function' do
65
+ func = Opuesto.new('z'.to_var_name)
66
+
71
67
  expect('opuesto(z)').to be_parsed_as(:expression).and_return(func)
72
68
  expect('opuesto( z )').to be_parsed_as(:expression).and_return(func)
73
69
  end
74
-
75
70
  end
76
71
 
77
- describe "board primitive functions" do
72
+ describe 'board primitive functions' do
73
+ it 'parses the nroBolitas(exp) function' do
74
+ func = NroBolitas.new('color'.to_var_name)
78
75
 
79
- it "parses the nroBolitas(exp) function" do
80
- func = NroBolitas.new 'color'.to_var_name
81
76
  expect('nroBolitas(color)').to be_parsed_as(:expression).and_return(func)
82
77
  expect('nroBolitas( color )').to be_parsed_as(:expression).and_return(func)
83
78
  end
84
79
 
85
- it "parses the hayBolitas(exp) function" do
86
- func = HayBolitas.new 'color'.to_var_name
80
+ it 'parses the hayBolitas(exp) function' do
81
+ func = HayBolitas.new('color'.to_var_name)
82
+
87
83
  expect('hayBolitas(color)').to be_parsed_as(:expression).and_return(func)
88
84
  expect('hayBolitas( color )').to be_parsed_as(:expression).and_return(func)
89
85
  end
90
86
 
91
- it "parses the puedeMover(exp) function" do
92
- func = PuedeMover.new 'dir'.to_var_name
87
+ it 'parses the puedeMover(exp) function' do
88
+ func = PuedeMover.new('dir'.to_var_name)
89
+
93
90
  expect('puedeMover(dir)').to be_parsed_as(:expression).and_return(func)
94
91
  expect('puedeMover( dir )').to be_parsed_as(:expression).and_return(func)
95
92
  end
96
-
97
93
  end
98
-
99
94
  end
@@ -1,36 +1,35 @@
1
- describe Gobstones::Parser, "procedure calls" do
2
-
3
- it "parses a procedure call without args" do
1
+ RSpec.describe Gobstones::Parser, 'procedure calls' do
2
+ it 'parses a procedure call without args' do
4
3
  expect('P1()').to be_parsed_as(:command).and_return(ProcedureCall.new('P1'))
5
4
  end
6
5
 
7
- it "does not parse a procedure call without a valid identifier" do
6
+ it 'does not parse a procedure call without a valid identifier' do
8
7
  expect('p1()').to be_parsed_as(:command).and_fail
9
8
  end
10
9
 
11
- it "parses a procedure call with one arg" do
12
- expected = ProcedureCall.new 'Proc1', [verde]
10
+ it 'parses a procedure call with one arg' do
11
+ expected = ProcedureCall.new('Proc1', [verde])
12
+
13
13
  expect('Proc1(Verde)').to be_parsed_as(:command).and_return(expected)
14
14
  end
15
15
 
16
- it "parses a procedure with many args" do
16
+ it 'parses a procedure with many args' do
17
17
  first_arg = 42.to_gbs_num
18
- second_arg = NroBolitas.new verde
18
+ second_arg = NroBolitas.new(verde)
19
19
  third_arg = norte
20
- expected = ProcedureCall.new 'Proc1', [first_arg, second_arg, third_arg]
20
+ expected = ProcedureCall.new('Proc1', [first_arg, second_arg, third_arg])
21
21
 
22
- expect('Proc1(42, nroBolitas(Verde), Norte)').
23
- to be_parsed_as(:command).and_return(expected)
22
+ expect('Proc1(42, nroBolitas(Verde), Norte)').to be_parsed_as(:command).and_return(expected)
24
23
  end
25
24
 
26
- it "parses a complex procedure call" do
27
- or_expr = Or.new 'a'.to_var_name, 'b'.to_var_name
28
- paren_expr = EnclosedByParensExpression.new Div.new(10.to_gbs_num, 'c'.to_var_name)
29
- num_expr = Mul.new 5.to_gbs_num, paren_expr
30
- func_call = FunctionCall.new 'func', [verde, Opuesto.new(norte)]
31
- proc_call = ProcedureCall.new 'Proc1', [or_expr, num_expr, func_call]
25
+ it 'parses a complex procedure call' do
26
+ or_expr = Or.new('a'.to_var_name, 'b'.to_var_name)
27
+ paren_expr = EnclosedByParensExpression.new(Div.new(10.to_gbs_num, 'c'.to_var_name))
28
+ num_expr = Mul.new(5.to_gbs_num, paren_expr)
29
+ func_call = FunctionCall.new('func', [verde, Opuesto.new(norte)])
30
+ proc_call = ProcedureCall.new('Proc1', [or_expr, num_expr, func_call])
31
+
32
32
  expect('Proc1(a || b, 5*(10 div c), func(Verde, opuesto(Norte)))').
33
33
  to be_parsed_as(:command).and_return(proc_call)
34
34
  end
35
-
36
35
  end