diff --git a/.styleguide b/.styleguide index 6ffecfdd..d0f7a4da 100644 --- a/.styleguide +++ b/.styleguide @@ -1,33 +1,7 @@ -cppHeaderFileInclude { - \.h$ - \.hpp$ - \.inc$ -} - -cppSrcFileInclude { - \.cpp$ -} - -# Extra "/" used by unit tests generatedFileExclude { - /cpplint\.py$ + cpplint\.py$ } modifiableFileExclude { \.png$ } - -licenseUpdateExclude { - Excluded\.h$ -} - -# Ordered this way to ensure tests find longest match -includeGuardRoots { - wpiformat/ - wpiformat/Test/ -} - -# Used by unit tests -includeProject { - ^ctre/ -} diff --git a/.styleguide-license b/.styleguide-license index a3fccde8..77684828 100644 --- a/.styleguide-license +++ b/.styleguide-license @@ -1,2 +1 @@ -/*{padding}Company Name{padding}*/ -/* Copyright (c) {year} Company Name. All Rights Reserved.{padding}*/ +// Copyright (c) {year} FIRST diff --git a/wpiformat/wpiformat/test/tempdir.py b/wpiformat/wpiformat/test/tempdir.py new file mode 100644 index 00000000..f4efc385 --- /dev/null +++ b/wpiformat/wpiformat/test/tempdir.py @@ -0,0 +1,16 @@ +import os +import tempfile + + +class OpenTemporaryDirectory(): + + def __init__(self): + self.prev_dir = os.getcwd() + + def __enter__(self): + self.temp_dir = tempfile.TemporaryDirectory() + os.chdir(self.temp_dir.name) + return self.temp_dir + + def __exit__(self, type, value, traceback): + os.chdir(self.prev_dir) diff --git a/wpiformat/wpiformat/test/test_cidentlist.py b/wpiformat/wpiformat/test/test_cidentlist.py index 4daf1063..816b9631 100644 --- a/wpiformat/wpiformat/test/test_cidentlist.py +++ b/wpiformat/wpiformat/test/test_cidentlist.py @@ -1,6 +1,7 @@ import os from .tasktest import * +from .tempdir import * from wpiformat.cidentlist import CIdentList @@ -299,4 +300,16 @@ def test_cidentlist(): "}" + os.linesep) test.add_latest_input_as_output(True) - test.run(OutputType.FILE) + with OpenTemporaryDirectory(): + with open(".styleguide", "w") as file: + file.write(r"""cppHeaderFileInclude { + \.h$ + \.hpp$ + \.inc$ +} + +includeProject { + ^ctre/ +} +""") + test.run(OutputType.FILE) diff --git a/wpiformat/wpiformat/test/test_config.py b/wpiformat/wpiformat/test/test_config.py index cd8a9b96..97c45570 100644 --- a/wpiformat/wpiformat/test/test_config.py +++ b/wpiformat/wpiformat/test/test_config.py @@ -1,18 +1,39 @@ -import os - +from .tempdir import * from wpiformat.config import Config def test_config(): - config_file = Config(os.path.abspath(os.getcwd()), ".styleguide") - assert config_file.is_modifiable_file("." + os.sep + "wpiformat" + os.sep + - "javaguidelink.png") - assert config_file.is_generated_file("." + os.sep + "wpiformat" + os.sep + - "wpiformat" + os.sep + "cpplint.py") + with OpenTemporaryDirectory(): + with open(".styleguide", "w") as file: + file.write(r"""cppHeaderFileInclude { + \.h$ + \.inc$ +} + +cppSrcFileInclude { + \.cpp$ +} + +# Extra "/" used by unit tests +generatedFileExclude { + /cpplint\.py$ +} + +modifiableFileExclude { + \.png$ +} +""") + + config_file = Config(os.path.abspath(os.getcwd()), ".styleguide") + assert config_file.is_modifiable_file("." + os.sep + "wpiformat" + + os.sep + "javaguidelink.png") + assert config_file.is_generated_file("." + os.sep + "wpiformat" + + os.sep + "wpiformat" + os.sep + + "cpplint.py") - assert not config_file.is_generated_file("." + os.sep + "wpiformat" + - os.sep + "diff_cpplint.py") - assert not config_file.is_generated_file("." + os.sep + "wpiformat" + - os.sep + "update_cpplint.py") - assert not config_file.is_modifiable_file("." + os.sep + "wpiformat" + - os.sep + "license.txt") + assert not config_file.is_generated_file("." + os.sep + "wpiformat" + + os.sep + "diff_cpplint.py") + assert not config_file.is_generated_file("." + os.sep + "wpiformat" + + os.sep + "update_cpplint.py") + assert not config_file.is_modifiable_file("." + os.sep + "wpiformat" + + os.sep + "license.txt") diff --git a/wpiformat/wpiformat/test/test_includeguard.py b/wpiformat/wpiformat/test/test_includeguard.py index ffe2fbe6..ee44e325 100644 --- a/wpiformat/wpiformat/test/test_includeguard.py +++ b/wpiformat/wpiformat/test/test_includeguard.py @@ -1,6 +1,7 @@ import os from .tasktest import * +from .tempdir import * from wpiformat.includeguard import IncludeGuard from wpiformat.task import Task @@ -8,78 +9,86 @@ def test_includeguard(): test = TaskTest(IncludeGuard()) - repo_root = os.path.basename(Task.get_repo_root()).upper() + with OpenTemporaryDirectory(): + with open(".styleguide", "w") as file: + # Roots are ordered this way to ensure tests find longest match + file.write(r"""includeGuardRoots { + wpiformat/ + wpiformat/Test/ +} +""") + repo_root = os.path.basename(Task.get_repo_root()).upper() - # Fix incorrect include guard - test.add_input("./Test.h", - "#ifndef WRONG_H" + os.linesep + \ - "#define WRONG_C" + os.linesep + \ - os.linesep + \ - "#endif" + os.linesep) - test.add_output( - "#ifndef " + repo_root + "_TEST_H_" + os.linesep + \ - "#define " + repo_root + "_TEST_H_" + os.linesep + \ - os.linesep + \ - "#endif // " + repo_root + "_TEST_H_" + os.linesep, True, True) + # Fix incorrect include guard + test.add_input("./Test.h", + "#ifndef WRONG_H" + os.linesep + \ + "#define WRONG_C" + os.linesep + \ + os.linesep + \ + "#endif" + os.linesep) + test.add_output( + "#ifndef " + repo_root + "_TEST_H_" + os.linesep + \ + "#define " + repo_root + "_TEST_H_" + os.linesep + \ + os.linesep + \ + "#endif // " + repo_root + "_TEST_H_" + os.linesep, True, True) - # Ensure nested preprocessor statements are handled properly for incorrect - # include guard - test.add_input("./Test.h", - "#ifndef WRONG_H" + os.linesep + \ - "#define WRONG_C" + os.linesep + \ - os.linesep + \ - "#if SOMETHING" + os.linesep + \ - "// do something" + os.linesep + \ - "#endif" + os.linesep + \ - "#endif" + os.linesep) - test.add_output( - "#ifndef " + repo_root + "_TEST_H_" + os.linesep + \ - "#define " + repo_root + "_TEST_H_" + os.linesep + \ - os.linesep + \ - "#if SOMETHING" + os.linesep + \ - "// do something" + os.linesep + \ - "#endif" + os.linesep + \ - "#endif // " + repo_root + "_TEST_H_" + os.linesep, True, True) + # Ensure nested preprocessor statements are handled properly for incorrect + # include guard + test.add_input("./Test.h", + "#ifndef WRONG_H" + os.linesep + \ + "#define WRONG_C" + os.linesep + \ + os.linesep + \ + "#if SOMETHING" + os.linesep + \ + "// do something" + os.linesep + \ + "#endif" + os.linesep + \ + "#endif" + os.linesep) + test.add_output( + "#ifndef " + repo_root + "_TEST_H_" + os.linesep + \ + "#define " + repo_root + "_TEST_H_" + os.linesep + \ + os.linesep + \ + "#if SOMETHING" + os.linesep + \ + "// do something" + os.linesep + \ + "#endif" + os.linesep + \ + "#endif // " + repo_root + "_TEST_H_" + os.linesep, True, True) - # Don't touch correct include guard - test.add_input("./Test.h", - "#ifndef " + repo_root + "_TEST_H_" + os.linesep + \ - "#define " + repo_root + "_TEST_H_" + os.linesep + \ - os.linesep + \ - "#endif // " + repo_root + "_TEST_H_" + os.linesep) - test.add_latest_input_as_output(True) + # Don't touch correct include guard + test.add_input("./Test.h", + "#ifndef " + repo_root + "_TEST_H_" + os.linesep + \ + "#define " + repo_root + "_TEST_H_" + os.linesep + \ + os.linesep + \ + "#endif // " + repo_root + "_TEST_H_" + os.linesep) + test.add_latest_input_as_output(True) - # Fail on missing include guard - test.add_input("./Test.h", "// Empty file" + os.linesep) - test.add_latest_input_as_output(False) + # Fail on missing include guard + test.add_input("./Test.h", "// Empty file" + os.linesep) + test.add_latest_input_as_output(False) - # Verify pragma once counts as include guard - test.add_input("./Test.h", "#pragma once" + os.linesep) - test.add_latest_input_as_output(True) + # Verify pragma once counts as include guard + test.add_input("./Test.h", "#pragma once" + os.linesep) + test.add_latest_input_as_output(True) - # Ensure include guard roots are processed correctly - test.add_input("./Test.h", - "#ifndef " + repo_root + "_WPIFORMAT_TEST_H_" + os.linesep + \ - "#define " + repo_root + "_WPIFORMAT_TEST_H_" + os.linesep + \ - os.linesep + \ - "#endif // " + repo_root + "_WPIFORMAT_TEST_H_" + os.linesep) - test.add_output( - "#ifndef " + repo_root + "_TEST_H_" + os.linesep + \ - "#define " + repo_root + "_TEST_H_" + os.linesep + \ - os.linesep + \ - "#endif // " + repo_root + "_TEST_H_" + os.linesep, True, True) + # Ensure include guard roots are processed correctly + test.add_input("./Test.h", + "#ifndef " + repo_root + "_WPIFORMAT_TEST_H_" + os.linesep + \ + "#define " + repo_root + "_WPIFORMAT_TEST_H_" + os.linesep + \ + os.linesep + \ + "#endif // " + repo_root + "_WPIFORMAT_TEST_H_" + os.linesep) + test.add_output( + "#ifndef " + repo_root + "_TEST_H_" + os.linesep + \ + "#define " + repo_root + "_TEST_H_" + os.linesep + \ + os.linesep + \ + "#endif // " + repo_root + "_TEST_H_" + os.linesep, True, True) - # Ensure leading underscores are removed (this occurs if the user doesn't - # include a trailing "/" in the include guard root) - test.add_input("./Test/Test.h", - "#ifndef " + repo_root + "_WPIFORMAT_TEST_TEST_H_" + os.linesep + \ - "#define " + repo_root + "_WPIFORMAT_TEST_TEST_H_" + os.linesep + \ - os.linesep + \ - "#endif // " + repo_root + "_WPIFORMAT_TEST_TEST_H_" + os.linesep) - test.add_output( - "#ifndef " + repo_root + "_TEST_H_" + os.linesep + \ - "#define " + repo_root + "_TEST_H_" + os.linesep + \ - os.linesep + \ - "#endif // " + repo_root + "_TEST_H_" + os.linesep, True, True) + # Ensure leading underscores are removed (this occurs if the user doesn't + # include a trailing "/" in the include guard root) + test.add_input("./Test/Test.h", + "#ifndef " + repo_root + "_WPIFORMAT_TEST_TEST_H_" + os.linesep + \ + "#define " + repo_root + "_WPIFORMAT_TEST_TEST_H_" + os.linesep + \ + os.linesep + \ + "#endif // " + repo_root + "_WPIFORMAT_TEST_TEST_H_" + os.linesep) + test.add_output( + "#ifndef " + repo_root + "_TEST_H_" + os.linesep + \ + "#define " + repo_root + "_TEST_H_" + os.linesep + \ + os.linesep + \ + "#endif // " + repo_root + "_TEST_H_" + os.linesep, True, True) - test.run(OutputType.FILE) + test.run(OutputType.FILE) diff --git a/wpiformat/wpiformat/test/test_includeorder.py b/wpiformat/wpiformat/test/test_includeorder.py index f0e80e1b..3ecd3b82 100644 --- a/wpiformat/wpiformat/test/test_includeorder.py +++ b/wpiformat/wpiformat/test/test_includeorder.py @@ -1,6 +1,7 @@ import os from .tasktest import * +from .tempdir import * from wpiformat.includeorder import IncludeOrder @@ -546,4 +547,16 @@ def test_includeorder(): "#endif" + os.linesep) test.add_latest_input_as_output(True) - test.run(OutputType.FILE) + with OpenTemporaryDirectory(): + with open(".styleguide", "w") as file: + file.write(r"""cppHeaderFileInclude { + \.h$ + \.hpp$ + \.inc$ +} + +includeProject { + ^ctre/ +} +""") + test.run(OutputType.FILE) diff --git a/wpiformat/wpiformat/test/test_licenseupdate.py b/wpiformat/wpiformat/test/test_licenseupdate.py index 5201fc13..2765e4dd 100644 --- a/wpiformat/wpiformat/test/test_licenseupdate.py +++ b/wpiformat/wpiformat/test/test_licenseupdate.py @@ -3,27 +3,13 @@ from pathlib import Path import shutil import subprocess -import tempfile +from .tempdir import * from .tasktest import * from wpiformat.config import Config from wpiformat.licenseupdate import LicenseUpdate -class OpenTemporaryDirectory(): - - def __init__(self): - self.prev_dir = os.getcwd() - - def __enter__(self): - self.temp_dir = tempfile.TemporaryDirectory() - os.chdir(self.temp_dir.name) - return self.temp_dir - - def __exit__(self, type, value, traceback): - os.chdir(self.prev_dir) - - def test_licenseupdate(): year = str(date.today().year) @@ -185,10 +171,6 @@ def test_licenseupdate(): "/* Copyright (c) 1992-" + year + " Company Name. All Rights Reserved. */" + os.linesep + \ os.linesep + file_appendix, True, True) - # Ensure excluded files won't be processed - config_file = Config(os.path.abspath(os.getcwd()), ".styleguide") - assert not task.should_process_file(config_file, "./Excluded.h") - # Create git repo to test license years for commits with OpenTemporaryDirectory(): subprocess.run(["git", "init", "-q"]) @@ -197,11 +179,26 @@ def test_licenseupdate(): with open(".styleguide-license", "w") as file: file.write("// Copyright (c) {year}") with open(".styleguide", "w") as file: - file.write("cppSrcFileInclude {\n" + r"\.cpp$") + file.write(r"""cppHeaderFileInclude { + \.h$ +} + +cppSrcFileInclude { + \.cpp$ +} + +licenseUpdateExclude { + Excluded\.h$ +} +""") subprocess.run(["git", "add", ".styleguide-license"]) subprocess.run(["git", "add", ".styleguide"]) subprocess.run(["git", "commit", "-q", "-m", "\"Initial commit\""]) + # Ensure excluded files won't be processed + config_file = Config(os.path.abspath(os.getcwd()), ".styleguide") + assert not task.should_process_file(config_file, "./Excluded.h") + # Add file with commit date of last year and range through this year with open("last-year.cpp", "w") as file: file.write(f"// Copyright (c) 2017-{year}") @@ -276,4 +273,9 @@ def test_licenseupdate(): output, success = task.run_pipeline(config_file, "no-year.cpp", lines) assert output == f"// Copyright (c) {year}\n\n" - test.run(OutputType.FILE) + with open(".styleguide-license", "w") as file: + file.write(r"""/*{padding}Company Name{padding}*/ +/* Copyright (c) {year} Company Name. All Rights Reserved.{padding}*/ +""") + + test.run(OutputType.FILE)