-
Notifications
You must be signed in to change notification settings - Fork 51
/
TemplatedCustomNamer.cpp
99 lines (86 loc) · 3.67 KB
/
TemplatedCustomNamer.cpp
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
89
90
91
92
93
94
95
96
97
98
99
#include "TemplatedCustomNamer.h"
#include "ApprovalTests//utilities/Path.h"
#include "ApprovalTests//utilities/StringUtils.h"
#include <functional>
#include <utility>
namespace
{
std::string replaceIfContains(std::string input,
std::string pattern,
std::function<std::string(void)> replacer)
{
if (!ApprovalTests::StringUtils::contains(input, pattern))
{
return input;
}
return ApprovalTests::StringUtils::replaceAll(input, pattern, replacer());
}
}
namespace ApprovalTests
{
TemplatedCustomNamer::TemplatedCustomNamer(std::string templateString)
: template_(std::move(templateString))
{
if (!StringUtils::contains(template_, "{ApprovedOrReceived}"))
{
throw std::runtime_error(
"Template must contain `{ApprovedOrReceived}` or the received and "
"approved files will not be unique.\n"
"Template: " +
template_);
}
}
Path TemplatedCustomNamer::constructFromTemplate(
const std::string& extensionWithDot,
const std::string& approvedOrReceivedReplacement) const
{
std::string result = template_;
// begin-snippet: custom_namer_tags
auto testSourceDirectory = "{TestSourceDirectory}";
auto relativeTestSourceDirectory = "{RelativeTestSourceDirectory}";
auto approvalsSubdirectory = "{ApprovalsSubdirectory}";
auto testFileName = "{TestFileName}";
auto testCaseName = "{TestCaseName}";
auto approvedOrReceived = "{ApprovedOrReceived}";
auto fileExtension = "{FileExtension}";
// end-snippet
using namespace ApprovalTests;
// clang-format off
result = replaceIfContains(result, fileExtension, [&](){return extensionWithDot.substr(1);});
result = replaceIfContains(result, approvalsSubdirectory, [&](){return namer_.getApprovalsSubdirectory();});
result = replaceIfContains(result, relativeTestSourceDirectory, [&](){return namer_.getRelativeTestSourceDirectory();});
result = replaceIfContains(result, testFileName, [&](){return namer_.getSourceFileName();});
result = replaceIfContains(result, testCaseName, [&](){return namer_.getTestName();});
result = replaceIfContains(result, testSourceDirectory, [&](){return namer_.getTestSourceDirectory();});
result = replaceIfContains(result, approvedOrReceived, [&](){return approvedOrReceivedReplacement;});
// clang-format on
// Convert to native directory separators:
return Path(result);
}
std::string TemplatedCustomNamer::getApprovedFile(std::string extensionWithDot) const
{
return getApprovedFileAsPath(extensionWithDot).toString();
}
std::string TemplatedCustomNamer::getReceivedFile(std::string extensionWithDot) const
{
return getReceivedFileAsPath(extensionWithDot).toString();
}
Path TemplatedCustomNamer::getApprovedFileAsPath(std::string extensionWithDot) const
{
return constructFromTemplate(extensionWithDot, "approved");
}
Path TemplatedCustomNamer::getReceivedFileAsPath(std::string extensionWithDot) const
{
return constructFromTemplate(extensionWithDot, "received");
}
std::shared_ptr<TemplatedCustomNamer>
TemplatedCustomNamer::create(std::string templateString)
{
return std::make_shared<TemplatedCustomNamer>(templateString);
}
DefaultNamerDisposer
TemplatedCustomNamer::useAsDefaultNamer(std::string templateString)
{
return Approvals::useAsDefaultNamer([=]() { return create(templateString); });
}
}