|  | //===- 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", | 
|  | YamlContent.c_str()); | 
|  | } | 
|  |  | 
|  | TEST(ReplacementsYamlTest, serializesNewLines) { | 
|  | TranslationUnitReplacements Doc; | 
|  |  | 
|  | Doc.MainSourceFile = "/path/to/source.cpp"; | 
|  | Doc.Replacements.emplace_back("/path/to/file1.h", 0, 0, "#include <utility>\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 <utility>\\n\"\n" | 
|  | "...\n", | 
|  | YamlContent.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()); | 
|  | } |