// Author: fruit.com.cn import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:fruitshorts/core/theme/app_colors.dart'; import 'package:fruitshorts/l10n/app_localizations.dart'; import 'package:fruitshorts/pages/player/widgets/player_more_sheet.dart'; void main() { testWidgets('should_hide_pip_row_when_platform_unsupported', (tester) async { await _openSheet(tester); expect(find.byKey(const Key('player-more-sheet')), findsOneWidget); expect(find.byKey(const Key('player-more-clear')), findsOneWidget); expect(find.byKey(const Key('player-more-offline')), findsOneWidget); expect(find.byKey(const Key('player-more-pip')), findsNothing); expect(find.byKey(const Key('player-more-close')), findsNothing); }); testWidgets('should_render_reference_layout_metrics', (tester) async { await _openSheet(tester); expect( tester.widget(find.byKey(const Key('player-more-sheet'))).color, AppColors.ink, ); expect( tester.getSize(find.byKey(const Key('player-more-drag-handle'))), const Size(36, 4), ); for (final key in const [ Key('player-more-speed-row'), Key('player-more-quality-row'), Key('player-more-clear'), Key('player-more-offline'), ]) { expect(tester.getSize(find.byKey(key)).height, 56); } for (final key in const [ Key('player-more-speed-track'), Key('player-more-quality-track'), ]) { expect(tester.getSize(find.byKey(key)).height, 34); final trackDecoration = tester.widget(find.byKey(key)).decoration! as BoxDecoration; expect(trackDecoration.color, AppColors.raised); } for (final key in const [ Key('player-more-speed-0.75'), Key('player-more-speed-1.0'), Key('player-more-speed-1.25'), ]) { expect(tester.getSize(find.byKey(key)).height, 26); } final speedLabel = tester.widget( find .descendant( of: find.byKey(const Key('player-more-speed-row')), matching: find.byType(Text), ) .first, ); expect(speedLabel.style?.fontSize, 15); expect(speedLabel.style?.fontWeight, FontWeight.w500); expect(tester.widget(find.byIcon(Icons.speed_outlined)).size, 22); expect(tester.widget(find.byIcon(Icons.fullscreen)).size, 22); final selected = tester.widget( find .descendant( of: find.byKey(const Key('player-more-speed-1.0')), matching: find.byType(Container), ) .first, ); final selectedDecoration = selected.decoration! as BoxDecoration; expect(selectedDecoration.color, AppColors.card); expect(selectedDecoration.boxShadow, isNotEmpty); final selectedText = tester.widget( find.descendant( of: find.byKey(const Key('player-more-speed-1.0')), matching: find.text('1.0x'), ), ); expect(selectedText.style?.color, AppColors.onSurface); expect(selectedText.style?.fontSize, 13); expect(selectedText.style?.fontWeight, FontWeight.w600); final unselected = tester.widget( find .descendant( of: find.byKey(const Key('player-more-speed-1.25')), matching: find.byType(Container), ) .first, ); final unselectedDecoration = unselected.decoration! as BoxDecoration; expect(unselectedDecoration.color, Colors.transparent); final unselectedText = tester.widget( find.descendant( of: find.byKey(const Key('player-more-speed-1.25')), matching: find.text('1.25x'), ), ); expect(unselectedText.style?.color, AppColors.muted); expect(unselectedText.style?.fontSize, 13); expect(unselectedText.style?.fontWeight, FontWeight.w400); final disabledText = tester.widget( find.descendant( of: find.byKey(const Key('player-more-quality-720P')), matching: find.byType(Text), ), ); expect(disabledText.style?.color, AppColors.subtle); }); testWidgets('should_trigger_pip_and_close_sheet_when_tapped', (tester) async { var pipCalls = 0; await _openSheet(tester, onPip: () => pipCalls++); expect(find.byKey(const Key('player-more-pip')), findsOneWidget); expect( tester.getTopLeft(find.byKey(const Key('player-more-clear'))).dy < tester.getTopLeft(find.byKey(const Key('player-more-pip'))).dy, isTrue, ); expect( tester.getTopLeft(find.byKey(const Key('player-more-pip'))).dy < tester.getTopLeft(find.byKey(const Key('player-more-offline'))).dy, isTrue, ); await tester.tap(find.byKey(const Key('player-more-pip'))); await tester.pumpAndSettle(); expect(pipCalls, 1); expect(find.byKey(const Key('player-more-sheet')), findsNothing); }); } Future _openSheet(WidgetTester tester, {VoidCallback? onPip}) async { await tester.pumpWidget( MaterialApp( supportedLocales: AppLocalizations.supportedLocales, localizationsDelegates: AppLocalizations.localizationsDelegates, home: Scaffold( body: Builder( builder: (context) => Center( child: TextButton( key: const Key('open-more-sheet'), onPressed: () => showModalBottomSheet( context: context, backgroundColor: Colors.transparent, isScrollControlled: true, builder: (_) => PlayerMoreSheet( l10n: AppLocalizations.of(context)!, state: const PlayerMoreState(speed: 1.0, qualities: ['AUTO']), actions: PlayerMoreActions( onSpeedChanged: (_) {}, onClear: () {}, onDownload: () {}, onPip: onPip, ), ), ), child: const Text('open'), ), ), ), ), ), ); await tester.tap(find.byKey(const Key('open-more-sheet'))); await tester.pumpAndSettle(); }