From b69531ced41ccffb82a526e3d127ee0749e16148 Mon Sep 17 00:00:00 2001 From: Martin Brodbeck Date: Thu, 12 Jul 2018 13:42:22 +0200 Subject: [PATCH 1/4] using shared_ptr --- src/core/sale.cpp | 11 ++++++++--- src/core/sale.h | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/core/sale.cpp b/src/core/sale.cpp index 8407232..43ecabb 100644 --- a/src/core/sale.cpp +++ b/src/core/sale.cpp @@ -2,9 +2,14 @@ #include +void Sale::addArticle(std::shared_ptr
articlePtr) +{ + articles_.push_back(articlePtr); +} + int Sale::sumInCents() { - int test = std::accumulate(articles_.begin(), articles_.end(), 0, - [](int a, Article* b) { return a + b->getPrice(); }); - return test; + int sum = std::accumulate(articles_.begin(), articles_.end(), 0, + [](int a, std::shared_ptr
b) { return a + b->getPrice(); }); + return sum; } \ No newline at end of file diff --git a/src/core/sale.h b/src/core/sale.h index e4d016e..11253bd 100644 --- a/src/core/sale.h +++ b/src/core/sale.h @@ -13,9 +13,10 @@ class Sale : public Entity { public: int sumInCents(); + void addArticle(std::shared_ptr
articlePtr); private: boost::posix_time::ptime systemTime_{boost::posix_time::second_clock::local_time()}; - std::vector articles_{}; + std::vector> articles_{}; }; #endif \ No newline at end of file From 9c624065bb8e3bf503fc9dcd895fe55837165897 Mon Sep 17 00:00:00 2001 From: Martin Brodbeck Date: Thu, 12 Jul 2018 14:37:56 +0200 Subject: [PATCH 2/4] more on pointers --- src/core/article.cpp | 8 +++++--- src/core/article.h | 11 ++++++----- test/test_article.cpp | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/core/article.cpp b/src/core/article.cpp index b798fbb..74c00d9 100644 --- a/src/core/article.cpp +++ b/src/core/article.cpp @@ -2,7 +2,7 @@ Article::Article() : Entity() {} -Article::Article(std::shared_ptr sellerPtr) : Entity() { sellerPtr_ = sellerPtr; } +// Article::Article(std::shared_ptr sellerPtr) : Entity() { sellerPtr_ = sellerPtr; } void Article::setArticleNo(int articleNo) { articleNo_ = articleNo; } @@ -10,12 +10,14 @@ void Article::setPrice(int price) { price_ = price; } void Article::setDescription(const std::string& description) { description_ = description; } -void Article::setSale(std::shared_ptr salePtr) { salePtr_ = salePtr; } +void Article::setSale(Sale* salePtr) { salePtr_ = salePtr; } + +void Article::setSeller(Seller* sellerPtr) { sellerPtr_ = sellerPtr; } bool Article::isSold() { return salePtr_ ? true : false; } std::string Article::getDescription() { return description_; } -Seller* Article::getSeller() { return sellerPtr_.get(); } +Seller* Article::getSeller() { return sellerPtr_; } int Article::getPrice() { return price_; } \ No newline at end of file diff --git a/src/core/article.h b/src/core/article.h index 03ceaf0..5c78b80 100644 --- a/src/core/article.h +++ b/src/core/article.h @@ -15,21 +15,22 @@ class Article : public Entity { public: Article(); - Article(std::shared_ptr sellerPtr); + //Article(std::shared_ptr sellerPtr); void setArticleNo(int articleNo); void setPrice(int price); void setDescription(const std::string& description); bool isSold(); - void setSale(std::shared_ptr salePtr); - void setSeller(std::shared_ptr sellerPtr); + void setSale(Sale* salePtr); + //void setSeller(std::shared_ptr sellerPtr); + void setSeller(Seller* sellerPtr); std::string getDescription(); Seller* getSeller(); int getPrice(); private: - std::shared_ptr sellerPtr_{}; - std::shared_ptr salePtr_{}; + Seller* sellerPtr_{}; + Sale* salePtr_{}; int articleNo_{}; int price_{}; std::string description_{}; diff --git a/test/test_article.cpp b/test/test_article.cpp index e0792ad..611fc5b 100644 --- a/test/test_article.cpp +++ b/test/test_article.cpp @@ -16,6 +16,6 @@ BOOST_AUTO_TEST_CASE(check_is_sold) BOOST_TEST(article.isSold() == false); auto salePtr = std::make_shared(); - article.setSale(salePtr); + article.setSale(salePtr.get()); BOOST_TEST(article.isSold() == true); } \ No newline at end of file From 051ed3e7306925217278768f74269c1b12ae2968 Mon Sep 17 00:00:00 2001 From: Martin Brodbeck Date: Thu, 12 Jul 2018 14:38:22 +0200 Subject: [PATCH 3/4] refacturing --- src/core/database.cpp | 2 +- src/core/entity.cpp | 2 +- src/core/entity.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/database.cpp b/src/core/database.cpp index bec8d37..43c82c3 100644 --- a/src/core/database.cpp +++ b/src/core/database.cpp @@ -174,7 +174,7 @@ unsigned int Database::storeSellers(std::vector& sellers) sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":last_name"), seller.getLastName().c_str(), -1, nullptr); sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":num_offered_articles"), - seller.getNumberOfOfferedArticles()); + seller.numArticlesOffered()); retCode = sqlite3_step(stmt); diff --git a/src/core/entity.cpp b/src/core/entity.cpp index 6a6e5d8..08614df 100644 --- a/src/core/entity.cpp +++ b/src/core/entity.cpp @@ -13,7 +13,7 @@ void Entity::createUuid() uuid_ = generator(); } -void Entity::createUuidFromString(const std::string& uuidString) +void Entity::setUuidFromString(const std::string& uuidString) { boost::uuids::string_generator generator{}; uuid_ = generator(uuidString); diff --git a/src/core/entity.h b/src/core/entity.h index 8f1f63f..11890c6 100644 --- a/src/core/entity.h +++ b/src/core/entity.h @@ -14,7 +14,7 @@ class Entity virtual ~Entity() = 0; const boost::uuids::uuid& getUuid() const { return uuid_; }; void createUuid(); - void createUuidFromString(const std::string& uuidString); + void setUuidFromString(const std::string& uuidString); virtual State getState() const; void setState(State state) { state_ = state; } From 2fb72f17018f24abf4f0bb7a6ac3f18c8f63c8c5 Mon Sep 17 00:00:00 2001 From: Martin Brodbeck Date: Thu, 12 Jul 2018 14:39:08 +0200 Subject: [PATCH 4/4] refacturing --- src/core/sale.cpp | 1 + src/core/seller.cpp | 20 +++++++++++++------- src/core/seller.h | 13 +++++++------ test/CMakeLists.txt | 4 ++++ test/test_sale.cpp | 33 +++++++++++++++++++++++++++++++++ test/test_seller.cpp | 4 ++-- 6 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 test/test_sale.cpp diff --git a/src/core/sale.cpp b/src/core/sale.cpp index 43ecabb..92b0140 100644 --- a/src/core/sale.cpp +++ b/src/core/sale.cpp @@ -4,6 +4,7 @@ void Sale::addArticle(std::shared_ptr
articlePtr) { + articlePtr->setSale(this); articles_.push_back(articlePtr); } diff --git a/src/core/seller.cpp b/src/core/seller.cpp index 94d3a0d..d2dc247 100644 --- a/src/core/seller.cpp +++ b/src/core/seller.cpp @@ -3,13 +3,13 @@ Seller::Seller() : Entity() {} Seller::Seller(const std::string& firstName, const std::string& lastName, int sellerNo, - int numberOfArticles) + int numArticlesOffered) : Entity() { firstName_ = firstName; lastName_ = lastName; sellerNo_ = sellerNo; - numberOfOfferedArticles_ = numberOfArticles; + numArticlesOffered_ = numArticlesOffered; } void Seller::setSellerNo(int seller_no) { sellerNo_ = seller_no; } @@ -18,11 +18,13 @@ inline void Seller::setFirstName(const std::string& firstName) { firstName_ = fi inline void Seller::setLastName(const std::string& lastName) { lastName_ = lastName; } -inline void Seller::setNumberOfOfferedArticles(int number) { numberOfOfferedArticles_ = number; } +inline void Seller::setNumArticlesOffered(int number) { numArticlesOffered_ = number; } -int Seller::getNumberOfOfferedArticles() const { return static_cast(articles_.size()); } - -void Seller::addArticle(std::shared_ptr
article) { articles_.push_back(article); } +void Seller::addArticle(std::shared_ptr
article) +{ + article->setSeller(this); + articles_.push_back(article); +} std::string Seller::getFirstName() const { return firstName_; } @@ -43,4 +45,8 @@ std::vector Seller::getArticles(bool onlySold) const return articles; } -size_t Seller::soldArticles() const { return getArticles(true).size(); } \ No newline at end of file +int Seller::numArticlesSold() const { return static_cast(getArticles(true).size()); } + +int Seller::numArticlesOffered() const { return numArticlesOffered_; } + +//int Seller::numArticlesTotal() const { return static_cast(getArticles().size()); } \ No newline at end of file diff --git a/src/core/seller.h b/src/core/seller.h index a713292..c5f3e4a 100644 --- a/src/core/seller.h +++ b/src/core/seller.h @@ -15,24 +15,25 @@ class Seller : public Entity public: Seller(); Seller(const std::string& firstName, const std::string& lastName, int sellerNo = 0, - int numberOfArticles = 0); + int numArticlesOffered = 0); void setSellerNo(int sellerNo); void setFirstName(const std::string& firstName); void setLastName(const std::string& lastName); - void setNumberOfOfferedArticles(int number); + void setNumArticlesOffered(int number); void addArticle(std::shared_ptr
article); std::string getFirstName() const; std::string getLastName() const; int getSellerNo() const; - int getNumberOfOfferedArticles() const; - size_t soldArticles() const; - std::vector getArticles(bool onlySold = false) const; + int numArticlesOffered() const; + int numArticlesSold() const; + //int numArticlesTotal() const; + std::vector getArticles(bool onlySold = true) const; private: int sellerNo_{-1}; - int numberOfOfferedArticles_{}; + int numArticlesOffered_{}; std::string firstName_{}; std::string lastName_{}; std::vector> articles_{}; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 382580f..a6f7d20 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,3 +11,7 @@ add_test(NAME Article COMMAND ${CMAKE_BINARY_DIR}/bin/test_article) add_executable(test_database test_database.cpp) target_link_libraries(test_database core Boost::unit_test_framework stdc++fs) add_test(NAME Database COMMAND ${CMAKE_BINARY_DIR}/bin/test_database) + +add_executable(test_sale test_sale.cpp) +target_link_libraries(test_sale core Boost::unit_test_framework) +add_test(NAME Sale COMMAND ${CMAKE_BINARY_DIR}/bin/test_sale) diff --git a/test/test_sale.cpp b/test/test_sale.cpp new file mode 100644 index 0000000..0ee1bed --- /dev/null +++ b/test/test_sale.cpp @@ -0,0 +1,33 @@ +#define BOOST_TEST_MODULE sale + +#include "../src/core/sale.h" + +#include + +#include + + +BOOST_AUTO_TEST_CASE(articles_sum) +{ + const int NUM_ARTICLES = 30; + + Seller seller("Max", "Mustermann", 1, NUM_ARTICLES); + std::vector> articles{}; + Sale sale{}; + + for(int i = 0; i < NUM_ARTICLES; ++i) + { + auto art = std::make_shared
(); + art->setPrice((i+1) * 10); + articles.push_back(art); + seller.addArticle(art); + } + + for(int i = 0; i < 10; ++i) + { + sale.addArticle(articles.at(i)); + } + + BOOST_TEST(sale.sumInCents() == 550); + BOOST_TEST(seller.getArticles(true).size() == 10); +} \ No newline at end of file diff --git a/test/test_seller.cpp b/test/test_seller.cpp index 2c0468f..7708701 100644 --- a/test/test_seller.cpp +++ b/test/test_seller.cpp @@ -34,6 +34,6 @@ BOOST_AUTO_TEST_CASE(with_article) { auto article = std::make_shared
(); article->setDescription("Test article"); seller.addArticle(article); - BOOST_TEST(seller.getArticles().at(0)->getDescription() == "Test article"); - BOOST_TEST(seller.soldArticles() == 0); + BOOST_TEST(seller.getArticles(false).at(0)->getDescription() == "Test article"); + BOOST_TEST(seller.numArticlesSold() == 0); } \ No newline at end of file