diff --git a/src/solver/modeler/dataSeries/CMakeLists.txt b/src/solver/modeler/dataSeries/CMakeLists.txt index 180ab3dcbc..d3c6b21d5e 100644 --- a/src/solver/modeler/dataSeries/CMakeLists.txt +++ b/src/solver/modeler/dataSeries/CMakeLists.txt @@ -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 diff --git a/src/solver/modeler/dataSeries/dataSeriesRepo.cpp b/src/solver/modeler/dataSeries/dataSeriesRepo.cpp index c82e8fe64d..6be71f7479 100644 --- a/src/solver/modeler/dataSeries/dataSeriesRepo.cpp +++ b/src/solver/modeler/dataSeries/dataSeriesRepo.cpp @@ -2,26 +2,29 @@ #include +#include "antares/solver/modeler/dataSeries/dataSeriesRepoExceptions.h" + namespace Antares::Solver::Modeler::DataSeries { void DataSeriesRepository::addDataSeries(std::unique_ptr 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]); } diff --git a/src/solver/modeler/dataSeries/dataSeriesRepoExceptions.cpp b/src/solver/modeler/dataSeries/dataSeriesRepoExceptions.cpp new file mode 100644 index 0000000000..9e7a1e5eef --- /dev/null +++ b/src/solver/modeler/dataSeries/dataSeriesRepoExceptions.cpp @@ -0,0 +1,22 @@ +#include "antares/solver/modeler/dataSeries/dataSeriesRepoExceptions.h" + +#include + +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 diff --git a/src/solver/modeler/dataSeries/include/antares/solver/modeler/dataSeries/dataSeriesRepo.h b/src/solver/modeler/dataSeries/include/antares/solver/modeler/dataSeries/dataSeriesRepo.h index ab6bf12e0f..9eb8bc8a09 100644 --- a/src/solver/modeler/dataSeries/include/antares/solver/modeler/dataSeries/dataSeriesRepo.h +++ b/src/solver/modeler/dataSeries/include/antares/solver/modeler/dataSeries/dataSeriesRepo.h @@ -18,7 +18,6 @@ class DataSeriesRepository private: std::map> dataSeries_; - std::string err_prefix = "Data series repo : "; }; } // namespace Antares::Solver::Modeler::DataSeries diff --git a/src/solver/modeler/dataSeries/include/antares/solver/modeler/dataSeries/dataSeriesRepoExceptions.h b/src/solver/modeler/dataSeries/include/antares/solver/modeler/dataSeries/dataSeriesRepoExceptions.h new file mode 100644 index 0000000000..6512ea098a --- /dev/null +++ b/src/solver/modeler/dataSeries/include/antares/solver/modeler/dataSeries/dataSeriesRepoExceptions.h @@ -0,0 +1,23 @@ +#pragma once +#include + +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 diff --git a/src/tests/src/solver/modeler/dataSeries/testDataSeriesRepo.cpp b/src/tests/src/solver/modeler/dataSeries/testDataSeriesRepo.cpp index 34e1006f99..2e960e6b1f 100644 --- a/src/tests/src/solver/modeler/dataSeries/testDataSeriesRepo.cpp +++ b/src/tests/src/solver/modeler/dataSeries/testDataSeriesRepo.cpp @@ -5,7 +5,9 @@ #include #include +#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; @@ -13,9 +15,24 @@ 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("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("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)); } @@ -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)); } @@ -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)); }