const_data/radicals: store both formal and informal variant of radical
Build and test / build (push) Successful in 5m47s

This commit is contained in:
2026-06-03 17:42:09 +09:00
parent 5556a73899
commit f3dba3ffab
2 changed files with 337 additions and 239 deletions
+291 -204
View File
@@ -1,217 +1,304 @@
const Map<int, List<String>> radicals = {
1: ['', '', '', '', '', ''],
class RadkfileRadical {
/// The formal variant of the radical
///
/// This is the one you want to use for searching.
final String formalVariant;
/// The informal variant of the radical (if it differs from the formal one).
///
/// This is the one you should display to the user.
final String? informalVariant;
/// The number of strokes in this radical.
final int strokeCount;
const RadkfileRadical({
required this.formalVariant,
this.informalVariant,
required this.strokeCount,
});
}
const Map<int, List<RadkfileRadical>> radicals = {
1: [
RadkfileRadical(formalVariant: '', strokeCount: 1),
RadkfileRadical(formalVariant: '', strokeCount: 1),
RadkfileRadical(formalVariant: '', strokeCount: 1),
RadkfileRadical(formalVariant: '', strokeCount: 1),
RadkfileRadical(formalVariant: '', strokeCount: 1),
RadkfileRadical(formalVariant: '', strokeCount: 1),
],
2: [
'',
'',
'',
'',
'𠆢',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'𠂉',
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', informalVariant: '𠆢', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
RadkfileRadical(formalVariant: '', strokeCount: 2),
],
3: [
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'广',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '广', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
RadkfileRadical(formalVariant: '', strokeCount: 3),
],
4: [
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
RadkfileRadical(formalVariant: '', informalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
RadkfileRadical(formalVariant: '', strokeCount: 4),
],
5: [
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
RadkfileRadical(formalVariant: '', strokeCount: 5),
],
6: [
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'西',
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '', strokeCount: 6),
RadkfileRadical(formalVariant: '西', strokeCount: 6),
],
7: [
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
RadkfileRadical(formalVariant: '', strokeCount: 7),
],
8: ['', '', '', '', '', '', '', '', '', '', '', ''],
9: ['', '', '', '', '', '', '', '', '', '', ''],
10: ['', '', '', '', '', '', '', '', '', ''],
11: ['', '', '', '鹿', '', '', '', '', ''],
12: ['', '', '', ''],
13: ['', '', '', ''],
14: ['', ''],
17: [''],
8: [
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
RadkfileRadical(formalVariant: '', strokeCount: 8),
],
9: [
RadkfileRadical(formalVariant: '', strokeCount: 9),
RadkfileRadical(formalVariant: '', strokeCount: 9),
RadkfileRadical(formalVariant: '', strokeCount: 9),
RadkfileRadical(formalVariant: '', strokeCount: 9),
RadkfileRadical(formalVariant: '', strokeCount: 9),
RadkfileRadical(formalVariant: '', strokeCount: 9),
RadkfileRadical(formalVariant: '', strokeCount: 9),
RadkfileRadical(formalVariant: '', strokeCount: 9),
RadkfileRadical(formalVariant: '', strokeCount: 9),
RadkfileRadical(formalVariant: '', strokeCount: 9),
RadkfileRadical(formalVariant: '', strokeCount: 9),
],
10: [
RadkfileRadical(formalVariant: '', strokeCount: 10),
RadkfileRadical(formalVariant: '', strokeCount: 10),
RadkfileRadical(formalVariant: '', strokeCount: 10),
RadkfileRadical(formalVariant: '', strokeCount: 10),
RadkfileRadical(formalVariant: '', strokeCount: 10),
RadkfileRadical(formalVariant: '', strokeCount: 10),
RadkfileRadical(formalVariant: '', strokeCount: 10),
RadkfileRadical(formalVariant: '', strokeCount: 10),
RadkfileRadical(formalVariant: '', strokeCount: 10),
RadkfileRadical(formalVariant: '', strokeCount: 10),
],
11: [
RadkfileRadical(formalVariant: '', strokeCount: 11),
RadkfileRadical(formalVariant: '', strokeCount: 11),
RadkfileRadical(formalVariant: '', strokeCount: 11),
RadkfileRadical(formalVariant: '鹿', strokeCount: 11),
RadkfileRadical(formalVariant: '', strokeCount: 11),
RadkfileRadical(formalVariant: '', strokeCount: 11),
RadkfileRadical(formalVariant: '', strokeCount: 11),
RadkfileRadical(formalVariant: '', strokeCount: 11),
RadkfileRadical(formalVariant: '', strokeCount: 11),
],
12: [
RadkfileRadical(formalVariant: '', strokeCount: 12),
RadkfileRadical(formalVariant: '', strokeCount: 12),
RadkfileRadical(formalVariant: '', strokeCount: 12),
RadkfileRadical(formalVariant: '', strokeCount: 12),
],
13: [
RadkfileRadical(formalVariant: '', strokeCount: 13),
RadkfileRadical(formalVariant: '', strokeCount: 13),
RadkfileRadical(formalVariant: '', strokeCount: 13),
RadkfileRadical(formalVariant: '', strokeCount: 13),
],
14: [
RadkfileRadical(formalVariant: '', strokeCount: 14),
RadkfileRadical(formalVariant: '', strokeCount: 14),
],
17: [RadkfileRadical(formalVariant: '', strokeCount: 17)],
};
+46 -35
View File
@@ -7,32 +7,29 @@ import 'package:test/test.dart';
import 'setup_database_connection.dart';
void main() {
test(
'All constant radicals should exist in the database',
() async {
final connection = await setupDatabaseConnection();
final allRadicalsInDb = await connection.query(
RADKFILETableNames.radkfile,
columns: ['radical'],
distinct: true,
);
test('All constant radicals should exist in the database', () async {
final connection = await setupDatabaseConnection();
final allRadicalsInDb = await connection.query(
RADKFILETableNames.radkfile,
columns: ['radical'],
distinct: true,
);
final radicalsInDb = allRadicalsInDb
.map((e) => e['radical'] as String)
.toSet();
final radicalsInDb = allRadicalsInDb
.map((e) => e['radical'] as String)
.toSet();
final missingRadicals = radicals.values.flattenedToSet.difference(
radicalsInDb,
);
final missingRadicals = radicals.values.flattenedToSet
.map((e) => e.formalVariant)
.toSet()
.difference(radicalsInDb);
expect(
missingRadicals,
isEmpty,
reason: 'Missing radicals in database: $missingRadicals',
);
},
skip: 'Test is valid, code is broken, fix me',
);
expect(
missingRadicals,
isEmpty,
reason: 'Missing radicals in database: $missingRadicals',
);
});
test(
'All radicals in database should be in the constant radical list',
@@ -49,7 +46,7 @@ void main() {
.toSet();
final extraRadicals = radicalsInDb.difference(
radicals.values.flattenedToSet,
radicals.values.flattenedToSet.map((e) => e.formalVariant).toSet(),
);
expect(
@@ -59,21 +56,35 @@ void main() {
'Extra radicals in database missing in the constant list: $extraRadicals',
);
},
skip: 'Test is valid, code is broken, fix me',
);
group(
'All radicals should return results',
test(
'All constant radicals are located in the correct stroke count group',
() {
for (final radical in radicals.values.flattened) {
test(' - $radical', () async {
final connection = await setupDatabaseConnection();
final result = await connection.jadbSearchKanjiByRadicals([radical]);
expect(result, isNotEmpty);
});
for (final mapEntry in radicals.entries) {
final strokeCount = mapEntry.key;
final radicalsInGroup = mapEntry.value;
for (final radical in radicalsInGroup) {
expect(
strokeCount,
radical.strokeCount,
reason:
'Radical ${radical.formalVariant} should have stroke count $strokeCount but has ${radical.strokeCount}',
);
}
}
},
skip:
'These will be automatically fixed once the other radical tests are passing',
);
group('All radicals should return results', () {
for (final radical in radicals.values.flattened) {
test(' - $radical', () async {
final connection = await setupDatabaseConnection();
final result = await connection.jadbSearchKanjiByRadicals([
radical.formalVariant,
]);
expect(result, isNotEmpty);
});
}
});
}