31 _getcwd(buf,
sizeof(buf));
33 return parts[parts.size() - 1].AsString();
36 string NormalizeAndCheckNoError(
const string& input) {
39 EXPECT_TRUE(normalizer.Normalize(input, &result, &err));
44 string NormalizeRelativeAndCheckNoError(
const string& input,
45 const string& relative_to) {
48 EXPECT_TRUE(normalizer.Normalize(input, &result, &err));
56 EXPECT_EQ(
"b", NormalizeAndCheckNoError(
"a\\..\\b"));
57 EXPECT_EQ(
"b", NormalizeAndCheckNoError(
"a\\../b"));
58 EXPECT_EQ(
"a/b", NormalizeAndCheckNoError(
"a\\.\\b"));
59 EXPECT_EQ(
"a/b", NormalizeAndCheckNoError(
"a\\./b"));
64 string currentdir = GetCurDir();
65 EXPECT_EQ(
"c", NormalizeRelativeAndCheckNoError(
"a/b/c",
"a/b"));
69 EXPECT_EQ(
string(
"../") + currentdir +
string(
"/a"),
70 NormalizeRelativeAndCheckNoError(
"a",
"../b"));
71 EXPECT_EQ(
string(
"../") + currentdir +
string(
"/a/b"),
72 NormalizeRelativeAndCheckNoError(
"a/b",
"../c"));
73 EXPECT_EQ(
"../../a", NormalizeRelativeAndCheckNoError(
"a",
"b/c"));
74 EXPECT_EQ(
".", NormalizeRelativeAndCheckNoError(
"a",
"a"));
78 EXPECT_EQ(
"b", NormalizeAndCheckNoError(
"Abc\\..\\b"));
79 EXPECT_EQ(
"BdEf", NormalizeAndCheckNoError(
"Abc\\..\\BdEf"));
80 EXPECT_EQ(
"A/b", NormalizeAndCheckNoError(
"A\\.\\b"));
81 EXPECT_EQ(
"a/b", NormalizeAndCheckNoError(
"a\\./b"));
82 EXPECT_EQ(
"A/B", NormalizeAndCheckNoError(
"A\\.\\B"));
83 EXPECT_EQ(
"A/B", NormalizeAndCheckNoError(
"A\\./B"));
88 NormalizeRelativeAndCheckNoError(
"p:\\vs08\\stuff.h",
"p:\\vs08"));
90 NormalizeRelativeAndCheckNoError(
"P:\\Vs08\\stuff.h",
"p:\\vs08"));
91 EXPECT_EQ(
"p:/vs08/stuff.h",
92 NormalizeRelativeAndCheckNoError(
"p:\\vs08\\stuff.h",
"c:\\vs08"));
93 EXPECT_EQ(
"P:/vs08/stufF.h", NormalizeRelativeAndCheckNoError(
94 "P:\\vs08\\stufF.h",
"D:\\stuff/things"));
95 EXPECT_EQ(
"P:/vs08/stuff.h", NormalizeRelativeAndCheckNoError(
96 "P:/vs08\\stuff.h",
"D:\\stuff/things"));
97 EXPECT_EQ(
"P:/wee/stuff.h",
98 NormalizeRelativeAndCheckNoError(
"P:/vs08\\../wee\\stuff.h",
103 const char kLongInputString[] =
104 "C:\\Program Files (x86)\\Microsoft Visual Studio "
105 "12.0\\VC\\INCLUDEwarning #31001: The dll for reading and writing the "
106 "pdb (for example, mspdb110.dll) could not be found on your path. This "
107 "is usually a configuration error. Compilation will continue using /Z7 "
108 "instead of /Zi, but expect a similar error when you link your program.";
113 normalizer.
Normalize(kLongInputString, &result, &err));
114 EXPECT_EQ(
"path too long", err);
119 char kExactlyMaxPath[_MAX_PATH + 1];
120 ASSERT_STRNE(_getcwd(kExactlyMaxPath,
sizeof kExactlyMaxPath), NULL);
122 int cwd_len = strlen(kExactlyMaxPath);
123 ASSERT_LE(cwd_len + 3 + 1, _MAX_PATH);
124 kExactlyMaxPath[cwd_len] =
'\\';
125 kExactlyMaxPath[cwd_len + 1] =
'a';
126 kExactlyMaxPath[cwd_len + 2] =
'\\';
128 kExactlyMaxPath[cwd_len + 3] =
'a';
130 for (
int i = cwd_len + 4; i < _MAX_PATH; ++i) {
131 if (i > cwd_len + 4 && i < _MAX_PATH - 1 && i % 10 == 0)
132 kExactlyMaxPath[i] =
'\\';
134 kExactlyMaxPath[i] =
'a';
137 kExactlyMaxPath[_MAX_PATH] =
'\0';
139 EXPECT_EQ(strlen(kExactlyMaxPath),
static_cast<size_t>(_MAX_PATH));
141 string forward_slashes(kExactlyMaxPath);
142 replace(forward_slashes.begin(), forward_slashes.end(),
'\\',
'/');
144 EXPECT_EQ(forward_slashes.substr(cwd_len + 1),
145 NormalizeAndCheckNoError(kExactlyMaxPath));
152 EXPECT_TRUE(normalizer.
Normalize(
"a", &result, &err));
157 char kExactlyMaxPath[_MAX_PATH + 1];
158 for (
int i = 0; i < _MAX_PATH; ++i) {
159 if (i < _MAX_PATH - 1 && i % 10 == 4)
160 kExactlyMaxPath[i] =
'\\';
162 kExactlyMaxPath[i] =
'a';
164 kExactlyMaxPath[_MAX_PATH] =
'\0';
165 EXPECT_EQ(strlen(kExactlyMaxPath),
static_cast<size_t>(_MAX_PATH));
168 EXPECT_FALSE(normalizer.
Normalize(kExactlyMaxPath, &result, &err));
169 EXPECT_TRUE(err.find(
"GetFullPathName") != string::npos);
TEST(IncludesNormalize, Simple)
vector< StringPiece > SplitStringPiece(StringPiece input, char sep)
Utility functions for normalizing include paths on Windows.
static std::string AbsPath(StringPiece s, std::string *err)
bool Normalize(const std::string &input, std::string *result, std::string *err) const
Normalize by fixing slashes style, fixing redundant .