You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
7.0 KiB

import XCTest
@testable import Model
class VerySimpleRulesTests: XCTestCase {
var rules: VerySimpleRules!
var board: Board!
override func setUp() {
super.setUp()
rules = VerySimpleRules()
board = VerySimpleRules.createBoard()
}
override func tearDown() {
rules = nil
board = nil
super.tearDown()
}
func testCreateBoard() {
// Test que la fonction createBoard() retourne un plateau valide avec les dimensions attendues
let board = VerySimpleRules.createBoard()
XCTAssertEqual(board.nbRows, 5)
XCTAssertEqual(board.nbColumns, 5)
}
func testGetNextPlayer() {
// Teste que la fonction getNextPlayer() retourne le joueur suivant en fonction de l'historique des coups
var rules = VerySimpleRules()
rules.historic.append(Move(owner: .player1, rowOrigin: 0, columnOrigin: 0, rowDestination: 0, columnDestination: 1))
XCTAssertEqual(rules.getNextPlayer(), .player2)
rules.historic.append(Move(owner: .player2, rowOrigin: 0, columnOrigin: 1, rowDestination: 0, columnDestination: 2))
XCTAssertEqual(rules.getNextPlayer(), .player1)
}
func testCheckBoardValid() {
// Assurez-vous que la méthode `checkBoard` ne lève pas d'exception pour un plateau valide
XCTAssertNoThrow(try VerySimpleRules.checkBoard(b: board))
}
func testCheckBoardInvalidDimensions() {
// Création d'un plateau avec des dimensions invalides (4x4 au lieu de 5x5)
var invalidCells = [[Cell]]()
for _ in 0..<4 {
var rowCells = [Cell]()
for _ in 0..<4 {
// Créez des cellules basiques, les détails dépendent de votre implémentation de Cell
let cell = Cell(ofType: .jungle, ownedBy: .noOne, withPiece: nil)
rowCells.append(cell)
}
invalidCells.append(rowCells)
}
do {
let invalidBoard = try Board(withGrid: invalidCells)
XCTAssertThrowsError(try VerySimpleRules.checkBoard(b: invalidBoard)) { error in
XCTAssertTrue(error is Error)
}
} catch {
XCTFail("Unexpected error while creating the board: \(error)")
}
}
func testMoveValidation() {
// Testez un mouvement valide
let validMove = Move(owner: .player1, rowOrigin: 0, columnOrigin: 1, rowDestination: 1, columnDestination: 1)
XCTAssertTrue(rules.isMoveValid(board: board, move: validMove), "Le mouvement valide n'a pas été reconnu comme tel")
// Testez un mouvement invalide
let invalidMove = Move(owner: .player1, rowOrigin: 0, columnOrigin: 1, rowDestination: 3, columnDestination: 3)
XCTAssertFalse(rules.isMoveValid(board: board, move: invalidMove), "Le mouvement invalide a été reconnu comme valide")
}
func testGameProgression() {
// Effectuer un mouvement valide
let move = Move(owner: .player1, rowOrigin: 0, columnOrigin: 1, rowDestination: 1, columnDestination: 1)
do {
try rules.playedMove(move: move, to: &board)
} catch {
XCTFail("Le mouvement n'a pas été appliqué comme prévu: \(error)")
}
// Vérifier que l'historique des mouvements a été mis à jour
XCTAssertEqual(rules.historic.count, 1, "L'historique des mouvements n'a pas été correctement mis à jour")
// Vérifier le changement de joueur
let nextPlayer = rules.getNextPlayer()
XCTAssertEqual(nextPlayer, .player2, "Le joueur suivant n'a pas été correctement mis à jour")
}
func testGameProgressionWithInvalidMove() {
// Essayer d'effectuer un mouvement invalide
let invalidMove = Move(owner: .player1, rowOrigin: 0, columnOrigin: 1, rowDestination: 3, columnDestination: 3)
XCTAssertThrowsError(try rules.playedMove(move: invalidMove, to: &board), "Un mouvement invalide a été accepté") { error in
guard let gameError = error as? GameError else {
XCTFail("Type d'erreur inattendu")
return
}
switch gameError {
case .invalidMove:
// Succès attendu, le mouvement est invalide
break
default:
XCTFail("Erreur inattendue pour un mouvement invalide")
}
}
}
func testGameOverConditions() {
// Utiliser `isGameOver` pour vérifier l'état de fin de jeu
let (isOver, result) = rules.isGameOver(board: board, lastMove: Move(owner: .player1, rowOrigin: 0, columnOrigin: 2, rowDestination: 4, columnDestination: 2))
XCTAssertTrue(isOver, "Le jeu ne s'est pas terminé comme prévu")
// Vérifier le résultat du jeu
switch result {
case .winner(let owner, let reason):
XCTAssertEqual(owner, .player1, "Le mauvais joueur a été déclaré gagnant")
// Ajouter des assertions spécifiques pour la raison de la victoire si nécessaire
default:
XCTFail("Résultat de fin de jeu inattendu")
}
}
// Test pour obtenir une cellule spécifique du plateau
func testGetCell() {
let cell = board.getCell(atRow: 0, atColumn: 0)
XCTAssertNotNil(cell, "La cellule n'a pas été correctement récupérée")
}
// Test pour obtenir les mouvements possibles pour un joueur
func testGetMoves() {
// Supposons que le joueur 1 ait des mouvements valides depuis sa position initiale
let moves = rules.getMoves(board: board, owner: .player1)
XCTAssertFalse(moves.isEmpty, "Aucun mouvement possible trouvé pour le joueur 1")
}
// Test pour vérifier le comportement de la fonction de mouvement
func testPlayedMove() {
// Assumer un mouvement valide
let move = Move(owner: .player1, rowOrigin: 0, columnOrigin: 1, rowDestination: 1, columnDestination: 1)
XCTAssertNoThrow(try rules.playedMove(move: move, to: &board), "Le mouvement valide a provoqué une erreur")
// Vérifier l'état du plateau après le mouvement
let destinationCell = board.getCell(atRow: 1, atColumn: 1)
XCTAssertNotNil(destinationCell?.piece, "La pièce n'a pas été déplacée vers la nouvelle cellule")
XCTAssertEqual(destinationCell?.piece?.owner, .player1, "La pièce déplacée n'appartient pas au joueur 1")
}
// Test pour valider un mouvement spécifique en utilisant des coordonnées
func testIsMoveValidWithCoordinates() {
// Valider un mouvement en utilisant des coordonnées directes
XCTAssertTrue(rules.isMoveValid(board: board, row: 0, column: 1, rowArrived: 1, columnArrived: 1), "Le mouvement valide n'a pas été reconnu")
// Tester un mouvement invalide (par exemple, trop loin)
XCTAssertFalse(rules.isMoveValid(board: board, row: 0, column: 0, rowArrived: 3, columnArrived: 3), "Un mouvement invalide a été reconnu comme valide")
}
}