#include "swift/IDE/Utils.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/MemoryBuffer.h" #include "gtest/gtest.h" using namespace swift; using namespace ide; static std::string replaceFromString(const std::string &S, bool *HadPH = nullptr) { auto Buf = llvm::MemoryBuffer::getMemBufferCopy(S, ""); Buf = ide::replacePlaceholders(std::move(Buf), HadPH); return Buf->getBuffer().str(); } TEST(Placeholders, Replace) { std::string Source = "aa <#one#> bb <# two #>"; std::string Result = "aa $_0____ bb $_1______"; std::string BufName = ""; auto Buf = llvm::MemoryBuffer::getMemBufferCopy(Source, BufName); struct PH { std::string Full; std::string Content; std::string Ident; }; std::vector PHs; PHs.push_back(PH{"<#one#>", "one", "$_0____"}); PHs.push_back(PH{"<# two #>", " two ", "$_1______"}); unsigned Index = 0; Buf = ide::replacePlaceholders(std::move(Buf), [&](const PlaceholderOccurrence &Occur) { EXPECT_EQ(PHs[Index].Full, std::string(Occur.FullPlaceholder)); EXPECT_EQ(PHs[Index].Content, std::string(Occur.PlaceholderContent)); EXPECT_EQ(PHs[Index].Ident, std::string(Occur.IdentifierReplacement)); ++Index; }); EXPECT_EQ(BufName, std::string(Buf->getBufferIdentifier())); EXPECT_EQ(Result, std::string(Buf->getBuffer())); } TEST(Placeholders, ReplaceNoCallback) { std::string Source = "aa <#one#> bb <# two #>"; std::string Result = "aa $_0____ bb $_1______"; bool HadOne; std::string Out = replaceFromString(Source, &HadOne); EXPECT_EQ(true, HadOne); EXPECT_EQ(Result, Out); } TEST(Placeholders, NoPlaceholder1) { std::string Source = "aa"; bool HadOne; std::string Out = replaceFromString(Source, &HadOne); EXPECT_EQ(false, HadOne); EXPECT_EQ(Source, Out); } TEST(Placeholders, NoPlaceholder2) { bool HadOne; replaceFromString("<#", &HadOne); EXPECT_EQ(false, HadOne); replaceFromString("<#a#", &HadOne); EXPECT_EQ(false, HadOne); replaceFromString("<#a\n#>", &HadOne); EXPECT_EQ(false, HadOne); replaceFromString("< #a#>", &HadOne); EXPECT_EQ(false, HadOne); } TEST(Placeholders, Nested) { std::string Source = "<#<#aa#>#>"; std::string Result = "<#$_0___#>"; std::string Out = replaceFromString(Source); EXPECT_EQ(Result, Out); } TEST(Placeholders, TooShort) { std::string Source; for (unsigned i = 0; i != 102; ++i) { Source += "<##>\n"; } std::string Out = replaceFromString(Source); std::string Last(StringRef(Out).substr(Out.size()-15)); EXPECT_EQ("$_99\n$___\n$___\n", Last); }