Skip to content

Commit

Permalink
[skip ci] Data for new modeler (4.1) : add custom exceptions + add on…
Browse files Browse the repository at this point in the history
…e check in production code
  • Loading branch information
guilpier-code committed Jan 23, 2025
1 parent ce6d3d4 commit 5bca306
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 10 deletions.
2 changes: 2 additions & 0 deletions src/solver/modeler/dataSeries/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ set(SRC_DATA_SERIES

include/antares/solver/modeler/dataSeries/dataSeriesRepo.h
dataSeriesRepo.cpp
include/antares/solver/modeler/dataSeries/dataSeriesRepoExceptions.h
dataSeriesRepoExceptions.cpp

include/antares/solver/modeler/dataSeries/scenarioGroupRepo.h
scenarioGroupRepo.cpp
Expand Down
13 changes: 8 additions & 5 deletions src/solver/modeler/dataSeries/dataSeriesRepo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,29 @@

#include <stdexcept>

#include "antares/solver/modeler/dataSeries/dataSeriesRepoExceptions.h"

namespace Antares::Solver::Modeler::DataSeries
{
void DataSeriesRepository::addDataSeries(std::unique_ptr<IDataSeries> dataSeries)
{
std::string name = dataSeries->name();
if (dataSeries_.contains(name))
{
throw DataSeriesRepo_DSalreadyExists(name);
}
dataSeries_[name] = std::move(dataSeries);
}

IDataSeries& DataSeriesRepository::getDataSeries(const std::string& setId)
{
std::string error_message = err_prefix;
if (dataSeries_.empty())
{
error_message += "empty";
throw std::invalid_argument(error_message);
throw DataSeriesRepo_Empty();
}
if (!dataSeries_.contains(setId))
{
error_message += "data series '" + setId + "' does not exist";
throw std::invalid_argument(error_message);
throw DataSeriesRepo_DataSeriesNotExist(setId);
}
return *(dataSeries_[setId]);
}
Expand Down
22 changes: 22 additions & 0 deletions src/solver/modeler/dataSeries/dataSeriesRepoExceptions.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#include "antares/solver/modeler/dataSeries/dataSeriesRepoExceptions.h"

#include <string>

namespace Antares::Solver::Modeler::DataSeries
{
DataSeriesRepo_Empty::DataSeriesRepo_Empty():
std::invalid_argument("Data series repo is empty, and somebody requests data from it")
{
}

DataSeriesRepo_DataSeriesNotExist::DataSeriesRepo_DataSeriesNotExist(const std::string setId):
std::invalid_argument("Data series repo : data series '" + setId + "' does not exist")
{
}

DataSeriesRepo_DSalreadyExists::DataSeriesRepo_DSalreadyExists(const std::string setId):
std::invalid_argument("Data series repo : data series '" + setId + "' already exists")
{
}

} // namespace Antares::Solver::Modeler::DataSeries
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class DataSeriesRepository

private:
std::map<std::string, std::unique_ptr<IDataSeries>> dataSeries_;
std::string err_prefix = "Data series repo : ";
};

} // namespace Antares::Solver::Modeler::DataSeries
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#pragma once
#include <stdexcept>

namespace Antares::Solver::Modeler::DataSeries
{
class DataSeriesRepo_Empty: public std::invalid_argument
{
public:
DataSeriesRepo_Empty();
};

class DataSeriesRepo_DataSeriesNotExist: public std::invalid_argument
{
public:
DataSeriesRepo_DataSeriesNotExist(const std::string setId);
};

class DataSeriesRepo_DSalreadyExists: public std::invalid_argument
{
public:
DataSeriesRepo_DSalreadyExists(const std::string setId);
};
} // namespace Antares::Solver::Modeler::DataSeries
25 changes: 21 additions & 4 deletions src/tests/src/solver/modeler/dataSeries/testDataSeriesRepo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,34 @@
#include <boost/test/unit_test.hpp>

#include <antares/solver/modeler/dataSeries/dataSeriesRepo.h>
#include "antares/solver/modeler/dataSeries/dataSeriesRepoExceptions.h"
#include "antares/solver/modeler/dataSeries/timeSeriesSet.h"
#include "antares/solver/modeler/dataSeries/timeSeriesSetExceptions.h"

using namespace Antares::Solver::Modeler::DataSeries;

BOOST_AUTO_TEST_CASE(repo_is_empty__asking_any_data_series_raises_exception)
{
DataSeriesRepository dataSeriesRepository;

std::string expected_err_msg = "Data series repo : empty";
std::string expected_err_msg = "Data series repo is empty, and somebody requests data from it";
BOOST_CHECK_EXCEPTION(dataSeriesRepository.getDataSeries("dummy name"),
std::invalid_argument,
DataSeriesRepo_Empty,
checkMessage(expected_err_msg));
}

BOOST_AUTO_TEST_CASE(adding_to_repo_a_data_it_already_contains___exception_raised)
{
DataSeriesRepository dataSeriesRepository;
auto some_TS_set = std::make_unique<TimeSeriesSet>("some TS set", 5);
dataSeriesRepository.addDataSeries(std::move(some_TS_set));

// This TS set wears the same name as the previous one
auto some_other_TS_set = std::make_unique<TimeSeriesSet>("some TS set", 7);

std::string expected_err_msg = "Data series repo : data series 'some TS set' already exists";
BOOST_CHECK_EXCEPTION(dataSeriesRepository.addDataSeries(std::move(some_other_TS_set)),
DataSeriesRepo_DSalreadyExists,
checkMessage(expected_err_msg));
}

Expand All @@ -27,7 +44,7 @@ BOOST_AUTO_TEST_CASE(repo_not_empty__asking_nonexistent_data_raises_exception)

std::string expected_err_msg = "Data series repo : data series 'dummy name' does not exist";
BOOST_CHECK_EXCEPTION(dataSeriesRepository.getDataSeries("dummy name"),
std::invalid_argument,
DataSeriesRepo_DataSeriesNotExist,
checkMessage(expected_err_msg));
}

Expand Down Expand Up @@ -57,7 +74,7 @@ BOOST_AUTO_TEST_CASE(asking_repo_data_for_a_too_big_hour___exception_from_data_s
unsigned hour = 100; // Hour too big
std::string expected_err_msg = "TS set 'some TS set' : hour 100 exceeds TS set's height";
BOOST_CHECK_EXCEPTION(dataSeriesRepository.getDataSeries("some TS set").getData(rank, hour),
std::invalid_argument,
TSset_HourTooBig,
checkMessage(expected_err_msg));
}

Expand Down

0 comments on commit 5bca306

Please sign in to comment.