ReplacementsYamlTest.cpp 5.0 KB

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