123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- //===- unittests/Tooling/DiagnosticsYamlTest.cpp - Serialization tests ---===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // Tests for serialization of Diagnostics.
- //
- //===----------------------------------------------------------------------===//
- #include "clang/Tooling/DiagnosticsYaml.h"
- #include "clang/Tooling/Core/Diagnostic.h"
- #include "clang/Tooling/ReplacementsYaml.h"
- #include "gtest/gtest.h"
- using namespace llvm;
- using namespace clang::tooling;
- using clang::tooling::Diagnostic;
- static DiagnosticMessage makeMessage(const std::string &Message, int FileOffset,
- const std::string &FilePath,
- const StringMap<Replacements> &Fix) {
- DiagnosticMessage DiagMessage;
- DiagMessage.Message = Message;
- DiagMessage.FileOffset = FileOffset;
- DiagMessage.FilePath = FilePath;
- DiagMessage.Fix = Fix;
- return DiagMessage;
- }
- static Diagnostic makeDiagnostic(StringRef DiagnosticName,
- const std::string &Message, int FileOffset,
- const std::string &FilePath,
- const StringMap<Replacements> &Fix) {
- return Diagnostic(DiagnosticName,
- makeMessage(Message, FileOffset, FilePath, Fix), {},
- Diagnostic::Warning, "path/to/build/directory");
- }
- static const char *YAMLContent =
- "---\n"
- "MainSourceFile: 'path/to/source.cpp'\n"
- "Diagnostics:\n"
- " - DiagnosticName: 'diagnostic#1\'\n"
- " DiagnosticMessage:\n"
- " Message: 'message #1'\n"
- " FilePath: 'path/to/source.cpp'\n"
- " FileOffset: 55\n"
- " Replacements:\n"
- " - FilePath: 'path/to/source.cpp'\n"
- " Offset: 100\n"
- " Length: 12\n"
- " ReplacementText: 'replacement #1'\n"
- " - DiagnosticName: 'diagnostic#2'\n"
- " DiagnosticMessage:\n"
- " Message: 'message #2'\n"
- " FilePath: 'path/to/header.h'\n"
- " FileOffset: 60\n"
- " Replacements:\n"
- " - FilePath: 'path/to/header.h'\n"
- " Offset: 62\n"
- " Length: 2\n"
- " ReplacementText: 'replacement #2'\n"
- " - DiagnosticName: 'diagnostic#3'\n"
- " DiagnosticMessage:\n"
- " Message: 'message #3'\n"
- " FilePath: 'path/to/source2.cpp'\n"
- " FileOffset: 72\n"
- " Replacements: []\n"
- " Notes:\n"
- " - Message: Note1\n"
- " FilePath: 'path/to/note1.cpp'\n"
- " FileOffset: 88\n"
- " Replacements: []\n"
- " - Message: Note2\n"
- " FilePath: 'path/to/note2.cpp'\n"
- " FileOffset: 99\n"
- " Replacements: []\n"
- "...\n";
- TEST(DiagnosticsYamlTest, serializesDiagnostics) {
- TranslationUnitDiagnostics TUD;
- TUD.MainSourceFile = "path/to/source.cpp";
- StringMap<Replacements> Fix1 = {
- {"path/to/source.cpp",
- Replacements({"path/to/source.cpp", 100, 12, "replacement #1"})}};
- TUD.Diagnostics.push_back(makeDiagnostic("diagnostic#1", "message #1", 55,
- "path/to/source.cpp", Fix1));
- StringMap<Replacements> Fix2 = {
- {"path/to/header.h",
- Replacements({"path/to/header.h", 62, 2, "replacement #2"})}};
- TUD.Diagnostics.push_back(makeDiagnostic("diagnostic#2", "message #2", 60,
- "path/to/header.h", Fix2));
- TUD.Diagnostics.push_back(makeDiagnostic("diagnostic#3", "message #3", 72,
- "path/to/source2.cpp", {}));
- TUD.Diagnostics.back().Notes.push_back(
- makeMessage("Note1", 88, "path/to/note1.cpp", {}));
- TUD.Diagnostics.back().Notes.push_back(
- makeMessage("Note2", 99, "path/to/note2.cpp", {}));
- std::string YamlContent;
- raw_string_ostream YamlContentStream(YamlContent);
- yaml::Output YAML(YamlContentStream);
- YAML << TUD;
- EXPECT_EQ(YAMLContent, YamlContentStream.str());
- }
- TEST(DiagnosticsYamlTest, deserializesDiagnostics) {
- TranslationUnitDiagnostics TUDActual;
- yaml::Input YAML(YAMLContent);
- YAML >> TUDActual;
- ASSERT_FALSE(YAML.error());
- ASSERT_EQ(3u, TUDActual.Diagnostics.size());
- EXPECT_EQ("path/to/source.cpp", TUDActual.MainSourceFile);
- auto getFixes = [](const StringMap<Replacements> &Fix) {
- std::vector<Replacement> Fixes;
- for (auto &Replacements : Fix) {
- for (auto &Replacement : Replacements.second) {
- Fixes.push_back(Replacement);
- }
- }
- return Fixes;
- };
- Diagnostic D1 = TUDActual.Diagnostics[0];
- EXPECT_EQ("diagnostic#1", D1.DiagnosticName);
- EXPECT_EQ("message #1", D1.Message.Message);
- EXPECT_EQ(55u, D1.Message.FileOffset);
- EXPECT_EQ("path/to/source.cpp", D1.Message.FilePath);
- std::vector<Replacement> Fixes1 = getFixes(D1.Message.Fix);
- ASSERT_EQ(1u, Fixes1.size());
- EXPECT_EQ("path/to/source.cpp", Fixes1[0].getFilePath());
- EXPECT_EQ(100u, Fixes1[0].getOffset());
- EXPECT_EQ(12u, Fixes1[0].getLength());
- EXPECT_EQ("replacement #1", Fixes1[0].getReplacementText());
- Diagnostic D2 = TUDActual.Diagnostics[1];
- EXPECT_EQ("diagnostic#2", D2.DiagnosticName);
- EXPECT_EQ("message #2", D2.Message.Message);
- EXPECT_EQ(60u, D2.Message.FileOffset);
- EXPECT_EQ("path/to/header.h", D2.Message.FilePath);
- std::vector<Replacement> Fixes2 = getFixes(D2.Message.Fix);
- ASSERT_EQ(1u, Fixes2.size());
- EXPECT_EQ("path/to/header.h", Fixes2[0].getFilePath());
- EXPECT_EQ(62u, Fixes2[0].getOffset());
- EXPECT_EQ(2u, Fixes2[0].getLength());
- EXPECT_EQ("replacement #2", Fixes2[0].getReplacementText());
- Diagnostic D3 = TUDActual.Diagnostics[2];
- EXPECT_EQ("diagnostic#3", D3.DiagnosticName);
- EXPECT_EQ("message #3", D3.Message.Message);
- EXPECT_EQ(72u, D3.Message.FileOffset);
- EXPECT_EQ("path/to/source2.cpp", D3.Message.FilePath);
- EXPECT_EQ(2u, D3.Notes.size());
- EXPECT_EQ("Note1", D3.Notes[0].Message);
- EXPECT_EQ(88u, D3.Notes[0].FileOffset);
- EXPECT_EQ("path/to/note1.cpp", D3.Notes[0].FilePath);
- EXPECT_EQ("Note2", D3.Notes[1].Message);
- EXPECT_EQ(99u, D3.Notes[1].FileOffset);
- EXPECT_EQ("path/to/note2.cpp", D3.Notes[1].FilePath);
- std::vector<Replacement> Fixes3 = getFixes(D3.Message.Fix);
- EXPECT_TRUE(Fixes3.empty());
- }
|