blob: 8e7913cc67f35aa3b9a971d2e1ac5ed98c980bf4 [file] [log] [blame]
#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 = "<the buffer>";
auto Buf = llvm::MemoryBuffer::getMemBufferCopy(Source, BufName);
struct PH {
std::string Full;
std::string Content;
std::string Ident;
};
std::vector<PH> 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);
}