feat: complete kouyu_english app codebase, A0 specifications and .gitignore

This commit is contained in:
shen
2026-09-15 15:58:33 +08:00
parent b8072673d8
commit 37c86f7ecb
136 changed files with 19042 additions and 0 deletions
@@ -0,0 +1,80 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:kouyu_english/core/app_state.dart';
import 'package:kouyu_english/widgets/lexicon_lookup.dart';
void main() {
test('lookup prefers the longest reviewed phrase', () {
final entry = findCourseLexicon('Nice to meet you, Mia.');
expect(entry, isNotNull);
expect(entry!.word, 'Nice to meet you');
expect(entry.meaning, isNotEmpty);
});
test('lookup includes reviewed vocabulary from split segments', () {
final entry = findCourseLexicon("It's three o'clock.");
expect(entry, isNotNull);
expect(entry!.word, "It's three o'clock.");
});
test('unknown text has no invented dictionary entry', () {
expect(findCourseLexicon('supercalifragilistic'), isNull);
});
test('lookup does not match substrings within longer words', () {
expect(findCourseLexicon('often'), isNull);
expect(findCourseLexicon('sentence'), isNull);
expect(findCourseLexicon('teacher'), isNull);
});
test('lookup matches reviewed vocabulary with punctuation and apostrophes', () {
expect(findCourseLexicon('tea'), isNotNull);
expect(findCourseLexicon('tea.'), isNotNull);
expect(findCourseLexicon("What's this?"), isNotNull);
expect(findCourseLexicon('What’s this?'), isNotNull);
});
testWidgets('cached temporary definition appears when lookup opens', (
tester,
) async {
final state = AppState()
..cacheTemporaryDefinition(query: 'library', definition: '图书馆');
await tester.pumpWidget(
MaterialApp(
home: Builder(
builder: (context) => ElevatedButton(
onPressed: () => showLexiconLookup(
context,
state: state,
initialText: 'library',
),
child: const Text('查词'),
),
),
),
);
await tester.tap(find.text('查词'));
await tester.pumpAndSettle();
expect(find.textContaining('待审核临时释义'), findsOneWidget);
expect(find.textContaining('图书馆'), findsOneWidget);
});
testWidgets('selected arbitrary text exposes a dynamic lookup action', (
tester,
) async {
await tester.pumpWidget(
MaterialApp(
home: Scaffold(body: LexiconText('mystery widget', state: AppState())),
),
);
expect(find.byType(SelectableText), findsOneWidget);
await tester.longPress(find.text('mystery widget'));
await tester.pumpAndSettle();
expect(find.text('查询已选文本'), findsOneWidget);
});
}