import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:kouyu_english/core/app_state.dart'; import 'package:kouyu_english/features/dialogue/dialogue_flow.dart'; import 'package:kouyu_english/features/onboarding/onboarding_pages.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { setUp(() { SharedPreferences.setMockInitialValues({}); }); testWidgets('three-question placement suggests a starting lesson', ( tester, ) async { final state = AppState(); var started = false; await tester.pumpWidget( MaterialApp( home: PlacementPage(state: state, onStart: () => started = true), ), ); await tester.tap(find.text('开始 3 分钟定位')); await tester.pumpAndSettle(); expect(find.text('定位 · 1 / 3'), findsOneWidget); await tester.tap(find.text('你好,我叫 Mia,很高兴认识你。')); await tester.pump(); await tester.tap(find.text('下一题')); await tester.pumpAndSettle(); expect(find.text('定位 · 2 / 3'), findsOneWidget); await tester.tap(find.text('现在不方便开口,跳过')); await tester.pumpAndSettle(); expect(find.text('定位 · 3 / 3'), findsOneWidget); await tester.enterText(find.byType(TextField), 'My name is Mia.'); await tester.tap(find.text('查看建议')); await tester.pumpAndSettle(); expect(find.text('建议从 A0 第 2 课开始'), findsOneWidget); expect(find.text('从更简单内容开始'), findsOneWidget); await tester.tap(find.text('开始今天学习')); await tester.pump(); expect(started, isTrue); expect(state.activeLessonId, 'a0-02'); expect(state.placementStartLessonId, 'a0-02'); expect(state.completedLessonIds, isEmpty); }); testWidgets('an unanswered placement starts from lesson one', (tester) async { final state = AppState(); await tester.pumpWidget( MaterialApp( home: PlacementPage(state: state, onStart: () {}), ), ); await tester.tap(find.text('开始 3 分钟定位')); await tester.pumpAndSettle(); await tester.tap(find.text('听不懂,下一题')); await tester.pumpAndSettle(); await tester.tap(find.text('我读完了')); await tester.pumpAndSettle(); await tester.tap(find.text('还不会说,查看建议')); await tester.pumpAndSettle(); expect(find.text('建议从 A0 第 1 课开始'), findsOneWidget); expect(find.text('从更简单内容开始'), findsNothing); }); testWidgets('scene page lists open and locked scenes', (tester) async { final state = AppState() ..completedLessonIds.addAll(['a0-01', 'a0-02', 'a0-03', 'a0-04']); String? startedScene; await tester.pumpWidget( MaterialApp( home: DialogueScenePage( state: state, onStart: (id) => startedScene = id, ), ), ); expect(find.text('初次见面'), findsOneWidget); expect(find.text('留个电话'), findsOneWidget); expect(find.text('A0 · 学完第 7 课后开放'), findsOneWidget); await tester.tap(find.widgetWithText(FilledButton, '开始对话').first); expect(startedScene, isNotNull); }); }