#ifdef TESTS_BUILD
#include "../../extern/doctest.hpp"
#include "../../src/Battling/Library/DamageLibrary.hpp"
#include "../../src/Battling/Pokemon/CreatePokemon.hpp"
#include "../TestLibrary/TestLibrary.hpp"

using namespace PkmnLib::Battling;

TEST_CASE("Correct rounding for damage.") {
    auto lib = TestLibrary::GetLibrary();
    auto mon1 = ArbUt::ScopedPtr(CreatePokemon(lib, "testCharizard"_cnc, 100)
                                     .WithIndividualValues(31, 31, 31, 31, 31, 31)
                                     .WithEffortValues(0, 0, 0, 0, 0, 0)
                                     .WithNature("neutralNature"_cnc)
                                     .WithGender(CreatureLib::Library::Gender::Male)
                                     .IsAllowedExperienceGain(false)
                                     .Build());
    auto mon2 = ArbUt::ScopedPtr(CreatePokemon(lib, "testVenusaur"_cnc, 100)
                                     .WithIndividualValues(31, 31, 31, 31, 31, 31)
                                     .WithEffortValues(0, 0, 0, 0, 0, 0)
                                     .WithNature("neutralNature"_cnc)
                                     .WithGender(CreatureLib::Library::Gender::Male)
                                     .IsAllowedExperienceGain(false)
                                     .Build());

    auto move = PkmnLib::Library::MoveData("test", 0, PkmnLib::Library::MoveCategory::Physical, 55, 100, 10,
                                           CreatureLib::Library::AttackTarget::All, 0, nullptr, {});

    auto attack = PkmnLib::Battling::LearnedMove(&move, CreatureLib::Battling::AttackLearnMethod::Unknown);

    auto executingAttack =
        CreatureLib::Battling::ExecutingAttack({mon2.GetValue()}, 1, mon1.GetValue(), &attack, &move, nullptr);

    auto hit = executingAttack.GetHitData(mon2.GetValue(), 0);
    hit.SetBasePower(55);
    hit.SetEffectiveness(2.0f);
    hit.SetCritical(0);

    auto damage = lib->GetDamageLibrary()->GetDamage(&executingAttack, mon2, 0, hit);
    REQUIRE_EQ(144, damage);

    hit.SetBasePower(110);
    damage = lib->GetDamageLibrary()->GetDamage(&executingAttack, mon2, 0, hit);
    REQUIRE_EQ(284, damage);
}

#endif