package fr.univamu.progav.td5;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;
class WarriorTest {

  @Test
  void newWarrior() {
    Warrior warrior = new Warrior();
    assertEquals(30,warrior.getHealth());
    warrior.reduceHealth(8);
    assertEquals(22,warrior.getHealth());
    warrior.setHealth(25);
    assertEquals(25,warrior.getHealth());
  }

  @Test
  void attack() {
    Warrior warrior = new Warrior();
    Blow b = warrior.attack();
    assertEquals(3,b.physicalDamage());
    assertEquals(0,b.magicalDamage());
  }

  @Test
  void defend() {
    Warrior warrior = new Warrior();
    warrior.defend(new Blow(10,2));
    assertEquals(23,warrior.getHealth());
    warrior.defend(new Blow(1,5));
    assertEquals(18,warrior.getHealth());
  }

  @Test
  void specialAction() {
    Warrior warrior = new Warrior();
    warrior.specialAction();
    Blow b  = warrior.attack();
    assertEquals(6,b.physicalDamage());
    assertEquals(0,b.magicalDamage());
    b  = warrior.attack();
    b  = warrior.attack();
    assertEquals(6,b.physicalDamage());
    assertEquals(0,b.magicalDamage());
    b  = warrior.attack();
    assertEquals(3,b.physicalDamage());
    assertEquals(0,b.magicalDamage());
  }

  @Test
  void getRage() {
    Warrior warrior = new Warrior();
    assertEquals(0,warrior.getRage());
    warrior.specialAction();
    assertEquals(3,warrior.getRage());
    warrior.attack();
    assertEquals(2,warrior.getRage());
    warrior.specialAction();
    assertEquals(3,warrior.getRage());
  }

  @Test
  void defendIncreaseRage() {
    Warrior warrior = new Warrior();
    warrior.defend(new Blow(4,4));
    assertEquals(0,warrior.getRage(), "Warrior does not enter rage by receiving a blow");
    warrior.specialAction();
    warrior.defend(new Blow(0,5));
    assertEquals(4,warrior.getRage(), "Increase rage when 5 health lost");
    warrior.defend(new Blow(0,4));
    assertEquals(4,warrior.getRage(), "Do not increase rage when <5 health lost");
    warrior.defend(new Blow(6,0));
    assertEquals(4,warrior.getRage(),"Do not increase rage when <5 health lost");
  }
}