提交 e15fbab4 编写于 作者: B Benjamin Pasero

fs - more avoidance of toLowerCase()

上级 d3d0b7a8
......@@ -334,15 +334,23 @@ export function isEqual(resourceOrPathA: string | URI, resourceOrPathB: string |
}
export function isParent(path: string, candidate: string): boolean {
if (!path || !candidate || path === candidate) {
return false;
}
if (candidate.length > path.length) {
return false;
}
if (candidate.charAt(candidate.length - 1) !== paths.nativeSep) {
candidate += paths.nativeSep;
}
if (!isLinux) {
return beginsWithIgnoreCase(path, candidate + paths.nativeSep);
return beginsWithIgnoreCase(path, candidate);
}
return path.indexOf(candidate + paths.nativeSep) === 0;
return path.indexOf(candidate) === 0;
}
export function isEqualOrParent(path: string, candidate: string): boolean {
......@@ -350,20 +358,37 @@ export function isEqualOrParent(path: string, candidate: string): boolean {
return true;
}
if (!path || !candidate) {
return false;
}
if (candidate.length > path.length) {
return false;
}
if (!isLinux) {
path = path.toLowerCase();
candidate = candidate.toLowerCase();
const beginsWith = beginsWithIgnoreCase(path, candidate);
if (!beginsWith) {
return false;
}
if (candidate.length === path.length) {
return true; // same path, different casing
}
if (path === candidate) {
return true;
let sepOffset = candidate.length;
if (candidate.charAt(candidate.length - 1) === paths.nativeSep) {
sepOffset--; // adjust the expected sep offset in case our candidate already ends in separator character
}
return path.charAt(sepOffset) === paths.nativeSep;
}
if (candidate.charAt(candidate.length - 1) !== paths.nativeSep) {
candidate += paths.nativeSep;
}
return path.indexOf(candidate + paths.nativeSep) === 0;
return path.indexOf(candidate) === 0;
}
export function indexOf(path: string, candidate: string): number {
......
......@@ -47,82 +47,191 @@ suite('Files', () => {
assert.strictEqual(true, r1.gotDeleted());
});
function testIsEqual(testMethod: (pA: string, pB: string) => boolean): void {
// corner cases
assert(testMethod('', ''));
assert(!testMethod(null, ''));
assert(!testMethod(void 0, ''));
// basics (string)
assert(testMethod('/', '/'));
assert(testMethod('/some', '/some'));
assert(testMethod('/some/path', '/some/path'));
assert(testMethod('c:\\', 'c:\\'));
assert(testMethod('c:\\some', 'c:\\some'));
assert(testMethod('c:\\some\\path', 'c:\\some\\path'));
assert(testMethod('/someöäü/path', '/someöäü/path'));
assert(testMethod('c:\\someöäü\\path', 'c:\\someöäü\\path'));
assert(!testMethod('/some/path', '/some/other/path'));
assert(!testMethod('c:\\some\\path', 'c:\\some\\other\\path'));
assert(!testMethod('c:\\some\\path', 'd:\\some\\path'));
// case insensitive (unless isLinux)
if (isLinux) {
assert(!testMethod('/some/path', '/some/PATH'));
assert(!testMethod('/some/path', '/some/other/PATH'));
} else {
assert(testMethod('/some/path', '/some/PATH'));
assert(testMethod('/someöäü/path', '/someÖÄÜ/PATH'));
assert(testMethod('c:\\some\\path', 'c:\\some\\PATH'));
assert(testMethod('c:\\someöäü\\path', 'c:\\someÖÄÜ\\PATH'));
assert(testMethod('c:\\some\\path', 'C:\\some\\PATH'));
}
}
test('isEqual', function () {
assert(isEqual('/some/path', '/some/path'));
testIsEqual(isEqual);
// basics (uris)
assert(isEqual(URI.file('/some/path'), URI.file('/some/path')));
assert(isEqual('c:\\some\\path', 'c:\\some\\path'));
assert(isEqual(URI.file('c:\\some\\path'), URI.file('c:\\some\\path')));
assert(!isEqual('/some/path', '/some/other/path'));
assert(isEqual(URI.file('/someöäü/path'), URI.file('/someöäü/path')));
assert(isEqual(URI.file('c:\\someöäü\\path'), URI.file('c:\\someöäü\\path')));
assert(!isEqual(URI.file('/some/path'), URI.file('/some/other/path')));
assert(!isEqual('c:\\some\\path', 'c:\\some\\other\\path'));
assert(!isEqual(URI.file('c:\\some\\path'), URI.file('c:\\some\\other\\path')));
assert(isEqual(URI.parse('some://cool/uri'), URI.parse('some://cool/uri')));
assert(!isEqual(URI.parse('some://cool/uri'), URI.parse('some://other/uri')));
// case insensitive (unless isLinux)
if (isLinux) {
assert(!isEqual('/some/path', '/some/PATH'));
assert(!isEqual(URI.file('/some/path'), URI.file('/some/PATH')));
} else {
assert(isEqual(URI.file('/some/path'), URI.file('/some/PATH')));
assert(isEqual(URI.file('/someöäü/path'), URI.file('/someÖÄÜ/PATH')));
assert(isEqual(URI.file('c:\\some\\path'), URI.file('c:\\some\\PATH')));
assert(isEqual(URI.file('c:\\someöäü\\path'), URI.file('c:\\someÖÄÜ\\PATH')));
assert(isEqual(URI.file('c:\\some\\path'), URI.file('C:\\some\\PATH')));
}
assert(isEqual(URI.parse('some://cool/uri'), URI.parse('some://cool/uri')));
assert(!isEqual(URI.parse('some://cool/uri'), URI.parse('some://other/uri')));
});
test('isParent', function () {
if (isWindows) {
assert(!isParent('c:\\some\\path', 'c:\\some\\path'));
assert(isParent('c:\\some\\path', 'c:\\'));
assert(isParent('c:\\some\\path', 'c:\\some'));
assert(isParent('c:\\some\\path', 'c:\\some\\'));
assert(isParent('c:\\someöäü\\path', 'c:\\someöäü'));
assert(isParent('c:\\someöäü\\path', 'c:\\someöäü\\'));
assert(isParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\bar'));
assert(isParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\bar\\'));
assert(isParent('c:\\some\\path', 'C:\\'));
assert(isParent('c:\\some\\path', 'c:\\SOME'));
assert(isParent('c:\\some\\path', 'c:\\SOME\\'));
assert(!isParent('c:\\some\\path', 'd:\\'));
assert(!isParent('c:\\some\\path', 'c:\\some\\path'));
assert(!isParent('c:\\some\\path', 'd:\\some\\path'));
assert(!isParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\barr'));
assert(!isParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\bar\\test'));
}
if (isMacintosh) {
assert(!isParent('/some/path', '/some/path'));
assert(!isParent('/some/path', '/some/other/path'));
assert(isParent('/some/path', '/'));
assert(isParent('/some/path', '/some'));
assert(isParent('/some/path', '/some/'));
assert(isParent('/someöäü/path', '/someöäü'));
assert(isParent('/someöäü/path', '/someöäü/'));
assert(isParent('/foo/bar/test.ts', '/foo/bar'));
assert(isParent('/foo/bar/test.ts', '/foo/bar/'));
assert(isParent('/some/path', '/SOME'));
assert(isParent('/some/path', '/SOME/'));
assert(isParent('/someöäü/path', '/SOMEÖÄÜ'));
assert(isParent('/someöäü/path', '/SOMEÖÄÜ/'));
assert(!isParent('/some/path', '/some/path'));
assert(!isParent('/foo/bar/test.ts', '/foo/barr'));
assert(!isParent('/foo/bar/test.ts', '/foo/bar/test'));
}
if (isLinux) {
assert(isParent('/some/path', '/'));
assert(isParent('/some/path', '/some'));
assert(isParent('/some/path', '/some/'));
assert(isParent('/someöäü/path', '/someöäü'));
assert(isParent('/someöäü/path', '/someöäü/'));
assert(isParent('/foo/bar/test.ts', '/foo/bar'));
assert(isParent('/foo/bar/test.ts', '/foo/bar/'));
assert(!isParent('/some/path', '/SOME'));
} else {
if (isMacintosh) {
assert(isParent('/some/path', '/SOME'));
}
if (isWindows) {
assert(isParent('c:\\some\\path', 'c:\\SOME'));
}
assert(!isParent('/some/path', '/some/path'));
assert(!isParent('/foo/bar/test.ts', '/foo/barr'));
assert(!isParent('/foo/bar/test.ts', '/foo/bar/test'));
}
});
test('isEqualOrParent', function () {
// same assertions apply as with isEqual()
testIsEqual(isEqualOrParent);
if (isWindows) {
assert(isEqualOrParent('c:\\some\\path', 'c:\\some\\path'));
assert(isEqualOrParent('c:\\some\\path', 'c:\\'));
assert(isEqualOrParent('c:\\some\\path', 'c:\\some'));
assert(isEqualOrParent('c:\\some\\path', 'c:\\some\\'));
assert(isEqualOrParent('c:\\someöäü\\path', 'c:\\someöäü'));
assert(isEqualOrParent('c:\\someöäü\\path', 'c:\\someöäü\\'));
assert(isEqualOrParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\bar'));
assert(!isEqualOrParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\barr'));
assert(isEqualOrParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\bar\\'));
assert(isEqualOrParent('c:\\some\\path', 'c:\\some\\path'));
assert(isEqualOrParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\bar\\test.ts'));
assert(isEqualOrParent('c:\\some\\path', 'C:\\'));
assert(isEqualOrParent('c:\\some\\path', 'c:\\SOME'));
assert(isEqualOrParent('c:\\some\\path', 'c:\\SOME\\'));
assert(!isEqualOrParent('c:\\some\\path', 'd:\\'));
assert(!isEqualOrParent('c:\\some\\path', 'd:\\some\\path'));
assert(!isEqualOrParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\barr'));
assert(!isEqualOrParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\bar\\test'));
assert(!isEqualOrParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\bar\\test.'));
} else {
assert(isEqualOrParent('foo/bar/test.ts', 'foo'));
assert(isEqualOrParent('/', '/'));
assert(isEqualOrParent('/foo', '/foo'));
assert(!isEqualOrParent('/foo', '/f'));
assert(!isEqualOrParent('/foo', '/foo/b'));
assert(isEqualOrParent('foo/bar/test.ts', 'foo/bar'));
assert(!isEqualOrParent('foo/bar/test.ts', '/foo/bar'));
assert(!isEqualOrParent('foo/bar/test.ts', 'foo/barr'));
assert(isEqualOrParent('foo/bar/test.ts', 'foo/bar/test.ts'));
assert(!isEqualOrParent('foo/bar/test.ts', 'foo/bar/test'));
assert(!isEqualOrParent('foo/bar/test.ts', 'foo/bar/test.'));
assert(!isEqualOrParent('c:\\foo\\bar\\test.ts', 'c:\\foo\\BAR\\test.'));
}
if (!isLinux) {
assert(isEqualOrParent('/foo', '/fOO'));
assert(isEqualOrParent('/fOO', '/foo'));
assert(isEqualOrParent('foo/bar/test.ts', 'foo/BAR/test.ts'));
if (isMacintosh) {
assert(isEqualOrParent('/some/path', '/'));
assert(isEqualOrParent('/some/path', '/some'));
assert(isEqualOrParent('/some/path', '/some/'));
assert(isEqualOrParent('/someöäü/path', '/someöäü'));
assert(isEqualOrParent('/someöäü/path', '/someöäü/'));
assert(isEqualOrParent('/foo/bar/test.ts', '/foo/bar'));
assert(isEqualOrParent('/foo/bar/test.ts', '/foo/bar/'));
assert(isEqualOrParent('/some/path', '/some/path'));
assert(isEqualOrParent('/some/path', '/SOME'));
assert(isEqualOrParent('/some/path', '/SOME/'));
assert(isEqualOrParent('/someöäü/path', '/SOMEÖÄÜ'));
assert(isEqualOrParent('/someöäü/path', '/SOMEÖÄÜ/'));
assert(!isEqualOrParent('/foo/bar/test.ts', '/foo/barr'));
assert(!isEqualOrParent('/foo/bar/test.ts', '/foo/bar/test'));
assert(!isEqualOrParent('foo/bar/test.ts', 'foo/bar/test.'));
assert(!isEqualOrParent('foo/bar/test.ts', 'foo/BAR/test.'));
}
if (isLinux) {
assert(isEqualOrParent('/some/path', '/'));
assert(isEqualOrParent('/some/path', '/some'));
assert(isEqualOrParent('/some/path', '/some/'));
assert(isEqualOrParent('/someöäü/path', '/someöäü'));
assert(isEqualOrParent('/someöäü/path', '/someöäü/'));
assert(isEqualOrParent('/foo/bar/test.ts', '/foo/bar'));
assert(isEqualOrParent('/foo/bar/test.ts', '/foo/bar/'));
assert(isEqualOrParent('/some/path', '/some/path'));
assert(!isEqualOrParent('/some/path', '/SOME'));
assert(!isEqualOrParent('/foo/bar/test.ts', '/foo/barr'));
assert(!isEqualOrParent('/foo/bar/test.ts', '/foo/bar/test'));
}
});
test('indexOf', function () {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册