From e312278b64fcc76272e2ca45d970892026823de7 Mon Sep 17 00:00:00 2001 From: John Bytheway Date: Sat, 11 Jan 2020 11:06:49 -0500 Subject: [PATCH] Add clang-tidy check for test filenames Enforce the rule that test files should be named *_test.cpp. --- tools/clang-tidy-plugin/CMakeLists.txt | 1 + tools/clang-tidy-plugin/CataTidyModule.cpp | 2 + tools/clang-tidy-plugin/TestFilenameCheck.cpp | 56 +++++++++++++++++++ tools/clang-tidy-plugin/TestFilenameCheck.h | 26 +++++++++ .../clang-tidy-plugin/test/test-filename.cpp | 6 ++ 5 files changed, 91 insertions(+) create mode 100644 tools/clang-tidy-plugin/TestFilenameCheck.cpp create mode 100644 tools/clang-tidy-plugin/TestFilenameCheck.h create mode 100644 tools/clang-tidy-plugin/test/test-filename.cpp diff --git a/tools/clang-tidy-plugin/CMakeLists.txt b/tools/clang-tidy-plugin/CMakeLists.txt index 553ef0ebe015c..a78f9f1d50f6e 100644 --- a/tools/clang-tidy-plugin/CMakeLists.txt +++ b/tools/clang-tidy-plugin/CMakeLists.txt @@ -12,6 +12,7 @@ add_library( PointInitializationCheck.cpp SimplifyPointConstructorsCheck.cpp StringLiteralIterator.cpp + TestFilenameCheck.cpp TextStyleCheck.cpp TranslatorCommentsCheck.cpp UseNamedPointConstantsCheck.cpp diff --git a/tools/clang-tidy-plugin/CataTidyModule.cpp b/tools/clang-tidy-plugin/CataTidyModule.cpp index 47da679700dbe..441c31a4dadb5 100644 --- a/tools/clang-tidy-plugin/CataTidyModule.cpp +++ b/tools/clang-tidy-plugin/CataTidyModule.cpp @@ -7,6 +7,7 @@ #include "NoStaticGettextCheck.h" #include "PointInitializationCheck.h" #include "SimplifyPointConstructorsCheck.h" +#include "TestFilenameCheck.h" #include "TextStyleCheck.h" #include "TranslatorCommentsCheck.h" #include "UseNamedPointConstantsCheck.h" @@ -31,6 +32,7 @@ class CataModule : public ClangTidyModule CheckFactories.registerCheck( "cata-point-initialization" ); CheckFactories.registerCheck( "cata-simplify-point-constructors" ); + CheckFactories.registerCheck( "cata-test-filename" ); CheckFactories.registerCheck( "cata-text-style" ); CheckFactories.registerCheck( "cata-translator-comments" ); CheckFactories.registerCheck( diff --git a/tools/clang-tidy-plugin/TestFilenameCheck.cpp b/tools/clang-tidy-plugin/TestFilenameCheck.cpp new file mode 100644 index 0000000000000..9d1f94dea3c0b --- /dev/null +++ b/tools/clang-tidy-plugin/TestFilenameCheck.cpp @@ -0,0 +1,56 @@ +#include "TestFilenameCheck.h" + +#include +#include +#include +#include + +#include "clang/Frontend/CompilerInstance.h" + +using namespace clang::ast_matchers; + +namespace clang +{ +namespace tidy +{ +namespace cata +{ + +class TestFilenameCallbacks : public PPCallbacks +{ + public: + TestFilenameCallbacks( TestFilenameCheck *Check, CompilerInstance *Compiler ) : + Check( Check ), Compiler( Compiler ) {} + + void MacroExpands( const Token &MacroNameTok, + const MacroDefinition &, + SourceRange Range, + const MacroArgs * ) override { + StringRef MacroName = MacroNameTok.getIdentifierInfo()->getName(); + + if( MacroName == "TEST_CASE" ) { + SourceManager &SM = Compiler->getSourceManager(); + StringRef Filename = SM.getBufferName( Range.getBegin() ); + bool IsTestFilename = Filename.endswith( "_test.cpp" ); + + if( !IsTestFilename ) { + Check->diag( Range.getBegin(), + "Files containing a test definition should have a filename " + "ending in '_test.cpp'." ); + } + } + } + private: + TestFilenameCheck *Check; + CompilerInstance *Compiler; +}; + +void TestFilenameCheck::registerPPCallbacks( CompilerInstance &Compiler ) +{ + Compiler.getPreprocessor().addPPCallbacks( + llvm::make_unique( this, &Compiler ) ); +} + +} // namespace cata +} // namespace tidy +} // namespace clang diff --git a/tools/clang-tidy-plugin/TestFilenameCheck.h b/tools/clang-tidy-plugin/TestFilenameCheck.h new file mode 100644 index 0000000000000..2c6a8832279ea --- /dev/null +++ b/tools/clang-tidy-plugin/TestFilenameCheck.h @@ -0,0 +1,26 @@ +#ifndef CATA_TOOLS_CLANG_TIDY_TESTFILENAMECHECK_H +#define CATA_TOOLS_CLANG_TIDY_TESTFILENAMECHECK_H + +#include "ClangTidy.h" + +namespace clang +{ +namespace tidy +{ +namespace cata +{ + +class TestFilenameCheck : public ClangTidyCheck +{ + public: + TestFilenameCheck( StringRef Name, ClangTidyContext *Context ) + : ClangTidyCheck( Name, Context ) {} + + void registerPPCallbacks( CompilerInstance &Compiler ) override; +}; + +} // namespace cata +} // namespace tidy +} // namespace clang + +#endif // CATA_TOOLS_CLANG_TIDY_TESTFILENAMECHECK_H diff --git a/tools/clang-tidy-plugin/test/test-filename.cpp b/tools/clang-tidy-plugin/test/test-filename.cpp new file mode 100644 index 0000000000000..605583e12d0f8 --- /dev/null +++ b/tools/clang-tidy-plugin/test/test-filename.cpp @@ -0,0 +1,6 @@ +// RUN: %check_clang_tidy %s cata-test-filename %t -- -plugins=%cata_plugin -- -isystem %cata_include + +#define TEST_CASE(name) + +TEST_CASE( "test_name" ) +// CHECK-MESSAGES: warning: Files containing a test definition should have a filename ending in '_test.cpp'. [cata-test-filename]