std/path/extname_test.ts

111 lines
3.2 KiB
TypeScript
Raw Normal View History

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
// Copyright the Browserify authors. MIT License.
// Ported from https://github.com/browserify/path-browserify/
import { assertEquals } from "@std/assert";
import * as posix from "./posix/mod.ts";
import * as windows from "./windows/mod.ts";
import { extname as posixUnstableExtname } from "./posix/unstable_extname.ts";
import { extname as windowsUnstableExtname } from "./windows/unstable_extname.ts";
const slashRE = /\//g;
const pairs = [
["", ""],
["/path/to/file", ""],
["/path/to/file.ext", ".ext"],
["/path.to/file.ext", ".ext"],
["/path.to/file", ""],
["/path.to/.file", ""],
["/path.to/.file.ext", ".ext"],
["/path/to/f.ext", ".ext"],
["/path/to/..ext", ".ext"],
["/path/to/..", ""],
["file", ""],
["file.ext", ".ext"],
[".file", ""],
[".file.ext", ".ext"],
["/file", ""],
["/file.ext", ".ext"],
["/.file", ""],
["/.file.ext", ".ext"],
[".path/file.ext", ".ext"],
["file.ext.ext", ".ext"],
["file.", "."],
[".", ""],
["./", ""],
[".file.ext", ".ext"],
[".file", ""],
[".file.", "."],
[".file..", "."],
["..", ""],
["../", ""],
["..file.ext", ".ext"],
["..file", ".file"],
["..file.", "."],
["..file..", "."],
["...", "."],
["...ext", ".ext"],
["....", "."],
["file.ext/", ".ext"],
["file.ext//", ".ext"],
["file/", ""],
["file//", ""],
["file./", "."],
["file.//", "."],
] as const;
Deno.test("posix.extname()", function () {
pairs.forEach(function (p) {
const input = p[0];
const expected = p[1];
assertEquals(expected, posix.extname(input));
});
// On *nix, backslash is a valid name component like any other character.
assertEquals(posix.extname(".\\"), "");
assertEquals(posix.extname("..\\"), ".\\");
assertEquals(posix.extname("file.ext\\"), ".ext\\");
assertEquals(posix.extname("file.ext\\\\"), ".ext\\\\");
assertEquals(posix.extname("file\\"), "");
assertEquals(posix.extname("file\\\\"), "");
assertEquals(posix.extname("file.\\"), ".\\");
assertEquals(posix.extname("file.\\\\"), ".\\\\");
assertEquals(
posixUnstableExtname(new URL("file:///home/user/Documents/image.png")),
".png",
);
assertEquals(
posixUnstableExtname(new URL("file:///home/user/Documents")),
"",
);
});
Deno.test("windows.extname()", function () {
pairs.forEach(function (p) {
const input = p[0].replace(slashRE, "\\");
const expected = p[1];
assertEquals(expected, windows.extname(input));
assertEquals(expected, windows.extname("C:" + input));
});
// On Windows, backslash is a path separator.
assertEquals(windows.extname(".\\"), "");
assertEquals(windows.extname("..\\"), "");
assertEquals(windows.extname("file.ext\\"), ".ext");
assertEquals(windows.extname("file.ext\\\\"), ".ext");
assertEquals(windows.extname("file\\"), "");
assertEquals(windows.extname("file\\\\"), "");
assertEquals(windows.extname("file.\\"), ".");
assertEquals(windows.extname("file.\\\\"), ".");
assertEquals(
windowsUnstableExtname(new URL("file:///C:/home/user/Documents/image.png")),
".png",
);
assertEquals(
windowsUnstableExtname(new URL("file:///C:/home/user/Documents")),
"",
);
});