| //===- 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 <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" |
| "...\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()); |
| } |