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)
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"
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
def test_partial_match(): f_obj = FakeFile("header.h", [ "#define FOO\n", "FOOBAR\n" ]) expected = "FOOBAR\n" run_case(f_obj, expected)
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)
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"
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)
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"
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"
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"
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"
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)
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"
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) == ""
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)
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))
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)
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")
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)
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)
def test_multiline_commented_quote(): lines = [" /* \n", " 'foo */\n"] f_obj = FakeFile("header.h", lines) run_case(f_obj, "\n")
def test_commented_quote(): text = "// 'foo\n" f_obj = FakeFile("header.h", [text]) run_case(f_obj, "\n")
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"
def test_char_token_simple(): f_obj = FakeFile("header.h", ["#define F 1\n", "'F'\n"]) expected = "'F'\n" run_case(f_obj, expected)
def test_string_token_special_characters(): line = '"!/-*+"\n' f_obj = FakeFile("header.h", [line]) expected = line run_case(f_obj, expected)
def test_define(): f_obj = FakeFile("header.h", ["#define FOO 1\n", "FOO\n"]) expected = "1\n" run_case(f_obj, expected)
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)
def test_space_macro_indentation(): f_obj = FakeFile("header.h", [ " #define FOO 1\n", " FOO\n"]) expected = " 1\n" run_case(f_obj, expected)
def test_define_simple__referential(): f_obj = FakeFile("header.h", ["#define FOO FOO\n", "FOO\n"]) expected = "FOO\n" run_case(f_obj, expected)
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))