From a3a44f0cefb3e0862bcd99df8d3563c952c9e0e9 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Fri, 19 Aug 2022 11:54:09 +0200 Subject: [PATCH] Add StringUtils tests and Paths test and fix detected problem with rooted path starting with `./` --- .../Engine/Platform/Base/StringUtilsBase.cpp | 4 +- Source/Engine/Tests/TestStringUtils.cpp | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 Source/Engine/Tests/TestStringUtils.cpp 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")); + } +}