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/features/timetable/week_grid.dart'; import 'package:hepan_everyday/features/exams/exams_page.dart'; import 'package:hepan_everyday/features/profile/profile_page.dart'; import 'package:hepan_everyday/widgets/glass_dock.dart'; import 'package:hepan_everyday/features/profile/settings_page.dart'; import 'package:hepan_everyday/features/feedback/feedback_page.dart'; import 'navigation_test.dart' show uiController; void main() { setUpAll(tzdata.initializeTimeZones); for (final size in [const Size(800, 1280), const Size(1280, 800)]) { testWidgets('tablet $size fits seven days and limits reading width', ( tester, ) async { tester.view.devicePixelRatio = 1; tester.view.physicalSize = size; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); final controller = uiController(); await controller.initialize(); await controller.showDemo(); await tester.pumpWidget(HepanApp(controller: controller)); await tester.pumpAndSettle(); expect(tester.takeException(), isNull); expect(tester.getRect(find.text('周一')).left, greaterThan(0)); expect(tester.getRect(find.text('周日')).right, lessThan(size.width)); final monday = tester.widget(find.text('周一')); expect(monday.style!.fontSize, greaterThanOrEqualTo(12)); expect(tester.getSize(find.byType(GlassDock)).width, 300); expect(tester.getSize(find.byType(GlassDock)).height, 58); await tester.drag(find.text('周三'), const Offset(-160, 0)); await tester.pumpAndSettle(); expect(find.text('第 2 周'), findsOneWidget); await tester.tap(find.byIcon(Icons.assignment_rounded)); await tester.pumpAndSettle(); expect( tester.getSize(find.byType(ExamsPage)).width, lessThanOrEqualTo(840), ); await tester.tap(find.byIcon(Icons.person_rounded)); await tester.pumpAndSettle(); expect( tester.getSize(find.byType(ProfilePage)).width, lessThanOrEqualTo(840), ); expect(tester.takeException(), isNull); await tester.tap(find.byIcon(Icons.calendar_month_rounded)); await tester.pumpAndSettle(); expect(find.text('第 2 周'), findsOneWidget); tester.view.physicalSize = const Size(480, 800); await tester.pumpAndSettle(); expect(tester.getSize(find.byType(GlassDock)).width, 264); expect(find.text('第 2 周'), findsOneWidget); expect( tester.getRect(find.byType(WeekGrid)).right, lessThanOrEqualTo(480), ); expect(tester.takeException(), isNull); controller.dispose(); }); } testWidgets( 'wide settings and feedback remain centered and usable with large text', (tester) async { tester.view.devicePixelRatio = 1; tester.view.physicalSize = const Size(1280, 800); addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); final controller = uiController(); await controller.initialize(); await tester.pumpWidget( MaterialApp( home: MediaQuery( data: const MediaQueryData( size: Size(1280, 800), textScaler: TextScaler.linear(1.5), ), child: SettingsPage(controller: controller), ), ), ); await tester.pumpAndSettle(); expect(tester.getSize(find.byType(ListView)).width, 760); expect(tester.getRect(find.byType(ListView)).center.dx, 640); expect(tester.takeException(), isNull); await tester.pumpWidget( MaterialApp( home: MediaQuery( data: const MediaQueryData( size: Size(1280, 800), textScaler: TextScaler.linear(1.5), ), child: const FeedbackPage(), ), ), ); await tester.pumpAndSettle(); expect(tester.getSize(find.byType(ListView)).width, 760); expect(tester.takeException(), isNull); await tester.enterText(find.byKey(const Key('feedback-message')), '平板反馈'); expect(find.text('平板反馈'), findsOneWidget); controller.dispose(); }, ); }