BLI_path_util: Add BLI_path_join
There weren't any convenient ways to join multiple paths in C that accounted for corner cases.
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
extern "C" {
|
||||
#include "BLI_fileops.h"
|
||||
#include "BLI_path_util.h"
|
||||
#include "BLI_string.h"
|
||||
#include "../../../source/blender/imbuf/IMB_imbuf.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
@@ -245,6 +246,103 @@ TEST(path_util, NameAtIndex_NoneComplexNeg)
|
||||
|
||||
#undef AT_INDEX
|
||||
|
||||
#define JOIN(str_expect, out_size, ...) \
|
||||
{ \
|
||||
const char *expect = str_expect; \
|
||||
char result[(out_size) + 1024]; \
|
||||
/* check we don't write past the last byte */ \
|
||||
result[out_size] = '\0'; \
|
||||
BLI_path_join(result, out_size, __VA_ARGS__, NULL); \
|
||||
/* simplify expected string */ \
|
||||
BLI_str_replace_char(result, '\\', '/'); \
|
||||
EXPECT_STREQ(result, expect); \
|
||||
EXPECT_EQ(result[out_size], '\0'); \
|
||||
} ((void)0)
|
||||
|
||||
/* BLI_path_join */
|
||||
TEST(path_util, JoinNop)
|
||||
{
|
||||
JOIN("", 100, "");
|
||||
JOIN("", 100, "", "");
|
||||
JOIN("", 100, "", "", "");
|
||||
JOIN("/", 100, "/", "", "");
|
||||
JOIN("/", 100, "/", "/");
|
||||
JOIN("/", 100, "/", "", "/");
|
||||
JOIN("/", 100, "/", "", "/", "");
|
||||
}
|
||||
|
||||
TEST(path_util, JoinSingle)
|
||||
{
|
||||
JOIN("test", 100, "test");
|
||||
JOIN("", 100, "");
|
||||
JOIN("a", 100, "a");
|
||||
JOIN("/a", 100, "/a");
|
||||
JOIN("a/", 100, "a/");
|
||||
JOIN("/a/", 100, "/a/");
|
||||
JOIN("/a/", 100, "/a//");
|
||||
JOIN("//a/", 100, "//a//");
|
||||
}
|
||||
|
||||
TEST(path_util, JoinTriple)
|
||||
{
|
||||
JOIN("/a/b/c", 100, "/a", "b", "c");
|
||||
JOIN("/a/b/c", 100, "/a/", "/b/", "/c");
|
||||
JOIN("/a/b/c", 100, "/a/b/", "/c");
|
||||
JOIN("/a/b/c", 100, "/a/b/c");
|
||||
JOIN("/a/b/c", 100, "/", "a/b/c");
|
||||
|
||||
JOIN("/a/b/c/", 100, "/a/", "/b/", "/c/");
|
||||
JOIN("/a/b/c/", 100, "/a/b/c/");
|
||||
JOIN("/a/b/c/", 100, "/a/b/", "/c/");
|
||||
JOIN("/a/b/c/", 100, "/a/b/c", "/");
|
||||
JOIN("/a/b/c/", 100, "/", "a/b/c", "/");
|
||||
}
|
||||
|
||||
TEST(path_util, JoinTruncateShort)
|
||||
{
|
||||
JOIN("", 1, "/");
|
||||
JOIN("/", 2, "/");
|
||||
JOIN("a", 2, "", "aa");
|
||||
JOIN("a", 2, "", "a/");
|
||||
JOIN("a/b", 4, "a", "bc");
|
||||
JOIN("ab/", 4, "ab", "c");
|
||||
JOIN("/a/", 4, "/a", "b");
|
||||
JOIN("/a/", 4, "/a/", "b/");
|
||||
JOIN("/a/", 4, "/a", "/b/");
|
||||
JOIN("/a/", 4, "/", "a/b/");
|
||||
JOIN("//a", 4, "//", "a/b/");
|
||||
|
||||
JOIN("/a/b", 5, "/a", "b", "c");
|
||||
}
|
||||
|
||||
TEST(path_util, JoinTruncateLong)
|
||||
{
|
||||
JOIN("", 1, "//", "//longer", "path");
|
||||
JOIN("/", 2, "//", "//longer", "path");
|
||||
JOIN("//", 3, "//", "//longer", "path");
|
||||
JOIN("//l", 4, "//", "//longer", "path");
|
||||
/* snip */
|
||||
JOIN("//longe", 8, "//", "//longer", "path");
|
||||
JOIN("//longer", 9, "//", "//longer", "path");
|
||||
JOIN("//longer/", 10, "//", "//longer", "path");
|
||||
JOIN("//longer/p", 11, "//", "//longer", "path");
|
||||
JOIN("//longer/pa", 12, "//", "//longer", "path");
|
||||
JOIN("//longer/pat", 13, "//", "//longer", "path");
|
||||
JOIN("//longer/path", 14, "//", "//longer", "path"); // not truncated
|
||||
JOIN("//longer/path", 14, "//", "//longer", "path/");
|
||||
JOIN("//longer/path/", 15, "//", "//longer", "path/"); // not truncated
|
||||
JOIN("//longer/path/", 15, "//", "//longer", "path/", "trunc");
|
||||
JOIN("//longer/path/t", 16, "//", "//longer", "path/", "trunc");
|
||||
}
|
||||
|
||||
TEST(path_util, JoinComplex)
|
||||
{
|
||||
JOIN("/a/b/c/d/e/f/g/", 100, "/", "\\a/b", "//////c/d", "", "e\\\\", "f", "g//");
|
||||
JOIN("/aa/bb/cc/dd/ee/ff/gg/", 100, "/", "\\aa/bb", "//////cc/dd", "", "ee\\\\", "ff", "gg//");
|
||||
JOIN("1/2/3/", 100, "1", "////////", "", "2", "3\\");
|
||||
}
|
||||
|
||||
#undef JOIN
|
||||
|
||||
/* BLI_path_frame */
|
||||
TEST(path_util, PathUtilFrame)
|
||||
|
Reference in New Issue
Block a user