halkyon/halkyon_learn_flutter/test/feature/kanji/model/radical_test.dart
Tizian 「ティツィアーン」 e7f3abdb8d
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>
2026-10-14 14:35:35 +02:00

57 lines
2.1 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:halkyon_learn_flutter/src/feature/kanji/model/radical.dart';
void main() {
test('the 214 Kangxi radicals in their order, by their strokes from 1 '
'to 17', () {
expect(
[for (final radical in radicals) radical.number],
[
for (var number = 1; number <= 214; number++) number,
],
);
final strokes = [for (final radical in radicals) radical.strokes];
expect(strokes, orderedEquals([...strokes]..sort()));
expect((strokes.first, strokes.last), (1, 17));
// Const, as the table is: a record compares its lists by identity.
expect(radicals[84], const (
number: 85,
character: '水',
variants: ['氵'],
strokes: 4,
name: 'water',
));
});
test('each is one character, as is every form it takes in kanji', () {
for (final radical in radicals) {
for (final form in [radical.character, ...radical.variants]) {
expect(form.runes, hasLength(1), reason: '${radical.number}');
}
}
});
test("a radical's label is the dictionary's", () {
expect(radicalLabel(85), 'radical:85');
});
test('the forms a radical takes in each language: simplified Chinese its '
"own, traditional Chinese and Korean without Japanese's own", () {
final speech = radicals[148];
final dragon = radicals[211];
final food = radicals[183];
expect(radicalFormsIn(speech, 'zh-Hans'), ['讠']);
expect(radicalFormsIn(speech, 'zh-Hant'), isEmpty);
expect(radicalFormsIn(dragon, 'ja'), ['竜']);
expect(radicalFormsIn(dragon, 'zh'), ['龙']);
expect(radicalFormsIn(dragon, 'ko'), isEmpty);
// Simplified Chinese writes 食 as 饣 at a character's side, not 飠.
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));
});
}