import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:fancake/core/data/planet_visual_state.dart'; import 'package:fancake/core/ui/live_planet.dart'; void main() { test('휴면은 FPI를 단말에서 추측하지 않고 명시적인 서버 상태만 읽는다', () { expect(PlanetVisualState.fromDocument({'fpi': 0}).isHibernating, isFalse); expect(PlanetVisualState.fromDocument({'isHibernating': 'true'}).isHibernating, isFalse); expect(PlanetVisualState.fromDocument({'isHibernating': true}).isHibernating, isTrue); }); testWidgets('서버 휴면에서 어두워지고 복귀 시 점진적으로 광량을 회복한다', (tester) async { final states = StreamController.broadcast(); addTearDown(states.close); await tester.pumpWidget(MaterialApp(home: Scaffold(body: LivePlanet25D( fandomId: 'one', watch: (_) => states.stream, image: 'assets/figma/planet-home.png', size: 200, )))); states.add(const PlanetVisualState(stage: 1, isHibernating: true)); await tester.pump(); await tester.pump(const Duration(seconds: 2)); double light() => tester.widget(find.byKey(const ValueKey('planet-surface-light'))).opacity; expect(light(), 0.35); expect(find.bySemanticsLabel('Stage 1 · 시작 · 휴면 중'), findsOneWidget); states.add(const PlanetVisualState(stage: 1)); await tester.pump(); await tester.pump(); await tester.pump(const Duration(seconds: 1)); expect(light(), greaterThan(0.35)); expect(light(), lessThan(1)); await tester.pump(const Duration(seconds: 1)); expect(light(), 1); await tester.pumpWidget(const SizedBox()); expect(states.hasListener, isFalse); }); }