feat: add elastic glass dock motion and Android tablet layouts
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
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<Text>(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();
|
||||
},
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user