我试图找出一种使用CMake / CTest编写测试的方法,该方法将尝试编译不应编译的文件,并导致CTest成功进行测试。一个示例是测试源文件,该文件尝试使用它没有访问权限的私有方法。天真的方法是对COMMAND进行硬编码以使用类似gcc failing_source_file.cpp | if [[ $? != 0 ]]; then false; else true; fi
的名称,但这将无法使用正确的编译器,并且在Windows上也将无法使用。
Get full C++ compiler command line在这方面可能很有用,但这似乎只是获得标志,而不是实际的编译器命令。
这是一个例子
#
# CMakeLists.txt
#
cmake_minimum_required(VERSION 3.8)
project(test_does_not_compile)
add_library(the_library INTERFACE)
target_include_directories(the_library INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
enable_testing()
add_executable(test_compiles test_compiles.cpp)
target_link_libraries(test_compiles the_library)
add_test(NAME test_compiles
COMMAND test_compiles)
# I'd like to be able to use the would-be compile command, to assert that the test does not compile
# add_executable(test_does_not_compile test_does_not_compile.cpp)
# target_link_libraries(test_does_not_compile the_library)
# add_test(NAME test_does_not_compile
# COMMAND test_does_not_compile)
来源很简单。
//
// the_library.hpp
//
#pragma once
#include <iostream>
class TheLibrary {
private:
void private_method() { std::cout << "called me private!\n"; };
public:
void public_method() { std::cout << "called me public!\n"; };
};
一个没有问题的测试文件,它使用public方法。
//
// test_compiles.cpp
//
#include "the_library.hpp"
int main(int argc, char* argv[]) {
TheLibrary a_library;
a_library.public_method();
return 0;
}
由于使用私有方法,因此无法编译的测试文件。
//
// test_does_not_compile.cpp
//
#include "the_library.hpp"
int main(int argc, char* argv[]) {
TheLibrary a_library;
a_library.private_method();
return 0;
}