Browse Source

Fixed FilePath behavior with trailing slash.

Branimir Karadžić 8 years ago
parent
commit
0c1354aacc
2 changed files with 22 additions and 10 deletions
  1. 10 0
      src/filepath.cpp
  2. 12 10
      tests/filepath_test.cpp

+ 10 - 0
src/filepath.cpp

@@ -61,6 +61,8 @@ namespace bx
 			dotdot = size;
 		}
 
+		bool trailingSlash = false;
+
 		while (idx < num && err.isOk() )
 		{
 			switch (_src[idx])
@@ -68,6 +70,7 @@ namespace bx
 			case '/':
 			case '\\':
 				++idx;
+				trailingSlash = idx == num;
 				break;
 
 			case '.':
@@ -129,6 +132,11 @@ namespace bx
 			size += write(&writer, '.', &err);
 		}
 
+		if (trailingSlash)
+		{
+			size += write(&writer, '/', &err);
+		}
+
 		write(&writer, '\0', &err);
 
 		return size;
@@ -326,6 +334,8 @@ namespace bx
 			{
 				return StringView(fileName.getPtr(), ext);
 			}
+
+			return fileName;
 		}
 
 		return StringView();

+ 12 - 10
tests/filepath_test.cpp

@@ -26,21 +26,21 @@ FilePathTest s_filePathTest[] =
 	{"/abc", "/abc"},
 	{"/", "/"},
 
-	// Remove trailing slash
-	{"abc/", "abc"},
-	{"abc/def/", "abc/def"},
-	{"a/b/c/", "a/b/c"},
-	{"./", "."},
-	{"../", ".."},
-	{"../../", "../.."},
-	{"/abc/", "/abc"},
+	// Do not remove trailing slash
+	{"abc/", "abc/"},
+	{"abc/def/", "abc/def/"},
+	{"a/b/c/", "a/b/c/"},
+	{"./", "./"},
+	{"../", "../"},
+	{"../../", "../../"},
+	{"/abc/", "/abc/"},
 
 	// Remove doubled slash
 	{"abc//def//ghi", "abc/def/ghi"},
 	{"//abc", "/abc"},
 	{"///abc", "/abc"},
-	{"//abc//", "/abc"},
-	{"abc//", "abc"},
+	{"//abc//", "/abc/"},
+	{"abc//", "abc/"},
 
 	// Remove . elements
 	{"abc/./def", "abc/def"},
@@ -84,6 +84,8 @@ static const FilePathSplit s_filePathSplit[] =
 	{ "tmp/archive.tar.gz", false, "tmp/", "archive.tar.gz", "archive", ".tar.gz" },
 	{ "/tmp/archive.tar.gz", true, "/tmp/", "archive.tar.gz", "archive", ".tar.gz" },
 	{ "d:/tmp/archive.tar.gz", true, "D:/tmp/", "archive.tar.gz", "archive", ".tar.gz" },
+	{ "/tmp/abv/gd", true, "/tmp/abv/", "gd", "gd", "" },
+	{ "/tmp/abv/gd/", true, "/tmp/abv/gd/", "", "", "" },
 };
 
 TEST_CASE("FilePath", "")