Files
fanuzu/app/test/galaxy_mini_map_capture_test.dart
T

129 lines
3.5 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'dart:ui' as ui;
import 'package:fancake/features/galaxy/galaxy_data.dart';
import 'package:fancake/features/galaxy/widgets/galaxy_mini_map.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
/// 프로토타입 v6.2 와 나란히 볼 미니맵 캡처. `MINIMAP_OUT=<폴더>` 일 때만 PNG 를 쓴다.
/// MINIMAP_OUT=build/minimap fvm flutter test test/galaxy_mini_map_capture_test.dart
/// 표본은 프로토타입 `FPI_DATA` 5행성 — 같은 데이터로 두 장면을 비교한다.
const protoPlanets = [
PlanetNode(
id: '1',
name: 'NewJeans',
rank: 1,
fpi: 3200,
members: 1,
online: 4820,
isMine: true,
),
PlanetNode(
id: '2',
name: 'BTS',
rank: 2,
fpi: 2800,
members: 1,
online: 12540,
),
PlanetNode(
id: '3',
name: 'aespa',
rank: 3,
fpi: 2100,
members: 1,
online: 3910,
),
PlanetNode(
id: '4',
name: 'IVE',
rank: 4,
fpi: 1700,
members: 1,
online: 2840,
),
PlanetNode(
id: '5',
name: 'PLAVE',
rank: 5,
fpi: 1300,
members: 1,
online: 5120,
),
];
/// 내 행성이 3위인 경우(C-103 — 1위가 아니어도 내 행성이 가운데).
List<PlanetNode> mineAt(int rank) => [
for (final p in protoPlanets)
PlanetNode(
id: p.id,
name: p.name,
rank: p.rank,
fpi: p.fpi,
members: p.members,
online: p.online,
isMine: p.rank == rank,
),
];
/// 테스트 기본 글꼴(Ahem 네모) 대신 앱 글꼴로 글자 폭을 잰다.
Future<void> loadAppFonts() async {
final manifest =
json.decode(await rootBundle.loadString('FontManifest.json')) as List;
for (final font in manifest.cast<Map<String, dynamic>>()) {
final loader = FontLoader(font['family'] as String);
for (final f in (font['fonts'] as List).cast<Map<String, dynamic>>()) {
loader.addFont(rootBundle.load(Uri.decodeFull(f['asset'] as String)));
}
await loader.load();
}
}
void main() {
final out = Platform.environment['MINIMAP_OUT'];
if (out == null) return;
setUpAll(() async {
Directory(out).createSync(recursive: true);
await loadAppFonts();
});
for (final (name, planets, size) in [
('minimap-140-mine1', protoPlanets, 140.0),
('minimap-140-mine3', mineAt(3), 140.0),
('minimap-360-mine1', protoPlanets, 360.0),
// Figma 「홈」(2097:16428) 실측 박스 약 93pt — C-105 140pt 와 비교용.
('after_93', protoPlanets, 93.0),
('after_93-mine3', mineAt(3), 93.0),
]) {
testWidgets(name, (tester) async {
final key = GlobalKey();
await tester.pumpWidget(
MaterialApp(
home: Center(
child: RepaintBoundary(
key: key,
child: GalaxyMiniMap(
data: GalaxySnapshot(planets: planets, myPop: 0),
onOpen: () {},
size: size,
),
),
),
),
);
await tester.pump();
await tester.runAsync(() async {
final boundary =
key.currentContext!.findRenderObject()! as RenderRepaintBoundary;
final image = await boundary.toImage(pixelRatio: 3);
final bytes = await image.toByteData(format: ui.ImageByteFormat.png);
File('$out/$name.png').writeAsBytesSync(bytes!.buffer.asUint8List());
});
});
}
}