yumi-flutter/test/room_rocket_entry_sync_test.dart

112 lines
3.6 KiB
Dart

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<RtcProvider>.value(value: rtcProvider),
ChangeNotifierProvider<RtmProvider>.value(
value: RealTimeMessagingManager(),
),
ChangeNotifierProvider<RoomMusicManager>.value(
value: RoomMusicManager(),
),
ChangeNotifierProvider<SCAppGeneralManager>.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<SCIndexBannerRes> roomBanners = <SCIndexBannerRes>[];
@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<FractionallySizedBox>(progressFinder);
return progress.widthFactor!;
}
T testerWidget<T extends Widget>(Finder finder) {
expect(finder, findsOneWidget);
return finder.evaluate().single.widget as T;
}