From 475cb81212b816f76e7cfa4e3b1896445e798b57 Mon Sep 17 00:00:00 2001 From: Tainix Date: Thu, 8 Feb 2024 21:43:43 +0100 Subject: [PATCH] =?UTF-8?q?R=C3=A9solution=20et=20tests=20unitaire=20du=20?= =?UTF-8?q?challenge=20MONSTERS=5F3=20avec=20les=20Collections?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 4 objets créés : - FoodType (enum) - Monster - MonstersLines - MonstersLinesWC (Without Collection) Tests unitaires réalisés avec Pest + readme + composer.json pour intégrer le package collections --- README.md | 2 + challenges/MONSTERS_3/FoodType.php | 12 ++++ challenges/MONSTERS_3/Monster.php | 23 +++++++ challenges/MONSTERS_3/MonstersLines.php | 41 +++++++++++++ challenges/MONSTERS_3/MonstersLinesWC.php | 74 +++++++++++++++++++++++ composer.json | 11 +++- pest/MONSTERS_3/MonsterLines_Test.php | 58 ++++++++++++++++++ pest/MONSTERS_3/Monsters_3Test.php | 16 +++++ 8 files changed, 235 insertions(+), 2 deletions(-) create mode 100644 challenges/MONSTERS_3/FoodType.php create mode 100644 challenges/MONSTERS_3/Monster.php create mode 100644 challenges/MONSTERS_3/MonstersLines.php create mode 100644 challenges/MONSTERS_3/MonstersLinesWC.php create mode 100644 pest/MONSTERS_3/MonsterLines_Test.php create mode 100644 pest/MONSTERS_3/Monsters_3Test.php diff --git a/README.md b/README.md index b9cc2c8..e68bd39 100644 --- a/README.md +++ b/README.md @@ -25,5 +25,7 @@ Corrigés des challenges, avec tests unitaires réalisés avec PHPUnit ou Pest P [Design Pattern en PHP : Strategy](https://tainix.fr/code/POO-en-PHP-design-Pattern-Strategy). +[Utilisation des Collections sur des objets](https://tainix.fr/code/PHP-Utiliser-les-Collections-sur-des-objets). + ### Autres [Interface ou héritage avec méthode abstraite ?](https://tainix.fr/code/POO-interfaces-ou-methodes-abstraites). \ No newline at end of file diff --git a/challenges/MONSTERS_3/FoodType.php b/challenges/MONSTERS_3/FoodType.php new file mode 100644 index 0000000..9b22e98 --- /dev/null +++ b/challenges/MONSTERS_3/FoodType.php @@ -0,0 +1,12 @@ +monsters[] = Monster::createFromText($informations); + } + + public function getMonstersFromFoodType(FoodType $foodType, int $number = 3): string + { + // Gestion du tri, par défaut, dans l'ordre croissant, décroissant pour ROCK et WOOD + $sort = 'sortBy'; + if ($foodType === FoodType::ROCK || $foodType === FoodType::WOOD) { + $sort = 'sortByDesc'; + } + + return collect($this->monsters) + ->filter(function(Monster $item) use ($foodType) { + return $item->foodType === $foodType; + }) + ->$sort('weight') + ->slice(0, $number) + ->implode('name', '-'); + } + + public function getAllFirstThree(): string + { + return collect(FoodType::cases()) + ->map( fn(FoodType $foodType) => $this->getMonstersFromFoodType($foodType, 3) ) + ->implode('-'); + } +} \ No newline at end of file diff --git a/challenges/MONSTERS_3/MonstersLinesWC.php b/challenges/MONSTERS_3/MonstersLinesWC.php new file mode 100644 index 0000000..e131f6d --- /dev/null +++ b/challenges/MONSTERS_3/MonstersLinesWC.php @@ -0,0 +1,74 @@ +monsters[] = Monster::createFromText($informations); + } + + public function getMonstersFromFoodType(FoodType $foodType, int $nbMonsters = 3): string + { + // 1. Initialisation d'un tableau vide + $monsters = []; + + // 2. Je filtre en selon le type de nourriture + foreach ($this->monsters as $monster) { + if ($monster->foodType === $foodType) { + $monsters[] = $monster; + } + } + + // 3. Je trie dans un sens ou dans l'autre, selon le type de nourriture + // grâce à la fonction usort, en comparant les poids + if ($foodType === FoodType::FRUITS || $foodType === FoodType::GRASS) { + usort($monsters, function (Monster $m1, Monster $m2) { + return $m1->weight <=> $m2->weight; + }); + } else { + // Sens inverse + usort($monsters, function (Monster $m1, Monster $m2) { + return $m2->weight <=> $m1->weight; + }); + } + + // 4. Je garde les N premiers monstres + $monsters = array_slice($monsters, 0, $nbMonsters); + + // 5. J'extraie les noms des monstres + $names = array_column($monsters, 'name'); + + // 6. Je lie les noms avec un "-" + return implode('-', $names); + } + + public function getAllFirstThree(): string + { + // 0. Je précise l'ordre attendu + $foodTypes = [ + FoodType::FRUITS, + FoodType::GRASS, + FoodType::ROCK, + FoodType::WOOD + ]; + + // 0. J'initialise un tableau vide en vue de mon implode final + $result = []; + + // 1. Je parcours chaque type pour récupérer les 3 premiers monstres + foreach ($foodTypes as $foodType) { + $result[] = $this->getMonstersFromFoodType($foodType, 3); + } + + // 2. Je lie les éléments avec un "-" + return implode('-', $result); + } +} \ No newline at end of file diff --git a/composer.json b/composer.json index 96da4a9..f19bf0d 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,8 @@ "php": ">=7.4", "pestphp/pest": "1.*", "guzzlehttp/guzzle": "^7.0", - "vlucas/phpdotenv": "^5.4" + "vlucas/phpdotenv": "^5.4", + "illuminate/collections": "^10.43" }, "require-dev": { "phpstan/phpstan": "^1.4" @@ -22,7 +23,13 @@ "autoload": { "psr-4" : { "Challenges\\" : "challenges/", - "Tainix\\" : "tainix/" + "Tainix\\" : "tainix/", + "Pest\\" : "pest/" + } + }, + "config": { + "allow-plugins": { + "pestphp/pest-plugin": true } } } diff --git a/pest/MONSTERS_3/MonsterLines_Test.php b/pest/MONSTERS_3/MonsterLines_Test.php new file mode 100644 index 0000000..9f82544 --- /dev/null +++ b/pest/MONSTERS_3/MonsterLines_Test.php @@ -0,0 +1,58 @@ +addMonsterFromText($monsterInformations); + } + + expect($monsterLine->getMonstersFromFoodType(FoodType::FRUITS, 3))->toBe('Drex29-Brux61-Brux18'); +})->with([ + [MonstersLinesWC::class], + [MonstersLines::class] +]); + + +test('Tri des monstres ROCK', function(string $className) { + + $monsters = ['Drex29:R:16', 'Traz65:W:74', 'Blit86:R:27', 'Brux18:F:83', 'Cobi82:R:72', 'Brux61:F:56', 'Draz68:G:97']; + + $monsterLine = new $className; + + foreach ($monsters as $monsterInformations) { + $monsterLine->addMonsterFromText($monsterInformations); + } + + expect($monsterLine->getMonstersFromFoodType(FoodType::ROCK, 3))->toBe('Cobi82-Blit86-Drex29'); +})->with([ + [MonstersLinesWC::class], + [MonstersLines::class] +]); + +test('Jeu de données complet', function (string $className) { + + // Données issues de Tainix directement -------- + $monsters = ['Zela56:W:49', 'Fluz56:W:40', 'Cobi12:R:63', 'Truz57:F:69', 'Chir23:F:18', 'Moxa15:R:33', 'Vrip15:W:55', 'Moxa72:W:54', 'Trex43:W:23', 'Spro49:R:75', 'Spro80:G:36', 'Brop35:W:60', 'Draz89:R:15', 'Flix26:F:97', 'Plor65:F:21', 'Fero70:G:51', 'Gloz30:R:59', 'Flix61:G:24', 'Vlaz59:R:90', 'Drin34:R:64', 'Chir96:R:99', 'Moxa73:W:50', 'Zorp31:F:74', 'Fluz86:W:12', 'Vlox73:G:34']; + $result = 'Chir23-Plor65-Truz57-Flix61-Vlox73-Spro80-Chir96-Vlaz59-Spro49-Brop35-Vrip15-Moxa72'; + // --------------------------------------------- + + $monsterLine = new $className; + + foreach ($monsters as $monsterInformations) { + $monsterLine->addMonsterFromText($monsterInformations); + } + + expect($monsterLine->getAllFirstThree())->toBe($result); +})->with([ + [MonstersLinesWC::class], + [MonstersLines::class] +]); \ No newline at end of file diff --git a/pest/MONSTERS_3/Monsters_3Test.php b/pest/MONSTERS_3/Monsters_3Test.php new file mode 100644 index 0000000..b462d22 --- /dev/null +++ b/pest/MONSTERS_3/Monsters_3Test.php @@ -0,0 +1,16 @@ +name)->toBe('Luxo18'); + expect($monster->foodType)->toBe(FoodType::FRUITS); + expect($monster->weight)->toBe(33); +}); \ No newline at end of file