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,53 +1,43 @@
1
- describe Gobstones::Parser, "assignments" do
1
+ RSpec.describe Gobstones::Parser, 'assignments' do
2
+ describe 'single' do
3
+ it 'parses a valid assignment with a simple expression' do
4
+ assignment = SingleAssignment.new('myDir'.to_var_name, norte)
2
5
 
3
- describe "single" do
4
-
5
- it "parses a valid assignment with a simple expression" do
6
- assignment = SingleAssignment.new 'myDir'.to_var_name, norte
7
-
8
- expect('myDir:=Norte').
9
- to be_parsed_as(:command).and_return(assignment)
10
- expect('myDir := Norte').
11
- to be_parsed_as(:command).and_return(assignment)
6
+ expect('myDir:=Norte').to be_parsed_as(:command).and_return(assignment)
7
+ expect('myDir := Norte').to be_parsed_as(:command).and_return(assignment)
12
8
  end
13
9
 
14
- it "parses a valid assignment with a complex expression" do
15
- a, b = 'a'.to_var_name, 'b'.to_var_name
16
- exp = Or.new false_value, EnclosedByParensExpression.new(And.new(a, b))
17
- assignment = SingleAssignment.new 'myVar'.to_var_name, exp
10
+ it 'parses a valid assignment with a complex expression' do
11
+ a = 'a'.to_var_name
12
+ b = 'b'.to_var_name
13
+ exp = Or.new(false_value, EnclosedByParensExpression.new(And.new(a, b)))
14
+ assignment = SingleAssignment.new('myVar'.to_var_name, exp)
18
15
 
19
- expect('myVar := False || (a && b)').
20
- to be_parsed_as(:command).and_return(assignment)
16
+ expect('myVar := False || (a && b)').to be_parsed_as(:command).and_return(assignment)
21
17
  end
22
18
 
23
- it "does not parse with an invalid var name" do
19
+ it 'does not parse with an invalid var name' do
24
20
  expect('MyWrongVar := a').to be_parsed_as(:command).and_fail
25
21
  end
26
22
 
27
- it "does not parse with a command on the right side" do
23
+ it 'does not parse with a command on the right side' do
28
24
  expect('myVar := Skip').to be_parsed_as(:command).and_fail
29
25
  end
30
-
31
26
  end
32
27
 
33
- describe "multiple" do
34
-
35
- context "failures" do
36
-
28
+ describe 'multiple' do
29
+ context 'when input causes a failure' do
37
30
  it 'fails if the expression on the left side is not a var tuple' do
38
31
  expect('myVar = funcCall()').to be_parsed_as(:command).and_fail
39
32
  end
40
-
41
33
  end
42
34
 
43
35
  it 'parses a valid assignment with a function call on the right side' do
44
- var_tuple = VarTuple.new ['aColor'.to_var_name, 'aDirection'.to_var_name]
45
- func_call = FunctionCall.new 'myFunction', []
46
- assignment = MultipleAssignment.new var_tuple, func_call
47
- expect('(aColor, aDirection) := myFunction()').
48
- to be_parsed_as(:command).and_return(assignment)
49
- end
36
+ var_tuple = VarTuple.with_names(%w[aColor aDirection])
37
+ func_call = FunctionCall.new('myFunction', [])
38
+ assignment = MultipleAssignment.new(var_tuple, func_call)
50
39
 
40
+ expect('(aColor, aDirection) := myFunction()').to be_parsed_as(:command).and_return(assignment)
41
+ end
51
42
  end
52
-
53
43
  end
@@ -1,111 +1,103 @@
1
- describe Gobstones::Parser, "boolean expressions" do
2
-
1
+ RSpec.describe 'parsing boolean expressions' do
3
2
  let(:a) { 'a'.to_var_name }
4
3
  let(:b) { 'b'.to_var_name }
5
4
  let(:c) { 'c'.to_var_name }
6
5
  let(:d) { 'd'.to_var_name }
7
6
 
8
- describe "relational operators" do
9
-
10
- it "parses an expression with ==" do
11
- eq = Equal.new a, b
7
+ describe 'relational operators' do
8
+ it 'parses an expression with ==' do
9
+ eq = Equal.new(a, b)
12
10
 
13
11
  expect('a==b').to be_parsed_as(:expression).and_return(eq)
14
12
  expect('a == b').to be_parsed_as(:expression).and_return(eq)
15
13
  end
16
14
 
17
- it "parses an expression with /=" do
18
- not_eq = NotEqual.new a, b
15
+ it 'parses an expression with /=' do
16
+ not_eq = NotEqual.new(a, b)
19
17
 
20
18
  expect('a/=b').to be_parsed_as(:expression).and_return(not_eq)
21
19
  expect('a /= b').to be_parsed_as(:expression).and_return(not_eq)
22
20
  end
23
21
 
24
- it "parses an expression with <" do
25
- lt = LessThan.new a, b
22
+ it 'parses an expression with <' do
23
+ lt = LessThan.new(a, b)
26
24
 
27
25
  expect('a<b').to be_parsed_as(:expression).and_return(lt)
28
26
  expect('a < b').to be_parsed_as(:expression).and_return(lt)
29
27
  end
30
28
 
31
- it "parses an expression with <=" do
32
- le = LessEqual.new a, b
29
+ it 'parses an expression with <=' do
30
+ le = LessEqual.new(a, b)
33
31
 
34
32
  expect('a<=b').to be_parsed_as(:expression).and_return(le)
35
33
  expect('a <= b').to be_parsed_as(:expression).and_return(le)
36
34
  end
37
35
 
38
- it "parses an expression with >=" do
39
- ge = GreaterEqual.new a, b
36
+ it 'parses an expression with >=' do
37
+ ge = GreaterEqual.new(a, b)
40
38
 
41
39
  expect('a>=b').to be_parsed_as(:expression).and_return(ge)
42
40
  expect('a >= b').to be_parsed_as(:expression).and_return(ge)
43
41
  end
44
42
 
45
- it "parses an expression with >" do
46
- gt = GreaterThan.new a, b
43
+ it 'parses an expression with >' do
44
+ gt = GreaterThan.new(a, b)
47
45
 
48
46
  expect('a>b').to be_parsed_as(:expression).and_return(gt)
49
47
  expect('a > b').to be_parsed_as(:expression).and_return(gt)
50
48
  end
51
-
52
49
  end
53
50
 
54
- describe "not, and, or" do
55
-
56
- it "parses a not expression" do
57
- exp = Equal.new a, b
58
- not_exp = Not.new exp
51
+ describe 'not, and, or' do
52
+ it 'parses a not expression' do
53
+ exp = Equal.new(a, b)
54
+ not_exp = Not.new(exp)
59
55
 
60
56
  expect('not a == b').to be_parsed_as(:expression).and_return(not_exp)
61
57
  end
62
58
 
63
- it "parses an And expression" do
64
- exp = And.new a, b
59
+ it 'parses an And expression' do
60
+ exp = And.new(a, b)
65
61
 
66
62
  expect('a&&b').to be_parsed_as(:expression).and_return(exp)
67
63
  expect('a && b').to be_parsed_as(:expression).and_return(exp)
68
64
  end
69
65
 
70
- it "parses an Or expression" do
71
- exp = Or.new a, b
66
+ it 'parses an Or expression' do
67
+ exp = Or.new(a, b)
72
68
 
73
69
  expect('a||b').to be_parsed_as(:expression).and_return(exp)
74
70
  expect('a || b').to be_parsed_as(:expression).and_return(exp)
75
71
  end
76
72
 
77
- describe "nested" do
78
-
79
- it "parses a nested || expression, associating right" do
80
- inner_or = Or.new b, c
81
- outer_or = Or.new a, inner_or
73
+ describe 'nested' do
74
+ it 'parses a nested || expression, associating right' do
75
+ inner_or = Or.new(b, c)
76
+ outer_or = Or.new(a, inner_or)
82
77
 
83
78
  expect('a || b || c').to be_parsed_as(:expression).and_return(outer_or)
84
79
  end
85
80
 
86
- it "parses a nested && expression, associating right" do
87
- inner_and = And.new b, c
88
- outer_and = And.new a, inner_and
81
+ it 'parses a nested && expression, associating right' do
82
+ inner_and = And.new(b, c)
83
+ outer_and = And.new(a, inner_and)
89
84
 
90
85
  expect('a && b && c').to be_parsed_as(:expression).and_return(outer_and)
91
86
  end
92
87
 
93
- it "parses with || taking precedence over &&, left" do
94
- bc_and = And.new b, c
95
- abc_or = Or.new a, bc_and
88
+ it 'parses with || taking precedence over &&, left' do
89
+ bc_and = And.new(b, c)
90
+ abc_or = Or.new(a, bc_and)
96
91
 
97
92
  expect('a || b && c').to be_parsed_as(:expression).and_return(abc_or)
98
93
  end
99
94
 
100
- it "parses with || taking precedence over &&, right" do
101
- ab_and = And.new a, b
102
- abc_or = Or.new ab_and, c
95
+ it 'parses with || taking precedence over &&, right' do
96
+ ab_and = And.new(a, b)
97
+ abc_or = Or.new(ab_and, c)
103
98
 
104
99
  expect('a && b || c').to be_parsed_as(:expression).and_return(abc_or)
105
100
  end
106
-
107
101
  end
108
-
109
102
  end
110
-
111
103
  end
@@ -1,20 +1,19 @@
1
- describe Gobstones::Parser, "command blocks" do
2
-
3
- it "parses an empty block" do
1
+ RSpec.describe Gobstones::Parser, 'command blocks' do
2
+ it 'parses an empty block' do
4
3
  expect('{}').to be_parsed_as(:command).and_return(CommandBlock.empty)
5
4
  expect('{ }').to be_parsed_as(:command).and_return(CommandBlock.empty)
6
5
  end
7
6
 
8
- it "parses a block with one simple cmd" do
9
- cmd_block = CommandBlock.new [Skip.new]
7
+ it 'parses a block with one simple cmd' do
8
+ cmd_block = CommandBlock.with_just(Skip.new)
10
9
  expect('{ Skip }').to be_parsed_as(:command).and_return(cmd_block)
11
10
  end
12
11
 
13
- it "parses a block with many simple commands" do
14
- first = Poner.new verde
15
- second = Boom.new "error"
16
- third = Mover.new oeste
17
- cmd_block = CommandBlock.new [first, second, third]
12
+ it 'parses a block with many simple commands' do
13
+ first = Poner.new(verde)
14
+ second = Boom.new('error')
15
+ third = Mover.new(oeste)
16
+ cmd_block = CommandBlock.new([first, second, third])
18
17
 
19
18
  expect('{
20
19
  Poner(Verde)
@@ -23,26 +22,25 @@ describe Gobstones::Parser, "command blocks" do
23
22
  }').to be_parsed_as(:command).and_return(cmd_block)
24
23
  end
25
24
 
26
- it "allows semicolon between commands" do
27
- first = Poner.new verde
28
- second = Boom.new 'error'
29
- third = Mover.new oeste
30
- cmd_block = CommandBlock.new [first, second, third]
25
+ it 'allows semicolon between commands' do
26
+ first = Poner.new(verde)
27
+ second = Boom.new('error')
28
+ third = Mover.new(oeste)
29
+ cmd_block = CommandBlock.new([first, second, third])
31
30
 
32
31
  expect('{Poner(Verde); BOOM("error");
33
32
  Mover(Oeste);
34
33
  }').to be_parsed_as(:command).and_return(cmd_block)
35
34
  end
36
35
 
37
- it "parses a block with simple and complex commands" do
38
- first = ProcedureCall.new 'Proc', []
39
- second = IfCmd.new true_value, empty_body
40
- cmd_block = CommandBlock.new [first, second]
36
+ it 'parses a block with simple and complex commands' do
37
+ first = ProcedureCall.new('Proc', [])
38
+ second = If.new(true_value, empty_body)
39
+ cmd_block = CommandBlock.new([first, second])
41
40
 
42
41
  expect('{
43
42
  Proc()
44
43
  if (True) {}
45
44
  }').to be_parsed_as(:command).and_return(cmd_block)
46
45
  end
47
-
48
46
  end
@@ -1,31 +1,25 @@
1
- describe Gobstones::Parser, "data types" do
2
-
3
- describe "numbers" do
4
-
5
- it "parses a positive number" do
1
+ RSpec.describe Gobstones::Parser, 'data types' do
2
+ describe 'numbers' do
3
+ it 'parses a positive number' do
6
4
  expect('42').to be_parsed_as(:expression).and_return(42.to_gbs_num)
7
5
  end
8
6
 
9
- it "parses a negative number" do
7
+ it 'parses a negative number' do
10
8
  expect('-42').to be_parsed_as(:expression).and_return(-42.to_gbs_num)
11
9
  end
12
-
13
10
  end
14
11
 
15
- describe "booleans" do
16
-
17
- it "parses a true boolean" do
12
+ describe 'booleans' do
13
+ it 'parses a true boolean' do
18
14
  expect('True').to be_parsed_as(:expression).and_return(true_value)
19
15
  end
20
16
 
21
- it "parses a false boolean" do
17
+ it 'parses a false boolean' do
22
18
  expect('False').to be_parsed_as(:expression).and_return(false_value)
23
19
  end
24
-
25
20
  end
26
21
 
27
- describe "colors" do
28
-
22
+ describe 'colors' do
29
23
  it "parses the 'Azul' color" do
30
24
  expect('Azul').to be_parsed_as(:expression).and_return(azul)
31
25
  end
@@ -41,11 +35,9 @@ describe Gobstones::Parser, "data types" do
41
35
  it "parses the 'Verde' color" do
42
36
  expect('Verde').to be_parsed_as(:expression).and_return(verde)
43
37
  end
44
-
45
38
  end
46
39
 
47
- describe "directions" do
48
-
40
+ describe 'directions' do
49
41
  it "parses the 'Norte' direction" do
50
42
  expect('Norte').to be_parsed_as(:expression).and_return(norte)
51
43
  end
@@ -61,7 +53,5 @@ describe Gobstones::Parser, "data types" do
61
53
  it "parses the 'Oeste' direction" do
62
54
  expect('Oeste').to be_parsed_as(:expression).and_return(oeste)
63
55
  end
64
-
65
56
  end
66
-
67
57
  end
@@ -1,38 +1,38 @@
1
- describe Gobstones::Parser, "function calls" do
1
+ RSpec.describe Gobstones::Parser, 'function calls' do
2
+ it 'parses a function call without args' do
3
+ expected = FunctionCall.new('f1')
2
4
 
3
- it "parses a function call without args" do
4
- expected = FunctionCall.new 'f1'
5
5
  expect('f1()').to be_parsed_as(:expression).and_return(expected)
6
6
  end
7
7
 
8
- it "does not parse a function call without a valid identifier" do
8
+ it 'does not parse a function call without a valid identifier' do
9
9
  expect('F1()').to be_parsed_as(:expression).and_fail
10
10
  end
11
11
 
12
- it "parses a function call with one arg" do
13
- expected = FunctionCall.new 'func1', [verde]
12
+ it 'parses a function call with one arg' do
13
+ expected = FunctionCall.new('func1', [verde])
14
+
14
15
  expect('func1(Verde)').to be_parsed_as(:expression).and_return(expected)
15
16
  end
16
17
 
17
- it "parses a function with many args" do
18
+ it 'parses a function with many args' do
18
19
  first_arg = 42.to_gbs_num
19
- second_arg = NroBolitas.new verde
20
+ second_arg = NroBolitas.new(verde)
20
21
  third_arg = norte
21
- expected = FunctionCall.new 'func1', [first_arg, second_arg, third_arg]
22
+ expected = FunctionCall.new('func1', [first_arg, second_arg, third_arg])
22
23
 
23
- expect('func1(42, nroBolitas(Verde), Norte)').
24
- to be_parsed_as(:expression).and_return(expected)
24
+ expect('func1(42, nroBolitas(Verde), Norte)').to be_parsed_as(:expression).and_return(expected)
25
25
  end
26
26
 
27
- it "parses a complex function call" do
28
- or_expr = Or.new 'a'.to_var_name, 'b'.to_var_name
29
- div = Div.new 10.to_gbs_num, 'c'.to_var_name
30
- paren_expr = EnclosedByParensExpression.new div
31
- num_expr = Mul.new 5.to_gbs_num, paren_expr
32
- func2_call = FunctionCall.new 'func2', [verde, Opuesto.new(norte)]
33
- func1_call = FunctionCall.new 'func1', [or_expr, num_expr, func2_call]
27
+ it 'parses a complex function call' do
28
+ or_expr = Or.new('a'.to_var_name, 'b'.to_var_name)
29
+ div = Div.new(10.to_gbs_num, 'c'.to_var_name)
30
+ paren_expr = EnclosedByParensExpression.new(div)
31
+ num_expr = Mul.new(5.to_gbs_num, paren_expr)
32
+ func2_call = FunctionCall.new('func2', [verde, Opuesto.new(norte)])
33
+ func1_call = FunctionCall.new('func1', [or_expr, num_expr, func2_call])
34
+
34
35
  expect('func1(a || b, 5*(10 div c), func2(Verde, opuesto(Norte)))').
35
36
  to be_parsed_as(:expression).and_return(func1_call)
36
37
  end
37
-
38
38
  end
@@ -1,29 +1,27 @@
1
- describe Gobstones::Parser, "function definitions" do
2
-
3
- it "parses a function without args and a single return" do
4
- func_return = ReturnFromFunction.new [42.to_gbs_num]
5
-
6
- func_def = Function.new 'just42', no_arguments, empty_body, func_return
1
+ RSpec.describe Gobstones::Parser, 'function definitions' do
2
+ it 'parses a function without args and a single return' do
3
+ func_return = ReturnFromFunction.new([42.to_gbs_num])
4
+ func_def = Function.new('just42', no_arguments, empty_body, func_return)
7
5
 
8
6
  expect('function just42() { return (42) }').
9
7
  to be_parsed_as(:definition).and_return(func_def)
10
8
  end
11
9
 
12
- it "parses a function with some args" do
13
- args = VarTuple.new ['firstArg'.to_var_name, 'secondArg'.to_var_name, 'thirdArg'.to_var_name]
14
- return_st = ReturnFromFunction.new [verde, PuedeMover.new(norte)]
15
- func_def = Function.new 'myCoolFunction', args, empty_body, return_st
10
+ it 'parses a function with some args' do
11
+ args = VarTuple.with_names(%w[firstArg secondArg thirdArg])
12
+ return_st = ReturnFromFunction.new([verde, PuedeMover.new(norte)])
13
+ func_def = Function.new('myCoolFunction', args, empty_body, return_st)
16
14
 
17
15
  expect('function myCoolFunction (firstArg, secondArg, thirdArg) {
18
16
  return (Verde, puedeMover(Norte))
19
17
  }').to be_parsed_as(:definition).and_return(func_def)
20
18
  end
21
19
 
22
- it "parses a function with some statements" do
23
- args = VarTuple.new ['arg'.to_var_name]
24
- body = CommandBlock.new [Poner.new(verde)]
25
- return_st = ReturnFromFunction.new [true_value]
26
- func_def = Function.new 'myFunc', args, body, return_st
20
+ it 'parses a function with some statements' do
21
+ args = VarTuple.with_names(%w[arg])
22
+ body = CommandBlock.with_just(Poner.new(verde))
23
+ return_st = ReturnFromFunction.new([true_value])
24
+ func_def = Function.new('myFunc', args, body, return_st)
27
25
 
28
26
  expect('function myFunc(arg)
29
27
  {
@@ -32,14 +30,11 @@ describe Gobstones::Parser, "function definitions" do
32
30
  }').to be_parsed_as(:definition).and_return(func_def)
33
31
  end
34
32
 
35
- it "does not parse a function without a valid identifier" do
36
- expect('function MyWrongFunc() { return(True) }').
37
- to be_parsed_as(:definition).and_fail
33
+ it 'does not parse a function without a valid identifier' do
34
+ expect('function MyWrongFunc() { return(True) }').to be_parsed_as(:definition).and_fail
38
35
  end
39
36
 
40
- it "does not parse a function without a return statement" do
41
- expect('function myFuncWithoutReturn() { }').
42
- to be_parsed_as(:definition).and_fail
37
+ it 'does not parse a function without a return statement' do
38
+ expect('function myFuncWithoutReturn() { }').to be_parsed_as(:definition).and_fail
43
39
  end
44
-
45
40
  end