def test_invalid(self): data = ''' *** Variables *** Ooops I did it again ${} invalid ${x}== invalid ${not closed invalid &{dict} invalid ${invalid} ''' expected = VariableSection( header=SectionHeader(tokens=[ Token(Token.VARIABLE_HEADER, '*** Variables ***', 1, 0) ]), body=[ Variable(tokens=[ Token(Token.VARIABLE, 'Ooops', 2, 0), Token(Token.ARGUMENT, 'I did it again', 2, 10) ], errors=("Invalid variable name 'Ooops'.", )), Variable(tokens=[ Token(Token.VARIABLE, '${}', 3, 0), Token(Token.ARGUMENT, 'invalid', 3, 10) ], errors=("Invalid variable name '${}'.", )), Variable(tokens=[ Token(Token.VARIABLE, '${x}==', 4, 0), Token(Token.ARGUMENT, 'invalid', 4, 10) ], errors=("Invalid variable name '${x}=='.", )), Variable(tokens=[ Token(Token.VARIABLE, '${not', 5, 0), Token(Token.ARGUMENT, 'closed', 5, 10) ], errors=("Invalid variable name '${not'.", )), Variable(tokens=[ Token(Token.VARIABLE, '', 6, 0), Token(Token.ARGUMENT, 'invalid', 6, 10) ], errors=("Invalid variable name ''.", )), Variable( tokens=[ Token(Token.VARIABLE, '&{dict}', 7, 0), Token(Token.ARGUMENT, 'invalid', 7, 10), Token(Token.ARGUMENT, '${invalid}', 7, 21) ], errors= ("Invalid dictionary variable item 'invalid'. " "Items must use 'name=value' syntax or be dictionary variables themselves.", "Invalid dictionary variable item '${invalid}'. " "Items must use 'name=value' syntax or be dictionary variables themselves." )), ]) get_and_assert_model(data, expected, depth=0)
def test_Variable(self): # ${variable_name} {'a': 4, 'b': 'abc'} tokens = [ Token(Token.VARIABLE, '${variable_name}'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, "{'a': 4, 'b': 'abc'}"), Token(Token.EOL, '\n') ] assert_created_statement(tokens, Variable, name='${variable_name}', value="{'a': 4, 'b': 'abc'}") # ${var} first second third # @{var} first second third # &{var} first second third for name in ['${var}', '@{var}', '&{var}']: tokens = [ Token(Token.VARIABLE, name), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'first'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'second'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'third'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, Variable, name=name, value=['first', 'second', 'third'])
DATA = ''' *** Test Cases *** Example Keyword arg ... argh *** Keywords *** Keyword [Arguments] ${arg1} ${arg2} Log Got ${arg1} and ${arg}! ''' PATH = os.path.join( os.getenv('TEMPDIR') or tempfile.gettempdir(), 'test_model.robot') EXPECTED = File(sections=[ CommentSection(body=[EmptyLine([Token('EOL', '\n', 1, 0)])]), TestCaseSection(header=TestCaseSectionHeader([ Token('TESTCASE_HEADER', '*** Test Cases ***', 2, 0), Token('EOL', '\n', 2, 18) ]), body=[ TestCase(header=TestCaseName([ Token('TESTCASE_NAME', 'Example', 3, 0), Token('EOL', '\n', 3, 7) ]), body=[ KeywordCall([ Token('SEPARATOR', ' ', 4, 0), Token('KEYWORD', 'Keyword', 4, 4), Token('SEPARATOR', ' ', 4, 11), Token('ARGUMENT', 'arg', 4, 15),
def test_try_except_else_finally(self): data = ''' *** Test Cases *** Example TRY Fail Oh no! EXCEPT does not match No operation EXCEPT AS ${exp} Log Catch ELSE No operation FINALLY Log finally here! END ''' expected = Try( header=TryHeader([Token(Token.TRY, 'TRY', 3, 4)]), body=[ KeywordCall([ Token(Token.KEYWORD, 'Fail', 4, 8), Token(Token.ARGUMENT, 'Oh no!', 4, 16) ]) ], next=Try( header=ExceptHeader([ Token(Token.EXCEPT, 'EXCEPT', 5, 4), Token(Token.ARGUMENT, 'does not match', 5, 14) ]), body=[ KeywordCall((Token(Token.KEYWORD, 'No operation', 6, 8), )) ], next=Try(header=ExceptHeader( (Token(Token.EXCEPT, 'EXCEPT', 7, 4), Token(Token.AS, 'AS', 7, 14), Token(Token.VARIABLE, '${exp}', 7, 20))), body=[ KeywordCall((Token(Token.KEYWORD, 'Log', 8, 8), Token(Token.ARGUMENT, 'Catch', 8, 15))) ], next=Try(header=ElseHeader( (Token(Token.ELSE, 'ELSE', 9, 4), )), body=[ KeywordCall( (Token(Token.KEYWORD, 'No operation', 10, 8), )) ], next=Try( header=FinallyHeader( (Token(Token.FINALLY, 'FINALLY', 11, 4), )), body=[ KeywordCall( (Token(Token.KEYWORD, 'Log', 12, 8), Token(Token.ARGUMENT, 'finally here!', 12, 15))) ])))), end=End([Token(Token.END, 'END', 13, 4)])) get_and_assert_model(data, expected)
def test_KeywordCall(self): # Test # ${return1} ${return2} Keyword Call ${arg1} ${arg2} tokens = [ Token(Token.SEPARATOR, ' '), Token(Token.ASSIGN, '${return1}'), Token(Token.SEPARATOR, ' '), Token(Token.ASSIGN, '${return2}'), Token(Token.SEPARATOR, ' '), Token(Token.KEYWORD, 'Keyword Call'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, '${arg1}'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, '${arg2}'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, KeywordCall, name='Keyword Call', assign=['${return1}', '${return2}'], args=['${arg1}', '${arg2}'])
def test_ExceptHeader(self): # EXCEPT tokens = [ Token(Token.SEPARATOR, ' '), Token(Token.EXCEPT), Token(Token.EOL, '\n') ] assert_created_statement(tokens, ExceptHeader) # EXCEPT one tokens = [ Token(Token.SEPARATOR, ' '), Token(Token.EXCEPT), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'one'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, ExceptHeader, patterns=['one']) # EXCEPT one two AS ${var} tokens = [ Token(Token.SEPARATOR, ' '), Token(Token.EXCEPT), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'one'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'two'), Token(Token.SEPARATOR, ' '), Token(Token.AS, 'AS'), Token(Token.SEPARATOR, ' '), Token(Token.VARIABLE, '${var}'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, ExceptHeader, patterns=['one', 'two'], variable='${var}') # EXCEPT Example: * type=glob tokens = [ Token(Token.SEPARATOR, ' '), Token(Token.EXCEPT), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'Example: *'), Token(Token.SEPARATOR, ' '), Token(Token.OPTION, 'type=glob'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, ExceptHeader, patterns=['Example: *'], type='glob') # EXCEPT Error \\d (x|y) type=regexp AS ${var} tokens = [ Token(Token.SEPARATOR, ' '), Token(Token.EXCEPT), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'Error \\d'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, '(x|y)'), Token(Token.SEPARATOR, ' '), Token(Token.OPTION, 'type=regexp'), Token(Token.SEPARATOR, ' '), Token(Token.AS, 'AS'), Token(Token.SEPARATOR, ' '), Token(Token.VARIABLE, '${var}'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, ExceptHeader, patterns=['Error \\d', '(x|y)'], type='regexp', variable='${var}')
def test_nested(self): model = get_model('''\ *** Test Cases *** Example IF ${x} Log ${x} IF ${y} Log ${y} ELSE Log ${z} END END ''', data_only=True) node = model.sections[0].body[0].body[0] expected = If(header=IfHeader([ Token(Token.IF, 'IF', 3, 4), Token(Token.ARGUMENT, '${x}', 3, 10), ]), body=[ KeywordCall([ Token(Token.KEYWORD, 'Log', 4, 8), Token(Token.ARGUMENT, '${x}', 4, 15) ]), If(header=IfHeader([ Token(Token.IF, 'IF', 5, 8), Token(Token.ARGUMENT, '${y}', 5, 14), ]), body=[ KeywordCall([ Token(Token.KEYWORD, 'Log', 6, 12), Token(Token.ARGUMENT, '${y}', 6, 19) ]) ], orelse=If(header=ElseHeader( [Token(Token.ELSE, 'ELSE', 7, 8)]), body=[ KeywordCall([ Token(Token.KEYWORD, 'Log', 8, 12), Token(Token.ARGUMENT, '${z}', 8, 19) ]) ]), end=End([Token(Token.END, 'END', 9, 8)])) ], end=End([Token(Token.END, 'END', 10, 4)])) assert_model(node, expected)
def test_Documentation(self): # Documentation Example documentation tokens = [ Token(Token.DOCUMENTATION, 'Documentation'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'Example documentation'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, Documentation, value='Example documentation') # Documentation First line. # ... Second line aligned. # ... # ... Second paragraph. tokens = [ Token(Token.DOCUMENTATION, 'Documentation'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'First line.'), Token(Token.EOL), Token(Token.CONTINUATION), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'Second line aligned.'), Token(Token.EOL), Token(Token.CONTINUATION), Token(Token.EOL), Token(Token.CONTINUATION), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'Second paragraph.'), Token(Token.EOL), ] assert_created_statement( tokens, Documentation, value='First line.\nSecond line aligned.\n\nSecond paragraph.') # Test/Keyword # [Documentation] First line # ... Second line aligned # ... # ... Second paragraph. tokens = [ Token(Token.SEPARATOR, ' '), Token(Token.DOCUMENTATION, '[Documentation]'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'First line.'), Token(Token.EOL), Token(Token.SEPARATOR, ' '), Token(Token.CONTINUATION), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'Second line aligned.'), Token(Token.EOL), Token(Token.SEPARATOR, ' '), Token(Token.CONTINUATION), Token(Token.EOL), Token(Token.SEPARATOR, ' '), Token(Token.CONTINUATION), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'Second paragraph.'), Token(Token.EOL), ] assert_created_statement( tokens, Documentation, value='First line.\nSecond line aligned.\n\nSecond paragraph.\n', indent=' ', separator=' ', settings_section=False)
def test_try_except_else_finally(self): for data_only in [True, False]: with self.subTest(data_only=data_only): model = get_model('''\ *** Test Cases *** Example TRY Fail Oh no! EXCEPT does not match No operation EXCEPT AS ${exp} Log Catch ELSE No operation FINALLY Log finally here! END ''', data_only=data_only) node = model.sections[0].body[0].body[0] expected = Try( header=TryHeader([Token(Token.TRY, 'TRY', 3, 4)]), body=[ KeywordCall([ Token(Token.KEYWORD, 'Fail', 4, 8), Token(Token.ARGUMENT, 'Oh no!', 4, 16) ]) ], next=Try( header=ExceptHeader([ Token(Token.EXCEPT, 'EXCEPT', 5, 4), Token(Token.ARGUMENT, 'does not match', 5, 13) ]), body=[ KeywordCall((Token(Token.KEYWORD, 'No operation', 6, 8), )) ], next=Try( header=ExceptHeader( (Token(Token.EXCEPT, 'EXCEPT', 7, 4), Token(Token.AS, 'AS', 7, 14), Token(Token.VARIABLE, '${exp}', 7, 20))), body=[ KeywordCall( (Token(Token.KEYWORD, 'Log', 8, 8), Token(Token.ARGUMENT, 'Catch', 8, 15))) ], next=Try(header=ElseHeader( (Token(Token.ELSE, 'ELSE', 9, 4), )), body=[ KeywordCall( (Token(Token.KEYWORD, 'No operation', 10, 8), )) ], next=Try(header=FinallyHeader( (Token(Token.FINALLY, 'FINALLY', 11, 4), )), body=[ KeywordCall( (Token( Token.KEYWORD, 'Log', 12, 8), Token( Token.ARGUMENT, 'finally here!', 12, 15))) ])))), end=End([Token(Token.END, 'END', 13, 4)])) if not data_only: RemoveNonDataTokensVisitor().visit(node) assert_model(node, expected)
def test_nested(self): model = get_model('''\ *** Test Cases *** Example FOR ${x} IN 1 2 FOR ${y} IN RANGE ${x} Log ${y} END END ''', data_only=True) loop = model.sections[0].body[0].body[0] expected = For(header=ForHeader([ Token(Token.FOR, 'FOR', 3, 4), Token(Token.VARIABLE, '${x}', 3, 11), Token(Token.FOR_SEPARATOR, 'IN', 3, 19), Token(Token.ARGUMENT, '1', 3, 25), Token(Token.ARGUMENT, '2', 3, 30), ]), body=[ For(header=ForHeader([ Token(Token.FOR, 'FOR', 4, 8), Token(Token.VARIABLE, '${y}', 4, 15), Token(Token.FOR_SEPARATOR, 'IN RANGE', 4, 23), Token(Token.ARGUMENT, '${x}', 4, 35), ]), body=[ KeywordCall([ Token(Token.KEYWORD, 'Log', 5, 12), Token(Token.ARGUMENT, '${y}', 5, 19) ]) ], end=End([Token(Token.END, 'END', 6, 8)])) ], end=End([Token(Token.END, 'END', 7, 4)])) assert_model(loop, expected)
def test_EmptyLine(self): tokens = [Token(Token.EOL, '\n')] assert_created_statement(tokens, EmptyLine, eol='\n')
def visit_Keyword(self, node): if not node.body.items or node != self.keywords[-1]: node.body.items.append(EmptyLine([Token(Token.EOL, self._newline)])) self.generic_visit(node) return node
def visit_Section(self, node): if node != self.sections[-1]: node.body.add(EmptyLine([Token(Token.EOL, self._newline)])) self.generic_visit(node) return node
def test_LibraryImport(self): # Library library_name.py tokens = [ Token(Token.LIBRARY, 'Library'), Token(Token.SEPARATOR, ' '), Token(Token.NAME, 'library_name.py'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, LibraryImport, name='library_name.py') # Library library_name.py 127.0.0.1 8080 tokens = [ Token(Token.LIBRARY, 'Library'), Token(Token.SEPARATOR, ' '), Token(Token.NAME, 'library_name.py'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, '127.0.0.1'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, '8080'), Token(Token.EOL, '\n') ] # Library library_name.py WITH NAME anothername tokens = [ Token(Token.LIBRARY, 'Library'), Token(Token.SEPARATOR, ' '), Token(Token.NAME, 'library_name.py'), Token(Token.SEPARATOR, ' '), Token(Token.WITH_NAME), Token(Token.SEPARATOR, ' '), Token(Token.NAME, 'anothername'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, LibraryImport, name='library_name.py', alias='anothername')
# Comment Keyword arg ...\targh \t\t *** Keywords *** # Comment continues Keyword [Arguments] ${arg1} ${arg2} Log Got ${arg1} and ${arg}! RETURN x ''' PATH = os.path.join( os.getenv('TEMPDIR') or tempfile.gettempdir(), 'test_model.robot') EXPECTED = File(sections=[ CommentSection(body=[EmptyLine([Token('EOL', '\n', 1, 0)])]), TestCaseSection(header=SectionHeader([ Token('TESTCASE HEADER', '*** Test Cases ***', 2, 0), Token('EOL', '\n', 2, 18) ]), body=[ EmptyLine([Token('EOL', '\n', 3, 0)]), TestCase(header=TestCaseName([ Token('TESTCASE NAME', 'Example', 4, 0), Token('EOL', '\n', 4, 7) ]), body=[ Comment([ Token('SEPARATOR', ' ', 5, 0), Token('COMMENT', '# Comment', 5, 2), Token('EOL', '\n', 5, 11),
def test_VariablesImport(self): # Variables variables.py tokens = [ Token(Token.VARIABLES, 'Variables'), Token(Token.SEPARATOR, ' '), Token(Token.NAME, 'variables.py'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, VariablesImport, name='variables.py') # Variables variables.py arg1 2 tokens = [ Token(Token.VARIABLES, 'Variables'), Token(Token.SEPARATOR, ' '), Token(Token.NAME, 'variables.py'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'arg1'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, '2'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, VariablesImport, name='variables.py', args=['arg1', '2'])
def test_nested(self): data = ''' *** Test Cases *** Example FOR ${x} IN 1 2 FOR ${y} IN RANGE ${x} Log ${y} END END ''' expected = For(header=ForHeader([ Token(Token.FOR, 'FOR', 3, 4), Token(Token.VARIABLE, '${x}', 3, 11), Token(Token.FOR_SEPARATOR, 'IN', 3, 19), Token(Token.ARGUMENT, '1', 3, 25), Token(Token.ARGUMENT, '2', 3, 30), ]), body=[ For(header=ForHeader([ Token(Token.FOR, 'FOR', 4, 8), Token(Token.VARIABLE, '${y}', 4, 15), Token(Token.FOR_SEPARATOR, 'IN RANGE', 4, 23), Token(Token.ARGUMENT, '${x}', 4, 35), ]), body=[ KeywordCall([ Token(Token.KEYWORD, 'Log', 5, 12), Token(Token.ARGUMENT, '${y}', 5, 19) ]) ], end=End([Token(Token.END, 'END', 6, 8)])) ], end=End([Token(Token.END, 'END', 7, 4)])) get_and_assert_model(data, expected)
def test_Metadata(self): tokens = [ Token(Token.METADATA, 'Metadata'), Token(Token.SEPARATOR, ' '), Token(Token.NAME, 'Key'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'Value'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, Metadata, name='Key', value='Value') tokens = [ Token(Token.METADATA, 'Metadata'), Token(Token.SEPARATOR, ' '), Token(Token.NAME, 'Key'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'First line'), Token(Token.EOL, '\n'), Token(Token.CONTINUATION), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, 'Second line'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, Metadata, name='Key', value='First line\nSecond line')
def test_nested(self): data = ''' *** Test Cases *** Example IF ${x} Log ${x} IF ${y} Log ${y} ELSE Log ${z} END END ''' expected = If(header=IfHeader([ Token(Token.IF, 'IF', 3, 4), Token(Token.ARGUMENT, '${x}', 3, 10), ]), body=[ KeywordCall([ Token(Token.KEYWORD, 'Log', 4, 8), Token(Token.ARGUMENT, '${x}', 4, 15) ]), If(header=IfHeader([ Token(Token.IF, 'IF', 5, 8), Token(Token.ARGUMENT, '${y}', 5, 14), ]), body=[ KeywordCall([ Token(Token.KEYWORD, 'Log', 6, 12), Token(Token.ARGUMENT, '${y}', 6, 19) ]) ], orelse=If(header=ElseHeader( [Token(Token.ELSE, 'ELSE', 7, 8)]), body=[ KeywordCall([ Token(Token.KEYWORD, 'Log', 8, 12), Token(Token.ARGUMENT, '${z}', 8, 19) ]) ]), end=End([Token(Token.END, 'END', 9, 8)])) ], end=End([Token(Token.END, 'END', 10, 4)])) get_and_assert_model(data, expected)
def test_ForHeader(self): # Keyword # FOR ${value1} ${value2} IN ZIP ${list1} ${list2} tokens = [ Token(Token.SEPARATOR, ' '), Token(Token.FOR), Token(Token.SEPARATOR, ' '), Token(Token.VARIABLE, '${value1}'), Token(Token.SEPARATOR, ' '), Token(Token.VARIABLE, '${value2}'), Token(Token.SEPARATOR, ' '), Token(Token.FOR_SEPARATOR, 'IN ZIP'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, '${list1}'), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, '${list2}'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, ForHeader, flavor='IN ZIP', variables=['${value1}', '${value2}'], values=['${list1}', '${list2}'], separator=' ')
def test_invalid(self): data1 = ''' *** Test Cases *** Example ${x} = ${y} IF ELSE ooops ELSE IF ''' data2 = ''' *** Test Cases *** Example IF e K ELSE ''' expected1 = If( header=InlineIfHeader([ Token(Token.ASSIGN, '${x} =', 3, 4), Token(Token.ASSIGN, '${y}', 3, 14), Token(Token.INLINE_IF, 'IF', 3, 22), Token(Token.ARGUMENT, 'ELSE', 3, 28) ]), body=[KeywordCall([Token(Token.KEYWORD, 'ooops', 3, 36)])], orelse=If( header=ElseIfHeader( [Token(Token.ELSE_IF, 'ELSE IF', 3, 45)], errors=('ELSE IF must have a condition.', )), errors=('ELSE IF branch cannot be empty.', ), ), end=End([Token(Token.END, '', 3, 52)])) expected2 = If(header=InlineIfHeader([ Token(Token.INLINE_IF, 'IF', 3, 4), Token(Token.ARGUMENT, 'e', 3, 10) ]), body=[KeywordCall([Token(Token.KEYWORD, 'K', 3, 15)])], orelse=If( header=ElseHeader( [Token(Token.ELSE, 'ELSE', 3, 20)]), errors=('ELSE branch cannot be empty.', ), ), end=End([Token(Token.END, '', 3, 24)])) get_and_assert_model(data1, expected1) get_and_assert_model(data2, expected2)
def test_WhileHeader(self): # WHILE $cond tokens = [ Token(Token.SEPARATOR, ' '), Token(Token.WHILE), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, '$cond'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, WhileHeader, condition='$cond') # WHILE $cond limit=100s tokens = [ Token(Token.SEPARATOR, ' '), Token(Token.WHILE), Token(Token.SEPARATOR, ' '), Token(Token.ARGUMENT, '$cond'), Token(Token.SEPARATOR, ' '), Token(Token.OPTION, 'limit=100s'), Token(Token.EOL, '\n') ] assert_created_statement(tokens, WhileHeader, condition='$cond', limit='100s')
def visit_TestCaseSection(self, node): self.generic_visit(node) node.body.items.append( TestCase(Name([Token('NAME', 'Added'), Token('EOL', '\n')]))) return node