import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:timezone/data/latest.dart' as tzdata; import 'package:hepan_everyday/features/timetable/week_grid.dart'; import 'package:hepan_everyday/domain/schedule_engine.dart'; import 'package:hepan_everyday/domain/app_settings.dart'; void main() { setUpAll(tzdata.initializeTimeZones); for (final scale in [1.0, 2.0]) { testWidgets( 'seven days and full teacher/room fit equal duration cards at scale $scale', (tester) async { tester.view.physicalSize = const Size(360, 800); tester.view.devicePixelRatio = 1; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); final term = Semester(startDate: DateTime(2026, 9, 7), totalWeeks: 1); Course c(String id, int day, String teacher, String room) => Course( id: id, name: '很长的课程名称应当可以省略但点击后显示完整课程名称$id', teacher: teacher, room: room, weekday: day, startPeriod: 3, endPeriod: 4, weeks: {1}, source: CourseSource.file, ); final events = ScheduleEngine.occurrences([ c('a', 1, '张晓玲、杨拥军', '品学楼B102'), c('b', 7, '李老师', '立人楼教学实验中心B412'), ], term); await tester.pumpWidget( MaterialApp( home: MediaQuery( data: MediaQueryData( size: const Size(360, 800), textScaler: TextScaler.linear(scale), ), child: Scaffold( body: SingleChildScrollView( child: WeekGrid( events: events, monday: term.firstMonday, today: term.startDate, settings: const AppSettings(), ), ), ), ), ), ); await tester.pumpAndSettle(); expect(tester.getRect(find.text('周一')).left, greaterThanOrEqualTo(0)); expect(tester.getRect(find.text('周日')).right, lessThanOrEqualTo(360)); final first = tester.getRect( find.bySemanticsLabel('${events.first.course.name},张晓玲、杨拥军,品学楼B102'), ); final last = tester.getRect( find.bySemanticsLabel('${events.last.course.name},李老师,立人楼教学实验中心B412'), ); expect(first.height, last.height); for (final text in ['张晓玲、杨拥军', '品学楼B102', '李老师', '立人楼教学实验中心B412']) { final finder = find.text(text); final widget = tester.widget(finder); expect(widget.maxLines, isNull); expect(widget.overflow, isNot(TextOverflow.ellipsis)); final paragraph = tester.renderObject(finder); expect(paragraph.didExceedMaxLines, isFalse); final rect = tester.getRect(finder); final card = text == '张晓玲、杨拥军' || text == '品学楼B102' ? first : last; expect(rect.bottom, lessThanOrEqualTo(card.bottom)); expect(rect.left, greaterThanOrEqualTo(card.left)); expect(rect.right, lessThanOrEqualTo(card.right)); } expect(tester.takeException(), isNull); await tester.ensureVisible(find.text(events.first.course.name)); await tester.tap(find.text(events.first.course.name)); await tester.pumpAndSettle(); expect(find.text(events.first.course.name), findsNWidgets(2)); }, ); } }