gobstones 0.0.1.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -3
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/CHANGELOG +22 -2
- data/Gemfile +3 -3
- data/Gemfile.lock +32 -27
- data/bin/gobstones +1 -1
- data/examples/.gitkeep +0 -0
- data/gobstones.gemspec +2 -2
- data/lib/gobstones/cli/board_template +1 -1
- data/lib/gobstones/cli/printer.rb +1 -1
- data/lib/gobstones/cli/runner.rb +8 -2
- data/lib/gobstones/extensions/all.rb +2 -1
- data/lib/gobstones/extensions/boolean.rb +1 -1
- data/lib/gobstones/extensions/fixnum.rb +1 -1
- data/lib/gobstones/extensions/string.rb +9 -0
- data/lib/gobstones/lang/all.rb +1 -1
- data/lib/gobstones/lang/commands/all.rb +3 -2
- data/lib/gobstones/lang/commands/boom_cmd.rb +6 -3
- data/lib/gobstones/lang/commands/command_block.rb +1 -1
- data/lib/gobstones/lang/commands/conditional_cmd.rb +5 -1
- data/lib/gobstones/lang/commands/ir_al_origen_cmd.rb +1 -1
- data/lib/gobstones/lang/commands/mover_cmd.rb +4 -2
- data/lib/gobstones/lang/commands/multiple_assignment.rb +35 -0
- data/lib/gobstones/lang/commands/poner_cmd.rb +8 -4
- data/lib/gobstones/lang/commands/procedure_call.rb +1 -9
- data/lib/gobstones/lang/commands/repeat_with_cmd.rb +10 -6
- data/lib/gobstones/lang/commands/sacar_cmd.rb +9 -7
- data/lib/gobstones/lang/commands/{assignments.rb → single_assignment.rb} +5 -3
- data/lib/gobstones/lang/commands/skip_cmd.rb +2 -2
- data/lib/gobstones/lang/commands/vaciar_tablero_cmd.rb +1 -1
- data/lib/gobstones/lang/commands/while_cmd.rb +1 -1
- data/lib/gobstones/lang/definitions/all.rb +1 -1
- data/lib/gobstones/lang/definitions/definition.rb +47 -5
- data/lib/gobstones/lang/definitions/definition_call.rb +17 -5
- data/lib/gobstones/lang/definitions/function.rb +9 -0
- data/lib/gobstones/lang/definitions/main.rb +1 -1
- data/lib/gobstones/lang/definitions/no_return_statement.rb +7 -3
- data/lib/gobstones/lang/definitions/procedure.rb +5 -20
- data/lib/gobstones/lang/definitions/return_from_function.rb +12 -2
- data/lib/gobstones/lang/definitions/return_from_main.rb +5 -1
- data/lib/gobstones/lang/definitions/var_tuple.rb +13 -1
- data/lib/gobstones/lang/expressions/all.rb +1 -1
- data/lib/gobstones/lang/expressions/arithmetic_expressions.rb +1 -1
- data/lib/gobstones/lang/expressions/boolean_expressions.rb +3 -2
- data/lib/gobstones/lang/expressions/enclosed_by_parens_expression.rb +17 -0
- data/lib/gobstones/lang/expressions/function_call.rb +1 -1
- data/lib/gobstones/lang/expressions/one_arg_expression.rb +16 -4
- data/lib/gobstones/lang/expressions/primitive_functions.rb +18 -12
- data/lib/gobstones/lang/expressions/two_arg_expression.rb +7 -3
- data/lib/gobstones/lang/expressions/type_bound_functions.rb +1 -1
- data/lib/gobstones/lang/expressions/var_name.rb +9 -3
- data/lib/gobstones/lang/literals/all.rb +1 -1
- data/lib/gobstones/lang/literals/colors.rb +1 -1
- data/lib/gobstones/lang/literals/literal.rb +31 -21
- data/lib/gobstones/lang/literals/number.rb +1 -1
- data/lib/gobstones/lang/program.rb +13 -4
- data/lib/gobstones/modules/equal_by_class.rb +1 -1
- data/lib/gobstones/parser/ast/ast.rb +12 -8
- data/lib/gobstones/parser/grammar/gobstones.treetop +4 -4
- data/lib/gobstones/parser/parse_error.rb +1 -1
- data/lib/gobstones/runner/all.rb +1 -2
- data/lib/gobstones/runner/board.rb +13 -4
- data/lib/gobstones/runner/cell.rb +10 -0
- data/lib/gobstones/runner/errors/all.rb +1 -1
- data/lib/gobstones/runner/errors/definition_not_found_error.rb +1 -1
- data/lib/gobstones/runner/execution_context.rb +66 -16
- data/lib/gobstones/runner/head.rb +17 -3
- data/spec/gobstones_lang_test_objects.rb +75 -0
- data/spec/lang/commands/boom_cmd_spec.rb +3 -3
- data/spec/lang/commands/cmd_block_spec.rb +14 -14
- data/spec/lang/commands/if_cmd_spec.rb +21 -20
- data/spec/lang/commands/ir_al_origen_cmd_spec.rb +3 -3
- data/spec/lang/commands/mover_cmd_spec.rb +12 -14
- data/spec/lang/commands/multiple_assignment_spec.rb +37 -0
- data/spec/lang/commands/poner_cmd_spec.rb +13 -14
- data/spec/lang/commands/procedure_call_spec.rb +19 -24
- data/spec/lang/commands/procedure_spec.rb +32 -36
- data/spec/lang/commands/repeat_with_cmd_spec.rb +39 -20
- data/spec/lang/commands/sacar_cmd_spec.rb +17 -16
- data/spec/lang/commands/single_assignment_spec.rb +13 -0
- data/spec/lang/commands/skip_cmd_spec.rb +2 -2
- data/spec/lang/commands/vaciar_tablero_cmd_spec.rb +7 -6
- data/spec/lang/commands/while_cmd_spec.rb +21 -15
- data/spec/lang/definitions/no_return_statement_spec.rb +10 -0
- data/spec/lang/definitions/var_tuple_spec.rb +16 -0
- data/spec/lang/expressions/arithmetic_expressions_spec.rb +15 -15
- data/spec/lang/expressions/boolean_expressions_spec.rb +35 -25
- data/spec/lang/expressions/comparison_expressions_spec.rb +25 -28
- data/spec/lang/expressions/enclosed_by_parens_expression_spec.rb +11 -0
- data/spec/lang/expressions/function_call_spec.rb +29 -0
- data/spec/lang/expressions/primitive_functions_spec.rb +60 -62
- data/spec/lang/expressions/type_bound_functions_spec.rb +13 -13
- data/spec/lang/expressions/var_name_spec.rb +20 -8
- data/spec/lang/literals/booleans_spec.rb +5 -7
- data/spec/lang/literals/colors_spec.rb +4 -4
- data/spec/lang/literals/directions_spec.rb +12 -12
- data/spec/lang/literals/numbers_spec.rb +2 -2
- data/spec/matchers/parse_matcher.rb +9 -10
- data/spec/parser/arithmetic_expressions_spec.rb +19 -19
- data/spec/parser/assignments_spec.rb +24 -10
- data/spec/parser/boolean_expressions_spec.rb +18 -18
- data/spec/parser/command_block_spec.rb +17 -19
- data/spec/parser/data_types_spec.rb +23 -23
- data/spec/parser/function_calls_spec.rb +13 -12
- data/spec/parser/function_definitions_spec.rb +13 -18
- data/spec/parser/gobstones_program_spec.rb +15 -15
- data/spec/parser/if_command_spec.rb +13 -12
- data/spec/parser/main_definition_spec.rb +12 -12
- data/spec/parser/nested_expressions_spec.rb +16 -20
- data/spec/parser/primitive_expressions_spec.rb +27 -33
- data/spec/parser/procedure_calls_spec.rb +12 -12
- data/spec/parser/procedure_definitions_spec.rb +10 -16
- data/spec/parser/repeat_with_command_spec.rb +7 -10
- data/spec/parser/simple_commands_spec.rb +10 -10
- data/spec/parser/treetop_parser_spec.rb +11 -10
- data/spec/parser/var_tuple_spec.rb +7 -11
- data/spec/parser/while_command_spec.rb +9 -9
- data/spec/runner/board_spec.rb +23 -27
- data/spec/runner/cell_spec.rb +34 -38
- data/spec/runner/execution_context_spec.rb +38 -24
- data/spec/runner/head_spec.rb +54 -63
- data/spec/spec_helper.rb +4 -1
- data/spec/type_checker_spec.rb +13 -13
- metadata +33 -18
- data/lib/gobstones/lang/expressions/parentheses_expression.rb +0 -13
- data/spec/lang/commands/assignments_spec.rb +0 -13
@@ -1,37 +1,38 @@
|
|
1
1
|
describe Gobstones::Parser, "function calls" do
|
2
2
|
|
3
|
-
it "
|
3
|
+
it "parses a function call without args" do
|
4
4
|
expected = FunctionCall.new 'f1'
|
5
5
|
expect('f1()').to be_parsed_as(:expression).and_return(expected)
|
6
6
|
end
|
7
7
|
|
8
|
-
it "
|
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 "
|
13
|
-
expected = FunctionCall.new 'func1', [
|
12
|
+
it "parses a function call with one arg" do
|
13
|
+
expected = FunctionCall.new 'func1', [verde]
|
14
14
|
expect('func1(Verde)').to be_parsed_as(:expression).and_return(expected)
|
15
15
|
end
|
16
16
|
|
17
|
-
it "
|
17
|
+
it "parses a function with many args" do
|
18
18
|
first_arg = 42.to_gbs_num
|
19
|
-
second_arg = NroBolitas.new
|
20
|
-
third_arg =
|
19
|
+
second_arg = NroBolitas.new verde
|
20
|
+
third_arg = norte
|
21
21
|
expected = FunctionCall.new 'func1', [first_arg, second_arg, third_arg]
|
22
22
|
|
23
23
|
expect('func1(42, nroBolitas(Verde), Norte)').
|
24
24
|
to be_parsed_as(:expression).and_return(expected)
|
25
25
|
end
|
26
26
|
|
27
|
-
it "
|
28
|
-
or_expr = Or.new
|
29
|
-
|
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
|
30
31
|
num_expr = Mul.new 5.to_gbs_num, paren_expr
|
31
|
-
func2_call = FunctionCall.new 'func2', [
|
32
|
+
func2_call = FunctionCall.new 'func2', [verde, Opuesto.new(norte)]
|
32
33
|
func1_call = FunctionCall.new 'func1', [or_expr, num_expr, func2_call]
|
33
34
|
expect('func1(a || b, 5*(10 div c), func2(Verde, opuesto(Norte)))').
|
34
35
|
to be_parsed_as(:expression).and_return(func1_call)
|
35
36
|
end
|
36
37
|
|
37
|
-
end
|
38
|
+
end
|
@@ -1,33 +1,28 @@
|
|
1
1
|
describe Gobstones::Parser, "function definitions" do
|
2
2
|
|
3
|
-
it "
|
4
|
-
args = VarTuple.new []
|
3
|
+
it "parses a function without args and a single return" do
|
5
4
|
func_return = ReturnFromFunction.new [42.to_gbs_num]
|
6
5
|
|
7
|
-
func_def = Function.new 'just42',
|
6
|
+
func_def = Function.new 'just42', no_arguments, empty_body, func_return
|
8
7
|
|
9
8
|
expect('function just42() { return (42) }').
|
10
9
|
to be_parsed_as(:definition).and_return(func_def)
|
11
10
|
end
|
12
11
|
|
13
|
-
it "
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
args = VarTuple.new [first_arg, second_arg, third_arg]
|
18
|
-
body =
|
19
|
-
return_st = ReturnFromFunction.new [Verde.new, PuedeMover.new(Norte.new)]
|
20
|
-
func_def = Function.new 'myCoolFunction', args, CmdBlock.new([]), return_st
|
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
|
21
16
|
|
22
17
|
expect('function myCoolFunction (firstArg, secondArg, thirdArg) {
|
23
18
|
return (Verde, puedeMover(Norte))
|
24
19
|
}').to be_parsed_as(:definition).and_return(func_def)
|
25
20
|
end
|
26
21
|
|
27
|
-
it "
|
28
|
-
args = VarTuple.new [
|
29
|
-
body =
|
30
|
-
return_st = ReturnFromFunction.new [
|
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]
|
31
26
|
func_def = Function.new 'myFunc', args, body, return_st
|
32
27
|
|
33
28
|
expect('function myFunc(arg)
|
@@ -37,14 +32,14 @@ describe Gobstones::Parser, "function definitions" do
|
|
37
32
|
}').to be_parsed_as(:definition).and_return(func_def)
|
38
33
|
end
|
39
34
|
|
40
|
-
it "
|
35
|
+
it "does not parse a function without a valid identifier" do
|
41
36
|
expect('function MyWrongFunc() { return(True) }').
|
42
37
|
to be_parsed_as(:definition).and_fail
|
43
38
|
end
|
44
39
|
|
45
|
-
it "
|
40
|
+
it "does not parse a function without a return statement" do
|
46
41
|
expect('function myFuncWithoutReturn() { }').
|
47
42
|
to be_parsed_as(:definition).and_fail
|
48
43
|
end
|
49
44
|
|
50
|
-
end
|
45
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
describe Gobstones::Parser, "program definitions" do
|
2
2
|
|
3
|
-
it "
|
4
|
-
main_def = Main.new
|
5
|
-
program = Program.new
|
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
|
6
6
|
|
7
7
|
expect('procedure Main(){}').to be_parsed_as(:program).and_return(program)
|
8
8
|
end
|
9
9
|
|
10
|
-
it "
|
11
|
-
main_def = Main.new
|
12
|
-
proc_1 = Procedure.new 'Procedure1',
|
13
|
-
proc_2 = Procedure.new 'Procedure2',
|
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
14
|
program = Program.new [proc_1, proc_2], main_def
|
15
15
|
|
16
16
|
gbs_code = <<GBS
|
@@ -23,11 +23,11 @@ GBS
|
|
23
23
|
expect(gbs_code).to be_parsed_as(:program).and_return(program)
|
24
24
|
end
|
25
25
|
|
26
|
-
it "
|
27
|
-
main_def = Main.new
|
28
|
-
proc_1 = Procedure.new 'Procedure1',
|
29
|
-
func_1 = Function.new 'function1',
|
30
|
-
proc_2 = Procedure.new 'Procedure2',
|
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
31
|
program = Program.new [proc_1, func_1, proc_2], main_def
|
32
32
|
gbs_code = <<GBS
|
33
33
|
procedure Procedure1(){ }
|
@@ -41,15 +41,15 @@ GBS
|
|
41
41
|
expect(gbs_code).to be_parsed_as(:program).and_return(program)
|
42
42
|
end
|
43
43
|
|
44
|
-
it "
|
44
|
+
it "does not parse a program without a Main definition" do
|
45
45
|
expect('procedure Procedure1(){}
|
46
46
|
procedure Procedure2() {}').to be_parsed_as(:program).and_fail
|
47
47
|
end
|
48
48
|
|
49
|
-
it "
|
49
|
+
it "does not parse a program if Main is not the last definition" do
|
50
50
|
expect('procedure Procedure1() {}
|
51
51
|
procedure Main() {}
|
52
52
|
procedure Procedure2() {}').to be_parsed_as(:program).and_fail
|
53
53
|
end
|
54
54
|
|
55
|
-
end
|
55
|
+
end
|
@@ -2,8 +2,8 @@ describe Gobstones::Parser, "if statements" do
|
|
2
2
|
|
3
3
|
describe "if" do
|
4
4
|
|
5
|
-
it "
|
6
|
-
if_cmd = IfCmd.new
|
5
|
+
it "parses a statement with a simple boolean and an empty block" do
|
6
|
+
if_cmd = IfCmd.new true_value, empty_body
|
7
7
|
|
8
8
|
expect('if (True) {}').to be_parsed_as(:command).and_return(if_cmd)
|
9
9
|
expect('if (True) {
|
@@ -12,18 +12,19 @@ describe Gobstones::Parser, "if statements" do
|
|
12
12
|
{}').to be_parsed_as(:command).and_return(if_cmd)
|
13
13
|
end
|
14
14
|
|
15
|
-
it "
|
16
|
-
cmd_block =
|
17
|
-
if_cmd = IfCmd.new
|
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
|
18
18
|
|
19
19
|
expect('if(False){Poner(Verde); Skip}').
|
20
20
|
to be_parsed_as(:command).and_return(if_cmd)
|
21
21
|
end
|
22
22
|
|
23
|
-
it "
|
24
|
-
and_expr = And.new
|
25
|
-
|
26
|
-
|
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
|
27
28
|
|
28
29
|
expect('if (puedeMover(Norte) || (a && False)) {}').
|
29
30
|
to be_parsed_as(:command).and_return(if_cmd)
|
@@ -33,9 +34,9 @@ describe Gobstones::Parser, "if statements" do
|
|
33
34
|
|
34
35
|
describe "if-else" do
|
35
36
|
|
36
|
-
it "
|
37
|
-
else_block =
|
38
|
-
if_else_cmd = IfElseCmd.new
|
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
|
39
40
|
|
40
41
|
expect('if (False) { } else { Mover(Norte) }').
|
41
42
|
to be_parsed_as(:command).and_return(if_else_cmd)
|
@@ -1,23 +1,23 @@
|
|
1
1
|
describe Gobstones::Parser, "main definition" do
|
2
2
|
|
3
|
-
|
4
|
-
|
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
|
5
7
|
|
6
8
|
expect('procedure Main() {}').to be_parsed_as(:definition).and_fail
|
7
9
|
expect('procedure Main() {}').to be_parsed_as(:main).and_return(main)
|
8
10
|
end
|
9
11
|
|
10
|
-
it "
|
11
|
-
|
12
|
-
main = Main.new CmdBlock.new([]), ReturnFromMain.new(return_tuple)
|
12
|
+
it "parses a valid main procedure with a return of var names" do
|
13
|
+
main = Main.new empty_body, ReturnFromMain.new(return_tuple)
|
13
14
|
|
14
15
|
expect('procedure Main() { return (x, y); }').
|
15
16
|
to be_parsed_as(:main).and_return(main)
|
16
17
|
end
|
17
18
|
|
18
|
-
it "
|
19
|
-
|
20
|
-
cmd_block = CmdBlock.new [Mover.new(Oeste.new), Skip.new]
|
19
|
+
it "parses a valid main procedure with commands and return" do
|
20
|
+
cmd_block = CommandBlock.new [Mover.new(oeste), Skip.new]
|
21
21
|
main = Main.new cmd_block, ReturnFromMain.new(return_tuple)
|
22
22
|
|
23
23
|
expect('procedure Main() {
|
@@ -27,16 +27,16 @@ describe Gobstones::Parser, "main definition" do
|
|
27
27
|
}').to be_parsed_as(:main).and_return(main)
|
28
28
|
end
|
29
29
|
|
30
|
-
it "
|
30
|
+
it "does not parse a main procedure with an invalid identifier" do
|
31
31
|
expect('procedure NotMain() {}').to be_parsed_as(:main).and_fail
|
32
32
|
end
|
33
33
|
|
34
|
-
it "
|
34
|
+
it "does not parse a main procedure with a return of expressions" do
|
35
35
|
expect('procedure Main() { return (3+4) }').to be_parsed_as(:main).and_fail
|
36
36
|
end
|
37
37
|
|
38
|
-
it "
|
38
|
+
it "does not parse a main procedure with args" do
|
39
39
|
expect('procedure Main(arg1, arg2) {}').to be_parsed_as(:main).and_fail
|
40
40
|
end
|
41
41
|
|
42
|
-
end
|
42
|
+
end
|
@@ -1,39 +1,35 @@
|
|
1
1
|
describe Gobstones::Parser, "nested expressions" do
|
2
2
|
|
3
|
-
it "
|
3
|
+
it "parses literals between ()" do
|
4
4
|
expect('( 42 )').to be_parsed_as(:expression).
|
5
|
-
and_return(
|
5
|
+
and_return(EnclosedByParensExpression.new(42.to_gbs_num))
|
6
6
|
expect('(True )').to be_parsed_as(:expression).
|
7
|
-
and_return(
|
7
|
+
and_return(EnclosedByParensExpression.new(true_value))
|
8
8
|
expect('(Rojo )').to be_parsed_as(:expression).
|
9
|
-
and_return(
|
9
|
+
and_return(EnclosedByParensExpression.new(rojo))
|
10
10
|
expect('(Verde)').to be_parsed_as(:expression).
|
11
|
-
and_return(
|
11
|
+
and_return(EnclosedByParensExpression.new(verde))
|
12
12
|
end
|
13
13
|
|
14
|
-
it "
|
15
|
-
puede_mover =
|
14
|
+
it "parses primitive functions between ()" do
|
15
|
+
puede_mover = EnclosedByParensExpression.new(PuedeMover.new(norte))
|
16
16
|
expect('(puedeMover(Norte))').
|
17
17
|
to be_parsed_as(:expression).and_return(puede_mover)
|
18
18
|
end
|
19
19
|
|
20
|
-
it "
|
21
|
-
paren_expr =
|
20
|
+
it "parses nested arithmetic expressions between ()" do
|
21
|
+
paren_expr = EnclosedByParensExpression.new Add.new(3.to_gbs_num, 5.to_gbs_num)
|
22
22
|
expected = Mul.new paren_expr, 6.to_gbs_num
|
23
23
|
expect('(3 + 5) * 6').to be_parsed_as(:expression).and_return(expected)
|
24
24
|
end
|
25
25
|
|
26
|
-
it "
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
and_expr = And.new a, inner_paren
|
33
|
-
outer_paren = ParenthesesExpr.new and_expr
|
34
|
-
d = VarName.new 'd'
|
35
|
-
result = And.new outer_paren, d
|
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
|
36
32
|
expect('(a && (b || c)) && d').to be_parsed_as(:expression).and_return(result)
|
37
33
|
end
|
38
34
|
|
39
|
-
end
|
35
|
+
end
|
@@ -2,20 +2,20 @@ describe Gobstones::Parser, "primitive expressions" do
|
|
2
2
|
|
3
3
|
describe "variable identifiers" do
|
4
4
|
|
5
|
-
it "
|
6
|
-
expect('v').to be_parsed_as(:expression).and_return(
|
7
|
-
expect('var1').to be_parsed_as(:expression).and_return(
|
8
|
-
expect('a_var').to be_parsed_as(:expression).and_return(
|
9
|
-
expect('vAR').to be_parsed_as(:expression).and_return(
|
5
|
+
it "parses valid var names" do
|
6
|
+
expect('v').to be_parsed_as(:expression).and_return('v'.to_var_name)
|
7
|
+
expect('var1').to be_parsed_as(:expression).and_return('var1'.to_var_name)
|
8
|
+
expect('a_var').to be_parsed_as(:expression).and_return('a_var'.to_var_name)
|
9
|
+
expect('vAR').to be_parsed_as(:expression).and_return('vAR'.to_var_name)
|
10
10
|
end
|
11
11
|
|
12
|
-
it "
|
13
|
-
expect('1').not_to be_parsed_as(:expression).and_return(
|
12
|
+
it "does not parse invalid var names" do
|
13
|
+
expect('1').not_to be_parsed_as(:expression).and_return('1'.to_var_name)
|
14
14
|
expect('_var').to be_parsed_as(:expression).and_fail
|
15
15
|
expect('Var').to be_parsed_as(:expression).and_fail
|
16
16
|
end
|
17
17
|
|
18
|
-
it "
|
18
|
+
it "does not parse reserved words as var names" do
|
19
19
|
literals = %w{True False Rojo Negro Azul Verde Norte Oeste Este Sur}
|
20
20
|
(RESERVED_IDS - literals).each do |id|
|
21
21
|
expect(id).to be_parsed_as(:expression).and_fail
|
@@ -26,27 +26,27 @@ describe Gobstones::Parser, "primitive expressions" do
|
|
26
26
|
|
27
27
|
describe "type bounds functions" do
|
28
28
|
|
29
|
-
it "
|
29
|
+
it "parses the minBool() function" do
|
30
30
|
expect('minBool()').to be_parsed_as(:expression).and_return(MinBool.new)
|
31
31
|
end
|
32
32
|
|
33
|
-
it "
|
33
|
+
it "parses the maxBool() function" do
|
34
34
|
expect('maxBool()').to be_parsed_as(:expression).and_return(MaxBool.new)
|
35
35
|
end
|
36
36
|
|
37
|
-
it "
|
37
|
+
it "parses the minColor() function" do
|
38
38
|
expect('minColor()').to be_parsed_as(:expression).and_return(MinColor.new)
|
39
39
|
end
|
40
40
|
|
41
|
-
it "
|
41
|
+
it "parses the maxColor() function" do
|
42
42
|
expect('maxColor()').to be_parsed_as(:expression).and_return(MaxColor.new)
|
43
43
|
end
|
44
44
|
|
45
|
-
it "
|
45
|
+
it "parses the minDir() function" do
|
46
46
|
expect('minDir()').to be_parsed_as(:expression).and_return(MinDir.new)
|
47
47
|
end
|
48
48
|
|
49
|
-
it "
|
49
|
+
it "parses the maxDir() function" do
|
50
50
|
expect('maxDir()').to be_parsed_as(:expression).and_return(MaxDir.new)
|
51
51
|
end
|
52
52
|
|
@@ -54,23 +54,20 @@ describe Gobstones::Parser, "primitive expressions" do
|
|
54
54
|
|
55
55
|
describe "other type functions" do
|
56
56
|
|
57
|
-
it "
|
58
|
-
|
59
|
-
func = Siguiente.new arg
|
57
|
+
it "parses the siguiente() function " do
|
58
|
+
func = Siguiente.new 'x'.to_var_name
|
60
59
|
expect('siguiente(x)').to be_parsed_as(:expression).and_return(func)
|
61
60
|
expect('siguiente(x )').to be_parsed_as(:expression).and_return(func)
|
62
61
|
end
|
63
62
|
|
64
|
-
it "
|
65
|
-
|
66
|
-
func = Previo.new arg
|
63
|
+
it "parses the previo() function" do
|
64
|
+
func = Previo.new 'y'.to_var_name
|
67
65
|
expect('previo(y)').to be_parsed_as(:expression).and_return(func)
|
68
66
|
expect('previo( y )').to be_parsed_as(:expression).and_return(func)
|
69
67
|
end
|
70
68
|
|
71
|
-
it "
|
72
|
-
|
73
|
-
func = Opuesto.new arg
|
69
|
+
it "parses the opuesto() function" do
|
70
|
+
func = Opuesto.new 'z'.to_var_name
|
74
71
|
expect('opuesto(z)').to be_parsed_as(:expression).and_return(func)
|
75
72
|
expect('opuesto( z )').to be_parsed_as(:expression).and_return(func)
|
76
73
|
end
|
@@ -79,27 +76,24 @@ describe Gobstones::Parser, "primitive expressions" do
|
|
79
76
|
|
80
77
|
describe "board primitive functions" do
|
81
78
|
|
82
|
-
it "
|
83
|
-
|
84
|
-
func = NroBolitas.new arg
|
79
|
+
it "parses the nroBolitas(exp) function" do
|
80
|
+
func = NroBolitas.new 'color'.to_var_name
|
85
81
|
expect('nroBolitas(color)').to be_parsed_as(:expression).and_return(func)
|
86
82
|
expect('nroBolitas( color )').to be_parsed_as(:expression).and_return(func)
|
87
83
|
end
|
88
84
|
|
89
|
-
it "
|
90
|
-
|
91
|
-
func = HayBolitas.new arg
|
85
|
+
it "parses the hayBolitas(exp) function" do
|
86
|
+
func = HayBolitas.new 'color'.to_var_name
|
92
87
|
expect('hayBolitas(color)').to be_parsed_as(:expression).and_return(func)
|
93
88
|
expect('hayBolitas( color )').to be_parsed_as(:expression).and_return(func)
|
94
89
|
end
|
95
90
|
|
96
|
-
it "
|
97
|
-
|
98
|
-
func = PuedeMover.new arg
|
91
|
+
it "parses the puedeMover(exp) function" do
|
92
|
+
func = PuedeMover.new 'dir'.to_var_name
|
99
93
|
expect('puedeMover(dir)').to be_parsed_as(:expression).and_return(func)
|
100
94
|
expect('puedeMover( dir )').to be_parsed_as(:expression).and_return(func)
|
101
95
|
end
|
102
96
|
|
103
97
|
end
|
104
98
|
|
105
|
-
end
|
99
|
+
end
|