#include #include #include #include #include #include "HeapObject.h" #include "CashFactory.h" #include "Bank.h" std::default_random_engine generator(static_cast(time(nullptr))); std::uniform_int_distribution distribution(-100, 500); std::string currency_to_string(CurrencyValue value) { if (value == CurrencyValue::USD) return "US Dollar"; if (value == CurrencyValue::EUR) return "Euro"; if (value == CurrencyValue::GPD) return "British Pound"; return "Say what ?"; } std::ostream &operator<<(std::ostream &os, Currency currency) { os << currency_to_string(currency.getValue()); return os; } std::ostream &operator<<(std::ostream &os, Bill bill) { os << bill.getValue() << " " << bill.getCurrency() << " " << bill.getSerial(); return os; } std::ostream &operator<<(std::ostream &os, Cash cash) { os << cash.getValue() << " " << cash.getCurrency(); return os; } std::ostream &operator<<(std::ostream &os, Money money) { os << money.getValue() << " " << money.getCurrency(); return os; } std::ostream &operator<<(std::ostream &os, Person *person) { os << person->getName(); return os; } std::ostream &operator<<(std::ostream &os, BankAccount bankAccount) { os << bankAccount.getOwner() << " " << bankAccount.getName() << ": " << bankAccount.getMoney(); return os; } std::set> banks; void setup() { std::unique_ptr bank1 = std::make_unique(new Bank("Bank 1")); std::unique_ptr bank2 = std::make_unique(new Bank("Bank 2")); std::unique_ptr bank3 = std::make_unique(new Bank("Bank 3")); std::shared_ptr max = std::make_shared(new Person("Max Müller")); std::shared_ptr marius = std::make_shared(new Person("Marius Müller")); std::shared_ptr alex = std::make_shared(new Person("Alex Maier")); bank1->addAccount(new BankAccount(max, "Konto 1")); bank2->addAccount(new BankAccount(max, "Konto 2")); bank1->addAccount(new BankAccount(alex, "privat")); bank3->addAccount(new BankAccount(alex, "geschäftlich 1")); bank2->addAccount(new BankAccount(alex, "geschäftlich 2")); bank1->addAccount(new BankAccount(alex, "geschäftlich 3")); bank2->addAccount(new BankAccount(marius, "Konto 1")); bank1->addAccount(new BankAccount(marius, "Konto 2")); bank3->addAccount(new BankAccount(marius, "Konto 3")); banks.insert(std::move(bank1)); banks.insert(std::move(bank2)); banks.insert(std::move(bank3)); } void simulate() { auto *cashFactory = new CashFactory(); for (auto && bank : banks) { std::cout << std::endl; std::cout << "======================== " << bank->getName() << " ========================" << std::endl; std::cout << std::endl; for (BankAccount *bankAccount : bank->getAccounts()) { for (int i = 0; i < 10000; ++i) { int rnd = distribution(generator); Bill *bill = cashFactory->printBill(rnd, CurrencyValue::USD); Coin *coin = cashFactory->printCoin(rnd, CurrencyValue::USD); if (bill != nullptr) { *bankAccount + bill; } if (coin != nullptr) { *bankAccount + coin; } Money *fee = *bankAccount - 10; } std::cout << *bankAccount << std::endl; } } } void tearDown() { for (auto && bank : banks) { for (BankAccount *bankAccount : bank->getAccounts()) { delete(bankAccount); } } } int main(int argc, char **argv) { std::cout << "+++++++++++++++++++++++++ " << "setup()" << " +++++++++++++++++++++++++" << std::endl; setup(); std::cout << "+++++++++++++++++++++++++ " << "simulate()" << " +++++++++++++++++++++++++" << std::endl; simulate(); std::cout << "+++++++++++++++++++++++++ " << "tearDown()" << " +++++++++++++++++++++++++" << std::endl; tearDown(); HeapObject::assertionsHold(); return 0; }