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 = { class RadkfileRadical {
1: ['', '', '', '', '', ''], /// 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: [ 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: [ 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: [ 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: [ 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: [ 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: [ 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: ['', '', '', '', '', '', '', '', '', '', '', ''], 8: [
9: ['', '', '', '', '', '', '', '', '', '', ''], RadkfileRadical(formalVariant: '', strokeCount: 8),
10: ['', '', '', '', '', '', '', '', '', ''], RadkfileRadical(formalVariant: '', strokeCount: 8),
11: ['', '', '', '鹿', '', '', '', '', ''], RadkfileRadical(formalVariant: '', strokeCount: 8),
12: ['', '', '', ''], RadkfileRadical(formalVariant: '', strokeCount: 8),
13: ['', '', '', ''], RadkfileRadical(formalVariant: '', strokeCount: 8),
14: ['', ''], RadkfileRadical(formalVariant: '', strokeCount: 8),
17: [''], 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'; import 'setup_database_connection.dart';
void main() { void main() {
test( test('All constant radicals should exist in the database', () async {
'All constant radicals should exist in the database', final connection = await setupDatabaseConnection();
() async { final allRadicalsInDb = await connection.query(
final connection = await setupDatabaseConnection(); RADKFILETableNames.radkfile,
final allRadicalsInDb = await connection.query( columns: ['radical'],
RADKFILETableNames.radkfile, distinct: true,
columns: ['radical'], );
distinct: true,
);
final radicalsInDb = allRadicalsInDb final radicalsInDb = allRadicalsInDb
.map((e) => e['radical'] as String) .map((e) => e['radical'] as String)
.toSet(); .toSet();
final missingRadicals = radicals.values.flattenedToSet.difference( final missingRadicals = radicals.values.flattenedToSet
radicalsInDb, .map((e) => e.formalVariant)
); .toSet()
.difference(radicalsInDb);
expect( expect(
missingRadicals, missingRadicals,
isEmpty, isEmpty,
reason: 'Missing radicals in database: $missingRadicals', reason: 'Missing radicals in database: $missingRadicals',
); );
}, });
skip: 'Test is valid, code is broken, fix me',
);
test( test(
'All radicals in database should be in the constant radical list', 'All radicals in database should be in the constant radical list',
@@ -49,7 +46,7 @@ void main() {
.toSet(); .toSet();
final extraRadicals = radicalsInDb.difference( final extraRadicals = radicalsInDb.difference(
radicals.values.flattenedToSet, radicals.values.flattenedToSet.map((e) => e.formalVariant).toSet(),
); );
expect( expect(
@@ -59,21 +56,35 @@ void main() {
'Extra radicals in database missing in the constant list: $extraRadicals', 'Extra radicals in database missing in the constant list: $extraRadicals',
); );
}, },
skip: 'Test is valid, code is broken, fix me',
); );
group( test(
'All radicals should return results', 'All constant radicals are located in the correct stroke count group',
() { () {
for (final radical in radicals.values.flattened) { for (final mapEntry in radicals.entries) {
test(' - $radical', () async { final strokeCount = mapEntry.key;
final connection = await setupDatabaseConnection(); final radicalsInGroup = mapEntry.value;
final result = await connection.jadbSearchKanjiByRadicals([radical]); for (final radical in radicalsInGroup) {
expect(result, isNotEmpty); 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);
});
}
});
} }