From d7e2278f6c071741796c20b368a6d0c93bbe79e2 Mon Sep 17 00:00:00 2001 From: Edwin Vane Date: Tue, 20 Aug 2013 19:07:21 +0000 Subject: Adding Replacement serialization support Adding a new data structure for storing the Replacements generated for a single translation unit. Structure contains a vector of Replacements as well a field indicating the main source file of the translation unit. An optional 'Context' field allows for tools to provide any information they want about the context the Replacements were generated in. This context is printed, for example, when detecting conflicts during Replacement deduplication. YAML serialization for this data structure is implemented in this patch. Tests are included. Differential Revision: http://llvm-reviews.chandlerc.com/D1422 llvm-svn: 188818 --- clang/unittests/Tooling/ReplacementsYamlTest.cpp | 106 +++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 clang/unittests/Tooling/ReplacementsYamlTest.cpp (limited to 'clang/unittests/Tooling/ReplacementsYamlTest.cpp') diff --git a/clang/unittests/Tooling/ReplacementsYamlTest.cpp b/clang/unittests/Tooling/ReplacementsYamlTest.cpp new file mode 100644 index 00000000000..627002a74e0 --- /dev/null +++ b/clang/unittests/Tooling/ReplacementsYamlTest.cpp @@ -0,0 +1,106 @@ +//===- unittests/Tooling/ReplacementsYamlTest.cpp - Serialization tests ---===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Tests for serialization of Replacements. +// +//===----------------------------------------------------------------------===// + +#include "clang/Tooling/ReplacementsYaml.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace clang::tooling; + +TEST(ReplacementsYamlTest, serializesReplacements) { + + TranslationUnitReplacements Doc; + + Doc.MainSourceFile = "/path/to/source.cpp"; + Doc.Context = "some context"; + Doc.Replacements + .push_back(Replacement("/path/to/file1.h", 232, 56, "replacement #1")); + Doc.Replacements + .push_back(Replacement("/path/to/file2.h", 301, 2, "replacement #2")); + + std::string YamlContent; + llvm::raw_string_ostream YamlContentStream(YamlContent); + + yaml::Output YAML(YamlContentStream); + YAML << Doc; + + // NOTE: If this test starts to fail for no obvious reason, check whitespace. + ASSERT_STREQ("---\n" + "MainSourceFile: \"/path/to/source.cpp\"\n" + "Context: \"some context\"\n" + "Replacements: \n" // Extra whitespace here! + " - FilePath: \"/path/to/file1.h\"\n" + " Offset: 232\n" + " Length: 56\n" + " ReplacementText: \"replacement #1\"\n" + " - FilePath: \"/path/to/file2.h\"\n" + " Offset: 301\n" + " Length: 2\n" + " ReplacementText: \"replacement #2\"\n" + "...\n", + YamlContentStream.str().c_str()); +} + +TEST(ReplacementsYamlTest, deserializesReplacements) { + std::string YamlContent = "---\n" + "MainSourceFile: \"/path/to/source.cpp\"\n" + "Context: \"some context\"\n" + "Replacements:\n" + " - FilePath: \"/path/to/file1.h\"\n" + " Offset: 232\n" + " Length: 56\n" + " ReplacementText: \"replacement #1\"\n" + " - FilePath: \"/path/to/file2.h\"\n" + " Offset: 301\n" + " Length: 2\n" + " ReplacementText: \"replacement #2\"\n" + "...\n"; + TranslationUnitReplacements DocActual; + yaml::Input YAML(YamlContent); + YAML >> DocActual; + ASSERT_FALSE(YAML.error()); + ASSERT_EQ(2u, DocActual.Replacements.size()); + ASSERT_EQ("/path/to/source.cpp", DocActual.MainSourceFile); + ASSERT_EQ("some context", DocActual.Context); + ASSERT_EQ("/path/to/file1.h", DocActual.Replacements[0].getFilePath()); + ASSERT_EQ(232u, DocActual.Replacements[0].getOffset()); + ASSERT_EQ(56u, DocActual.Replacements[0].getLength()); + ASSERT_EQ("replacement #1", DocActual.Replacements[0].getReplacementText()); + ASSERT_EQ("/path/to/file2.h", DocActual.Replacements[1].getFilePath()); + ASSERT_EQ(301u, DocActual.Replacements[1].getOffset()); + ASSERT_EQ(2u, DocActual.Replacements[1].getLength()); + ASSERT_EQ("replacement #2", DocActual.Replacements[1].getReplacementText()); +} + +TEST(ReplacementsYamlTest, deserializesWithoutContext) { + // Make sure a doc can be read without the context field. + std::string YamlContent = "---\n" + "MainSourceFile: \"/path/to/source.cpp\"\n" + "Replacements:\n" + " - FilePath: \"target_file.h\"\n" + " Offset: 1\n" + " Length: 10\n" + " ReplacementText: \"replacement\"\n" + "...\n"; + TranslationUnitReplacements DocActual; + yaml::Input YAML(YamlContent); + YAML >> DocActual; + ASSERT_FALSE(YAML.error()); + ASSERT_EQ("/path/to/source.cpp", DocActual.MainSourceFile); + ASSERT_EQ(1u, DocActual.Replacements.size()); + ASSERT_EQ(std::string(), DocActual.Context); + ASSERT_EQ("target_file.h", DocActual.Replacements[0].getFilePath()); + ASSERT_EQ(1u, DocActual.Replacements[0].getOffset()); + ASSERT_EQ(10u, DocActual.Replacements[0].getLength()); + ASSERT_EQ("replacement", DocActual.Replacements[0].getReplacementText()); +} -- cgit v1.2.3