예제 #1
0
def test_ifndef_fulfilled_define_allowed():
    f_obj = FakeFile("header.h", ["#ifndef FOO\n",
                                  "#define BAR 1\n",
                                  "#endif\n",
                                  "BAR\n"])
    expected = "1\n"
    run_case(f_obj, expected)
예제 #2
0
def test_ifdef_file_guard():
    other_header = "somedirectory/other.h"
    f_obj = FakeFile("header.h",
                     ['#include "%s"\n' % other_header])
    handler = FakeHandler({other_header: ["1\n"]})
    ret = preprocess(f_obj, header_handler=handler)
    assert "".join(ret) == "1\n"
예제 #3
0
def test_else_left_open_causes_error():
    f_obj = FakeFile("header.h", ["#ifdef FOO\n", "#else\n"])
    with pytest.raises(ParseError) as excinfo:
        "".join(preprocess(f_obj))
    s = str(excinfo.value)
    assert "else" in s
    assert "left open" in s
예제 #4
0
def test_partial_match():
    f_obj = FakeFile("header.h", [
                     "#define FOO\n",
                     "FOOBAR\n"
                     ])
    expected = "FOOBAR\n"
    run_case(f_obj, expected)
예제 #5
0
def test_define_indirect__reference_multiple():
    f_obj = FakeFile("header.h", ["#define I 1\n",
                                  "#define J I + 2\n",
                                  "#define K I + J\n",
                                  "I\n", "J\n", "K\n"])
    expected = "1\n1 + 2\n1 + 1 + 2\n"
    run_case(f_obj, expected)
예제 #6
0
def test_include_preresolved():
    f_obj = FakeFile("header.h", ['#include <other.h>\n'])
    header = "other.h"
    path = posixpath.join("subdirectory", header)
    handler = FakeHandler({path: ["1\n"]})
    handler.resolved[header] = path
    ret = preprocess(f_obj, header_handler=handler)
    assert "".join(ret) == "1\n"
예제 #7
0
def test_ifdef_with_comment():
    f_obj = FakeFile("header.h", [
        "#define FOO\n",
        "#ifdef FOO // comment\n",
        "1\n",
        "#endif\n"])
    expected = "1\n"
    run_case(f_obj, expected)
예제 #8
0
def test_include_local_fallback():
    other_header = "other.h"
    path = "bogus"
    f_obj = FakeFile("header.h", ['#include "%s"\n' % other_header])
    handler = FakeHandler({"%s/%s" % (path, other_header): ["2\n"]},
                          include_paths=[path])
    ret = preprocess(f_obj, header_handler=handler)
    assert "".join(ret) == "2\n"
예제 #9
0
def test_platform_constants():
    f_obj = FakeFile("header.h", ['#ifdef ODDPLATFORM\n',
                                  'ODDPLATFORM\n', '#endif\n'])
    const = {
        "ODDPLATFORM": [Token.from_string(None, "ODDPLATFORM")]
    }
    ret = preprocess(f_obj, platform_constants=const)
    assert "".join(ret) == "ODDPLATFORM\n"
예제 #10
0
def test_platform_undefine():
    with mock.patch(extract_platform_spec_path) as mock_spec:
        mock_spec.return_value = "Linux", "32bit"
        f_obj = FakeFile("header.h", [
            '#undef __i386__\n'
            '__i386__\n', ])
        ret = preprocess(f_obj)
        assert "".join(ret) == "__i386__\n"
예제 #11
0
def test_include_with_path_list():
    f_obj = FakeFile("header.h", ['#include <other.h>\n'])
    directory = "subdirectory"
    handler = FakeHandler({posixpath.join(directory,
                                          "other.h"): ["1\n"]})
    include_paths = [directory]
    ret = preprocess(f_obj, include_paths=include_paths,
                     header_handler=handler)
    assert "".join(ret) == "1\n"
예제 #12
0
def test_ifndef_else_undefined():
    f_obj = FakeFile("header.h", [
        "#ifndef A\n",
        "#define X 1\n",
        "#else\n",
        "#define X 0\n",
        "#endif\n",
        "X\n"])
    expected = "1\n"
    run_case(f_obj, expected)
예제 #13
0
def test_include_with_path_list_with_subdirectory():
    header_file = posixpath.join("nested", "other.h")
    include_path = "somedir"
    f_obj = FakeFile("header.h", ['#include <%s>\n' % header_file])
    handler = FakeHandler({posixpath.join(include_path,
                                          header_file): ["1\n"]})
    include_paths = [include_path]
    ret = preprocess(f_obj, include_paths=include_paths,
                     header_handler=handler)
    assert "".join(ret) == "1\n"
예제 #14
0
def test_ignore_include_path():
    f_obj = FakeFile("header.h", ['#include <other.h>\n'])
    handler = FakeHandler({posixpath.join("subdirectory",
                                          "other.h"): ["1\n"]})
    paths = ["subdirectory"]
    ignored = ["other.h"]
    ret = preprocess(f_obj, include_paths=paths,
                     header_handler=handler,
                     ignore_headers=ignored)
    assert "".join(ret) == ""
예제 #15
0
def test_define_inside_ifndef():
    f_obj = FakeFile("header.h", ["#ifndef MODULE\n",
                                  "#define MODULE\n",
                                  "#ifdef BAR\n",
                                  "5\n",
                                  "#endif\n",
                                  "1\n",
                                  "#endif\n"])

    expected = "1\n"
    run_case(f_obj, expected)
예제 #16
0
def test_fullfile_guard_ifndef_noskip():
    f_obj = FakeFile("header.h", ["""#include "other.h"\n""",
                                  "done\n"])
    handler = FakeHandler({"other.h": [
        "#ifndef X\n",
        "#endif\n"]})
    preprocessor = Preprocessor(header_handler=handler)
    ret = preprocessor.preprocess(f_obj)
    assert "".join(ret) == "done\n"
    assert not preprocessor.skip_file("other.h"), (
        "%s -> %s" % (preprocessor.include_once,
                      preprocessor.defines))
예제 #17
0
def test_complex_ignore():
    f_obj = FakeFile("header.h",
                     [
                         "#ifdef X\n",
                         "#define X 1\n",
                         "#ifdef X\n",
                         "#define X 2\n",
                         "#else\n",
                         "#define X 3\n",
                         "#endif\n",
                         "#define X 4\n",
                         "#endif\n",
                         "X\n"])
    expected = "X\n"
    run_case(f_obj, expected)
예제 #18
0
def test_pragma_once():
    f_obj = FakeFile("header.h", [
                     """#include "other.h"\n""",
                     """#include "other.h"\n""",
                     "X\n"])
    handler = FakeHandler({"other.h": [
        "#pragma once\n",
        "#ifdef X\n",
        "#define X 2\n",
        "#else\n",
        "#define X 1\n",
        "#endif\n"]})
    preprocessor = Preprocessor(header_handler=handler)
    ret = preprocessor.preprocess(f_obj)
    assert "".join(ret) == "1\n"
    assert preprocessor.skip_file("other.h")
예제 #19
0
def test_wchar_string():
    f_obj = FakeFile("header.h", ["#define L 1\n",
                                  'L"FOO"\n'])
    expected = 'L"FOO"\n'
    run_case(f_obj, expected)
예제 #20
0
def test_string_token_with_single_quote():
    f_obj = FakeFile("header.h", ["#define FOO 1\n",
                                  '"FOO\'"\n'])
    expected = '"FOO\'"\n'
    run_case(f_obj, expected)
예제 #21
0
def test_multiline_commented_quote():
    lines = [" /* \n",
             " 'foo */\n"]
    f_obj = FakeFile("header.h", lines)
    run_case(f_obj, "\n")
예제 #22
0
def test_commented_quote():
    text = "// 'foo\n"
    f_obj = FakeFile("header.h", [text])
    run_case(f_obj, "\n")
예제 #23
0
def test_repeated_macro():
    f_obj = FakeFile("header.h", [
        '#define A value\n'
        'A A\n', ])
    ret = preprocess(f_obj)
    assert "".join(ret) == "value value\n"
예제 #24
0
def test_char_token_simple():
    f_obj = FakeFile("header.h", ["#define F 1\n",
                                  "'F'\n"])
    expected = "'F'\n"
    run_case(f_obj, expected)
예제 #25
0
def test_string_token_special_characters():
    line = '"!/-*+"\n'
    f_obj = FakeFile("header.h", [line])
    expected = line
    run_case(f_obj, expected)
예제 #26
0
def test_define():
    f_obj = FakeFile("header.h", ["#define FOO 1\n",
                                  "FOO\n"])
    expected = "1\n"
    run_case(f_obj, expected)
예제 #27
0
def test_multiline_define():
    f_obj = FakeFile("header.h", ["#define FOO \\\n",
                                  "\t1\n",
                                  "FOO\n"])
    expected = "\\\n\t1\n"
    run_case(f_obj, expected)
예제 #28
0
def test_space_macro_indentation():
    f_obj = FakeFile("header.h", [
        "    #define FOO 1\n",
        "    FOO\n"])
    expected = "    1\n"
    run_case(f_obj, expected)
예제 #29
0
def test_define_simple__referential():
    f_obj = FakeFile("header.h", ["#define FOO FOO\n",
                                  "FOO\n"])
    expected = "FOO\n"
    run_case(f_obj, expected)
예제 #30
0
def test_include_missing_local_file():
    other_header = posixpath.join("somedirectory", "other.h")
    f_obj = FakeFile("header.h", ['#include "%s"\n' % other_header])
    handler = FakeHandler({})
    with pytest.raises(ParseError):
        "".join(preprocess(f_obj, header_handler=handler))