1 // Copyright 2012 Google Inc. All Rights Reserved.
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
15 #include "includes_normalize.h"
28 _getcwd(buf, sizeof(buf));
29 vector<string> parts = IncludesNormalize::Split(string(buf), '\\');
30 return parts[parts.size() - 1];
33 string NormalizeAndCheckNoError(const string& input) {
35 EXPECT_TRUE(IncludesNormalize::Normalize(input.c_str(), NULL, &result, &err));
40 string NormalizeRelativeAndCheckNoError(const string& input,
41 const string& relative_to) {
43 EXPECT_TRUE(IncludesNormalize::Normalize(input.c_str(), relative_to.c_str(),
51 TEST(IncludesNormalize, Simple) {
52 EXPECT_EQ("b", NormalizeAndCheckNoError("a\\..\\b"));
53 EXPECT_EQ("b", NormalizeAndCheckNoError("a\\../b"));
54 EXPECT_EQ("a/b", NormalizeAndCheckNoError("a\\.\\b"));
55 EXPECT_EQ("a/b", NormalizeAndCheckNoError("a\\./b"));
58 TEST(IncludesNormalize, WithRelative) {
59 string currentdir = GetCurDir();
60 EXPECT_EQ("c", NormalizeRelativeAndCheckNoError("a/b/c", "a/b"));
61 EXPECT_EQ("a", NormalizeAndCheckNoError(IncludesNormalize::AbsPath("a")));
62 EXPECT_EQ(string("../") + currentdir + string("/a"),
63 NormalizeRelativeAndCheckNoError("a", "../b"));
64 EXPECT_EQ(string("../") + currentdir + string("/a/b"),
65 NormalizeRelativeAndCheckNoError("a/b", "../c"));
66 EXPECT_EQ("../../a", NormalizeRelativeAndCheckNoError("a", "b/c"));
67 EXPECT_EQ(".", NormalizeRelativeAndCheckNoError("a", "a"));
70 TEST(IncludesNormalize, Case) {
71 EXPECT_EQ("b", NormalizeAndCheckNoError("Abc\\..\\b"));
72 EXPECT_EQ("BdEf", NormalizeAndCheckNoError("Abc\\..\\BdEf"));
73 EXPECT_EQ("A/b", NormalizeAndCheckNoError("A\\.\\b"));
74 EXPECT_EQ("a/b", NormalizeAndCheckNoError("a\\./b"));
75 EXPECT_EQ("A/B", NormalizeAndCheckNoError("A\\.\\B"));
76 EXPECT_EQ("A/B", NormalizeAndCheckNoError("A\\./B"));
79 TEST(IncludesNormalize, Join) {
81 EXPECT_EQ("", IncludesNormalize::Join(x, ':'));
83 EXPECT_EQ("alpha", IncludesNormalize::Join(x, ':'));
86 EXPECT_EQ("alpha:beta:gamma", IncludesNormalize::Join(x, ':'));
89 TEST(IncludesNormalize, Split) {
90 EXPECT_EQ("", IncludesNormalize::Join(IncludesNormalize::Split("", '/'),
92 EXPECT_EQ("a", IncludesNormalize::Join(IncludesNormalize::Split("a", '/'),
95 IncludesNormalize::Join(
96 IncludesNormalize::Split("a/b/c", '/'), ':'));
99 TEST(IncludesNormalize, ToLower) {
100 EXPECT_EQ("", IncludesNormalize::ToLower(""));
101 EXPECT_EQ("stuff", IncludesNormalize::ToLower("Stuff"));
102 EXPECT_EQ("stuff and things", IncludesNormalize::ToLower("Stuff AND thINGS"));
103 EXPECT_EQ("stuff 3and thin43gs",
104 IncludesNormalize::ToLower("Stuff 3AND thIN43GS"));
107 TEST(IncludesNormalize, DifferentDrive) {
109 NormalizeRelativeAndCheckNoError("p:\\vs08\\stuff.h", "p:\\vs08"));
111 NormalizeRelativeAndCheckNoError("P:\\Vs08\\stuff.h", "p:\\vs08"));
112 EXPECT_EQ("p:/vs08/stuff.h",
113 NormalizeRelativeAndCheckNoError("p:\\vs08\\stuff.h", "c:\\vs08"));
114 EXPECT_EQ("P:/vs08/stufF.h", NormalizeRelativeAndCheckNoError(
115 "P:\\vs08\\stufF.h", "D:\\stuff/things"));
116 EXPECT_EQ("P:/vs08/stuff.h", NormalizeRelativeAndCheckNoError(
117 "P:/vs08\\stuff.h", "D:\\stuff/things"));
118 EXPECT_EQ("P:/wee/stuff.h",
119 NormalizeRelativeAndCheckNoError("P:/vs08\\../wee\\stuff.h",
120 "D:\\stuff/things"));
123 TEST(IncludesNormalize, LongInvalidPath) {
124 const char kLongInputString[] =
125 "C:\\Program Files (x86)\\Microsoft Visual Studio "
126 "12.0\\VC\\INCLUDEwarning #31001: The dll for reading and writing the "
127 "pdb (for example, mspdb110.dll) could not be found on your path. This "
128 "is usually a configuration error. Compilation will continue using /Z7 "
129 "instead of /Zi, but expect a similar error when you link your program.";
130 // Too long, won't be canonicalized. Ensure doesn't crash.
133 IncludesNormalize::Normalize(kLongInputString, NULL, &result, &err));
134 EXPECT_EQ("path too long", err);
136 const char kExactlyMaxPath[] =
163 string forward_slashes(kExactlyMaxPath);
164 replace(forward_slashes.begin(), forward_slashes.end(), '\\', '/');
165 // Make sure a path that's exactly _MAX_PATH long is canonicalized.
166 EXPECT_EQ(forward_slashes,
167 NormalizeAndCheckNoError(kExactlyMaxPath));