12 #include "gmock/gmock.h"
13 #include "gtest/gtest.h"
24 using ::testing::AllOf;
26 MATCHER_P(Scheme, S,
"") {
return arg.scheme() == S; }
27 MATCHER_P(Authority, A,
"") {
return arg.authority() == A; }
28 MATCHER_P(Body, B,
"") {
return arg.body() == B; }
30 std::string createOrDie(llvm::StringRef AbsolutePath,
31 llvm::StringRef Scheme =
"file") {
34 llvm_unreachable(
toString(Uri.takeError()).c_str());
35 return Uri->toString();
38 URI parseOrDie(llvm::StringRef Uri) {
41 llvm_unreachable(
toString(U.takeError()).c_str());
45 TEST(PercentEncodingTest, Encode) {
46 EXPECT_EQ(
URI(
"x",
"",
"a/b/c").
toString(),
"x:a/b/c");
47 EXPECT_EQ(
URI(
"x",
"",
"a!b;c~").
toString(),
"x:a%21b%3Bc~");
48 EXPECT_EQ(
URI(
"x",
"",
"a123b").
toString(),
"x:a123b");
49 EXPECT_EQ(
URI(
"x",
"",
"a:b;c").
toString(),
"x:a:b%3Bc");
52 TEST(PercentEncodingTest, Decode) {
53 EXPECT_EQ(parseOrDie(
"x:a/b/c").body(),
"a/b/c");
55 EXPECT_EQ(parseOrDie(
"s%2b://%3a/%3").scheme(),
"s+");
56 EXPECT_EQ(parseOrDie(
"s%2b://%3a/%3").authority(),
":");
57 EXPECT_EQ(parseOrDie(
"s%2b://%3a/%3").body(),
"/%3");
59 EXPECT_EQ(parseOrDie(
"x:a%21b%3ac~").body(),
"a!b:c~");
60 EXPECT_EQ(parseOrDie(
"x:a:b%3bc").body(),
"a:b;c");
63 std::string resolveOrDie(
const URI &U, llvm::StringRef HintPath =
"") {
70 TEST(URITest, Create) {
72 EXPECT_THAT(createOrDie(
"c:\\x\\y\\z"),
"file:///c:/x/y/z");
74 EXPECT_THAT(createOrDie(
"/x/y/z"),
"file:///x/y/z");
75 EXPECT_THAT(createOrDie(
"/(x)/y/\\ z"),
"file:///%28x%29/y/%5C%20z");
79 TEST(URITest, FailedCreate) {
85 TEST(URITest, Parse) {
86 EXPECT_THAT(parseOrDie(
"file://auth/x/y/z"),
87 AllOf(Scheme(
"file"), Authority(
"auth"), Body(
"/x/y/z")));
89 EXPECT_THAT(parseOrDie(
"file://au%3dth/%28x%29/y/%5c%20z"),
90 AllOf(Scheme(
"file"), Authority(
"au=th"), Body(
"/(x)/y/\\ z")));
92 EXPECT_THAT(parseOrDie(
"file:///%28x%29/y/%5c%20z"),
93 AllOf(Scheme(
"file"), Authority(
""), Body(
"/(x)/y/\\ z")));
94 EXPECT_THAT(parseOrDie(
"file:///x/y/z"),
95 AllOf(Scheme(
"file"), Authority(
""), Body(
"/x/y/z")));
96 EXPECT_THAT(parseOrDie(
"file:"),
97 AllOf(Scheme(
"file"), Authority(
""), Body(
"")));
98 EXPECT_THAT(parseOrDie(
"file:///x/y/z%2"),
99 AllOf(Scheme(
"file"), Authority(
""), Body(
"/x/y/z%2")));
100 EXPECT_THAT(parseOrDie(
"http://llvm.org"),
101 AllOf(Scheme(
"http"), Authority(
"llvm.org"), Body(
"")));
102 EXPECT_THAT(parseOrDie(
"http://llvm.org/"),
103 AllOf(Scheme(
"http"), Authority(
"llvm.org"), Body(
"/")));
104 EXPECT_THAT(parseOrDie(
"http://llvm.org/D"),
105 AllOf(Scheme(
"http"), Authority(
"llvm.org"), Body(
"/D")));
106 EXPECT_THAT(parseOrDie(
"http:/"),
107 AllOf(Scheme(
"http"), Authority(
""), Body(
"/")));
108 EXPECT_THAT(parseOrDie(
"urn:isbn:0451450523"),
109 AllOf(Scheme(
"urn"), Authority(
""), Body(
"isbn:0451450523")));
111 parseOrDie(
"file:///c:/windows/system32/"),
112 AllOf(Scheme(
"file"), Authority(
""), Body(
"/c:/windows/system32/")));
115 TEST(URITest, ParseFailed) {
124 TEST(URITest, Resolve) {
126 EXPECT_THAT(resolveOrDie(parseOrDie(
"file:///c%3a/x/y/z")),
"c:\\x\\y\\z");
127 EXPECT_THAT(resolveOrDie(parseOrDie(
"file:///c:/x/y/z")),
"c:\\x\\y\\z");
129 EXPECT_EQ(resolveOrDie(parseOrDie(
"file:/a/b/c")),
"/a/b/c");
130 EXPECT_EQ(resolveOrDie(parseOrDie(
"file://auth/a/b/c")),
"/a/b/c");
131 EXPECT_THAT(resolveOrDie(parseOrDie(
"file://au%3dth/%28x%29/y/%20z")),
133 EXPECT_THAT(resolveOrDie(parseOrDie(
"file:///c:/x/y/z")),
"c:/x/y/z");
135 EXPECT_EQ(resolveOrDie(parseOrDie(
"unittest:///a"),
testPath(
"x")),
139 std::string resolvePathOrDie(llvm::StringRef AbsPath,
140 llvm::StringRef HintPath =
"") {
147 TEST(URITest, ResolvePath) {
154 EXPECT_EQ(resolvePathOrDie(FilePath), FilePath);
158 EXPECT_FALSE(Resolve);
159 llvm::consumeError(Resolve.takeError());
162 TEST(URITest, Platform) {
165 EXPECT_TRUE(static_cast<bool>(U));
166 EXPECT_THAT(resolveOrDie(*U),
Path);
169 TEST(URITest, ResolveFailed) {
170 auto FailedResolve = [](StringRef Uri) {
173 consumeError(
Path.takeError());
180 EXPECT_TRUE(FailedResolve(
"no:/a/b/c"));
182 EXPECT_TRUE(FailedResolve(
"file:a/b/c"));