Files
fanuzu/app/integration_test/galaxy_perf_test.dart
T

47 lines
2.0 KiB
Dart

import 'package:fancake/features/eclipse/eclipse_data.dart';
import 'package:fancake/features/galaxy/galaxy_data.dart';
import 'package:fancake/features/planet/planet_data.dart';
import 'package:fancake/features/galaxy/galaxy_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
/// 기기 위에서 재는 갤럭시 맵 프레임 타이밍.
///
/// 위젯 테스트는 실제로 래스터화하지 않으므로 「끊기는가」를 답하지 못한다.
/// 이 테스트는 프로파일 빌드로 기기에 올라가 **실제 프레임 시간**을 남긴다.
/// 별첨 1 ① 판정 기준 「기준 단말에서 행성/맵/애니메이션 체감 지연 없음」의 근거다.
void main() {
final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('갤럭시 맵을 팬·줌하는 동안의 프레임 시간', (tester) async {
await binding.watchPerformance(() async {
await tester.pumpWidget(
MaterialApp(
home: GalaxyScreen(
repository: SampleGalaxyRepository(),
planetRepository: samplePlanetRepository,
eclipse: SampleEclipseRepository(),
),
),
);
await tester.pump(const Duration(milliseconds: 100));
final field = find.byType(GalaxyScreen);
expect(field, findsOneWidget);
// 궤도가 도는 동안 드래그를 섞는다. 애니메이션과 제스처가 겹치는 구간이
// 가장 무거우므로, 나눠 재면 실제로 끊기는 순간을 놓친다.
for (var round = 0; round < 6; round++) {
await tester.drag(field, const Offset(-120, -40));
await tester.pump(const Duration(milliseconds: 16));
await tester.drag(field, const Offset(120, 40));
await tester.pump(const Duration(milliseconds: 16));
for (var frame = 0; frame < 20; frame++) {
await tester.pump(const Duration(milliseconds: 16));
}
}
}, reportKey: 'galaxy_pan');
});
}