import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:provider/provider.dart'; import 'package:yumi/services/audio/rtc_manager.dart'; import 'package:yumi/services/audio/rtm_manager.dart'; import 'package:yumi/services/general/sc_app_general_manager.dart'; import 'package:yumi/services/music/room_music_manager.dart'; import 'package:yumi/shared/business_logic/models/res/sc_room_rocket_api_res.dart'; import 'package:yumi/shared/business_logic/models/res/sc_room_rocket_status_res.dart'; import 'package:yumi/shared/business_logic/models/res/sc_index_banner_res.dart'; import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_floating_entry.dart'; import 'package:yumi/ui_kit/widgets/room/room_play_widget.dart'; void main() { testWidgets('room rocket entry follows in-room progress updates', ( tester, ) async { await tester.binding.setSurfaceSize(const Size(720, 1600)); addTearDown(() async { await tester.binding.setSurfaceSize(null); }); final rtcProvider = _TestRtcProvider()..setRocketPercent(30); await tester.pumpWidget( ScreenUtilInit( designSize: const Size(375, 812), builder: (_, __) => MultiProvider( providers: [ ChangeNotifierProvider.value(value: rtcProvider), ChangeNotifierProvider.value( value: RealTimeMessagingManager(), ), ChangeNotifierProvider.value( value: RoomMusicManager(), ), ChangeNotifierProvider.value( value: _TestAppGeneralManager(), ), ], child: const MaterialApp(home: Scaffold(body: RoomPlayWidget())), ), ), ); await tester.pump(); expect(_rocketProgressWidthFactor(), closeTo(0.3, 0.001)); rtcProvider.setRocketPercent(80); await tester.pump(); expect(_rocketProgressWidthFactor(), closeTo(0.8, 0.001)); }); } class _TestAppGeneralManager extends ChangeNotifier implements SCAppGeneralManager { @override final List roomBanners = []; @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } class _TestRtcProvider extends RealTimeCommunicationManager { void setRocketPercent(num percent) { roomRocketStatus = SCRoomRocketStatusRes( roomId: 'room-1', currentLevel: 1, level: 1, currentEnergy: percent.toInt(), maxEnergy: 100, displayPercent: percent, configured: true, enabled: true, levels: [ SCRoomRocketLevelRes( id: 'level-1', level: 1, needEnergy: 100, rocketIconUrl: 'sc_images/index/sc_icon_task_gift.png', rocketPreviewUrl: '', rocketAnimationUrl: '', progressBarUrl: '', shakeThresholdPercent: 95, enabled: true, sort: 1, ), ], ); notifyListeners(); } } double _rocketProgressWidthFactor() { final progressFinder = find.descendant( of: find.byType(RoomRocketFloatingEntry), matching: find.byWidgetPredicate( (widget) => widget is FractionallySizedBox && widget.heightFactor == 1, ), ); final progress = testerWidget(progressFinder); return progress.widthFactor!; } T testerWidget(Finder finder) { expect(finder, findsOneWidget); return finder.evaluate().single.widget as T; }