MapTest.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. /**
  3. * Tests unitaires pour la classe Map
  4. */
  5. // Inclure les classes nécessaires
  6. require_once __DIR__ . '/../Models/Map.php';
  7. /**
  8. * Classe de tests simples pour la classe Map
  9. */
  10. class MapTest
  11. {
  12. private int $passed = 0;
  13. private int $failed = 0;
  14. private array $errors = [];
  15. /**
  16. * Exécute tous les tests
  17. */
  18. public function runAllTests(): void
  19. {
  20. echo "=== Tests de la classe Map ===\n\n";
  21. $this->testMapCreation();
  22. $this->testTileModification();
  23. $this->testInvalidCoordinates();
  24. $this->testStatistics();
  25. $this->testJsonSerialization();
  26. $this->testHexagonDistance();
  27. $this->testTileTypes();
  28. echo "\n=== Résultats des tests ===\n";
  29. echo "Tests réussis: {$this->passed}\n";
  30. echo "Tests échoués: {$this->failed}\n";
  31. if (!empty($this->errors)) {
  32. echo "\nErreurs:\n";
  33. foreach ($this->errors as $error) {
  34. echo "- $error\n";
  35. }
  36. }
  37. echo "\n" . ($this->failed === 0 ? "✓ Tous les tests sont passés !" : "✗ Certains tests ont échoué") . "\n";
  38. }
  39. /**
  40. * Test de création d'une carte
  41. */
  42. private function testMapCreation(): void
  43. {
  44. $map = new Map("Test Map", 3, 4);
  45. $this->assert($map->getName() === "Test Map", "Nom de la carte");
  46. $this->assert($map->getWidth() === 3, "Largeur de la carte");
  47. $this->assert($map->getHeight() === 4, "Hauteur de la carte");
  48. $tile = $map->getTile(0, 0);
  49. $this->assert($tile !== null && $tile->getType() === "empty", "Tuile par défaut");
  50. }
  51. /**
  52. * Test de modification des tuiles
  53. */
  54. private function testTileModification(): void
  55. {
  56. $map = new Map("Test", 3, 3);
  57. $tile = new Tile(['type' => 'forest', 'resources' => ['wood' => 100]]);
  58. $this->assert($map->setTile(1, 1, $tile), "Modification de tuile valide");
  59. $retrievedTile = $map->getTile(1, 1);
  60. $this->assert($retrievedTile !== null && $retrievedTile->getType() === 'forest', "Récupération de tuile modifiée");
  61. $this->assert($retrievedTile->getProperty('resources')['wood'] === 100, "Récupération des propriétés de la tuile");
  62. }
  63. /**
  64. * Test des coordonnées invalides
  65. */
  66. private function testInvalidCoordinates(): void
  67. {
  68. $map = new Map("Test", 2, 2);
  69. $this->assert(!$map->isValidCoordinate(-1, 0), "Coordonnée Q négative invalide");
  70. $this->assert(!$map->isValidCoordinate(0, -1), "Coordonnée R négative invalide");
  71. $this->assert(!$map->isValidCoordinate(2, 0), "Coordonnée Q trop grande invalide");
  72. $this->assert(!$map->isValidCoordinate(0, 2), "Coordonnée R trop grande invalide");
  73. $this->assert($map->getTile(-1, 0) === null, "Récupération de tuile avec coordonnées invalides");
  74. $this->assert(!$map->setTile(-1, 0, new Tile(['type' => 'forest'])), "Modification de tuile avec coordonnées invalides");
  75. }
  76. /**
  77. * Test des statistiques
  78. */
  79. private function testStatistics(): void
  80. {
  81. $map = new Map("Test", 2, 2);
  82. $map->setTile(0, 0, new Tile(['type' => 'castle']));
  83. $map->setTile(1, 1, new Tile(['type' => 'forest']));
  84. $stats = $map->getStatistics();
  85. $this->assert($stats['total_hexagons'] === 4, "Nombre total d'hexagones");
  86. $this->assert($stats['tile_type_counts']['castle'] === 1, "Nombre de châteaux");
  87. $this->assert($stats['tile_type_counts']['forest'] === 1, "Nombre de forêts");
  88. $this->assert($stats['empty_count'] === 2, "Nombre de cases vides");
  89. }
  90. /**
  91. * Test de sérialisation JSON
  92. */
  93. private function testJsonSerialization(): void
  94. {
  95. $map = new Map("Test JSON", 2, 2);
  96. $map->setTile(0, 0, new Tile(['type' => 'castle', 'resources' => ['gold' => 100]]));
  97. $json = $map->toJson();
  98. $data = json_decode($json, true);
  99. $this->assert($data['name'] === "Test JSON", "Nom dans JSON");
  100. $this->assert($data['width'] === 2, "Largeur dans JSON");
  101. $this->assert(count($data['hexagons']) === 4, "Nombre d'hexagones dans JSON");
  102. $this->assert($data['hexagons'][0]['tile']['type'] === 'castle', "Type de tuile dans JSON");
  103. $this->assert($data['hexagons'][0]['tile']['resources']['gold'] === 100, "Propriétés de tuile dans JSON");
  104. // Test de désérialisation
  105. $loadedMap = Map::fromArray($data);
  106. $this->assert($loadedMap !== null, "Chargement depuis tableau");
  107. $loadedTile = $loadedMap->getTile(0, 0);
  108. $this->assert($loadedTile !== null && $loadedTile->getType() === "castle", "Tuile après chargement");
  109. $this->assert($loadedTile->getProperty('resources')['gold'] === 100, "Propriétés après chargement");
  110. }
  111. /**
  112. * Test du calcul de distance entre hexagones
  113. */
  114. private function testHexagonDistance(): void
  115. {
  116. $hex1 = new Hexagon(0, 0);
  117. $hex2 = new Hexagon(1, 1);
  118. $hex3 = new Hexagon(0, 0);
  119. $this->assert($hex1->distanceTo($hex2) === 2, "Distance entre (0,0) et (1,1)");
  120. $this->assert($hex1->distanceTo($hex3) === 0, "Distance entre hexagones identiques");
  121. }
  122. /**
  123. * Test des types de tuiles
  124. */
  125. private function testTileTypes(): void
  126. {
  127. $map = new Map("Test", 1, 1);
  128. // Tester quelques types valides
  129. $validTypes = ['empty', 'castle', 'forest', 'river', 'road'];
  130. foreach ($validTypes as $type) {
  131. $tile = new Tile(['type' => $type]);
  132. $this->assert($map->setTile(0, 0, $tile), "Type valide: $type");
  133. $retrievedTile = $map->getTile(0, 0);
  134. $this->assert($retrievedTile !== null && $retrievedTile->getType() === $type, "Récupération du type: $type");
  135. }
  136. }
  137. /**
  138. * Méthode d'assertion simple
  139. */
  140. private function assert(bool $condition, string $description): void
  141. {
  142. if ($condition) {
  143. $this->passed++;
  144. echo "✓ $description\n";
  145. } else {
  146. $this->failed++;
  147. $this->errors[] = $description;
  148. echo "✗ $description\n";
  149. }
  150. }
  151. }
  152. // Exécuter les tests si le fichier est appelé directement
  153. if (basename(__FILE__) === basename($_SERVER['PHP_SELF'] ?? '')) {
  154. $test = new MapTest();
  155. $test->runAllTests();
  156. }