Use weighted algorithm for string matching when finding files in repo (#21370)
This PR is for: * https://github.com/go-gitea/gitea/issues/20231 Now, when a user searches `word`, they always see `/{word}.txt` before `/{w}e-g{o}t-{r}esult.{d}at` Demo: When searching "a", "a.ext" comes first. Then when searching "at", the longer matched "template" comes first. <details> ![image](https://user-images.githubusercontent.com/2114189/194588738-3644d891-956f-40e4-b79b-b97d34265456.png) ![image](https://user-images.githubusercontent.com/2114189/194588797-9b124670-4e1e-4510-a170-780295ed89b8.png) </details> This PR also makes the frontend tests could import feature JS files by introducing `jestSetup.js` Co-authored-by: delvh <dev.lh@web.de> Co-authored-by: silverwind <me@silverwind.io>tokarchuk/v1.18
parent
7bb12d7efa
commit
768e16dad1
@ -0,0 +1,34 @@ |
|||||||
|
import {strSubMatch, calcMatchedWeight, filterRepoFilesWeighted} from './repo-findfile.js'; |
||||||
|
|
||||||
|
describe('Repo Find Files', () => { |
||||||
|
test('strSubMatch', () => { |
||||||
|
expect(strSubMatch('abc', '')).toEqual(['abc']); |
||||||
|
expect(strSubMatch('abc', 'a')).toEqual(['', 'a', 'bc']); |
||||||
|
expect(strSubMatch('abc', 'b')).toEqual(['a', 'b', 'c']); |
||||||
|
expect(strSubMatch('abc', 'c')).toEqual(['ab', 'c']); |
||||||
|
expect(strSubMatch('abc', 'ac')).toEqual(['', 'a', 'b', 'c']); |
||||||
|
expect(strSubMatch('abc', 'z')).toEqual(['abc']); |
||||||
|
expect(strSubMatch('abc', 'az')).toEqual(['abc']); |
||||||
|
|
||||||
|
expect(strSubMatch('ABc', 'ac')).toEqual(['', 'A', 'B', 'c']); |
||||||
|
expect(strSubMatch('abC', 'ac')).toEqual(['', 'a', 'b', 'C']); |
||||||
|
|
||||||
|
expect(strSubMatch('aabbcc', 'abc')).toEqual(['', 'a', 'a', 'b', 'b', 'c', 'c']); |
||||||
|
expect(strSubMatch('the/directory', 'hedir')).toEqual(['t', 'he', '/', 'dir', 'ectory']); |
||||||
|
}); |
||||||
|
|
||||||
|
test('calcMatchedWeight', () => { |
||||||
|
expect(calcMatchedWeight(['a', 'b', 'c', 'd']) < calcMatchedWeight(['a', 'bc', 'c'])).toBeTruthy(); |
||||||
|
}); |
||||||
|
|
||||||
|
test('filterRepoFilesWeighted', () => { |
||||||
|
// the first matched result should always be the "word.txt"
|
||||||
|
let res = filterRepoFilesWeighted(['word.txt', 'we-got-result.dat'], 'word'); |
||||||
|
expect(res).toHaveLength(2); |
||||||
|
expect(res[0].matchResult).toEqual(['', 'word', '.txt']); |
||||||
|
|
||||||
|
res = filterRepoFilesWeighted(['we-got-result.dat', 'word.txt'], 'word'); |
||||||
|
expect(res).toHaveLength(2); |
||||||
|
expect(res[0].matchResult).toEqual(['', 'word', '.txt']); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,5 @@ |
|||||||
|
window.config = { |
||||||
|
csrfToken: 'jest-test-csrf-token-123456', |
||||||
|
pageData: {}, |
||||||
|
i18n: {}, |
||||||
|
}; |
Loading…
Reference in new issue