diff --git a/Source/Engine/Platform/Base/StringUtilsBase.cpp b/Source/Engine/Platform/Base/StringUtilsBase.cpp index bf4f10149..61482df89 100644 --- a/Source/Engine/Platform/Base/StringUtilsBase.cpp +++ b/Source/Engine/Platform/Base/StringUtilsBase.cpp @@ -336,7 +336,7 @@ void StringUtils::PathRemoveRelativeParts(String& path) Array components; path.Split(TEXT('/'), components); - Array stack; + Array> stack; for (auto& bit : components) { if (bit == TEXT("..")) @@ -365,7 +365,7 @@ void StringUtils::PathRemoveRelativeParts(String& path) } } - const bool isRooted = path.StartsWith(TEXT('/')); + const bool isRooted = path.StartsWith(TEXT('/')) || (path.Length() >= 2 && path[0] == '.' && path[1] == '/'); path.Clear(); for (auto& e : stack) path /= e; diff --git a/Source/Engine/Tests/TestStringUtils.cpp b/Source/Engine/Tests/TestStringUtils.cpp new file mode 100644 index 000000000..34cec8697 --- /dev/null +++ b/Source/Engine/Tests/TestStringUtils.cpp @@ -0,0 +1,63 @@ +// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. + +#include "Engine/Core/Types/String.h" +#include "Engine/Core/Types/StringView.h" +#include "Engine/Platform/StringUtils.h" +#include "Engine/Platform/Windows/WindowsFileSystem.h" +#include + +String TestNormalizePath(const StringView& input) +{ + String path(input); + FileSystem::NormalizePath(path); + StringUtils::PathRemoveRelativeParts(path); + return path; +} + +TEST_CASE("StringUtils") +{ + SECTION("Test Length") + { + CHECK(StringUtils::Length("1234") == 4); + CHECK(StringUtils::Length(TEXT("1234")) == 4); + } + + SECTION("Test Paths") + { + CHECK(StringUtils::GetFileName(TEXT("file")) == TEXT("file")); + CHECK(StringUtils::GetFileName(TEXT("file.ext")) == TEXT("file.ext")); + CHECK(StringUtils::GetFileName(TEXT("folder/file.ext")) == TEXT("file.ext")); + CHECK(StringUtils::GetFileName(TEXT("folder\\file.ext")) == TEXT("file.ext")); + CHECK(StringUtils::GetFileName(TEXT("folder/d/file.ext")) == TEXT("file.ext")); + CHECK(StringUtils::GetFileName(TEXT("folder/d//file.ext")) == TEXT("file.ext")); + CHECK(StringUtils::GetFileName(TEXT("folder/d/../file.ext")) == TEXT("file.ext")); + CHECK(StringUtils::GetFileName(TEXT("folder/d/./file.ext")) == TEXT("file.ext")); + CHECK(StringUtils::GetFileName(TEXT("C:\\folder/d/./file.ext")) == TEXT("file.ext")); + CHECK(StringUtils::GetFileName(TEXT("/folder/d/./file.ext")) == TEXT("file.ext")); + CHECK(StringUtils::GetFileName(TEXT("./folder/d/./file.ext")) == TEXT("file.ext")); + + CHECK(StringUtils::GetDirectoryName(TEXT("file")) == TEXT("")); + CHECK(StringUtils::GetDirectoryName(TEXT("file.ext")) == TEXT("")); + CHECK(StringUtils::GetDirectoryName(TEXT("folder")) == TEXT("")); + CHECK(StringUtils::GetDirectoryName(TEXT("folder\\file.ext")) == TEXT("folder")); + CHECK(StringUtils::GetDirectoryName(TEXT("folder/d/file.ext")) == TEXT("folder/d")); + CHECK(StringUtils::GetDirectoryName(TEXT("folder/d//file.ext")) == TEXT("folder/d/")); + CHECK(StringUtils::GetDirectoryName(TEXT("folder/d/../file.ext")) == TEXT("folder/d/..")); + CHECK(StringUtils::GetDirectoryName(TEXT("folder/d/./file.ext")) == TEXT("folder/d/.")); + CHECK(StringUtils::GetDirectoryName(TEXT("C:\\folder/d/./file.ext")) == TEXT("C:\\folder/d/.")); + CHECK(StringUtils::GetDirectoryName(TEXT("/folder/d/./file.ext")) == TEXT("/folder/d/.")); + CHECK(StringUtils::GetDirectoryName(TEXT("./folder/d/./file.ext")) == TEXT("./folder/d/.")); + + CHECK(TestNormalizePath(TEXT("file")) == TEXT("file")); + CHECK(TestNormalizePath(TEXT("file.ext")) == TEXT("file.ext")); + CHECK(TestNormalizePath(TEXT("folder")) == TEXT("folder")); + CHECK(TestNormalizePath(TEXT("folder\\file.ext")) == TEXT("folder/file.ext")); + CHECK(TestNormalizePath(TEXT("folder/d/file.ext")) == TEXT("folder/d/file.ext")); + CHECK(TestNormalizePath(TEXT("folder/d//file.ext")) == TEXT("folder/d/file.ext")); + CHECK(TestNormalizePath(TEXT("folder/d/../file.ext")) == TEXT("folder/file.ext")); + CHECK(TestNormalizePath(TEXT("folder/d/./file.ext")) == TEXT("folder/d/file.ext")); + CHECK(TestNormalizePath(TEXT("C:\\folder/d/./file.ext")) == TEXT("C:\\folder/d/file.ext")); + CHECK(TestNormalizePath(TEXT("/folder/d/./file.ext")) == TEXT("/folder/d/file.ext")); + CHECK(TestNormalizePath(TEXT("./folder/d/./file.ext")) == TEXT("/folder/d/file.ext")); + } +}