diff --git a/.github/workflows/hw2-ci.yml b/.github/workflows/hw2-ci.yml index 5002aec..f8b3173 100644 --- a/.github/workflows/hw2-ci.yml +++ b/.github/workflows/hw2-ci.yml @@ -5,7 +5,7 @@ on: paths: - 'Homework_2/**' pull_request: - branches: [main, new_vim] + branches: [main] paths: - 'Homework_2/**' @@ -53,7 +53,7 @@ jobs: fi cd Homework_2 - make text-editor -j4 + make -j4 - name: Run tests with sanitizers run: | @@ -64,7 +64,7 @@ jobs: fi cd Homework_2 - make text-editor -j4 + make -j4 build-normal: runs-on: ubuntu-latest diff --git a/.github/workflows/hw3-ci.yml b/.github/workflows/hw3-ci.yml index d2fae28..5d695d9 100644 --- a/.github/workflows/hw3-ci.yml +++ b/.github/workflows/hw3-ci.yml @@ -76,6 +76,7 @@ jobs: run: | sudo apt-get update sudo apt-get install -y build-essential g++-14 + sudo apt-get install -y libgtest-dev - name: Build run: | diff --git a/Homework_3/Makefile b/Homework_3/Makefile index e33e1bf..14e5b0b 100644 --- a/Homework_3/Makefile +++ b/Homework_3/Makefile @@ -1,19 +1,24 @@ CXX ?= g++-14 -CXXFLAGS ?= -O2 -LDFLAGS ?= +CXXFLAGS ?= -O2 -I./src +LDFLAGS ?= -lgtest -lgtest_main -pthread all: bank-system rebuild: clean all -bank-system: bank-system.cpp - $(CXX) $(CXXFLAGS) -o bank-system bank-system.cpp +bank-system: src/bank-system.cpp src/main.cpp + $(CXX) $(CXXFLAGS) -o bank-system src/bank-system.cpp src/main.cpp + +bank-system-tests: tests/bank-system-tests.cpp src/bank-system.cpp + $(CXX) $(CXXFLAGS) -o bank-system-tests src/bank-system.cpp tests/bank-system-tests.cpp $(LDFLAGS) + +test: bank-system-tests + ./bank-system-tests clean: - rm bank-system + rm bank-system bank-system-tests -test: bank-system - ./bank-system +rebuild: clean all .PHONY: all test clean diff --git a/Homework_3/src/bank-system.cpp b/Homework_3/src/bank-system.cpp new file mode 100644 index 0000000..9bc9aff --- /dev/null +++ b/Homework_3/src/bank-system.cpp @@ -0,0 +1,61 @@ +#include "bank-system.h" + +#include +#include +#include +#include + +BankAccount::BankAccount(std::string accountNumber, double balance, + std::string accountHolder) + : accountNumber(accountNumber), + balance(balance), + accountHolder(accountHolder) {} + +void BankAccount::deposit(double amount) { + balance += amount; +} + +void BankAccount::withdraw(double amount) { + if (balance >= amount) { + balance -= amount; + } else { + std::cout << "Insufficient funds" << std::endl; + } +} + +double BankAccount::getBalance() const { + return balance; +} + +std::string BankAccount::getAccountHolder() const { + return accountHolder; +} + +std::string BankAccount::getAccountNumber() const { + return accountNumber; +} + +void BankAccount::printAccountinfo() const { + std::cout << "Account:" << getAccountHolder() << std::endl; + std::cout << "ID:" << getAccountNumber() << std::endl; + std::cout << "Balance:" << getBalance() << std::endl; +} + +void Bank::addAccount(const BankAccount& account) { + accounts.push_back(account); +} + +double Bank::getTotalBalance() const { + double total = 0.0; + for (const auto& acc : accounts) { + total += acc.getBalance(); + } + return total; +} + +void Bank::printAllAccounts() const { + for (const auto& acc : accounts) { + acc.printAccountinfo(); + std::cout << "-----------------" << std::endl; + } +} diff --git a/Homework_3/src/bank-system.h b/Homework_3/src/bank-system.h new file mode 100644 index 0000000..0190a42 --- /dev/null +++ b/Homework_3/src/bank-system.h @@ -0,0 +1,35 @@ +#ifndef BANK_SYSTEM_H +#define BANK_SYSTEM_H + +#include +#include +#include + +class BankAccount { + private: + std::string accountNumber; + double balance; + std::string accountHolder; + + public: + BankAccount(std::string accountNumber, double balance, + std::string accountHolder); + void deposit(double amount); + void withdraw(double amount); + double getBalance() const; + std::string getAccountHolder() const; + std::string getAccountNumber() const; + void printAccountinfo() const; +}; + +class Bank { + private: + std::vector accounts; + + public: + void addAccount(const BankAccount& account); + double getTotalBalance() const; + void printAllAccounts() const; +}; + +#endif diff --git a/Homework_3/src/main.cpp b/Homework_3/src/main.cpp new file mode 100644 index 0000000..51f4bbd --- /dev/null +++ b/Homework_3/src/main.cpp @@ -0,0 +1,18 @@ +#include "bank-system.h" + +int main() { + BankAccount vasya("123", 0, "vasya"); + BankAccount petya("001", 1000, "petya"); + + vasya.deposit(500); + petya.withdraw(100); + petya.withdraw(1000); + + Bank bank; + bank.addAccount(vasya); + bank.addAccount(petya); + std::cout << bank.getTotalBalance() << std::endl; + bank.printAllAccounts(); + + return 0; +} diff --git a/Homework_3/tests/bank-system-tests.cpp b/Homework_3/tests/bank-system-tests.cpp new file mode 100644 index 0000000..aa2e270 --- /dev/null +++ b/Homework_3/tests/bank-system-tests.cpp @@ -0,0 +1,110 @@ +#include + +#include + +#include "bank-system.h" + +TEST(BankAccountTest, CreateAccountAndGetters) { + BankAccount account("12345", 1000.0, "Иван Иванов"); + + EXPECT_EQ(account.getAccountNumber(), "12345"); + EXPECT_EQ(account.getAccountHolder(), "Иван Иванов"); + EXPECT_DOUBLE_EQ(account.getBalance(), 1000.0); +} + +TEST(BankAccountTest, SuccessfulDeposit) { + BankAccount account("123", 500.0, "Вася"); + account.deposit(250.5); + + EXPECT_DOUBLE_EQ(account.getBalance(), 750.5); +} + +TEST(BankAccountTest, SuccessfulWithdrawal) { + BankAccount account("456", 1000.0, "Петя"); + account.withdraw(300.0); + + EXPECT_DOUBLE_EQ(account.getBalance(), 700.0); +} + +TEST(BankAccountTest, InsufficientFundsWithdrawal) { + BankAccount account("789", 100.0, "Маша"); + + std::stringstream buffer; + std::streambuf* old = std::cout.rdbuf(buffer.rdbuf()); + + account.withdraw(200.0); + + std::cout.rdbuf(old); + + EXPECT_DOUBLE_EQ(account.getBalance(), 100.0); + + EXPECT_TRUE(buffer.str().find("Insufficient funds") != std::string::npos); +} + +TEST(BankAccountTest, NegativeAmountOperations) { + BankAccount account("999", 500.0, "Оля"); + + account.deposit(-100.0); + EXPECT_DOUBLE_EQ(account.getBalance(), 400.0); // 500 + (-100) = 400 + + account.withdraw(-50.0); + EXPECT_DOUBLE_EQ(account.getBalance(), 450.0); // 400 - (-50) = 450 +} + +TEST(BankTest, AddAccountsAndTotalBalance) { + Bank bank; + + BankAccount account1("001", 100.0, "Клиент1"); + BankAccount account2("002", 200.0, "Клиент2"); + BankAccount account3("003", 300.0, "Клиент3"); + + bank.addAccount(account1); + bank.addAccount(account2); + bank.addAccount(account3); + + EXPECT_DOUBLE_EQ(bank.getTotalBalance(), 600.0); // 100 + 200 + 300 = 600 +} + +TEST(BankTest, PrintAllAccounts) { + Bank bank; + + BankAccount account1("111", 500.0, "Алексей"); + BankAccount account2("222", 750.5, "Мария"); + + bank.addAccount(account1); + bank.addAccount(account2); + + std::stringstream buffer; + std::streambuf* old = std::cout.rdbuf(buffer.rdbuf()); + + bank.printAllAccounts(); + + std::cout.rdbuf(old); + + std::string output = buffer.str(); + + EXPECT_TRUE(output.find("Алексей") != std::string::npos); + EXPECT_TRUE(output.find("Мария") != std::string::npos); + EXPECT_TRUE(output.find("111") != std::string::npos); + EXPECT_TRUE(output.find("222") != std::string::npos); + EXPECT_TRUE(output.find("500") != std::string::npos); + EXPECT_TRUE(output.find("750.5") != std::string::npos); + EXPECT_TRUE(output.find("-----------------") != std::string::npos); +} + +TEST(BankAccountTest, MultipleOperationsSequence) { + BankAccount account("777", 1000.0, "Сергей"); + + account.deposit(500.0); + account.withdraw(200.0); + account.withdraw(100.0); + account.deposit(300.0); + + EXPECT_DOUBLE_EQ(account.getBalance(), + 1500.0); // 1000 + 500 - 200 - 100 + 300 = 1500 +} + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}