//===- unittests/Tooling/ReplacementsYamlTest.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 Replacements. // //===----------------------------------------------------------------------===// #include "clang/Tooling/ReplacementsYaml.h" #include "gtest/gtest.h" using namespace llvm; using namespace clang::tooling; TEST(ReplacementsYamlTest, serializesReplacements) { TranslationUnitReplacements Doc; Doc.MainSourceFile = "/path/to/source.cpp"; Doc.Replacements.emplace_back("/path/to/file1.h", 232, 56, "replacement #1"); Doc.Replacements.emplace_back("/path/to/file2.h", 301, 2, "replacement #2"); std::string YamlContent; llvm::raw_string_ostream YamlContentStream(YamlContent); yaml::Output YAML(YamlContentStream); YAML << Doc; // NOTE: If this test starts to fail for no obvious reason, check whitespace. ASSERT_STREQ("---\n" "MainSourceFile: '/path/to/source.cpp'\n" "Replacements:\n" " - FilePath: '/path/to/file1.h'\n" " Offset: 232\n" " Length: 56\n" " ReplacementText: 'replacement #1'\n" " - FilePath: '/path/to/file2.h'\n" " Offset: 301\n" " Length: 2\n" " ReplacementText: 'replacement #2'\n" "...\n", YamlContentStream.str().c_str()); } TEST(ReplacementsYamlTest, serializesNewLines) { TranslationUnitReplacements Doc; Doc.MainSourceFile = "/path/to/source.cpp"; Doc.Replacements.emplace_back("/path/to/file1.h", 0, 0, "#include \n"); std::string YamlContent; llvm::raw_string_ostream YamlContentStream(YamlContent); yaml::Output YAML(YamlContentStream); YAML << Doc; // NOTE: If this test starts to fail for no obvious reason, check whitespace. ASSERT_STREQ("---\n" "MainSourceFile: '/path/to/source.cpp'\n" "Replacements:\n" " - FilePath: '/path/to/file1.h'\n" " Offset: 0\n" " Length: 0\n" " ReplacementText: \"#include \\n\"\n" "...\n", YamlContentStream.str().c_str()); } TEST(ReplacementsYamlTest, deserializesReplacements) { std::string YamlContent = "---\n" "MainSourceFile: /path/to/source.cpp\n" "Replacements:\n" " - FilePath: /path/to/file1.h\n" " Offset: 232\n" " Length: 56\n" " ReplacementText: 'replacement #1'\n" " - FilePath: /path/to/file2.h\n" " Offset: 301\n" " Length: 2\n" " ReplacementText: 'replacement #2'\n" "...\n"; TranslationUnitReplacements DocActual; yaml::Input YAML(YamlContent); YAML >> DocActual; ASSERT_FALSE(YAML.error()); ASSERT_EQ(2u, DocActual.Replacements.size()); ASSERT_EQ("/path/to/source.cpp", DocActual.MainSourceFile); ASSERT_EQ("/path/to/file1.h", DocActual.Replacements[0].getFilePath()); ASSERT_EQ(232u, DocActual.Replacements[0].getOffset()); ASSERT_EQ(56u, DocActual.Replacements[0].getLength()); ASSERT_EQ("replacement #1", DocActual.Replacements[0].getReplacementText()); ASSERT_EQ("/path/to/file2.h", DocActual.Replacements[1].getFilePath()); ASSERT_EQ(301u, DocActual.Replacements[1].getOffset()); ASSERT_EQ(2u, DocActual.Replacements[1].getLength()); ASSERT_EQ("replacement #2", DocActual.Replacements[1].getReplacementText()); } TEST(ReplacementsYamlTest, deserializesWithoutContext) { // Make sure a doc can be read without the context field. std::string YamlContent = "---\n" "MainSourceFile: /path/to/source.cpp\n" "Replacements:\n" " - FilePath: target_file.h\n" " Offset: 1\n" " Length: 10\n" " ReplacementText: replacement\n" "...\n"; TranslationUnitReplacements DocActual; yaml::Input YAML(YamlContent); YAML >> DocActual; ASSERT_FALSE(YAML.error()); ASSERT_EQ("/path/to/source.cpp", DocActual.MainSourceFile); ASSERT_EQ(1u, DocActual.Replacements.size()); ASSERT_EQ("target_file.h", DocActual.Replacements[0].getFilePath()); ASSERT_EQ(1u, DocActual.Replacements[0].getOffset()); ASSERT_EQ(10u, DocActual.Replacements[0].getLength()); ASSERT_EQ("replacement", DocActual.Replacements[0].getReplacementText()); }