119 lines
4.2 KiB
Dart
119 lines
4.2 KiB
Dart
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('self-reported basics move a learner who passes both checks', (
|
|
tester,
|
|
) async {
|
|
final state = AppState();
|
|
await tester.pumpWidget(
|
|
MaterialApp(
|
|
home: PlacementPage(state: state, onStart: () {}),
|
|
),
|
|
);
|
|
await tester.tap(find.text('能说一点'));
|
|
await tester.tap(find.text('开始 3 分钟定位'));
|
|
await tester.pumpAndSettle();
|
|
await tester.tap(find.text('你好,我叫 Mia,很高兴认识你。'));
|
|
await tester.pump();
|
|
await tester.tap(find.text('下一题'));
|
|
await tester.pumpAndSettle();
|
|
await tester.tap(find.text('现在不方便开口,跳过'));
|
|
await tester.pumpAndSettle();
|
|
await tester.enterText(find.byType(TextField), 'My name is Mia.');
|
|
await tester.tap(find.text('查看建议'));
|
|
await tester.pumpAndSettle();
|
|
expect(find.text('建议从 A0 第 3 课开始'), findsOneWidget);
|
|
await tester.tap(find.text('开始今天学习'));
|
|
expect(state.placementStartLessonId, 'a0-03');
|
|
});
|
|
|
|
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);
|
|
});
|
|
}
|