139 lines
3.8 KiB
Dart
139 lines
3.8 KiB
Dart
|
import 'package:bubbletwist/enums/stone_color.dart';
|
||
|
import 'package:bubbletwist/game/board.dart';
|
||
|
import 'package:bubbletwist/game/game.dart';
|
||
|
import 'package:bubbletwist/game/i_game_consumer.dart';
|
||
|
import 'package:bubbletwist/game/stone/stone.dart';
|
||
|
import 'package:bubbletwist/game/stone/stone_location.dart';
|
||
|
import 'package:test/test.dart';
|
||
|
|
||
|
void main() {
|
||
|
group('Game Tests', () {
|
||
|
late Game game;
|
||
|
late MockGameConsumer mockGameConsumer;
|
||
|
|
||
|
setUp(() {
|
||
|
mockGameConsumer = MockGameConsumer();
|
||
|
game = Game(mockGameConsumer);
|
||
|
});
|
||
|
|
||
|
tearDown(() {
|
||
|
game.stop(); // Ensure game is stopped after each test
|
||
|
});
|
||
|
|
||
|
test('Initial points should be 0', () {
|
||
|
expect(game.getPoints(), 0);
|
||
|
});
|
||
|
|
||
|
test('Initial time should be equal to startTime', () {
|
||
|
expect(game.getTimeInSeconds(), game.startTime);
|
||
|
});
|
||
|
|
||
|
test('Start method should start the game', () {
|
||
|
game.start();
|
||
|
expect(game.isRunning(), isTrue);
|
||
|
});
|
||
|
|
||
|
test('Stop method should stop the game', () {
|
||
|
game.start();
|
||
|
game.stop();
|
||
|
expect(game.isRunning(), isFalse);
|
||
|
});
|
||
|
|
||
|
test('AddPoints should update points if game is running', () {
|
||
|
game.start();
|
||
|
game.addPoints(10);
|
||
|
expect(game.getPoints(), 10);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
group('Board Tests', () {
|
||
|
late Game game;
|
||
|
late Board board;
|
||
|
|
||
|
setUp(() {
|
||
|
game = Game(MockGameConsumer());
|
||
|
board = Board(game);
|
||
|
});
|
||
|
|
||
|
tearDown(() {
|
||
|
game.stop(); // Ensure game is stopped after each test
|
||
|
});
|
||
|
|
||
|
test('Swap stones should correctly swap positions', () {
|
||
|
// Arrange
|
||
|
// Arrange: Create a board with a match
|
||
|
board.stones[0][0]!.setColor(StoneColors.red);
|
||
|
board.stones[0][1]!.setColor(StoneColors.red);
|
||
|
board.stones[0][2]!.setColor(StoneColors.green);
|
||
|
board.stones[1][2]!.setColor(StoneColors.red);
|
||
|
StoneLocation sl1 = StoneLocation(row: 0, column: 2);
|
||
|
StoneLocation sl2 = StoneLocation(row: 1, column: 2);
|
||
|
Stone? originalStone1 = board.getStone(sl1);
|
||
|
Stone? originalStone2 = board.getStone(sl2);
|
||
|
|
||
|
// Act
|
||
|
board.swap(sl1, sl2);
|
||
|
|
||
|
// Assert
|
||
|
expect(board.getStone(sl1), originalStone2);
|
||
|
expect(board.getStone(sl2), originalStone1);
|
||
|
});
|
||
|
|
||
|
test('CheckBoard should detect and remove matches vertically', () {
|
||
|
// Arrange: Create a board with a match
|
||
|
board.stones[0][0]!.setColor(StoneColors.red);
|
||
|
board.stones[0][1]!.setColor(StoneColors.red);
|
||
|
board.stones[0][2]!.setColor(StoneColors.red);
|
||
|
|
||
|
// Act
|
||
|
bool boardChanged = board.checkBoard();
|
||
|
|
||
|
// Assert
|
||
|
expect(boardChanged, isTrue);
|
||
|
});
|
||
|
|
||
|
test('CheckBoard should detect and remove matches horizontally', () {
|
||
|
// Arrange: Create a board with a match
|
||
|
board.stones[0][0]!.setColor(StoneColors.red);
|
||
|
board.stones[1][0]!.setColor(StoneColors.red);
|
||
|
board.stones[2][0]!.setColor(StoneColors.red);
|
||
|
|
||
|
// Act
|
||
|
bool boardChanged = board.checkBoard();
|
||
|
|
||
|
// Assert
|
||
|
expect(boardChanged, isTrue);
|
||
|
});
|
||
|
|
||
|
test('ApplyGravity should move stones down and refill', () {
|
||
|
// Arrange: Create a board with some empty spaces
|
||
|
board.stones[0][0] = null;
|
||
|
board.stones[1][0] = null;
|
||
|
|
||
|
// Act
|
||
|
board.applyGravity();
|
||
|
|
||
|
// Assert
|
||
|
// Verify that stones have fallen down and all empty spaces are filled
|
||
|
expect(board.getStone(StoneLocation(row: 0, column: 0)), isNotNull);
|
||
|
expect(board.getStone(StoneLocation(row: 1, column: 0)), isNotNull);
|
||
|
expect(board.getStone(StoneLocation(row: 2, column: 0)), isNotNull);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Mock class for IGameConsumer
|
||
|
class MockGameConsumer implements IGameConsumer {
|
||
|
@override
|
||
|
void gameStopped() {}
|
||
|
|
||
|
@override
|
||
|
void updatePoints() {}
|
||
|
|
||
|
@override
|
||
|
void updateStones() {}
|
||
|
|
||
|
@override
|
||
|
void updateTime() {}
|
||
|
}
|