def test_compiler_expression_sum_to_parenthesis(parser): tree = parser.parse('1 + (2 + 3)') result = Compiler.compile(tree) rhs = {'$OBJECT': 'expression', 'expression': 'sum', 'values': [2, 3]} args = [{'$OBJECT': 'expression', 'expression': 'sum', 'values': [1, rhs]}] assert result['tree']['1']['method'] == 'expression' assert result['tree']['1']['args'] == args
def test_compiler_set_regular_expression_flags(parser): """ Ensures regular expressions with flags are compiled correctly """ tree = parser.parse('a = /^foo/g') result = Compiler.compile(tree) assert result['tree']['1']['args'][0]['flags'] == 'g'
def test_compiler_if_inline_expression(parser): tree = parser.parse('if (random numbers)\n\tx = 0') result = Compiler.compile(tree) entry = result['entrypoint'] name = result['tree'][entry]['name'] assert result['tree']['1']['method'] == 'if' assert result['tree']['1']['args'] == [{'$OBJECT': 'path', 'paths': name}]
def test_compiler_mutation_chained(parser, source): """ Ensures that chained mutations are compiled correctly """ tree = parser.parse(source) result = Compiler.compile(tree) args = [ 1, { '$OBJECT': 'mutation', 'mutation': 'increment', 'arguments': [] }, { '$OBJECT': 'mutation', 'mutation': 'format', 'arguments': [{ '$OBJECT': 'argument', 'name': 'to', 'argument': { '$OBJECT': 'string', 'string': 'string' } }] } ] assert result['tree']['1']['args'] == args
def test_compiler_if_else(parser): source = 'if colour == "red"\n\tx = 0\nelse\n\tx = 1' tree = parser.parse(source) result = Compiler.compile(tree) assert result['tree']['1']['exit'] == '3' assert result['tree']['3']['method'] == 'else' assert result['tree']['4']['parent'] == '3'
def test_assignments_int_positive(parser): """ Ensures that assignments to positive integers are compiled correctly """ tree = parser.parse('a = +3') result = Compiler.compile(tree) assert result['tree']['1']['args'] == [3]
def test_compiler_try(parser): source = 'try\n\tx=0' tree = parser.parse(source) result = Compiler.compile(tree) assert result['tree']['1']['method'] == 'try' assert result['tree']['1']['enter'] == '2' assert result['tree']['2']['parent'] == '1'
def test_compiler_try_finally(parser): source = 'try\n\tx=0\nfinally\n\tx=1' tree = parser.parse(source) result = Compiler.compile(tree) assert result['tree']['3']['method'] == 'finally' assert result['tree']['3']['enter'] == '4' assert result['tree']['4']['parent'] == '3'
def test_compiler_compile(patch): patch.many(Compiler, ['parse_tree', 'compiler', 'get_services']) result = Compiler.compile('tree') Compiler.compiler().parse_tree.assert_called_with('tree') expected = {'tree': Compiler.compiler().lines, 'version': version, 'services': Compiler.compiler().get_services(), 'functions': Compiler.compiler().functions} assert result == expected
def test_compiler_set_object_empty(parser): """ Ensures that assignments to empty objects are compiled correctly """ tree = parser.parse('a = {}') result = Compiler.compile(tree) assert result['tree']['1']['method'] == 'set' assert result['tree']['1']['args'] == [{'$OBJECT': 'dict', 'items': []}]
def test_compiler_set_service(parser): """ Ensures that service assignments are compiled correctly """ tree = parser.parse('a = alpine echo') result = Compiler.compile(tree) assert result['tree']['1']['method'] == 'execute' assert result['tree']['1']['name'] == ['a']
def test_compiler_compile(patch, magic): patch.object(Compiler, 'generate') patch.object(JSONCompiler, 'compile') tree = magic() result = Compiler.compile(tree, story=None, features=None) Compiler.generate.assert_called_with(tree, None) JSONCompiler.compile.assert_called_with(Compiler.generate()) assert result == JSONCompiler.compile()
def test_compiler_function_call(parser): source = 'function sum a:int returns int\n\treturn 0\nsum a:1' tree = parser.parse(source) result = Compiler.compile(tree) args = [{'$OBJECT': 'argument', 'name': 'a', 'argument': 1}] assert result['tree']['3']['method'] == 'call' assert result['tree']['3']['service'] == 'sum' assert result['tree']['3']['args'] == args
def test_compiler_try_raise(parser): source = 'try\n\tx=0\ncatch as error\n\traise' tree = parser.parse(source) result = Compiler.compile(tree) assert result['tree']['1']['exit'] == '3' assert result['tree']['3']['method'] == 'catch' assert result['tree']['4']['method'] == 'raise' assert result['tree']['4']['parent'] == '3'
def test_compiler_while(parser): tree = parser.parse('while cond\n\tx = 0') result = Compiler.compile(tree) args = [{'$OBJECT': 'path', 'paths': ['cond']}] assert result['tree']['1']['method'] == 'while' assert result['tree']['1']['args'] == args assert result['tree']['1']['enter'] == '2' assert result['tree']['2']['parent'] == '1'
def test_compiler_expression_path(parser): """ Ensures that expressions with paths are compiled correctly. """ tree = parser.parse('x = 3\nx + 2') result = Compiler.compile(tree) path = {'$OBJECT': 'path', 'paths': ['x']} assert result['tree']['2']['args'][0]['values'][0] == path
def test_compiler_expression_sum(parser): """ Ensures that sums are compiled correctly """ tree = parser.parse('3 + 2') result = Compiler.compile(tree) args = [{'$OBJECT': 'expression', 'expression': 'sum', 'values': [3, 2]}] assert result['tree']['1']['method'] == 'expression' assert result['tree']['1']['args'] == args
def test_assignments_mutation(parser): """ Ensures that assigning a mutation on a value is compiled correctly """ tree = parser.parse('0 increase by:1') result = Compiler.compile(tree) assert result['services'] == [] assert result['tree']['1']['method'] == 'mutation' assert result['tree']['1']['args'][1]['$OBJECT'] == 'mutation'
def test_compiler_try_catch(parser): source = 'try\n\tx=0\ncatch as error\n\tx=1' tree = parser.parse(source) result = Compiler.compile(tree) assert result['tree']['1']['exit'] == '3' assert result['tree']['3']['method'] == 'catch' assert result['tree']['3']['output'] == ['error'] assert result['tree']['3']['enter'] == '4' assert result['tree']['4']['parent'] == '3'
def test_assignments_null(parser): """ Ensures that assignments to null are compiled correctly """ tree = parser.parse('a = null') result = Compiler.compile(tree) assert result['tree']['1']['method'] == 'set' assert result['tree']['1']['name'] == ['a'] assert result['tree']['1']['args'] == [None]
def test_compiler_foreach(parser): tree = parser.parse('foreach items as item\n\tx = 0') result = Compiler.compile(tree) args = [{'$OBJECT': 'path', 'paths': ['items']}] assert result['tree']['1']['method'] == 'for' assert result['tree']['1']['output'] == ['item'] assert result['tree']['1']['args'] == args assert result['tree']['1']['enter'] == '2' assert result['tree']['2']['parent'] == '1'
def test_assignments_true(parser): """ Ensures that assignments to true are compiled correctly """ tree = parser.parse('a = true') result = Compiler.compile(tree) assert result['tree']['1']['method'] == 'set' assert result['tree']['1']['name'] == ['a'] assert result['tree']['1']['args'] == [True]
def test_assignments_float(parser): """ Ensures that assignments to floats are compiled correctly """ tree = parser.parse('a = 3.14') result = Compiler.compile(tree) assert result['tree']['1']['method'] == 'set' assert result['tree']['1']['name'] == ['a'] assert result['tree']['1']['args'] == [3.14]
def test_assignments_list(parser): """ Ensures that assignments to lists are compiled correctly """ tree = parser.parse('a = [1, 2]') result = Compiler.compile(tree) args = [{'$OBJECT': 'list', 'items': [1, 2]}] assert result['tree']['1']['method'] == 'set' assert result['tree']['1']['args'] == args
def test_functions_function_return(parser): """ Ensures that return statements are compiled correctly """ tree = parser.parse('function f\n\treturn 0') result = Compiler.compile(tree) assert result['tree']['2']['method'] == 'return' assert result['tree']['2']['args'] == [0] assert result['tree']['2']['parent'] == '1'
def test_compiler_set(parser): """ Ensures that assignments to integers are compiled correctly """ tree = parser.parse('a = 0') result = Compiler.compile(tree) assert result['tree']['1']['method'] == 'set' assert result['tree']['1']['name'] == ['a'] assert result['tree']['1']['args'] == [0]
def test_compiler_set_list_multiline(parser): """ Ensures that assignments to multiline lists are compiled correctly """ tree = parser.parse('a = [\n\t1,\n\t2\n]') result = Compiler.compile(tree) args = [{'$OBJECT': 'list', 'items': [1, 2]}] assert result['tree']['1']['method'] == 'set' assert result['tree']['1']['args'] == args
def test_compiler_set_regular_expression(parser): """ Ensures regular expressions are compiled correctly """ tree = parser.parse('a = /^foo/') result = Compiler.compile(tree) assert result['tree']['1']['method'] == 'set' assert result['tree']['1']['args'][0]['$OBJECT'] == 'regexp' assert result['tree']['1']['args'][0]['regexp'] == '/^foo/'
def test_functions_function_returns(parser): """ Ensures that functions with a return type are compiled correctly """ tree = parser.parse('function f returns int\n\tx = 0') result = Compiler.compile(tree) assert result['tree']['1']['method'] == 'function' assert result['tree']['1']['function'] == 'f' assert result['tree']['1']['output'] == ['int']
def test_compiler_set_mutation(parser): """ Ensures that applying a mutation on a variable is not compiled as a service """ tree = parser.parse('a = 0\na increase by:1') result = Compiler.compile(tree) assert result['services'] == [] assert result['tree']['2']['method'] == 'expression' assert result['tree']['2']['args'][1]['$OBJECT'] == 'mutation'