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 
17 using namespace llvm;
18 using namespace clang::tooling;
19 
20 TEST(ReplacementsYamlTest, serializesReplacements) {
21 
22   TranslationUnitReplacements Doc;
23 
24   Doc.MainSourceFile = "/path/to/source.cpp";
25   Doc.Replacements.emplace_back("/path/to/file1.h", 232, 56, "replacement #1");
26   Doc.Replacements.emplace_back("/path/to/file2.h", 301, 2, "replacement #2");
27 
28   std::string YamlContent;
29   llvm::raw_string_ostream YamlContentStream(YamlContent);
30 
31   yaml::Output YAML(YamlContentStream);
32   YAML << Doc;
33 
34   // NOTE: If this test starts to fail for no obvious reason, check whitespace.
35   ASSERT_STREQ("---\n"
36                "MainSourceFile:  /path/to/source.cpp\n"
37                "Replacements:    \n" // Extra whitespace here!
38                "  - FilePath:        /path/to/file1.h\n"
39                "    Offset:          232\n"
40                "    Length:          56\n"
41                "    ReplacementText: 'replacement #1'\n"
42                "  - FilePath:        /path/to/file2.h\n"
43                "    Offset:          301\n"
44                "    Length:          2\n"
45                "    ReplacementText: 'replacement #2'\n"
46                "...\n",
47                YamlContentStream.str().c_str());
48 }
49 
50 TEST(ReplacementsYamlTest, deserializesReplacements) {
51   std::string YamlContent = "---\n"
52                             "MainSourceFile:      /path/to/source.cpp\n"
53                             "Replacements:\n"
54                             "  - FilePath:        /path/to/file1.h\n"
55                             "    Offset:          232\n"
56                             "    Length:          56\n"
57                             "    ReplacementText: 'replacement #1'\n"
58                             "  - FilePath:        /path/to/file2.h\n"
59                             "    Offset:          301\n"
60                             "    Length:          2\n"
61                             "    ReplacementText: 'replacement #2'\n"
62                             "...\n";
63   TranslationUnitReplacements DocActual;
64   yaml::Input YAML(YamlContent);
65   YAML >> DocActual;
66   ASSERT_FALSE(YAML.error());
67   ASSERT_EQ(2u, DocActual.Replacements.size());
68   ASSERT_EQ("/path/to/source.cpp", DocActual.MainSourceFile);
69   ASSERT_EQ("/path/to/file1.h", DocActual.Replacements[0].getFilePath());
70   ASSERT_EQ(232u, DocActual.Replacements[0].getOffset());
71   ASSERT_EQ(56u, DocActual.Replacements[0].getLength());
72   ASSERT_EQ("replacement #1", DocActual.Replacements[0].getReplacementText());
73   ASSERT_EQ("/path/to/file2.h", DocActual.Replacements[1].getFilePath());
74   ASSERT_EQ(301u, DocActual.Replacements[1].getOffset());
75   ASSERT_EQ(2u, DocActual.Replacements[1].getLength());
76   ASSERT_EQ("replacement #2", DocActual.Replacements[1].getReplacementText());
77 }
78 
79 TEST(ReplacementsYamlTest, deserializesWithoutContext) {
80   // Make sure a doc can be read without the context field.
81   std::string YamlContent = "---\n"
82                             "MainSourceFile:      /path/to/source.cpp\n"
83                             "Replacements:\n"
84                             "  - FilePath:        target_file.h\n"
85                             "    Offset:          1\n"
86                             "    Length:          10\n"
87                             "    ReplacementText: replacement\n"
88                             "...\n";
89   TranslationUnitReplacements DocActual;
90   yaml::Input YAML(YamlContent);
91   YAML >> DocActual;
92   ASSERT_FALSE(YAML.error());
93   ASSERT_EQ("/path/to/source.cpp", DocActual.MainSourceFile);
94   ASSERT_EQ(1u, DocActual.Replacements.size());
95   ASSERT_EQ("target_file.h", DocActual.Replacements[0].getFilePath());
96   ASSERT_EQ(1u, DocActual.Replacements[0].getOffset());
97   ASSERT_EQ(10u, DocActual.Replacements[0].getLength());
98   ASSERT_EQ("replacement", DocActual.Replacements[0].getReplacementText());
99 }
100