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