// ignore_for_file: cascade_invocations import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pinball/game/behaviors/camera_focusing_behavior.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; import '../../helpers/helpers.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); group( 'CameraFocusingBehavior', () { final flameTester = FlameTester( EmptyPinballTestGame.new, ); test('can be instantiated', () { expect( CameraFocusingBehavior(), isA(), ); }); flameTester.test('loads', (game) async { final behavior = CameraFocusingBehavior(); await game.ensureAdd(behavior); expect(game.contains(behavior), isTrue); }); flameTester.test( 'changes focus when loaded', (game) async { final behavior = CameraFocusingBehavior(); final previousZoom = game.camera.zoom; expect(game.camera.follow, isNull); await game.ensureAdd(behavior); expect(game.camera.follow, isNotNull); expect(game.camera.zoom, isNot(equals(previousZoom))); }, ); flameTester.test( 'listenWhen only listens when status changes', (game) async { final behavior = CameraFocusingBehavior(); const waiting = GameState.initial(); final playing = const GameState.initial().copyWith(status: GameStatus.playing); final gameOver = const GameState.initial().copyWith(status: GameStatus.gameOver); expect(behavior.listenWhen(waiting, waiting), isFalse); expect(behavior.listenWhen(waiting, playing), isTrue); expect(behavior.listenWhen(waiting, gameOver), isTrue); expect(behavior.listenWhen(playing, playing), isFalse); expect(behavior.listenWhen(playing, waiting), isTrue); expect(behavior.listenWhen(playing, gameOver), isTrue); expect(behavior.listenWhen(gameOver, gameOver), isFalse); expect(behavior.listenWhen(gameOver, waiting), isTrue); expect(behavior.listenWhen(gameOver, playing), isTrue); }, ); group('onNewState', () { flameTester.test( 'zooms when started playing', (game) async { final playing = const GameState.initial().copyWith(status: GameStatus.playing); final behavior = CameraFocusingBehavior(); await game.ensureAdd(behavior); behavior.onNewState(playing); final previousPosition = game.camera.position.clone(); await game.ready(); final zoom = behavior.children.whereType().single; game.update(zoom.controller.duration!); game.update(0); expect(zoom.controller.completed, isTrue); expect( game.camera.position, isNot(equals(previousPosition)), ); }, ); flameTester.test( 'zooms when game is over', (game) async { final playing = const GameState.initial().copyWith( status: GameStatus.gameOver, ); final behavior = CameraFocusingBehavior(); await game.ensureAdd(behavior); behavior.onNewState(playing); final previousPosition = game.camera.position.clone(); await game.ready(); final zoom = behavior.children.whereType().single; game.update(zoom.controller.duration!); game.update(0); expect(zoom.controller.completed, isTrue); expect( game.camera.position, isNot(equals(previousPosition)), ); }, ); }); }, ); }