import 'package:block_seasons/data/save_repository.dart'; import 'package:block_seasons/game/engine/piece_generator.dart'; import 'package:block_seasons/core/rng.dart'; import 'package:block_seasons/game/models/booster.dart'; import 'package:block_seasons/game/models/stage.dart'; import 'package:block_seasons/state/game_session_notifier.dart'; import 'package:block_seasons/state/providers.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:shared_preferences/shared_preferences.dart'; StageConfig _stage() => StageConfig.fromJson({ 'id': 'gs_b', 'seed': 1, 'moveLimit': 20, 'preset': [ {'x': 0, 'y': 0, 't': 'filled', 'c': 3}, ], 'objectives': [ {'type': 'reachScore', 'target': 100000}, ], 'stars': { 'two': {'movesLeft': 5}, 'three': {'movesLeft': 10}, }, }); void main() { TestWidgetsFlutterBinding.ensureInitialized(); Future container() async { SharedPreferences.setMockInitialValues({}); final repo = SaveRepository(await SharedPreferences.getInstance()); final c = ProviderContainer( overrides: [saveRepositoryProvider.overrideWithValue(repo)], ); c.read(gameSessionProvider.notifier) .startStage(_stage(), generator: PieceGenerator(SeededRng(1))); return c; } test('hammer consumes a booster only when one is owned and target valid', () async { final c = await container(); final session = c.read(gameSessionProvider.notifier); final inv = c.read(boosterInventoryProvider.notifier); // No booster -> noBooster, grid unchanged. expect(await session.useHammer(0, 0), BoosterUseResult.noBooster); await inv.grant(BoosterType.hammer, 1); expect(await session.useHammer(0, 0), BoosterUseResult.success); expect(c.read(boosterInventoryProvider)[BoosterType.hammer], 0); expect(c.read(gameSessionProvider)!.grid.isOccupied(0, 0), isFalse); }); test('an invalid target keeps the booster', () async { final c = await container(); final session = c.read(gameSessionProvider.notifier); await c.read(boosterInventoryProvider.notifier).grant(BoosterType.hammer, 1); expect(await session.useHammer(5, 5), BoosterUseResult.invalidTarget); expect(c.read(boosterInventoryProvider)[BoosterType.hammer], 1); }); }