提交 50dae61e 编写于 作者: J Johannes Rieken

more tests for fuzzyScore, #22153

上级 8b24b77b
......@@ -490,9 +490,11 @@ function initTable() {
}
return table;
}
const _table = initTable();
const _arrows = initTable();
const _debug = false;
function printTable(table: number[][], pattern: string, patternLen: number, word: string, wordLen: number): string {
function pad(s: string, n: number, pad = ' ') {
while (s.length < n) {
......@@ -518,6 +520,10 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] {
const patternLen = pattern.length > 25 ? 25 : pattern.length;
const wordLen = word.length > 100 ? 100 : word.length;
if (patternLen === 0) {
return [-1, []];
}
if (patternLen > wordLen) {
return undefined;
}
......@@ -609,35 +615,50 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] {
while (i > 0 && j > 0) {
let value = _table[i][j];
let arrow = _arrows[i][j];
if (arrow === -1) { // left
if (arrow === -1 || arrow === 1) {
// keep going left, we cannot
// skip a character in the pattern
j -= 1;
} else if (arrow === 1) { // top
i -= 1;
} else if (arrow === 0) { //diag
j -= 1;
i -= 1;
total += value;
matches.unshift(j);
if (i === 0) {
let score = value - _table[i][j];
if (i === 0 && score === 1) {
// we have reached the first pattern char and now
// test that it has scored properly, like `o -> bbOO`
// and not `o -> foobar`
let score = value - _table[i][j];
if (score === 1) {
return undefined;
}
return undefined;
} else if (score < 1) {
// we went diagonal by inheriting a good
// result, not by matching keep going left
i += 1;
} else {
// all good
total += value;
matches.unshift(j);
}
}
}
total -= Math.min(matches[0], 3) * 3; // penalty for first matching character
if (matches.length !== patternLen) {
// we didn't match all pattern
// characters in order
return undefined;
}
if (j > 3) {
j = 3;
}
total -= j * 3; // penalty for first matching character
total -= (1 + matches[matches.length - 1]) - (pattern.length); // penalty for all non matching characters between first and last
if (_debug) {
console.log(`${pattern} & ${word} => ${total} points`);
console.log(`${pattern} & ${word} => ${total} points for ${matches}`);
}
return [total, matches];
......
......@@ -239,30 +239,47 @@ suite('Filters', () => {
});
test('fuzzyScore', function () {
assertMatches('ab', 'abA', '^a^bA', fuzzyScore);
assertMatches('ccm', 'cacmelCase', '^ca^c^melCase', fuzzyScore);
assertMatches('bti', 'the_black_knight', undefined, fuzzyScore);
assertMatches('ccm', 'camelCase', undefined, fuzzyScore);
assertMatches('BK', 'the_black_knight', 'the_^black_^knight', fuzzyScore);
assertMatches('KeyboardLayout=', 'KeyboardLayout', undefined, fuzzyScore);
assertMatches('LLL', 'SVisualLoggerLogsList', 'SVisual^Logger^Logs^List', fuzzyScore);
assertMatches('sllll', 'SVisualLoggerLogsList', '^SVisua^l^Logger^Logs^List', fuzzyScore);
assertMatches('sl', 'SVisualLoggerLogsList', '^SVisual^LoggerLogsList', fuzzyScore);
assertMatches('LLLL', 'SVilLoLosLi', undefined, fuzzyScore);
assertMatches('fob', 'foobar', '^f^oo^bar', fuzzyScore);
assertMatches('ob', 'foobar', undefined, fuzzyScore);
assertMatches('fobz', 'foobar', undefined, fuzzyScore);
assertMatches('ba', '?AB?', undefined, fuzzyScore);
assertMatches('ccm', 'camelCasecm', '^camel^Casec^m', fuzzyScore);
assertMatches('myvable', 'myvariable', '^m^y^v^aria^b^l^e', fuzzyScore);
assertMatches('fdm', 'findModel', '^fin^d^Model', fuzzyScore);
assertMatches('KeyboardLayout=', 'KeyboardLayout', undefined, fuzzyScore);
assertMatches('LLLL', 'SVisualLoggerLogsList', undefined, fuzzyScore);
assertMatches('TEdit', 'TextEdit', '^Text^E^d^i^t', fuzzyScore);
assertMatches('TEdit', 'text_edit', '^text_^e^d^i^t', fuzzyScore);
assertMatches('TEdit', 'Textedit', '^T^exte^d^i^t', fuzzyScore);
assertMatches('Tedit', 'TextEdit', '^Text^E^d^i^t', fuzzyScore);
assertMatches('TEdit', 'TextEditor', '^Text^E^d^i^tor', fuzzyScore);
assertMatches('TEdit', 'Textedit', '^T^exte^d^i^t', fuzzyScore);
assertMatches('TEdit', 'text_edit', '^text_^e^d^i^t', fuzzyScore);
assertMatches('TEditDit', 'TextEditorDecorationType', '^Text^E^d^i^tor^Decorat^ion^Type', fuzzyScore);
assertMatches('TEdit', 'TextEditorDecorationType', '^Text^Editor^Decorat^ion^Type', fuzzyScore);
assertMatches('Tedit', 'TextEdit', '^Text^E^d^i^t', fuzzyScore);
assertMatches('ba', '?AB?', undefined, fuzzyScore);
assertMatches('bkn', 'the_black_knight', 'the_^black_^k^night', fuzzyScore);
assertMatches('bt', 'the_black_knight', 'the_^black_knigh^t', fuzzyScore);
assertMatches('ccm', 'camelCasecm', '^camel^Casec^m', fuzzyScore);
assertMatches('fdm', 'findModel', '^fin^d^Model', fuzzyScore);
assertMatches('fob', 'foobar', '^f^oo^bar', fuzzyScore);
assertMatches('fobz', 'foobar', undefined, fuzzyScore);
assertMatches('foobar', 'foobar', '^f^o^o^b^a^r', fuzzyScore);
assertMatches('form', 'editor.formatOnSave', 'editor.^f^o^r^matOnSave', fuzzyScore);
assertMatches('g p', 'Git: Pull', '^Git:^ ^Pull', fuzzyScore);
assertMatches('g p', 'Git: Pull', '^Git:^ ^Pull', fuzzyScore);
assertMatches('gip', 'Git: Pull', '^G^it: ^Pull', fuzzyScore);
assertMatches('is', 'isValid', '^i^sValid', fuzzyScore);
assertMatches('gip', 'Git: Pull', '^G^it: ^Pull', fuzzyScore);
assertMatches('gp', 'Git: Pull', '^Git: ^Pull', fuzzyScore);
assertMatches('gp', 'Git_Git_Pull', '^Git_Git_^Pull', fuzzyScore);
assertMatches('is', 'ImportStatement', '^Import^Statement', fuzzyScore);
assertMatches('is', 'isValid', '^i^sValid', fuzzyScore);
assertMatches('lowrd', 'lowWord', '^l^ow^Wo^r^d', fuzzyScore);
assertMatches('myvable', 'myvariable', '^m^y^v^aria^b^l^e', fuzzyScore);
assertMatches('no', '', undefined, fuzzyScore);
assertMatches('no', 'match', undefined, fuzzyScore);
assertMatches('ob', 'foobar', undefined, fuzzyScore);
assertMatches('sl', 'SVisualLoggerLogsList', '^SVisual^LoggerLogsList', fuzzyScore);
assertMatches('sllll', 'SVisualLoggerLogsList', '^SVisua^l^Logger^Logs^List', fuzzyScore);
});
test('topScore', function () {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册