整个课程和数据UI重新设计版本

This commit is contained in:
shenlei
2026-09-18 17:55:44 +09:00
parent febfd30f49
commit 0a4f97d105
154 changed files with 12366 additions and 4784 deletions
@@ -6,9 +6,10 @@ import 'package:kouyu_english/core/models.dart';
import 'package:kouyu_english/features/dialogue/dialogue_flow.dart';
import 'package:kouyu_english/features/review/review_page.dart';
import 'package:kouyu_english/features/shell/learning_shell.dart';
import 'package:kouyu_english/main.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'support/app_assets.dart';
void main() {
setUp(() {
SharedPreferences.setMockInitialValues({});
@@ -17,7 +18,7 @@ void main() {
testWidgets('Onboarding PlacementPage back button returns to WelcomePage', (
tester,
) async {
await tester.pumpWidget(const KouyuEnglishApp());
await pumpLoadedApp(tester);
await tester.pumpAndSettle();
expect(find.text('每天 20 分钟,\n说出能用的英语。'), findsOneWidget);
@@ -33,43 +34,30 @@ void main() {
expect(find.text('每天 20 分钟,\n说出能用的英语。'), findsOneWidget);
});
testWidgets('SettingsPage back button returns to ProgressPage', (
tester,
) async {
testWidgets('Profile sub-page back button returns to 我的', (tester) async {
final state = AppState()..finishOnboarding();
await tester.pumpWidget(
MaterialApp(home: LearningShell(state: state)),
);
await tester.pumpWidget(MaterialApp(home: LearningShell(state: state)));
await tester.pumpAndSettle();
// Navigate to "我的" (progress tab)
await tester.tap(find.text('我的'));
await tester.pumpAndSettle();
final settingsButton = find.text('调整学习与 AI 设置');
await tester.ensureVisible(settingsButton);
final preferences = find.text('学习偏好');
await tester.ensureVisible(preferences);
await tester.tap(preferences);
await tester.pumpAndSettle();
expect(settingsButton, findsOneWidget);
await tester.tap(settingsButton);
expect(find.text('每日学习时间'), findsOneWidget);
await tester.tap(find.byType(BackButton));
await tester.pumpAndSettle();
// In SettingsPage
expect(find.text('学习设置'), findsOneWidget);
expect(find.byIcon(Icons.arrow_back), findsOneWidget);
// Tap back button
await tester.tap(find.byIcon(Icons.arrow_back));
await tester.pumpAndSettle();
expect(find.text('调整学习与 AI 设置'), findsOneWidget);
expect(find.text('每日学习时间'), findsNothing);
expect(find.text('学习偏好'), findsOneWidget);
});
testWidgets('LessonFlow back button returns to tab', (tester) async {
final state = AppState()..finishOnboarding();
await tester.pumpWidget(
MaterialApp(home: LearningShell(state: state)),
);
await tester.pumpWidget(MaterialApp(home: LearningShell(state: state)));
await tester.pumpAndSettle();
expect(find.text('开始今天的学习'), findsOneWidget);
@@ -86,27 +74,15 @@ void main() {
expect(find.text('开始今天的学习'), findsOneWidget);
});
testWidgets('DialogueScenePage from Home has back button and returns to Home', (
tester,
) async {
testWidgets('学习 tab shows today task and the lesson path', (tester) async {
final state = AppState()..finishOnboarding();
await tester.pumpWidget(
MaterialApp(home: LearningShell(state: state)),
);
await tester.pumpWidget(MaterialApp(home: LearningShell(state: state)));
await tester.pumpAndSettle();
expect(find.text('开始情境对话'), findsOneWidget);
await tester.tap(find.text('开始情境对话'));
await tester.pumpAndSettle();
// In DialogueScenePage as secondary route
expect(find.text('AI 情境对话'), findsOneWidget);
expect(find.byIcon(Icons.arrow_back), findsOneWidget);
await tester.tap(find.byIcon(Icons.arrow_back));
await tester.pumpAndSettle();
expect(find.text('开始情境对话'), findsOneWidget);
expect(find.byType(NavigationDestination), findsNWidgets(4));
expect(find.text('今日新课'), findsOneWidget);
expect(find.text('课程路径'), findsOneWidget);
expect(find.textContaining('第 1 课 · '), findsWidgets);
});
testWidgets('DialogueSummaryPage has back button', (tester) async {
@@ -137,7 +113,9 @@ void main() {
expect(backCalled, isTrue);
});
testWidgets('AdaptiveLessonPage has back button in all states', (tester) async {
testWidgets('AdaptiveLessonPage has back button in all states', (
tester,
) async {
final state = AppState()..finishOnboarding();
// 1. Empty state
@@ -200,44 +178,47 @@ void main() {
expect(finished, isTrue);
});
testWidgets('AssessmentPreparationPage and AssessmentPage have back buttons', (
tester,
) async {
final state = AppState()..finishOnboarding();
await tester.pumpWidget(
MaterialApp(home: LearningShell(state: state)),
);
await tester.pumpAndSettle();
testWidgets(
'AssessmentPreparationPage and AssessmentPage have back buttons',
(tester) async {
final state = AppState()..finishOnboarding();
await tester.pumpWidget(MaterialApp(home: LearningShell(state: state)));
await tester.pumpAndSettle();
// Navigate to "我的"
await tester.tap(find.text('我的'));
await tester.pumpAndSettle();
// Navigate to "我的"
await tester.tap(find.text('我的'));
await tester.pumpAndSettle();
// Open assessment pack A0-E1
final packAButton = find.text('开始 A0-E1');
await tester.ensureVisible(packAButton);
await tester.pumpAndSettle();
final assessments = find.text('四技能评估');
await tester.ensureVisible(assessments);
await tester.tap(assessments);
await tester.pumpAndSettle();
expect(packAButton, findsOneWidget);
await tester.tap(packAButton);
await tester.pumpAndSettle();
// Open assessment pack A0-E1
final packAButton = find.text('开始 A0-E1');
await tester.ensureVisible(packAButton);
await tester.pumpAndSettle();
// In AssessmentPreparationPage
expect(find.text('评估准备'), findsOneWidget);
expect(find.byIcon(Icons.arrow_back), findsOneWidget);
expect(packAButton, findsOneWidget);
await tester.tap(packAButton);
await tester.pumpAndSettle();
// Start assessment
await tester.tap(find.text('开始评估'));
await tester.pumpAndSettle();
// In AssessmentPreparationPage
expect(find.text('评估准备'), findsOneWidget);
expect(find.byIcon(Icons.arrow_back), findsOneWidget);
// In AssessmentPage
expect(find.byIcon(Icons.arrow_back), findsOneWidget);
// Start assessment
await tester.tap(find.text('开始评估'));
await tester.pumpAndSettle();
// Tap back button in AssessmentPage
await tester.tap(find.byIcon(Icons.arrow_back));
await tester.pumpAndSettle();
// In AssessmentPage
expect(find.byIcon(Icons.arrow_back), findsOneWidget);
// Returns to Progress tab
expect(find.text('A0 四技能评估'), findsOneWidget);
});
// Returns to 我的
await tester.tap(find.byIcon(Icons.arrow_back));
await tester.pumpAndSettle();
expect(find.text('评估准备'), findsNothing);
expect(find.text('四技能评估'), findsOneWidget);
},
);
}