def test_line_in_context(file_name):
    line = line_in_context(
        line='a simple line of text',
        context=context(file=file_name, line=45),
    )
    assert line.context.file == file_name
    assert line.context.line == 45
    assert line.line == 'a simple line of text'
    line = line_in_context('a simple line of text', context(file_name, 45))
    assert line.context.file == file_name
    assert line.context.line == 45
    assert line.line == 'a simple line of text'
def test_add_context(file_name):
    lines = (
        'line1',
        'line2',
        'line3',
    )
    expected = (
        line_in_context(context=context(file=file_name, line=1), line='line1'),
        line_in_context(context=context(file=file_name, line=2), line='line2'),
        line_in_context(context=context(file=file_name, line=3), line='line3'),
    )
    result = tuple(add_context(file=file_name, lines=lines))
    assert expected == result
def test_statement_to_comment(context_gen):
    comment_statments = (
        line_in_context('# a comment line', context_gen(1)),
        line_in_context('#', context_gen(2)),
        line_in_context('', context_gen(3)),
    )
    expected_objects = (
        comment(' a comment line', context_gen(1)),
        comment('', context_gen(2)),
        comment('', context_gen(3)),
    )
    for sttmt, expected in _it.izip(comment_statments, expected_objects):
        result = statement_to_comment(sttmt)
        assert expected == result

    bad_statements = (
        line_in_context('  # indented comment', context_gen(4)),
        line_in_context('command arg1:arg2', context_gen(5)),
        line_in_context('command', context_gen(6)),
        line_in_context('command args  # not a comment', context_gen(7)),
    )
    exception_contexts = tuple(context_gen(i) for i in range(4, 8))
    for sttmt, exp_ctx in _it.izip(bad_statements, exception_contexts):
        with pytest.raises(VirtSyntaxError) as err:
            statement_to_comment(sttmt)
        assert exp_ctx == err.value.context
def test_add_context_nested(file_name, some_context):
    lines = (
        'line1',
        'line2',
        'line3',
    )
    ctx = (
        nested_context(file_name, cnt, some_context) for cnt in _it.count(1)
    )
    expected = (
        line_in_context(context=next(ctx), line='line1'),
        line_in_context(context=next(ctx), line='line2'),
        line_in_context(context=next(ctx), line='line3'),
    )
    result = tuple(
        add_context(file=file_name, lines=lines, nest_in=some_context)
    )
    assert expected == result
def test_statement_to_command(context_gen):
    command_statements = (
        line_in_context(' # indented comment', context_gen(1)),
        line_in_context('command arg1:arg2', context_gen(2)),
        line_in_context('command ', context_gen(3)),
        line_in_context('command', context_gen(4)),
        line_in_context('command   args  # not a comment', context_gen(5)),
    )
    expected_objects = (
        command('', '# indented comment', context_gen(1)),
        command('command', 'arg1:arg2', context_gen(2)),
        command('command', '', context_gen(3)),
        command('command', None, context_gen(4)),
        command('command', '  args  # not a comment', context_gen(5)),
    )
    for sttmt, expected in _it.izip(command_statements, expected_objects):
        result = statement_to_command(sttmt)
        assert expected == result
def test_lines_to_statements(file_name):
    lines = add_context(file=file_name, lines=(
        'line1\n',
        '  line2  \n',
        'line3 part1\\\n',
        'line3 part2\n',
        'line \\ number 4\n',
        'line5 part1\\\n',
        '  line5\\ part2\\\n',
        'line5 part3\n',
        'line6',
    ))
    expected = (
        line_in_context('line1', context(file_name, 1)),
        line_in_context('  line2  ', context(file_name, 2)),
        line_in_context('line3 part1\nline3 part2', context(file_name, 3)),
        line_in_context('line \\ number 4', context(file_name, 5)),
        line_in_context(
            'line5 part1\n  line5\\ part2\nline5 part3',
            context(file_name, 6)
        ),
        line_in_context('line6', context(file_name, 9)),
    )
    result = tuple(lines_to_statements(lines))
    assert expected == result