Add support for splitting a test file. (#2876)

I'm looking at this as I start thinking about handling `import`. Syntax is based on llvm's `split-file` tool.

The `std::vector` -> `llvm::SmallVector` switch is minor, I'm doing it here because I had to touch everything anyways and I think for tests I'll lean slightly more towards the toolchain's way of doing things versus explorer's.
This commit is contained in:
Jon Ross-Perkins
2023-06-07 08:56:20 -07:00
committed by GitHub
parent 97de96eac6
commit 6586179c8d
12 changed files with 190 additions and 59 deletions
+29 -2
View File
@@ -7,6 +7,7 @@
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <fstream>
#include <vector>
#include "llvm/ADT/StringRef.h"
@@ -15,15 +16,19 @@
namespace Carbon::Testing {
namespace {
using ::testing::ElementsAre;
class FileTestBaseTest : public FileTestBase {
public:
explicit FileTestBaseTest(const std::filesystem::path& path)
: FileTestBase(path) {}
auto RunOverFile(llvm::raw_ostream& stdout, llvm::raw_ostream& stderr)
auto RunWithFiles(const llvm::SmallVector<std::string>& test_files,
llvm::raw_ostream& stdout, llvm::raw_ostream& stderr)
-> bool override {
auto filename = path().filename();
if (filename == "example.carbon") {
EXPECT_THAT(test_files, ElementsAre("example.carbon"));
stdout << "something\n"
"\n"
"8: Line delta\n"
@@ -32,8 +37,30 @@ class FileTestBaseTest : public FileTestBase {
"Foo baz\n";
return true;
} else if (filename == "fail_example.carbon") {
EXPECT_THAT(test_files, ElementsAre("fail_example.carbon"));
stderr << "Oops\n";
return false;
} else if (filename == "two_files.carbon") {
int i = 0;
for (const auto& file : test_files) {
// Prints line numbers to validate per-file.
stdout << file << ": " << ++i << "\n";
// Make sure the split files have appropriate content.
std::ifstream file_in(file);
std::stringstream content;
content << file_in.rdbuf();
if (file == "a.carbon") {
EXPECT_THAT(content.str(),
testing::Eq("// CHECK:STDOUT: a.carbon: [[@LINE+0]]\n\n"))
<< "Checking " << file;
} else {
EXPECT_THAT(content.str(),
testing::Eq("// CHECK:STDOUT: b.carbon: [[@LINE+1]]\n"))
<< "Checking " << file;
}
}
return true;
} else {
ADD_FAILURE() << "Unexpected file: " << filename;
return false;
@@ -43,7 +70,7 @@ class FileTestBaseTest : public FileTestBase {
} // namespace
auto RegisterFileTests(const std::vector<std::filesystem::path>& paths)
auto RegisterFileTests(const llvm::SmallVector<std::filesystem::path>& paths)
-> void {
FileTestBaseTest::RegisterTests("FileTestBaseTest", paths,
[](const std::filesystem::path& path) {