blob: b7ad0efdb458c5aff0fecf9323dbf4891fdccb31 [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();
}
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);
}