//__________.__       .__    .__               ___________             __
//\_   _____|__| ____ |  |__ |__| ___________  \__    _______   ______/  |_
// |    __) |  _/ ___\|  |  \|  _/ __ \_  __ \   |    |_/ __ \ /  ___\   __\
// |     \  |  \  \___|   Y  |  \  ___/|  | \/   |    |\  ___/ \___ \ |  |
// \___  /  |__|\___  |___|  |__|\___  |__|      |____| \___  /____  >|__|
//     \/           \/     \/        \/                     \/     \/
package Tests;

import Entity.*;
import Enum.CapaciteSpeciale;
import Enum.TypeMechant;

import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;
class Test {
//___________             __     ____
//\__    _______   ______/  |_  /_   |
//  |    |_/ __ \ /  ___\   __\  |   |
//  |    |\  ___/ \___ \ |  |    |   |
//  |____| \___  /____  >|__|    |___|
//             \/     \/
    @org.junit.jupiter.api.Test
    // Ce test s'assure que lorsque le gentil attaque il est en capacité de tuer le méchant
    public final void testAttaqueTue() {
        // Création d'un gentil
        Gentil gentil = new Gentil('*', 50, 7, 50, "Thomas", CapaciteSpeciale.ONE_SHOT);
        // Création d'un méchant
        Mechant mechant = new Mechant( '!', "Sbire", TypeMechant.GANGSTER);
        // Le gentil attaque le méchant
        gentil.attaquer(mechant);
        if(mechant.getIsAlive()){
            // Si le méchant est en vie alors le test est raté
            fail("\n ///////// \ntestAttaqueTue raté\n ///////// \n");
        }else{
            // Si le méchant n'est plus en vie alors le test est réussi
            System.out.println("\n /////////\ntestAttaqueTue réussi \n ///////// \n");
        }
    }
//___________             __    ________
//\__    _______   ______/  |_  \_____  \
//  |    |_/ __ \ /  ___\   __\  /  ____/
//  |    |\  ___/ \___ \ |  |   /       \
//  |____| \___  /____  >|__|   \_______ \
//             \/     \/                \/
    @org.junit.jupiter.api.Test
    // Ce test vérifie ce qu'il se passe si le gentil meurt avant d'arriver à la fin de la carte
    public final void testGentilMeurtAvantFin(){
        Context context = new Context();
        // Création d'une carte
        Carte carte = new Carte("Désert", "Gobie", 0, 4, 5);
        // Création du gentil
        Gentil gentil = new Gentil('*', 1, 1, 10, "Thomas", CapaciteSpeciale.ONE_SHOT);
        // Création des méchants
        Mechant catcheur = new Mechant('!', "Catcheur", TypeMechant.CATCHEUR);
        Mechant brute = new Mechant('!', "Brute", TypeMechant.BRUTE);
        Mechant tireur = new Mechant('!', "Tireur", TypeMechant.TIREUR);
        Mechant gangster = new Mechant('!', "Gangster", TypeMechant.GANGSTER);
        Mechant boss = new Mechant('$', "Boss", TypeMechant.BOSS);
        // Création d'une liste ou on stocke les diférents méchants
        List<Mechant> listeMechant = new ArrayList<Mechant>();
        listeMechant.add(catcheur);
        listeMechant.add(brute);
        listeMechant.add(tireur);
        listeMechant.add(gangster);
        listeMechant.add(boss);
        // Création d'un tableau qui représente la map de jeu
        Personnage[] tableau = new Personnage[7];
        tableau[0] = gentil;
        tableau[1] = catcheur;
        tableau[2] = brute;
        tableau[3] = tireur;
        tableau[4] = gangster;
        tableau[5] = boss;
        tableau[6] = null;
        // Création du jeu avec les éléments définis au dessus
        Jeu jeu = new Jeu(carte, gentil, listeMechant, tableau);
        while(gentil.getIsAlive()){
            // Lancement automatique de tour tant que le gentil est en vie
            context.LancementTourAutomatique(tableau, gentil, context);
            if (tableau[tableau.length - 1] == gentil) {
                // Si le gentil arrive à la fin de la map sans être mort alors le test est raté
                fail("\n ///////// \ntestGentilMeurtAvantFin raté\n ///////// \n");
            }else{
                // Si le gentil meurt avant la fin de la map alors le test est réussi
                System.out.println("\n ///////// \ntestGentilMeurtAvantFin réussi\n ///////// \n");
            }
        }
    }
//___________             __    ________
//\__    _______   ______/  |_  \_____  \
//  |    |_/ __ \ /  ___\   __\   _(__  <
//  |    |\  ___/ \___ \ |  |    /       \
//  |____| \___  /____  >|__|   /______  /
//             \/     \/               \/
    @org.junit.jupiter.api.Test
    // Ce test s'assure que le gentil avance sur la case suivante si il n'y a pas de méchant dessus
    public final void testGentilAvanceCaseVide(){
        Context context = new Context();
        // Création de la carte
        Carte carte = new Carte("Désert", "Gobie", 0, 4, 5);
        // Création du gentil
        Gentil gentil = new Gentil('*', 1, 1, 10, "Thomas", CapaciteSpeciale.ONE_SHOT);
        // Création d'un tableau qui représente la map de jeu
        Personnage[] tableau = new Personnage[7];
        tableau[0] = gentil;
        // Lancement automatique de tour tant que le gentil est en vie
        context.LancementTourAutomatique(tableau, gentil, context);
        if (tableau[1] != gentil) {
            // Si après 1 tour la case 1 du tableau n'est pas le gentil alors le test est raté
            fail("\n ///////// \ntestGentilAvanceCaseVide raté\n ///////// \n");
        }else{
            // Si après 1 tour la case 1 du tableau est le gentil alors le test est réussi
            System.out.println("\n ///////// \ntestGentilAvanceCaseVide réussi\n ///////// \n");
        }
    }
//___________             __       _____
//\__    _______   ______/  |_    /  |  |
//  |    |_/ __ \ /  ___\   __\  /   |  |_
//  |    |\  ___/ \___ \ |  |   /    ^   /
//  |____| \___  /____  >|__|   \____   |
//             \/     \/             |__|
    @org.junit.jupiter.api.Test
    // Ce test s'assure que si le gentil arrive à la fin de la map il gagne
    public final void testVictoireGentil(){
        Context context = new Context();
        // Création de la carte
        Carte carte = new Carte("Désert", "Gobie", 0, 4, 5);
        // Création du gentil
        Gentil gentil = new Gentil('*', 1, 1, 10, "Thomas", CapaciteSpeciale.ONE_SHOT);
        // Création d'un tableau qui représente la map de jeu
        Personnage[] tableau = new Personnage[7];
        tableau[0] = gentil;
        while(gentil.getIsAlive()){
            // Lancement automatique du tour tant que le gentil est en vie
            context.LancementTourAutomatique(tableau, gentil, context);
            if (tableau[tableau.length - 1] == gentil) {
                // Si la dernière case du tableau est égale au gentil alors le test est réussi
                System.out.println("\n ///////// \ntestVictoireGentil réussi\n ///////// \n");
                break;
            }
        }
        if(!gentil.getIsAlive()){
            // Si le gentil meurt avant d'arriver à la fin du tableau alors le test est raté
            fail("\n ///////// \ntestVictoireGentil raté\n ///////// \n");
        }

    }
//___________             __     .________
//\__    _______   ______/  |_   |   ____/
//  |    |_/ __ \ /  ___\   __\  |____  \
//  |    |\  ___/ \___ \ |  |    /       \
//  |____| \___  /____  >|__|   /______  /
//             \/     \/               \/
    @org.junit.jupiter.api.Test
    // Ce test s'assure que le gentil ne peut utiliser sa capacité spéciale qu'une seule fois
    public final void testCapaciteSpecialeUneFois(){
        Context context = new Context();
        // Création d'un gentil
        Gentil gentil = new Gentil('*', 1, 1, 10, "Thomas", CapaciteSpeciale.TREMPETTE);
        // Création d'un méchant
        Mechant boss = new Mechant('$', "Boss", TypeMechant.BOSS);
        // Utilisation de la capacité spéciale du gentil sur le méchant
        gentil.utiliserPouvoir(boss);
        if (gentil.getCapaciteSpeciale() != null){
            // Si la capacité spéciale du gentil n'est pas égale à "null" alors le test est raté
            fail("\n ///////// \ntestCapaciteSpecialeUneFois raté\n ///////// \n");
        }else{
            // Si la capacité spéciale du gentil est égale à "null" alors le test est réussi
            System.out.println("\n ///////// \ntestCapaciteSpecialeUneFois réussi\n ///////// \n");
        }
    }
}