mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-08-04 07:21:32 -07:00
feat(anime): add language filter to extensions available list
- Add a language chip row above the Available list; pick one or more languages to narrow the repo index, or "All" to clear - Show language display names (e.g. "Japanese") instead of raw tags, and an "N of M" count on the Available heading - Add language-filter.ts with collectLanguages/toggleLanguage/pruneSelection/filterByLanguage/languageLabel, plus tests
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import {
|
||||
collectLanguages,
|
||||
filterByLanguage,
|
||||
languageLabel,
|
||||
pruneSelection,
|
||||
toggleLanguage,
|
||||
} from './language-filter';
|
||||
|
||||
const ext = (lang: string, name = lang) => ({ lang, name });
|
||||
|
||||
test('languageLabel names known tags and falls back to the raw code', () => {
|
||||
assert.equal(languageLabel('ja'), 'Japanese');
|
||||
assert.equal(languageLabel('all'), 'Multi-language');
|
||||
assert.equal(languageLabel('zzzz'), 'ZZZZ');
|
||||
});
|
||||
|
||||
test('collectLanguages dedupes, puts multi-language first, then sorts by name', () => {
|
||||
// English, German, Japanese — display names, not codes.
|
||||
assert.deepEqual(collectLanguages([ext('ja'), ext('de'), ext('ja'), ext('all'), ext('en')]), [
|
||||
'all',
|
||||
'en',
|
||||
'de',
|
||||
'ja',
|
||||
]);
|
||||
});
|
||||
|
||||
test('toggleLanguage adds, removes, and empties back to All', () => {
|
||||
const one = toggleLanguage(new Set(), 'ja');
|
||||
assert.deepEqual([...one], ['ja']);
|
||||
const two = toggleLanguage(one, 'en');
|
||||
assert.deepEqual([...two].sort(), ['en', 'ja']);
|
||||
assert.deepEqual([...toggleLanguage(two, 'ja')], ['en']);
|
||||
assert.equal(toggleLanguage(one, 'ja').size, 0);
|
||||
});
|
||||
|
||||
test('pruneSelection drops languages no repository offers any more', () => {
|
||||
assert.deepEqual([...pruneSelection(new Set(['ja', 'de']), ['ja', 'en'])], ['ja']);
|
||||
});
|
||||
|
||||
test('filterByLanguage keeps everything when nothing is selected', () => {
|
||||
const extensions = [ext('ja'), ext('en'), ext('all')];
|
||||
assert.deepEqual(filterByLanguage(extensions, new Set()), extensions);
|
||||
assert.deepEqual(
|
||||
filterByLanguage(extensions, new Set(['ja', 'all'])).map((extension) => extension.name),
|
||||
['ja', 'all'],
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user