void ProximityMating::updateOrganismsToMateWithList(id_t mateId, double mateFitness, std::string mateGenome, std::string mateMind)
{
    for (int i = 0; i < organismsToMateWith.size(); i++)
    {
        if (organismsToMateWith[i].getId() == mateId)
        {
            organismsToMateWith[i].setFitness(mateFitness);
            return;
        }
    }

    Organism newMate = Organism(mateGenome, mateMind, mateId, mateFitness, 0, 0, std::vector<id_t>(), Organism::ADULT, true);
    organismsToMateWith.push_back(newMate);

    storeMatingLocation(to_string(mateId), to_string(worldModel.position.x)+" "+to_string(worldModel.position.y));
}
void EvolverController::birthMessage(std::string message, double currentTime) {
    id_t parent1 = std::atoi(MessagesManager::get(message, "PARENT1").c_str());
    id_t parent2 = std::atoi(MessagesManager::get(message, "PARENT2").c_str());
    id_t organismId = std::atoi(MessagesManager::get(message, "ORGANISM_ID").c_str());
    unsigned int size = std::atoi(MessagesManager::get(message, "SIZE").c_str());
    std::string genome = MessagesManager::get(message, "GENOME");
    std::string mind = MessagesManager::get(message, "MIND");
    
    if(parent1 > 0){
        int index = searchForOrganism(parent1);
        if (index >= 0)
        {
            organismsList[index].setOffspring(organismsList[index].getOffspring()+1);
        }
        else
        {
            std::string event = " ORGANISM_BUILT_MESSAGE (parent1)";
            std::string fields = " PARENT1: " + std::to_string(parent1) + "\n" +
            " PARENT2: " + std::to_string(parent2) + "\n" +
            " ORGANISM_ID: " + std::to_string(organismId) + "\n" +
            " SIZE: " + std::to_string(size) + "\n" +
            " GENOME: " + genome + "\n" +
            " MIND: " + mind + "\n";
            logListProblem(event, message, fields);
        }
    }
    
    if(parent2 > 0){
        int index = searchForOrganism(parent2);
        if (index >= 0)
        {
            organismsList[index].setOffspring(organismsList[index].getOffspring()+1);
        }
        else
        {
            std::string event = " ORGANISM_BUILT_MESSAGE (parent2)";
            std::string fields = " PARENT1: " + std::to_string(parent1) + "\n" +
            " PARENT2: " + std::to_string(parent2) + "\n" +
            " ORGANISM_ID: " + std::to_string(organismId) + "\n" +
            " SIZE: " + std::to_string(size) + "\n" +
            " GENOME: " + genome + "\n" +
            " MIND: " + mind + "\n";
            logListProblem(event, message, fields);
        }
        
    }
    
    std::vector<id_t> parents;
    parents.push_back(parent1);
    parents.push_back(parent2);
    
    Organism newOrganism = Organism(genome, mind, organismId, 0, size, 0, parents, Organism::INFANT, false);
    int idx = searchForOrganism(organismId);
    if (idx >= 0)
    {
        std::string before = getOrganismsListAsString();
        
        organismsList.erase(organismsList.begin()+idx);
        
        std::string after = getOrganismsListAsString();
        
        ofstream file;
        file.open(RESULTS_PATH + simulationDateAndTime + "/already_there.txt", ios::app);
        file << std::endl;
        file << "organism " << organismId << " was already inside the list, in position " << idx << std::endl;
        file << "list before:" << std::endl << before << std::endl;
        file << "list after:" << std::endl << after << std::endl;
        file.close();

    }
    organismsList.push_back(newOrganism);
    
    ofstream file2;
    file2.open(RESULTS_PATH + simulationDateAndTime + "/added.txt", ios::app);
    file2 << std::endl;
    file2 << "organism " << organismId << " added to list " << std::endl;
    file2 << "list:" << std::endl << getOrganismsListAsString() << std::endl;
    file2.close();
    
    std::string log = std::to_string(getTime()) + " PROCREATE " + std::to_string(parent1) + " and "  + std::to_string(parent2) + " successfully had child " + std::to_string(organismId);
    storeEventOnFile(log);
}
#include "catch.h"

#include "organism.h"

SCENARIO("an organism can be killed", "[organism]")
{
    GIVEN("a dead organism")
    {
        Organism organism = Organism(false);

        REQUIRE(organism.is_dead() == true);

        WHEN("it is killed")
        {
            organism.kill();

            THEN("it remains dead")
            {
                REQUIRE(organism.is_dead() == true);
            }
        }
    }

    GIVEN("an alive organism")
    {
        Organism organism = Organism(true);

        REQUIRE(organism.is_alive() == true);

        WHEN("it is killed")
        {