mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 05:42:29 +00:00
Fix basename() and dirname()
This commit is contained in:
parent
9b11206ae3
commit
04d39d47f1
41 changed files with 489 additions and 207 deletions
|
@ -54,9 +54,9 @@ TEST(mkdir, testPathIsDirectory_EEXIST) {
|
|||
EXPECT_EQ(EEXIST, errno);
|
||||
}
|
||||
|
||||
TEST(makedirs, testEmptyString_ENOENT) {
|
||||
TEST(makedirs, testEmptyString_EEXIST) {
|
||||
EXPECT_EQ(-1, makedirs("", 0755));
|
||||
EXPECT_EQ(ENOENT, errno);
|
||||
EXPECT_EQ(EEXIST, errno);
|
||||
}
|
||||
|
||||
TEST(mkdirat, testRelativePath_opensRelativeToDirFd) {
|
||||
|
|
|
@ -21,25 +21,33 @@
|
|||
#include "libc/mem/mem.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(basename, test) {
|
||||
EXPECT_STREQ("", basename(""));
|
||||
EXPECT_STREQ("/", basename("/"));
|
||||
EXPECT_STREQ("hello", basename("hello"));
|
||||
EXPECT_STREQ("there", basename("hello/there"));
|
||||
EXPECT_STREQ("yo", basename("hello/there/yo"));
|
||||
#define BASENAME(x) basename(gc(strdup(x)))
|
||||
|
||||
TEST(basename, testRegularExamples) {
|
||||
EXPECT_STREQ("lib", BASENAME("/usr/lib"));
|
||||
EXPECT_STREQ("lib", BASENAME("usr/lib"));
|
||||
EXPECT_STREQ("usr", BASENAME("/usr/"));
|
||||
EXPECT_STREQ("usr", BASENAME("usr"));
|
||||
EXPECT_STREQ("/", BASENAME("/"));
|
||||
EXPECT_STREQ(".", BASENAME("."));
|
||||
EXPECT_STREQ("..", BASENAME(".."));
|
||||
}
|
||||
|
||||
TEST(basename, testIrregularExamples) {
|
||||
EXPECT_STREQ(".", basename(0));
|
||||
EXPECT_STREQ(".", basename(""));
|
||||
}
|
||||
|
||||
TEST(basename, testTrailingSlash_isIgnored) {
|
||||
/* should be "foo" but basename() doesn't allocate memory */
|
||||
EXPECT_STREQ("foo/", basename("foo/"));
|
||||
EXPECT_STREQ("foo//", basename("foo//"));
|
||||
EXPECT_STREQ("foo", BASENAME("foo/"));
|
||||
EXPECT_STREQ("foo", BASENAME("foo//"));
|
||||
}
|
||||
|
||||
TEST(basename, testOnlySlashes_oneSlashOnlyVasily) {
|
||||
EXPECT_STREQ("/", basename("///"));
|
||||
EXPECT_STREQ("/", BASENAME("///"));
|
||||
}
|
||||
|
||||
TEST(basename, testWindows_isGrantedRespect) {
|
||||
EXPECT_STREQ("there", basename("hello\\there"));
|
||||
EXPECT_STREQ("yo", basename("hello\\there\\yo"));
|
||||
EXPECT_STREQ("there", BASENAME("hello\\there"));
|
||||
EXPECT_STREQ("yo", BASENAME("hello\\there\\yo"));
|
||||
}
|
||||
|
|
|
@ -26,12 +26,11 @@
|
|||
TEST(dirname, test) {
|
||||
EXPECT_STREQ("/usr/lib", dirname(gc(strdup("/usr/lib/foo.bar"))));
|
||||
EXPECT_STREQ("/usr", dirname(gc(strdup("/usr/lib"))));
|
||||
EXPECT_STREQ("/usr", dirname(gc(strdup("/usr/lib"))));
|
||||
EXPECT_STREQ("usr", dirname(gc(strdup("usr/lib"))));
|
||||
EXPECT_STREQ("/", dirname(gc(strdup("/usr/"))));
|
||||
EXPECT_STREQ(".", dirname(gc(strdup("usr"))));
|
||||
EXPECT_STREQ("/", dirname(gc(strdup("/"))));
|
||||
EXPECT_STREQ(".", dirname(gc(strdup("hello"))));
|
||||
EXPECT_STREQ(".", dirname(gc(strdup("."))));
|
||||
EXPECT_STREQ(".", dirname(gc(strdup(".."))));
|
||||
EXPECT_STREQ("", dirname(gc(strdup(""))));
|
||||
EXPECT_STREQ(".", dirname(gc(strdup(""))));
|
||||
}
|
||||
|
|
116
test/libc/str/classifypath_test.c
Normal file
116
test/libc/str/classifypath_test.c
Normal file
|
@ -0,0 +1,116 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2022 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/str/path.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(isabspath, testUniversal) {
|
||||
ASSERT_TRUE(_isabspath("/home/jart/foo.txt"));
|
||||
}
|
||||
|
||||
TEST(isabspath, testDosPaths) {
|
||||
ASSERT_FALSE(_isabspath("C:"));
|
||||
ASSERT_FALSE(_isabspath("C:foo.txt"));
|
||||
ASSERT_TRUE(_isabspath("C:/"));
|
||||
ASSERT_TRUE(_isabspath("C:/Users/jart/foo.txt"));
|
||||
ASSERT_TRUE(_isabspath("C:\\Users\\jart\\foo.txt"));
|
||||
ASSERT_TRUE(_isabspath("\\Users\\jart\\foo.txt"));
|
||||
}
|
||||
|
||||
TEST(isabspath, testWin32Paths) {
|
||||
ASSERT_TRUE(_isabspath("\\\\?\\C:\\.."));
|
||||
ASSERT_TRUE(_isabspath("\\\\.\\C:\\Users\\jart\\foo.txt"));
|
||||
}
|
||||
|
||||
TEST(isabspath, testNtPaths) {
|
||||
ASSERT_TRUE(_isabspath("\\??\\C:\\Users\\jart\\foo.txt"));
|
||||
}
|
||||
|
||||
TEST(_classifypath, test) {
|
||||
EXPECT_EQ(0, _classifypath(""));
|
||||
EXPECT_EQ(0, _classifypath("xyz"));
|
||||
EXPECT_EQ(_PATH_DOS | _PATH_DEV, _classifypath("CON"));
|
||||
EXPECT_EQ(_PATH_DOS | _PATH_DEV, _classifypath("NUL"));
|
||||
EXPECT_EQ(0, _classifypath(":"));
|
||||
EXPECT_EQ(_PATH_DOS, _classifypath("::"));
|
||||
EXPECT_EQ(_PATH_DOS, _classifypath(":::"));
|
||||
EXPECT_EQ(_PATH_DOS, _classifypath("::::"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_DOS, _classifypath("::\\"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("\\"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("\\:"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("\\C:"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("\\C:\\"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("/"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("/:"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("/C:"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("/C:/"));
|
||||
EXPECT_EQ(0, _classifypath("C"));
|
||||
EXPECT_EQ(_PATH_DOS, _classifypath("C:"));
|
||||
EXPECT_EQ(_PATH_DOS, _classifypath("C:a"));
|
||||
EXPECT_EQ(_PATH_DOS, _classifypath("C:a\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_DOS, _classifypath("C:\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_DOS, _classifypath("C:/"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_DOS, _classifypath("C:\\a"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_DOS, _classifypath("C:/a"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_DOS, _classifypath("C:\\\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\\\\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\\\;"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\\\f\\b\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\\\f\\b"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\\\f\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\\\f"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_NT, _classifypath("\\??\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_NT, _classifypath("\\??\\UNC"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_NT, _classifypath("\\??\\UNC\\"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("\\?"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("\\?\\"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("\\?\\UNC"));
|
||||
EXPECT_EQ(_PATH_ABS, _classifypath("\\?\\UNC\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV, _classifypath("\\\\?\\UNC\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV | _PATH_ROOT,
|
||||
_classifypath("\\\\?"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\\\??"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\\\??\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\\\??\\C:\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV | _PATH_ROOT,
|
||||
_classifypath("\\\\."));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV, _classifypath("\\\\.\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV, _classifypath("\\\\.\\C:\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("\\/"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("/\\"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("//"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("///"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("//;"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV | _PATH_ROOT,
|
||||
_classifypath("//?"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV | _PATH_ROOT,
|
||||
_classifypath("/\\?"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV | _PATH_ROOT,
|
||||
_classifypath("\\/?"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN, _classifypath("//??"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV | _PATH_ROOT,
|
||||
_classifypath("//."));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV | _PATH_ROOT,
|
||||
_classifypath("\\/."));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV | _PATH_ROOT,
|
||||
_classifypath("/\\."));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV, _classifypath("//./"));
|
||||
EXPECT_EQ(_PATH_ABS | _PATH_WIN | _PATH_DEV, _classifypath("//./C:/"));
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue