path_tests.cpp (11849B)
1 // SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin <stenzek@gmail.com> 2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) 3 4 #include "common/path.h" 5 #include "common/types.h" 6 #include <gtest/gtest.h> 7 8 TEST(Path, ToNativePath) 9 { 10 ASSERT_EQ(Path::ToNativePath(""), ""); 11 12 #ifdef _WIN32 13 ASSERT_EQ(Path::ToNativePath("foo"), "foo"); 14 ASSERT_EQ(Path::ToNativePath("foo\\"), "foo"); 15 ASSERT_EQ(Path::ToNativePath("foo\\\\bar"), "foo\\bar"); 16 ASSERT_EQ(Path::ToNativePath("foo\\bar"), "foo\\bar"); 17 ASSERT_EQ(Path::ToNativePath("foo\\bar\\baz"), "foo\\bar\\baz"); 18 ASSERT_EQ(Path::ToNativePath("foo\\bar/baz"), "foo\\bar\\baz"); 19 ASSERT_EQ(Path::ToNativePath("foo/bar/baz"), "foo\\bar\\baz"); 20 ASSERT_EQ(Path::ToNativePath("foo/🙃bar/b🙃az"), "foo\\🙃bar\\b🙃az"); 21 ASSERT_EQ(Path::ToNativePath("\\\\foo\\bar\\baz"), "\\\\foo\\bar\\baz"); 22 #else 23 ASSERT_EQ(Path::ToNativePath("foo"), "foo"); 24 ASSERT_EQ(Path::ToNativePath("foo/"), "foo"); 25 ASSERT_EQ(Path::ToNativePath("foo//bar"), "foo/bar"); 26 ASSERT_EQ(Path::ToNativePath("foo/bar"), "foo/bar"); 27 ASSERT_EQ(Path::ToNativePath("foo/bar/baz"), "foo/bar/baz"); 28 ASSERT_EQ(Path::ToNativePath("/foo/bar/baz"), "/foo/bar/baz"); 29 #endif 30 } 31 32 TEST(Path, IsAbsolute) 33 { 34 ASSERT_FALSE(Path::IsAbsolute("")); 35 ASSERT_FALSE(Path::IsAbsolute("foo")); 36 ASSERT_FALSE(Path::IsAbsolute("foo/bar")); 37 ASSERT_FALSE(Path::IsAbsolute("foo/b🙃ar")); 38 #ifdef _WIN32 39 ASSERT_TRUE(Path::IsAbsolute("C:\\foo/bar")); 40 ASSERT_TRUE(Path::IsAbsolute("C://foo\\bar")); 41 ASSERT_FALSE(Path::IsAbsolute("\\foo/bar")); 42 ASSERT_TRUE(Path::IsAbsolute("\\\\foo\\bar\\baz")); 43 ASSERT_TRUE(Path::IsAbsolute("C:\\")); 44 ASSERT_TRUE(Path::IsAbsolute("C:\\Path")); 45 ASSERT_TRUE(Path::IsAbsolute("C:\\Path\\Subdirectory")); 46 ASSERT_TRUE(Path::IsAbsolute("C:/")); 47 ASSERT_TRUE(Path::IsAbsolute("C:/Path")); 48 ASSERT_TRUE(Path::IsAbsolute("C:/Path/Subdirectory")); 49 ASSERT_FALSE(Path::IsAbsolute("")); 50 ASSERT_FALSE(Path::IsAbsolute("C:")); 51 ASSERT_FALSE(Path::IsAbsolute("Path")); 52 ASSERT_FALSE(Path::IsAbsolute("Path/Subdirectory")); 53 #else 54 ASSERT_TRUE(Path::IsAbsolute("/foo/bar")); 55 ASSERT_TRUE(Path::IsAbsolute("/")); 56 ASSERT_TRUE(Path::IsAbsolute("/path")); 57 ASSERT_TRUE(Path::IsAbsolute("/path/subdirectory")); 58 ASSERT_FALSE(Path::IsAbsolute("")); 59 ASSERT_FALSE(Path::IsAbsolute("path")); 60 ASSERT_FALSE(Path::IsAbsolute("path/subdirectory")); 61 #endif 62 } 63 64 TEST(Path, Canonicalize) 65 { 66 ASSERT_EQ(Path::Canonicalize(""), Path::ToNativePath("")); 67 ASSERT_EQ(Path::Canonicalize("foo/bar/../baz"), Path::ToNativePath("foo/baz")); 68 ASSERT_EQ(Path::Canonicalize("foo/bar/./baz"), Path::ToNativePath("foo/bar/baz")); 69 ASSERT_EQ(Path::Canonicalize("foo/./bar/./baz"), Path::ToNativePath("foo/bar/baz")); 70 ASSERT_EQ(Path::Canonicalize("foo/bar/../baz/../foo"), Path::ToNativePath("foo/foo")); 71 ASSERT_EQ(Path::Canonicalize("foo/bar/../baz/./foo"), Path::ToNativePath("foo/baz/foo")); 72 ASSERT_EQ(Path::Canonicalize("./foo"), Path::ToNativePath("foo")); 73 ASSERT_EQ(Path::Canonicalize("../foo"), Path::ToNativePath("../foo")); 74 ASSERT_EQ(Path::Canonicalize("foo/b🙃ar/../b🙃az/./foo"), Path::ToNativePath("foo/b🙃az/foo")); 75 ASSERT_EQ(Path::Canonicalize("ŻąłóРстуぬねのはen🍪⟑η∏☉ⴤℹ︎∩₲ ₱⟑♰⫳🐱/b🙃az/../foℹ︎o"), 76 Path::ToNativePath("ŻąłóРстуぬねのはen🍪⟑η∏☉ⴤℹ︎∩₲ ₱⟑♰⫳🐱/foℹ︎o")); 77 #ifdef _WIN32 78 ASSERT_EQ(Path::Canonicalize("C:\\foo\\bar\\..\\baz\\.\\foo"), "C:\\foo\\baz\\foo"); 79 ASSERT_EQ(Path::Canonicalize("C:/foo\\bar\\..\\baz\\.\\foo"), "C:\\foo\\baz\\foo"); 80 ASSERT_EQ(Path::Canonicalize("foo\\bar\\..\\baz\\.\\foo"), "foo\\baz\\foo"); 81 ASSERT_EQ(Path::Canonicalize("foo\\bar/..\\baz/.\\foo"), "foo\\baz\\foo"); 82 ASSERT_EQ(Path::Canonicalize("\\\\foo\\bar\\baz/..\\foo"), "\\\\foo\\bar\\foo"); 83 #else 84 ASSERT_EQ(Path::Canonicalize("/foo/bar/../baz/./foo"), "/foo/baz/foo"); 85 #endif 86 } 87 88 TEST(Path, Combine) 89 { 90 ASSERT_EQ(Path::Combine("", ""), Path::ToNativePath("")); 91 ASSERT_EQ(Path::Combine("foo", "bar"), Path::ToNativePath("foo/bar")); 92 ASSERT_EQ(Path::Combine("foo/bar", "baz"), Path::ToNativePath("foo/bar/baz")); 93 ASSERT_EQ(Path::Combine("foo/bar", "../baz"), Path::ToNativePath("foo/bar/../baz")); 94 ASSERT_EQ(Path::Combine("foo/bar/", "/baz/"), Path::ToNativePath("foo/bar/baz")); 95 ASSERT_EQ(Path::Combine("foo//bar", "baz/"), Path::ToNativePath("foo/bar/baz")); 96 ASSERT_EQ(Path::Combine("foo//ba🙃r", "b🙃az/"), Path::ToNativePath("foo/ba🙃r/b🙃az")); 97 #ifdef _WIN32 98 ASSERT_EQ(Path::Combine("C:\\foo\\bar", "baz"), "C:\\foo\\bar\\baz"); 99 ASSERT_EQ(Path::Combine("\\\\server\\foo\\bar", "baz"), "\\\\server\\foo\\bar\\baz"); 100 ASSERT_EQ(Path::Combine("foo\\bar", "baz"), "foo\\bar\\baz"); 101 ASSERT_EQ(Path::Combine("foo\\bar\\", "baz"), "foo\\bar\\baz"); 102 ASSERT_EQ(Path::Combine("foo/bar\\", "\\baz"), "foo\\bar\\baz"); 103 ASSERT_EQ(Path::Combine("\\\\foo\\bar", "baz"), "\\\\foo\\bar\\baz"); 104 #else 105 ASSERT_EQ(Path::Combine("/foo/bar", "baz"), "/foo/bar/baz"); 106 #endif 107 } 108 109 TEST(Path, AppendDirectory) 110 { 111 ASSERT_EQ(Path::AppendDirectory("foo/bar", "baz"), Path::ToNativePath("foo/baz/bar")); 112 ASSERT_EQ(Path::AppendDirectory("", "baz"), Path::ToNativePath("baz")); 113 ASSERT_EQ(Path::AppendDirectory("", ""), Path::ToNativePath("")); 114 ASSERT_EQ(Path::AppendDirectory("foo/bar", "🙃"), Path::ToNativePath("foo/🙃/bar")); 115 #ifdef _WIN32 116 ASSERT_EQ(Path::AppendDirectory("foo\\bar", "baz"), "foo\\baz\\bar"); 117 ASSERT_EQ(Path::AppendDirectory("\\\\foo\\bar", "baz"), "\\\\foo\\baz\\bar"); 118 #else 119 ASSERT_EQ(Path::AppendDirectory("/foo/bar", "baz"), "/foo/baz/bar"); 120 #endif 121 } 122 123 TEST(Path, MakeRelative) 124 { 125 ASSERT_EQ(Path::MakeRelative("", ""), Path::ToNativePath("")); 126 ASSERT_EQ(Path::MakeRelative("foo", ""), Path::ToNativePath("foo")); 127 ASSERT_EQ(Path::MakeRelative("", "foo"), Path::ToNativePath("")); 128 ASSERT_EQ(Path::MakeRelative("foo", "bar"), Path::ToNativePath("foo")); 129 130 #ifdef _WIN32 131 #define A "C:\\" 132 #else 133 #define A "/" 134 #endif 135 136 ASSERT_EQ(Path::MakeRelative(A "foo", A "bar"), Path::ToNativePath("../foo")); 137 ASSERT_EQ(Path::MakeRelative(A "foo/bar", A "foo"), Path::ToNativePath("bar")); 138 ASSERT_EQ(Path::MakeRelative(A "foo/bar", A "foo/baz"), Path::ToNativePath("../bar")); 139 ASSERT_EQ(Path::MakeRelative(A "foo/b🙃ar", A "foo/b🙃az"), Path::ToNativePath("../b🙃ar")); 140 ASSERT_EQ(Path::MakeRelative(A "f🙃oo/b🙃ar", A "f🙃oo/b🙃az"), Path::ToNativePath("../b🙃ar")); 141 ASSERT_EQ( 142 Path::MakeRelative(A "ŻąłóРстуぬねのはen🍪⟑η∏☉ⴤℹ︎∩₲ ₱⟑♰⫳🐱/b🙃ar", A "ŻąłóРстуぬねのはen🍪⟑η∏☉ⴤℹ︎∩₲ ₱⟑♰⫳🐱/b🙃az"), 143 Path::ToNativePath("../b🙃ar")); 144 145 #undef A 146 147 #ifdef _WIN32 148 ASSERT_EQ(Path::MakeRelative("\\\\foo\\bar\\baz\\foo", "\\\\foo\\bar\\baz"), "foo"); 149 ASSERT_EQ(Path::MakeRelative("\\\\foo\\bar\\foo", "\\\\foo\\bar\\baz"), "..\\foo"); 150 ASSERT_EQ(Path::MakeRelative("\\\\foo\\bar\\foo", "\\\\other\\bar\\foo"), "\\\\foo\\bar\\foo"); 151 #endif 152 } 153 154 TEST(Path, GetExtension) 155 { 156 ASSERT_EQ(Path::GetExtension("foo"), ""); 157 ASSERT_EQ(Path::GetExtension("foo.txt"), "txt"); 158 ASSERT_EQ(Path::GetExtension("foo.t🙃t"), "t🙃t"); 159 ASSERT_EQ(Path::GetExtension("foo."), ""); 160 ASSERT_EQ(Path::GetExtension("a/b/foo.txt"), "txt"); 161 ASSERT_EQ(Path::GetExtension("a/b/foo"), ""); 162 } 163 164 TEST(Path, GetFileName) 165 { 166 ASSERT_EQ(Path::GetFileName(""), ""); 167 ASSERT_EQ(Path::GetFileName("foo"), "foo"); 168 ASSERT_EQ(Path::GetFileName("foo.txt"), "foo.txt"); 169 ASSERT_EQ(Path::GetFileName("foo"), "foo"); 170 ASSERT_EQ(Path::GetFileName("foo/bar/."), "."); 171 ASSERT_EQ(Path::GetFileName("foo/bar/baz"), "baz"); 172 ASSERT_EQ(Path::GetFileName("foo/bar/baz.txt"), "baz.txt"); 173 #ifdef _WIN32 174 ASSERT_EQ(Path::GetFileName("foo/bar\\baz"), "baz"); 175 ASSERT_EQ(Path::GetFileName("foo\\bar\\baz.txt"), "baz.txt"); 176 #endif 177 } 178 179 TEST(Path, GetFileTitle) 180 { 181 ASSERT_EQ(Path::GetFileTitle(""), ""); 182 ASSERT_EQ(Path::GetFileTitle("foo"), "foo"); 183 ASSERT_EQ(Path::GetFileTitle("foo.txt"), "foo"); 184 ASSERT_EQ(Path::GetFileTitle("foo/bar/."), ""); 185 ASSERT_EQ(Path::GetFileTitle("foo/bar/baz"), "baz"); 186 ASSERT_EQ(Path::GetFileTitle("foo/bar/baz.txt"), "baz"); 187 #ifdef _WIN32 188 ASSERT_EQ(Path::GetFileTitle("foo/bar\\baz"), "baz"); 189 ASSERT_EQ(Path::GetFileTitle("foo\\bar\\baz.txt"), "baz"); 190 #endif 191 } 192 193 TEST(Path, GetDirectory) 194 { 195 ASSERT_EQ(Path::GetDirectory(""), ""); 196 ASSERT_EQ(Path::GetDirectory("foo"), ""); 197 ASSERT_EQ(Path::GetDirectory("foo.txt"), ""); 198 ASSERT_EQ(Path::GetDirectory("foo/bar/."), "foo/bar"); 199 ASSERT_EQ(Path::GetDirectory("foo/bar/baz"), "foo/bar"); 200 ASSERT_EQ(Path::GetDirectory("foo/bar/baz.txt"), "foo/bar"); 201 #ifdef _WIN32 202 ASSERT_EQ(Path::GetDirectory("foo\\bar\\baz"), "foo\\bar"); 203 ASSERT_EQ(Path::GetDirectory("foo\\bar/baz.txt"), "foo\\bar"); 204 #endif 205 } 206 207 TEST(Path, ChangeFileName) 208 { 209 ASSERT_EQ(Path::ChangeFileName("", ""), Path::ToNativePath("")); 210 ASSERT_EQ(Path::ChangeFileName("", "bar"), Path::ToNativePath("bar")); 211 ASSERT_EQ(Path::ChangeFileName("bar", ""), Path::ToNativePath("")); 212 ASSERT_EQ(Path::ChangeFileName("foo/bar", ""), Path::ToNativePath("foo")); 213 ASSERT_EQ(Path::ChangeFileName("foo/", "bar"), Path::ToNativePath("foo/bar")); 214 ASSERT_EQ(Path::ChangeFileName("foo/bar", "baz"), Path::ToNativePath("foo/baz")); 215 ASSERT_EQ(Path::ChangeFileName("foo//bar", "baz"), Path::ToNativePath("foo/baz")); 216 ASSERT_EQ(Path::ChangeFileName("foo//bar.txt", "baz.txt"), Path::ToNativePath("foo/baz.txt")); 217 ASSERT_EQ(Path::ChangeFileName("foo//ba🙃r.txt", "ba🙃z.txt"), Path::ToNativePath("foo/ba🙃z.txt")); 218 #ifdef _WIN32 219 ASSERT_EQ(Path::ChangeFileName("foo/bar", "baz"), "foo\\baz"); 220 ASSERT_EQ(Path::ChangeFileName("foo//bar\\foo", "baz"), "foo\\bar\\baz"); 221 ASSERT_EQ(Path::ChangeFileName("\\\\foo\\bar\\foo", "baz"), "\\\\foo\\bar\\baz"); 222 #else 223 ASSERT_EQ(Path::ChangeFileName("/foo/bar", "baz"), "/foo/baz"); 224 #endif 225 } 226 227 TEST(Path, SanitizeFileName) 228 { 229 ASSERT_EQ(Path::SanitizeFileName("foo"), "foo"); 230 ASSERT_EQ(Path::SanitizeFileName("foo/bar"), "foo_bar"); 231 ASSERT_EQ(Path::SanitizeFileName("f🙃o"), "f🙃o"); 232 ASSERT_EQ(Path::SanitizeFileName("ŻąłóРстуぬねのはen🍪⟑η∏☉ⴤℹ︎∩₲ ₱⟑♰⫳🐱"), "ŻąłóРстуぬねのはen🍪⟑η∏☉ⴤℹ︎∩₲ ₱⟑♰⫳🐱"); 233 ASSERT_EQ(Path::SanitizeFileName("abcdefghijlkmnopqrstuvwxyz-0123456789+&=_[]{}"), 234 "abcdefghijlkmnopqrstuvwxyz-0123456789+&=_[]{}"); 235 ASSERT_EQ(Path::SanitizeFileName("some*path**with*asterisks"), "some_path__with_asterisks"); 236 #ifdef _WIN32 237 ASSERT_EQ(Path::SanitizeFileName("foo:"), "foo_"); 238 ASSERT_EQ(Path::SanitizeFileName("foo:bar."), "foo_bar_"); 239 ASSERT_EQ(Path::SanitizeFileName("foo\\bar"), "foo_bar"); 240 ASSERT_EQ(Path::SanitizeFileName("foo>bar"), "foo_bar"); 241 ASSERT_EQ(Path::SanitizeFileName("foo\\bar", false), "foo\\bar"); 242 #endif 243 ASSERT_EQ(Path::SanitizeFileName("foo/bar", false), "foo/bar"); 244 } 245 246 TEST(Path, RemoveLengthLimits) 247 { 248 #ifdef _WIN32 249 ASSERT_EQ(Path::RemoveLengthLimits("C:\\foo"), "\\\\?\\C:\\foo"); 250 ASSERT_EQ(Path::RemoveLengthLimits("\\\\foo\\bar\\baz"), "\\\\?\\UNC\\foo\\bar\\baz"); 251 #else 252 ASSERT_EQ(Path::RemoveLengthLimits("/foo/bar/baz"), "/foo/bar/baz"); 253 #endif 254 } 255 256 #if 0 257 258 // Relies on presence of files. 259 TEST(Path, RealPath) 260 { 261 #ifdef _WIN32 262 ASSERT_EQ(Path::RealPath("C:\\Users\\Me\\Desktop\\foo\\baz"), "C:\\Users\\Me\\Desktop\\foo\\bar\\baz"); 263 #else 264 ASSERT_EQ(Path::RealPath("/lib/foo/bar"), "/usr/lib/foo/bar"); 265 #endif 266 } 267 268 #endif 269 270 TEST(Path, CreateFileURL) 271 { 272 #ifdef _WIN32 273 ASSERT_EQ(Path::CreateFileURL("C:\\foo\\bar"), "file:///C:/foo/bar"); 274 ASSERT_EQ(Path::CreateFileURL("\\\\server\\share\\file.txt"), "file://server/share/file.txt"); 275 #else 276 ASSERT_EQ(Path::CreateFileURL("/foo/bar"), "file:///foo/bar"); 277 #endif 278 }