mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-01 12:03:41 +00:00
59b6ae1cbd
This also fixes some POSIX header warnings.
121 lines
6.3 KiB
C
121 lines
6.3 KiB
C
/*-*- 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/dce.h"
|
|
#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) {
|
|
if (!SupportsWindows()) return;
|
|
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) {
|
|
if (!SupportsWindows()) return;
|
|
ASSERT_TRUE(_isabspath("\\\\?\\C:\\.."));
|
|
ASSERT_TRUE(_isabspath("\\\\.\\C:\\Users\\jart\\foo.txt"));
|
|
}
|
|
|
|
TEST(isabspath, testNtPaths) {
|
|
if (!SupportsWindows()) return;
|
|
ASSERT_TRUE(_isabspath("\\??\\C:\\Users\\jart\\foo.txt"));
|
|
}
|
|
|
|
TEST(_classifypath, test) {
|
|
if (!SupportsWindows()) return;
|
|
EXPECT_EQ(0, _classifypath(""));
|
|
EXPECT_EQ(0, _classifypath("xyz"));
|
|
EXPECT_EQ(_kPathDos | _kPathDev, _classifypath("CON"));
|
|
EXPECT_EQ(_kPathDos | _kPathDev, _classifypath("NUL"));
|
|
EXPECT_EQ(0, _classifypath(":"));
|
|
EXPECT_EQ(_kPathDos, _classifypath("::"));
|
|
EXPECT_EQ(_kPathDos, _classifypath(":::"));
|
|
EXPECT_EQ(_kPathDos, _classifypath("::::"));
|
|
EXPECT_EQ(_kPathAbs | _kPathDos, _classifypath("::\\"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("\\"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("\\:"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("\\C:"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("\\C:\\"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("/"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("/:"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("/C:"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("/C:/"));
|
|
EXPECT_EQ(0, _classifypath("C"));
|
|
EXPECT_EQ(_kPathDos, _classifypath("C:"));
|
|
EXPECT_EQ(_kPathDos, _classifypath("C:a"));
|
|
EXPECT_EQ(_kPathDos, _classifypath("C:a\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathDos, _classifypath("C:\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathDos, _classifypath("C:/"));
|
|
EXPECT_EQ(_kPathAbs | _kPathDos, _classifypath("C:\\a"));
|
|
EXPECT_EQ(_kPathAbs | _kPathDos, _classifypath("C:/a"));
|
|
EXPECT_EQ(_kPathAbs | _kPathDos, _classifypath("C:\\\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\\\\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\\\;"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\\\f\\b\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\\\f\\b"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\\\f\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\\\f"));
|
|
EXPECT_EQ(_kPathAbs | _kPathNt, _classifypath("\\??\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathNt, _classifypath("\\??\\UNC"));
|
|
EXPECT_EQ(_kPathAbs | _kPathNt, _classifypath("\\??\\UNC\\"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("\\?"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("\\?\\"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("\\?\\UNC"));
|
|
EXPECT_EQ(_kPathAbs, _classifypath("\\?\\UNC\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev, _classifypath("\\\\?\\UNC\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev | _kPathRoot,
|
|
_classifypath("\\\\?"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\\\??"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\\\??\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\\\??\\C:\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev | _kPathRoot,
|
|
_classifypath("\\\\."));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev, _classifypath("\\\\.\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev, _classifypath("\\\\.\\C:\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("\\/"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("/\\"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("//"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("///"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("//;"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev | _kPathRoot,
|
|
_classifypath("//?"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev | _kPathRoot,
|
|
_classifypath("/\\?"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev | _kPathRoot,
|
|
_classifypath("\\/?"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin, _classifypath("//??"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev | _kPathRoot,
|
|
_classifypath("//."));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev | _kPathRoot,
|
|
_classifypath("\\/."));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev | _kPathRoot,
|
|
_classifypath("/\\."));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev, _classifypath("//./"));
|
|
EXPECT_EQ(_kPathAbs | _kPathWin | _kPathDev, _classifypath("//./C:/"));
|
|
}
|