Files
BlockSeasons/test/state/game_session_booster_test.dart
T

66 lines
2.4 KiB
Dart

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<ProviderContainer> 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);
});
}