File: Placeholders.cpp

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (88 lines) | stat: -rw-r--r-- 2,614 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#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);
}