fix(dictionary): a Hanja reads 물 수, and each radical's form shows once

Korean names a Hanja by its meaning, then its sound; simplified Chinese
shares some radicals' forms with Japanese (麦), which showed twice, and
writes 黑 as itself. A test can read a language's strokes beforehand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-14 12:45:11 +02:00
commit e7f3abdb8d
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
2 changed files with 26 additions and 18 deletions

View file

@ -49,6 +49,9 @@ void main() {
expect(radicalFormsIn(food, 'zh-CN'), ['饣']);
expect(radicalFormsIn(food, 'zh-TW'), ['飠']);
expect(radicalsIn('zh-Hans')[148].variants, ['讠']);
// Each form once, never the radical itself.
expect(radicalFormsIn(radicals[198], 'zh'), ['麦']);
expect(radicalFormsIn(radicals[202], 'zh'), isEmpty);
expect((hasRadicals('ko'), hasRadicals('el')), (true, false));
});
}

View file

@ -1,18 +1,19 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:halkyon_learn_flutter/src/feature/kanji/data/stroke_repository.dart';
/// The bundled strokes of [characters], read already: reading an asset is
/// real input, which a widget test's fake clock never lets finish, so it
/// happens outside it and the app gets this repository
/// The bundled strokes of [characters] in [language], read already:
/// reading an asset is real input, which a widget test's fake clock never
/// lets finish, so it happens outside it and the app gets this repository
/// (`testDependencies(strokes: ...)`).
Future<StrokeRepository> loadedStrokes(
WidgetTester tester,
Iterable<String> characters,
) async {
Iterable<String> characters, {
String? language,
}) async {
final strokes = StrokeRepository();
await tester.runAsync(() async {
for (final character in characters) {
await strokes.strokesOf(character);
await strokes.strokesOf(character, language: language);
}
});
return strokes;