示例#1
0
    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_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)
示例#3
0
    def test_invalid(self):
        model = get_model('''\
*** Test Cases ***
Example
    FOR
    END    ooops

    FOR    wrong    IN
''',
                          data_only=True)
        loop1, loop2 = model.sections[0].body[0].body
        expected1 = For(header=ForHeader(
            tokens=[Token(Token.FOR, 'FOR', 3, 4)],
            errors=('FOR loop has no loop variables.',
                    "FOR loop has no 'IN' or other valid separator."),
        ),
                        end=End(tokens=[
                            Token(Token.END, 'END', 4, 4),
                            Token(Token.ARGUMENT, 'ooops', 4, 11)
                        ],
                                errors=('END does not accept arguments.', )),
                        errors=('FOR loop has empty body.', ))
        expected2 = For(header=ForHeader(
            tokens=[
                Token(Token.FOR, 'FOR', 6, 4),
                Token(Token.VARIABLE, 'wrong', 6, 11),
                Token(Token.FOR_SEPARATOR, 'IN', 6, 20)
            ],
            errors=("FOR loop has invalid loop variable 'wrong'.",
                    "FOR loop has no loop values."),
        ),
                        errors=('FOR loop has empty body.',
                                'FOR loop has no closing END.'))
        assert_model(loop1, expected1)
        assert_model(loop2, expected2)
示例#4
0
    def test_break(self):
        model = get_model('''\
*** Keywords ***
Name
    WHILE    True
        Break    BREAK
        BREAK
    END
''',
                          data_only=True)
        expected = KeywordSection(
            header=SectionHeader(
                tokens=[Token(Token.KEYWORD_HEADER, '*** Keywords ***', 1, 0)
                        ]),
            body=[
                Keyword(
                    header=KeywordName(
                        tokens=[Token(Token.KEYWORD_NAME, 'Name', 2, 0)]),
                    body=[
                        While(header=WhileHeader([
                            Token(Token.WHILE, 'WHILE', 3, 4),
                            Token(Token.ARGUMENT, 'True', 3, 13)
                        ]),
                              body=[
                                  KeywordCall([
                                      Token(Token.KEYWORD, 'Break', 4, 8),
                                      Token(Token.ARGUMENT, 'BREAK', 4, 17)
                                  ]),
                                  Break([Token(Token.BREAK, 'BREAK', 5, 8)])
                              ],
                              end=End([Token(Token.END, 'END', 6, 4)]))
                    ],
                )
            ])
        assert_model(model.sections[0], expected)
示例#5
0
    def test_nested(self):
        model = get_model('''\
*** Test Cases ***
Example
    IF    ${x}    IF    ${y}    K1    ELSE    IF    ${z}    K2
''', data_only=True)
        node = model.sections[0].body[0].body[0]
        expected = If(
            header=InlineIfHeader([Token(Token.INLINE_IF, 'IF', 3, 4),
                                   Token(Token.ARGUMENT, '${x}', 3, 10)]),
            body=[If(
                header=InlineIfHeader([Token(Token.INLINE_IF, 'IF', 3, 18),
                                       Token(Token.ARGUMENT, '${y}', 3, 24)]),
                body=[KeywordCall([Token(Token.KEYWORD, 'K1', 3, 32)])],
                orelse=If(
                    header=ElseHeader([Token(Token.ELSE, 'ELSE', 3, 38)]),
                    body=[If(
                        header=InlineIfHeader([Token(Token.INLINE_IF, 'IF', 3, 46),
                                               Token(Token.ARGUMENT, '${z}', 3, 52)]),
                        body=[KeywordCall([Token(Token.KEYWORD, 'K2', 3, 60)])],
                        end=End([Token(Token.END, '', 3, 62)]),
                    )],
                ),
                errors=('Inline IF cannot be nested.',),
            )],
            errors=('Inline IF cannot be nested.',),
        )
        assert_model(node, expected)
示例#6
0
    def test_if_else_if_else(self):
        data = '''
*** Test Cases ***
Example
    IF    True
        K1
    ELSE IF    False
        K2
    ELSE
        K3
    END
    '''
        expected = If(
            header=IfHeader([
                Token(Token.IF, 'IF', 3, 4),
                Token(Token.ARGUMENT, 'True', 3, 10),
            ]),
            body=[KeywordCall([Token(Token.KEYWORD, 'K1', 4, 8)])],
            orelse=If(
                header=ElseIfHeader([
                    Token(Token.ELSE_IF, 'ELSE IF', 5, 4),
                    Token(Token.ARGUMENT, 'False', 5, 15),
                ]),
                body=[KeywordCall([Token(Token.KEYWORD, 'K2', 6, 8)])],
                orelse=If(
                    header=ElseHeader([
                        Token(Token.ELSE, 'ELSE', 7, 4),
                    ]),
                    body=[KeywordCall([Token(Token.KEYWORD, 'K3', 8, 8)])],
                )),
            end=End([Token(Token.END, 'END', 9, 4)]))
        get_and_assert_model(data, expected)
示例#7
0
    def test_continue(self):
        model = get_model('''\
*** Keywords ***
Name
    FOR    ${x}    IN    @{stuff}
        Continue    CONTINUE
        CONTINUE
    END
''', data_only=True)
        expected = KeywordSection(
            header=SectionHeader(
                tokens=[Token(Token.KEYWORD_HEADER, '*** Keywords ***', 1, 0)]
            ),
            body=[
                Keyword(
                    header=KeywordName(
                        tokens=[Token(Token.KEYWORD_NAME, 'Name', 2, 0)]
                    ),
                    body=[
                        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, '@{stuff}', 3, 25)]),
                            body=[KeywordCall([Token(Token.KEYWORD, 'Continue', 4, 8),
                                               Token(Token.ARGUMENT, 'CONTINUE', 4, 20)]),
                                  Continue([Token(Token.CONTINUE, 'CONTINUE', 5, 8)])],
                            end=End([Token(Token.END, 'END', 6, 4)])
                        )
                    ],
                )
            ]
        )
        assert_model(model.sections[0], expected)
示例#8
0
    def test_valid(self):
        model = get_model('''\
*** Test Cases ***
Example
    FOR    ${x}    IN    a    b    c
        Log    ${x}
    END
''',
                          data_only=True)
        loop = model.sections[0].body[0].body[0]
        expected = ForLoop(header=ForLoopHeader([
            Token(Token.FOR, 'FOR', 3, 4),
            Token(Token.VARIABLE, '${x}', 3, 11),
            Token(Token.FOR_SEPARATOR, 'IN', 3, 19),
            Token(Token.ARGUMENT, 'a', 3, 25),
            Token(Token.ARGUMENT, 'b', 3, 30),
            Token(Token.ARGUMENT, 'c', 3, 35),
        ]),
                           body=[
                               KeywordCall([
                                   Token(Token.KEYWORD, 'Log', 4, 8),
                                   Token(Token.ARGUMENT, '${x}', 4, 15)
                               ])
                           ],
                           end=End([Token(Token.END, 'END', 5, 4)]))
        assert_model(loop, expected)
示例#9
0
    def test_if_else_if_else(self):
        model = get_model('''\
*** Test Cases ***
Example
    IF    True
        K1
    ELSE IF    False
        K2
    ELSE
        K3
    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, 'True', 3, 10),
            ]),
            body=[KeywordCall([Token(Token.KEYWORD, 'K1', 4, 8)])],
            orelse=If(
                header=ElseIfHeader([
                    Token(Token.ELSE_IF, 'ELSE IF', 5, 4),
                    Token(Token.ARGUMENT, 'False', 5, 15),
                ]),
                body=[KeywordCall([Token(Token.KEYWORD, 'K2', 6, 8)])],
                orelse=If(
                    header=ElseHeader([
                        Token(Token.ELSE, 'ELSE', 7, 4),
                    ]),
                    body=[KeywordCall([Token(Token.KEYWORD, 'K3', 8, 8)])],
                )),
            end=End([Token(Token.END, 'END', 9, 4)]))
        assert_model(node, expected)
示例#10
0
 def visit_ForLoop(self, loop):
     loop.header.data_tokens[0].value = 'FOR'
     if loop.end:
         loop.end.data_tokens[0].value = 'END'
     else:
         loop.end = End([Token(Token.SEPARATOR), Token(Token.END, 'END')])
     self.generic_visit(loop)
     return loop
示例#11
0
    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)
示例#12
0
    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 = ForLoop(
            header=ForLoopHeader([
                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=[
                ForLoop(
                    header=ForLoopHeader([
                        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)
        assert_equal(loop.error, None)
示例#13
0
    def test_invalid(self):
        model = get_model('''\
*** Test Cases ***
Example
    IF    too    many
    ELSE    ooops
    ELSE IF
    END    ooops

    IF
''', data_only=True)
        if1, if2 = model.sections[0].body[0].body
        expected1 = If(
            header=IfHeader(
                tokens=[Token(Token.IF, 'IF', 3, 4),
                        Token(Token.ARGUMENT, 'too', 3, 10),
                        Token(Token.ARGUMENT, 'many', 3, 17)],
                errors=('IF has more than one condition.',)
            ),
            orelse=If(
                header=ElseHeader(
                    tokens=[Token(Token.ELSE, 'ELSE', 4, 4),
                            Token(Token.ARGUMENT, 'ooops', 4, 12)],
                    errors=('ELSE has condition.',)
                ),
                orelse=If(
                    header=ElseIfHeader(
                        tokens=[Token(Token.ELSE_IF, 'ELSE IF', 5, 4)],
                        errors=('ELSE IF has no condition.',)
                    ),
                    errors=('ELSE IF has empty body.',)
                ),
                errors=('ELSE has empty body.',)
            ),
            end=End(
                tokens=[Token(Token.END, 'END', 6, 4),
                        Token(Token.ARGUMENT, 'ooops', 6, 11)],
                errors=('END does not accept arguments.',)
            ),
            errors=('IF has empty body.',
                    'ELSE IF after ELSE.')
        )
        expected2 = If(
            header=IfHeader(
                tokens=[Token(Token.IF, 'IF', 8, 4)],
                errors=('IF has no condition.',)
            ),
            errors=('IF has empty body.',
                    'IF has no closing END.')
        )
        assert_model(if1, expected1)
        assert_model(if2, expected2)
示例#14
0
    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)
示例#15
0
    def test_if(self):
        model = get_model('''\
*** Test Cases ***
Example
    IF    True    Keyword
''', data_only=True)
        node = model.sections[0].body[0].body[0]
        expected = If(
            header=InlineIfHeader([Token(Token.INLINE_IF, 'IF', 3, 4),
                                   Token(Token.ARGUMENT, 'True', 3, 10)]),
            body=[KeywordCall([Token(Token.KEYWORD, 'Keyword', 3, 18)])],
            end=End([Token(Token.END, '', 3, 25)])
        )
        assert_model(node, expected)
示例#16
0
    def test_if(self):
        data = '''
*** Test Cases ***
Example
    IF    True    Keyword
'''
        expected = If(
            header=InlineIfHeader([
                Token(Token.INLINE_IF, 'IF', 3, 4),
                Token(Token.ARGUMENT, 'True', 3, 10)
            ]),
            body=[KeywordCall([Token(Token.KEYWORD, 'Keyword', 3, 18)])],
            end=End([Token(Token.END, '', 3, 25)]))
        get_and_assert_model(data, expected)
示例#17
0
    def test_assign_only_inside(self):
        data = '''
*** Test Cases ***
Example
    IF    ${cond}    ${assign}
'''
        expected = If(
            header=InlineIfHeader([
                Token(Token.INLINE_IF, 'IF', 3, 4),
                Token(Token.ARGUMENT, '${cond}', 3, 10)
            ]),
            body=[KeywordCall([Token(Token.ASSIGN, '${assign}', 3, 21)])],
            end=End([Token(Token.END, '', 3, 30)]),
            errors=('Inline IF branches cannot contain assignments.', ))
        get_and_assert_model(data, expected)
示例#18
0
    def test_assign(self):
        model = get_model('''\
*** Test Cases ***
Example
    ${x} =    IF    True    K1    ELSE    K2
''', data_only=True)
        node = model.sections[0].body[0].body[0]
        expected = If(
            header=InlineIfHeader([Token(Token.ASSIGN, '${x} =', 3, 4),
                                   Token(Token.INLINE_IF, 'IF', 3, 14),
                                   Token(Token.ARGUMENT, 'True', 3, 20)]),
            body=[KeywordCall([Token(Token.KEYWORD, 'K1', 3, 28)])],
            orelse=If(
                header=ElseHeader([Token(Token.ELSE, 'ELSE', 3, 34)]),
                body=[KeywordCall([Token(Token.KEYWORD, 'K2', 3, 42)])],
            ),
            end=End([Token(Token.END, '', 3, 44)])
        )
        assert_model(node, expected)
示例#19
0
    def test_assign(self):
        data = '''
*** Test Cases ***
Example
    ${x} =    IF    True    K1    ELSE    K2
'''
        expected = If(
            header=InlineIfHeader([
                Token(Token.ASSIGN, '${x} =', 3, 4),
                Token(Token.INLINE_IF, 'IF', 3, 14),
                Token(Token.ARGUMENT, 'True', 3, 20)
            ]),
            body=[KeywordCall([Token(Token.KEYWORD, 'K1', 3, 28)])],
            orelse=If(
                header=ElseHeader([Token(Token.ELSE, 'ELSE', 3, 34)]),
                body=[KeywordCall([Token(Token.KEYWORD, 'K2', 3, 42)])],
            ),
            end=End([Token(Token.END, '', 3, 44)]))
        get_and_assert_model(data, expected)
示例#20
0
    def test_invalid(self):
        data = '''
*** Test Cases ***
Example
    WHILE    too    many    values
        # Empty body
    END
'''
        expected = While(header=WhileHeader(
            tokens=[
                Token(Token.WHILE, 'WHILE', 3, 4),
                Token(Token.ARGUMENT, 'too', 3, 13),
                Token(Token.ARGUMENT, 'many', 3, 20),
                Token(Token.ARGUMENT, 'values', 3, 28)
            ],
            errors=('WHILE cannot have more than one condition.', )),
                         end=End([Token(Token.END, 'END', 5, 4)]),
                         errors=('WHILE loop cannot be empty.', ))
        get_and_assert_model(data, expected)
示例#21
0
    def test_invalid(self):
        data1 = '''
*** Test Cases ***
Example
    IF
    ELSE    ooops
        # Empty
    ELSE IF

    END    ooops
'''
        data2 = '''
*** Test Cases ***
Example
    IF
'''
        expected1 = If(
            header=IfHeader(tokens=[Token(Token.IF, 'IF', 3, 4)],
                            errors=('IF must have a condition.', )),
            orelse=If(header=ElseHeader(
                tokens=[
                    Token(Token.ELSE, 'ELSE', 4, 4),
                    Token(Token.ARGUMENT, 'ooops', 4, 12)
                ],
                errors=("ELSE does not accept arguments, got 'ooops'.", )),
                      orelse=If(header=ElseIfHeader(
                          tokens=[Token(Token.ELSE_IF, 'ELSE IF', 6, 4)],
                          errors=('ELSE IF must have a condition.', )),
                                errors=('ELSE IF branch cannot be empty.', )),
                      errors=('ELSE branch cannot be empty.', )),
            end=End(tokens=[
                Token(Token.END, 'END', 8, 4),
                Token(Token.ARGUMENT, 'ooops', 8, 11)
            ],
                    errors=("END does not accept arguments, got 'ooops'.", )),
            errors=('IF branch cannot be empty.',
                    'ELSE IF not allowed after ELSE.'))
        expected2 = If(header=IfHeader(tokens=[Token(Token.IF, 'IF', 3, 4)],
                                       errors=('IF must have a condition.', )),
                       errors=('IF branch cannot be empty.',
                               'IF must have closing END.'))
        get_and_assert_model(data1, expected1)
        get_and_assert_model(data2, expected2)
示例#22
0
    def test_valid(self):
        data = '''
*** Test Cases ***
Example
    WHILE    True
        Log    ${x}
    END
'''
        expected = While(header=WhileHeader([
            Token(Token.WHILE, 'WHILE', 3, 4),
            Token(Token.ARGUMENT, 'True', 3, 13),
        ]),
                         body=[
                             KeywordCall([
                                 Token(Token.KEYWORD, 'Log', 4, 8),
                                 Token(Token.ARGUMENT, '${x}', 4, 15)
                             ])
                         ],
                         end=End([Token(Token.END, 'END', 5, 4)]))
        get_and_assert_model(data, expected)
示例#23
0
    def test_invalid(self):
        model = get_model('''\
*** Test Cases ***
Example
    ${x} =    ${y}    IF    ELSE    ooops    ELSE IF
''', data_only=True)
        node = model.sections[0].body[0].body[0]
        expected = 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)])
        )
        assert_model(node, expected)
示例#24
0
    def test_nested(self):
        data = '''
*** Test Cases ***
Example
    IF    ${x}    IF    ${y}    K1    ELSE    IF    ${z}    K2
'''
        expected = If(
            header=InlineIfHeader([
                Token(Token.INLINE_IF, 'IF', 3, 4),
                Token(Token.ARGUMENT, '${x}', 3, 10)
            ]),
            body=[
                If(
                    header=InlineIfHeader([
                        Token(Token.INLINE_IF, 'IF', 3, 18),
                        Token(Token.ARGUMENT, '${y}', 3, 24)
                    ]),
                    body=[KeywordCall([Token(Token.KEYWORD, 'K1', 3, 32)])],
                    orelse=If(
                        header=ElseHeader([Token(Token.ELSE, 'ELSE', 3, 38)]),
                        body=[
                            If(
                                header=InlineIfHeader([
                                    Token(Token.INLINE_IF, 'IF', 3, 46),
                                    Token(Token.ARGUMENT, '${z}', 3, 52)
                                ]),
                                body=[
                                    KeywordCall(
                                        [Token(Token.KEYWORD, 'K2', 3, 60)])
                                ],
                                end=End([Token(Token.END, '', 3, 62)]),
                            )
                        ],
                    ),
                    errors=('Inline IF cannot be nested.', ),
                )
            ],
            errors=('Inline IF cannot be nested.', ),
        )
        get_and_assert_model(data, expected)
示例#25
0
    def test_break(self):
        data = '''
*** Keywords ***
Name
    WHILE    True
        Break    BREAK
        BREAK
    END
'''
        expected = While(header=WhileHeader([
            Token(Token.WHILE, 'WHILE', 3, 4),
            Token(Token.ARGUMENT, 'True', 3, 13)
        ]),
                         body=[
                             KeywordCall([
                                 Token(Token.KEYWORD, 'Break', 4, 8),
                                 Token(Token.ARGUMENT, 'BREAK', 4, 17)
                             ]),
                             Break([Token(Token.BREAK, 'BREAK', 5, 8)])
                         ],
                         end=End([Token(Token.END, 'END', 6, 4)]))
        get_and_assert_model(data, expected)
示例#26
0
    def test_try_except_else_finally(self):
        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=True)
        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)])
        )
        assert_model(node, expected)
示例#27
0
    def test_valid(self):
        model = get_model('''\
*** Test Cases ***
Example
    WHILE    True
        Log    ${x}
    END
''',
                          data_only=True)
        loop = model.sections[0].body[0].body[0]
        expected = While(header=WhileHeader([
            Token(Token.WHILE, 'WHILE', 3, 4),
            Token(Token.ARGUMENT, 'True', 3, 13),
        ]),
                         body=[
                             KeywordCall([
                                 Token(Token.KEYWORD, 'Log', 4, 8),
                                 Token(Token.ARGUMENT, '${x}', 4, 15)
                             ])
                         ],
                         end=End([Token(Token.END, 'END', 5, 4)]))
        assert_model(loop, expected)
示例#28
0
    def test_if(self):
        data = '''
*** Test Cases ***
Example
    IF    True
        Keyword
        Another    argument
    END
    '''
        expected = If(header=IfHeader([
            Token(Token.IF, 'IF', 3, 4),
            Token(Token.ARGUMENT, 'True', 3, 10),
        ]),
                      body=[
                          KeywordCall([Token(Token.KEYWORD, 'Keyword', 4, 8)]),
                          KeywordCall([
                              Token(Token.KEYWORD, 'Another', 5, 8),
                              Token(Token.ARGUMENT, 'argument', 5, 19)
                          ])
                      ],
                      end=End([Token(Token.END, 'END', 6, 4)]))
        get_and_assert_model(data, expected)
示例#29
0
    def test_invalid(self):
        model = get_model('''\
*** Test Cases ***
Example
    IF
    ELSE    ooops
    ELSE IF
    END    ooops

    IF
''',
                          data_only=True)
        if1, if2 = model.sections[0].body[0].body
        expected1 = If(
            header=IfHeader(tokens=[Token(Token.IF, 'IF', 3, 4)],
                            errors=('IF must have a condition.', )),
            orelse=If(header=ElseHeader(
                tokens=[
                    Token(Token.ELSE, 'ELSE', 4, 4),
                    Token(Token.ARGUMENT, 'ooops', 4, 12)
                ],
                errors=("ELSE does not accept arguments, got 'ooops'.", )),
                      orelse=If(header=ElseIfHeader(
                          tokens=[Token(Token.ELSE_IF, 'ELSE IF', 5, 4)],
                          errors=('ELSE IF must have a condition.', )),
                                errors=('ELSE IF branch cannot be empty.', )),
                      errors=('ELSE branch cannot be empty.', )),
            end=End(tokens=[
                Token(Token.END, 'END', 6, 4),
                Token(Token.ARGUMENT, 'ooops', 6, 11)
            ],
                    errors=("END does not accept arguments, got 'ooops'.", )),
            errors=('IF branch cannot be empty.', 'ELSE IF after ELSE.'))
        expected2 = If(header=IfHeader(tokens=[Token(Token.IF, 'IF', 8, 4)],
                                       errors=('IF must have a condition.', )),
                       errors=('IF branch cannot be empty.',
                               'IF has no closing END.'))
        assert_model(if1, expected1)
        assert_model(if2, expected2)
示例#30
0
    def test_invalid(self):
        data1 = '''
*** Test Cases ***
Example
    FOR

    END    ooops
'''
        data2 = '''
*** Test Cases ***
Example
    FOR    wrong    IN
'''
        expected1 = For(
            header=ForHeader(
                tokens=[Token(Token.FOR, 'FOR', 3, 4)],
                errors=('FOR loop has no loop variables.',
                        "FOR loop has no 'IN' or other valid separator."),
            ),
            end=End(tokens=[
                Token(Token.END, 'END', 5, 4),
                Token(Token.ARGUMENT, 'ooops', 5, 11)
            ],
                    errors=("END does not accept arguments, got 'ooops'.", )),
            errors=('FOR loop cannot be empty.', ))
        expected2 = For(header=ForHeader(
            tokens=[
                Token(Token.FOR, 'FOR', 3, 4),
                Token(Token.VARIABLE, 'wrong', 3, 11),
                Token(Token.FOR_SEPARATOR, 'IN', 3, 20)
            ],
            errors=("FOR loop has invalid loop variable 'wrong'.",
                    "FOR loop has no loop values."),
        ),
                        errors=('FOR loop cannot be empty.',
                                'FOR loop must have closing END.'))
        get_and_assert_model(data1, expected1)
        get_and_assert_model(data2, expected2)