duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

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 }