Clang Project

clang_source_code/unittests/Tooling/ReplacementsYamlTest.cpp
1//===- unittests/Tooling/ReplacementsYamlTest.cpp - Serialization tests ---===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Tests for serialization of Replacements.
10//
11//===----------------------------------------------------------------------===//
12
13#include "clang/Tooling/ReplacementsYaml.h"
14#include "gtest/gtest.h"
15
16using namespace llvm;
17using namespace clang::tooling;
18
19TEST(ReplacementsYamlTest, serializesReplacements) {
20
21  TranslationUnitReplacements Doc;
22
23  Doc.MainSourceFile = "/path/to/source.cpp";
24  Doc.Replacements.emplace_back("/path/to/file1.h"23256"replacement #1");
25  Doc.Replacements.emplace_back("/path/to/file2.h"3012"replacement #2");
26
27  std::string YamlContent;
28  llvm::raw_string_ostream YamlContentStream(YamlContent);
29
30  yaml::Output YAML(YamlContentStream);
31  YAML << Doc;
32
33  // NOTE: If this test starts to fail for no obvious reason, check whitespace.
34  ASSERT_STREQ("---\n"
35               "MainSourceFile:  '/path/to/source.cpp'\n"
36               "Replacements:    \n" // Extra whitespace here!
37               "  - FilePath:        '/path/to/file1.h'\n"
38               "    Offset:          232\n"
39               "    Length:          56\n"
40               "    ReplacementText: 'replacement #1'\n"
41               "  - FilePath:        '/path/to/file2.h'\n"
42               "    Offset:          301\n"
43               "    Length:          2\n"
44               "    ReplacementText: 'replacement #2'\n"
45               "...\n",
46               YamlContentStream.str().c_str());
47}
48
49TEST(ReplacementsYamlTest, deserializesReplacements) {
50  std::string YamlContent = "---\n"
51                            "MainSourceFile:      /path/to/source.cpp\n"
52                            "Replacements:\n"
53                            "  - FilePath:        /path/to/file1.h\n"
54                            "    Offset:          232\n"
55                            "    Length:          56\n"
56                            "    ReplacementText: 'replacement #1'\n"
57                            "  - FilePath:        /path/to/file2.h\n"
58                            "    Offset:          301\n"
59                            "    Length:          2\n"
60                            "    ReplacementText: 'replacement #2'\n"
61                            "...\n";
62  TranslationUnitReplacements DocActual;
63  yaml::Input YAML(YamlContent);
64  YAML >> DocActual;
65  ASSERT_FALSE(YAML.error());
66  ASSERT_EQ(2uDocActual.Replacements.size());
67  ASSERT_EQ("/path/to/source.cpp"DocActual.MainSourceFile);
68  ASSERT_EQ("/path/to/file1.h"DocActual.Replacements[0].getFilePath());
69  ASSERT_EQ(232uDocActual.Replacements[0].getOffset());
70  ASSERT_EQ(56uDocActual.Replacements[0].getLength());
71  ASSERT_EQ("replacement #1"DocActual.Replacements[0].getReplacementText());
72  ASSERT_EQ("/path/to/file2.h"DocActual.Replacements[1].getFilePath());
73  ASSERT_EQ(301uDocActual.Replacements[1].getOffset());
74  ASSERT_EQ(2uDocActual.Replacements[1].getLength());
75  ASSERT_EQ("replacement #2"DocActual.Replacements[1].getReplacementText());
76}
77
78TEST(ReplacementsYamlTest, deserializesWithoutContext) {
79  // Make sure a doc can be read without the context field.
80  std::string YamlContent = "---\n"
81                            "MainSourceFile:      /path/to/source.cpp\n"
82                            "Replacements:\n"
83                            "  - FilePath:        target_file.h\n"
84                            "    Offset:          1\n"
85                            "    Length:          10\n"
86                            "    ReplacementText: replacement\n"
87                            "...\n";
88  TranslationUnitReplacements DocActual;
89  yaml::Input YAML(YamlContent);
90  YAML >> DocActual;
91  ASSERT_FALSE(YAML.error());
92  ASSERT_EQ("/path/to/source.cpp"DocActual.MainSourceFile);
93  ASSERT_EQ(1uDocActual.Replacements.size());
94  ASSERT_EQ("target_file.h"DocActual.Replacements[0].getFilePath());
95  ASSERT_EQ(1uDocActual.Replacements[0].getOffset());
96  ASSERT_EQ(10uDocActual.Replacements[0].getLength());
97  ASSERT_EQ("replacement"DocActual.Replacements[0].getReplacementText());
98}
99