Siv3D / OpenSiv3D

C++20 framework for creative coding 🎮🎨🎹 / Cross-platform support (Windows, macOS, Linux, and the Web)
https://siv3d.github.io/
MIT License
994 stars 136 forks source link

FileSytem:: の関数をリソースファイルパスにも使えるようにする #1223

Closed Reputeless closed 1 month ago

Reputeless commented 4 months ago

など

Reputeless commented 1 month ago

コーナーケース対策も強化。

# include <Siv3D.hpp>

void TestExtension(FilePath path, StringView s2)
{
    const String s1 = FileSystem::Extension(path);

    if (s1 == s2)
    {
        Console << U"OK";
    }
    else
    {
        Console << U"Fail: `{}` -> `{}` vs `{}`"_fmt(path, s1, s2);
    }
}

void TestFileName(FilePath path, StringView s2)
{
    const String s1 = FileSystem::FileName(path);

    if (s1 == s2)
    {
        Console << U"OK";
    }
    else
    {
        Console << U"Fail: `{}` -> `{}` vs `{}`"_fmt(path, s1, s2);
    }
}

void TestBaseName(FilePath path, StringView)
{
    const String fileName = FileSystem::FileName(path);
    const String baseName = FileSystem::BaseName(path);
    const String extension = FileSystem::Extension(path);

    String s;

    if (extension)
    {
        s = baseName + U'.' + extension;
    }
    else
    {
        s = baseName;
    }

    if (s.lowercased() == fileName.lowercased())
    {
        Console << U"OK";
    }
    else
    {
        Console << U"Fail: `{}` -> `{}` vs `{}`"_fmt(path, s, fileName);
    }
}

void Main()
{
    TestExtension(U"aaa.png", U"png");
    TestExtension(U"./aaa.png", U"png");
    TestExtension(U"../aaa.png", U"png");
    TestExtension(U"aaa", U"");
    TestExtension(U"aaa.bbb/ccc", U"");
    TestExtension(U"aaa.bbb/ccc.d", U"d");
    TestExtension(U"aaa.bbb/ccc.d.e", U"e");
    TestExtension(U"", U"");
    TestExtension(U"./", U"");
    TestExtension(U"../", U"");
    TestExtension(Resource(U"example/windmill.png"), U"png");
    TestExtension(U"document.txt", U"txt");
    TestExtension(U"filename", U"");
    TestExtension(U"./filename", U"");
    TestExtension(U".gitignore", U"");
    TestExtension(U".test.txt", U"txt");
    TestExtension(U"document.TXT", U"txt");
    TestExtension(U"FILENAME", U"");
    TestExtension(U"./FILENAME", U"");
    TestExtension(U".GITIGNORE", U"");
    TestExtension(U".test.TXT", U"txt");
    TestExtension(U"path/to/file.pdf", U"pdf");
    TestExtension(U"./path/./to/file.pdf", U"pdf");
    TestExtension(U"./path/../to/file.pdf", U"pdf");
    TestExtension(U"../path/to/file.pdf", U"pdf");
    TestExtension(U"archive.tar.gz", U"gz");
    TestExtension(U"archive.tar.GZ", U"gz");
    TestExtension(U"file.", U"");
    TestExtension(U"file..", U"");
    TestExtension(U"file...", U"");
    TestExtension(U"file.txt.", U"");
    TestExtension(U"file.txt..", U"");
    TestExtension(U"file.txt...", U"");
    TestExtension(U"my document.docx", U"docx");
    TestExtension(U".hidden.tar.gz", U"gz");
    TestExtension(U"path/to/.config.file.dat", U"dat");
    TestExtension(U"....", U"");
    TestExtension(U"file.middle.", U"");
    TestExtension(U"path.to.folder/file", U"");
    TestExtension(U"C:\\path\\to\\file.docx", U"docx");
    TestExtension(U"file.extension-with-special_chars!@#", U"extension-with-special_chars!@#");
    TestExtension(U"メモ.テキスト", U"テキスト");
    TestExtension(U"my file. ", U" ");
    TestExtension(U"file..txt", U"txt");
    TestExtension(U"a.a", U"a");
    TestExtension(U"a.A", U"a");
    TestExtension(Resource(U"example/windmill.png"), U"png");
    TestExtension(Resource(U"example/windmill"), U"");
    TestExtension(Resource(U"example.test/windmill"), U"");
    TestExtension(Resource(U"example.test/windmill.p"), U"p");
    TestExtension(Resource(U"example.test/a.b.c/windmill.p"), U"p");
    TestExtension(Resource(U"example.test/a.b.c/windmill.p.q"), U"q");

    Console << U"----";

    TestFileName(U"aaa.png", U"aaa.png");
    TestFileName(U"./aaa.png", U"aaa.png");
    TestFileName(U"../aaa.png", U"aaa.png");
    TestFileName(U"aaa/", U"");
    TestFileName(U"aaa/bbb/", U"");
    TestFileName(U"aaa/bbb.aa/ccc", U"ccc");
    TestFileName(U"aaa/bbb.aa/ccc/", U"");
    TestFileName(U"aaa", U"aaa");
    TestFileName(U"aaa.bbb/ccc", U"ccc");
    TestFileName(U"aaa.bbb/ccc.d", U"ccc.d");
    TestFileName(U"aaa.bbb/ccc.d.e", U"ccc.d.e");
    TestFileName(U"", U"");
    TestFileName(U"./", U"");
    TestFileName(U"../", U"");
    TestFileName(Resource(U"example/windmill.png"), U"windmill.png");
    TestFileName(U"document.txt", U"document.txt");
    TestFileName(U"filename", U"filename");
    TestFileName(U"./filename", U"filename");
    TestFileName(U".gitignore", U".gitignore");
    TestFileName(U".test.txt", U".test.txt");
    TestFileName(U"document.TXT", U"document.TXT");
    TestFileName(U"FILENAME", U"FILENAME");
    TestFileName(U"./FILENAME", U"FILENAME");
    TestFileName(U".GITIGNORE", U".GITIGNORE");
    TestFileName(U".test.TXT", U".test.TXT");
    TestFileName(U"path/to/file.pdf", U"file.pdf");
    TestFileName(U"./path/./to/file.pdf", U"file.pdf");
    TestFileName(U"./path/../to/file.pdf", U"file.pdf");
    TestFileName(U"../path/to/file.pdf", U"file.pdf");
    TestFileName(U"archive.tar.gz", U"archive.tar.gz");
    TestFileName(U"archive.tar.GZ", U"archive.tar.GZ");
    TestFileName(U"file.", U"file.");
    TestFileName(U"file..", U"file..");
    TestFileName(U"file...", U"file...");
    TestFileName(U"file.txt.", U"file.txt.");
    TestFileName(U"file.txt..", U"file.txt..");
    TestFileName(U"file.txt...", U"file.txt...");
    TestFileName(U"my document.docx", U"my document.docx");
    TestFileName(U".hidden.tar.gz", U".hidden.tar.gz");
    TestFileName(U"path/to/.config.file.dat", U".config.file.dat");
    TestFileName(U"....", U"....");
    TestFileName(U"file.middle.", U"file.middle.");
    TestFileName(U"path.to.folder/file", U"file");
    TestFileName(U"C:\\path\\to\\file.docx", U"file.docx");
    TestFileName(U"file.extension-with-special_chars!@#", U"file.extension-with-special_chars!@#");
    TestFileName(U"メモ.テキスト", U"メモ.テキスト");
    TestFileName(U"my file. ", U"my file. ");
    TestFileName(U"file..txt", U"file..txt");
    TestFileName(U"a.a", U"a.a");
    TestFileName(U"a.A", U"a.A");
    TestFileName(Resource(U"example/windmill.png"), U"windmill.png");
    TestFileName(Resource(U"example/windmill"), U"windmill");
    TestFileName(Resource(U"example.test/windmill"), U"windmill");
    TestFileName(Resource(U"example.test/windmill/"), U"");
    TestFileName(Resource(U""), U"");
    TestFileName(Resource(U"example.test/windmill.p"), U"windmill.p");
    TestFileName(Resource(U"example.test/a.b.c/windmill.p"), U"windmill.p");
    TestFileName(Resource(U"example.test/a.b.c/windmill.p.q"), U"windmill.p.q");

    Console << U"----";

    TestBaseName(U"aaa.png", U"aaa.png");
    TestBaseName(U"./aaa.png", U"aaa.png");
    TestBaseName(U"../aaa.png", U"aaa.png");
    TestBaseName(U"aaa/", U"");
    TestBaseName(U"aaa/bbb/", U"");
    TestBaseName(U"aaa/bbb.aa/ccc", U"ccc");
    TestBaseName(U"aaa/bbb.aa/ccc/", U"");
    TestBaseName(U"aaa", U"aaa");
    TestBaseName(U"aaa.bbb/ccc", U"ccc");
    TestBaseName(U"aaa.bbb/ccc.d", U"ccc.d");
    TestBaseName(U"aaa.bbb/ccc.d.e", U"ccc.d.e");
    TestBaseName(U"", U"");
    TestBaseName(U"./", U"");
    TestBaseName(U"../", U"");
    TestBaseName(Resource(U"example/windmill.png"), U"windmill.png");
    TestBaseName(U"document.txt", U"document.txt");
    TestBaseName(U"filename", U"filename");
    TestBaseName(U"./filename", U"filename");
    TestBaseName(U".gitignore", U".gitignore");
    TestBaseName(U".test.txt", U".test.txt");
    TestBaseName(U"document.TXT", U"document.TXT");
    TestBaseName(U"FILENAME", U"FILENAME");
    TestBaseName(U"./FILENAME", U"FILENAME");
    TestBaseName(U".GITIGNORE", U".GITIGNORE");
    TestBaseName(U".test.TXT", U".test.TXT");
    TestBaseName(U"path/to/file.pdf", U"file.pdf");
    TestBaseName(U"./path/./to/file.pdf", U"file.pdf");
    TestBaseName(U"./path/../to/file.pdf", U"file.pdf");
    TestBaseName(U"../path/to/file.pdf", U"file.pdf");
    TestBaseName(U"archive.tar.gz", U"archive.tar.gz");
    TestBaseName(U"archive.tar.GZ", U"archive.tar.GZ");
    TestBaseName(U"file.", U"file.");
    TestBaseName(U"file..", U"file..");
    TestBaseName(U"file...", U"file...");
    TestBaseName(U"file.txt.", U"file.txt.");
    TestBaseName(U"file.txt..", U"file.txt..");
    TestBaseName(U"file.txt...", U"file.txt...");
    TestBaseName(U"my document.docx", U"my document.docx");
    TestBaseName(U".hidden.tar.gz", U".hidden.tar.gz");
    TestBaseName(U"path/to/.config.file.dat", U".config.file.dat");
    TestBaseName(U"....", U"....");
    TestBaseName(U"file.middle.", U"file.middle.");
    TestBaseName(U"path.to.folder/file", U"file");
    TestBaseName(U"C:\\path\\to\\file.docx", U"file.docx");
    TestBaseName(U"file.extension-with-special_chars!@#", U"file.extension-with-special_chars!@#");
    TestBaseName(U"メモ.テキスト", U"メモ.テキスト");
    TestBaseName(U"my file. ", U"my file. ");
    TestBaseName(U"file..txt", U"file..txt");
    TestBaseName(U"a.a", U"a.a");
    TestBaseName(U"a.A", U"a.A");
    TestBaseName(Resource(U"example/windmill.png"), U"windmill.png");
    TestBaseName(Resource(U"example/windmill"), U"windmill");
    TestBaseName(Resource(U"example.test/windmill"), U"windmill");
    TestBaseName(Resource(U"example.test/windmill/"), U"");
    TestBaseName(Resource(U""), U"");
    TestBaseName(Resource(U"example.test/windmill.p"), U"windmill.p");
    TestBaseName(Resource(U"example.test/a.b.c/windmill.p"), U"windmill.p");
    TestBaseName(Resource(U"example.test/a.b.c/windmill.p.q"), U"windmill.p.q");

    while (System::Update())
    {

    }
}