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