import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:timezone/data/latest.dart' as tzdata; import 'package:hepan_everyday/app/hepan_app.dart'; import 'package:hepan_everyday/app/app_controller.dart'; import 'package:hepan_everyday/domain/app_snapshot.dart'; import 'package:hepan_everyday/domain/semester.dart'; import 'package:hepan_everyday/features/timetable/timetable_page.dart'; import '../support/fakes.dart'; import '../domain/schedule_engine_test.dart' show course; void main() { setUpAll(tzdata.initializeTimeZones); testWidgets('imported courses without start date show an actionable prompt', ( tester, ) async { final c = AppController( MemoryStore(AppSnapshot(courses: [course()])), FakeNotifications(), FakeCalendar(), () => DateTime(2026, 10, 13), ); await c.initialize(); await tester.pumpWidget(HepanApp(controller: c)); await tester.pumpAndSettle(); expect(find.text('课表已导入,请设置学期开始日'), findsOneWidget); expect(find.text('1 条课程安排已保存'), findsOneWidget); await tester.tap(find.text('设置学期开始日')); await tester.pumpAndSettle(); expect(find.text('课表设置'), findsOneWidget); expect(find.text('学期开始日').hitTestable(), findsOneWidget); await c.updateSettings( (s) => s.copyWith( semester: Semester(startDate: DateTime(2026, 10, 12), totalWeeks: 20), ), ); Navigator.of(tester.element(find.text('课表设置'))).pop(); await tester.pumpAndSettle(); expect(find.text('课表已导入,请设置学期开始日'), findsNothing); expect(find.text('周日'), findsOneWidget); c.dispose(); }); testWidgets( 'timetable refresh calls school sync and page titles are specific', (tester) async { final c = AppController( MemoryStore(), FakeNotifications(), FakeCalendar(), () => DateTime(2026, 10, 13), ); await c.initialize(); var calls = 0; await tester.pumpWidget( MaterialApp( home: Scaffold( body: TimetablePage(controller: c, onSync: () => calls++), ), ), ); await tester.pumpAndSettle(); await tester.tap(find.byTooltip('刷新课表')); expect(calls, 1); expect(find.text('课表'), findsOneWidget); await tester.pumpWidget(HepanApp(controller: c)); await tester.pumpAndSettle(); await tester.tap(find.bySemanticsLabel('考试')); await tester.pumpAndSettle(); expect(find.text('考试'), findsOneWidget); expect(find.text('考试安排'), findsOneWidget); await tester.tap(find.bySemanticsLabel('个人设置')); await tester.pumpAndSettle(); expect(find.text('更新学期'), findsOneWidget); expect(find.text('TPSchedule'), findsWidgets); c.dispose(); }, ); }