Skip to content

Commit

Permalink
created mock Option and modified unittest for marketdata however for …
Browse files Browse the repository at this point in the history
…now memory does not work
  • Loading branch information
anthonymakarewicz committed Jul 30, 2024
1 parent 374c28b commit 96181b8
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 26 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ add_executable(Option_pricer main.cpp
src/market_data/market_data.cpp
src/market_data/market_data_observer.cpp
src/market_data/stock_data.cpp
src/option/interface_option.cpp
src/option/base_option.cpp
src/option/single_path/base_single_path_option.cpp
src/option/single_path/european_option.cpp
Expand Down
15 changes: 15 additions & 0 deletions include/option/interface_option.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#ifndef INTERFACE_OPTION_H
#define INTERFACE_OPTION_H

#include "market_data/market_data_observer.h"

namespace OptionPricer {
class IOption : public MarketDataObserver {
public:
explicit IOption(const std::string& id);
~IOption() override;

};
}

#endif //INTERFACE_OPTION_H
7 changes: 7 additions & 0 deletions src/option/interface_option.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "option/interface_option.h"

namespace OptionPricer {
IOption::IOption(const std::string &id) : MarketDataObserver(id) {}

IOption::~IOption() = default;
}
1 change: 1 addition & 0 deletions tests/unit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ add_executable(Unit_tests ${CMAKE_CURRENT_SOURCE_DIR}/../test_main.cpp
../../src/market_data/market_data.cpp
../../src/market_data/market_data_observer.cpp
../../src/market_data/stock_data.cpp
../../src/option/interface_option.cpp
../../src/option/base_option.cpp
../../src/option/single_path/base_single_path_option.cpp
../../src/option/single_path/european_option.cpp
Expand Down
34 changes: 18 additions & 16 deletions tests/unit/market_data/test_market_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,12 @@ class MarketDataTest : public ::testing::Test {
//MarketData::instance_ = nullptr; // Assuming this is allowed in your implementation to reset the singleton
}

void TearDown() override {
observer->resetUpdated();
}

static std::shared_ptr<MarketData> marketData;
static std::shared_ptr<Mocks::Option> observer;
//std::string ticker;
};

// Static member initialization to avoid u
// Static member initialization to avoid undefined behaviour
std::shared_ptr<MarketData> MarketDataTest::marketData = nullptr;
std::shared_ptr<Mocks::Option> MarketDataTest::observer = nullptr;

Expand All @@ -42,30 +38,38 @@ TEST_F(MarketDataTest, SingletonInstance) {
}

TEST_F(MarketDataTest, NotifyObserver) {
EXPECT_CALL(*observer, update()).Times(1);
marketData->notifyObserver("AAPL");
EXPECT_TRUE(observer->wasUpdated());
}

TEST_F(MarketDataTest, RemoveObserver) {
EXPECT_CALL(*observer, update()).Times(0);
observer.reset();
marketData->removeObserver();
marketData->notifyObserver("AAPL");
EXPECT_TRUE(observer->wasUpdated());
}

TEST_F(MarketDataTest, NotifyAllObservers) {
auto observer2 = std::make_shared<Mocks::Option>("AAPL");
marketData->addObserver(observer2);

EXPECT_CALL(*observer, update()).Times(1);
EXPECT_CALL(*observer2, update()).Times(1);
marketData->notifyObservers();
EXPECT_TRUE(observer->wasUpdated());
EXPECT_TRUE(observer2->wasUpdated());
}

TEST_F(MarketDataTest, UpdateStockData) {
TEST_F(MarketDataTest, GetStockData) {
auto stockData = marketData->getStockData("AAPL");

EXPECT_DOUBLE_EQ(stockData->getPrice(), 150.0);
EXPECT_DOUBLE_EQ(stockData->getSigma(), 0.2);
EXPECT_TRUE(stockData->getCoupon().has_value());
EXPECT_DOUBLE_EQ(stockData->getCoupon().value(), 0.01);
}

TEST_F(MarketDataTest, UpdateStockData) {
EXPECT_CALL(*observer, update()).Times(3);
auto stockData = marketData->getStockData("AAPL");

marketData->updateStockPrice("AAPL", 160.0);
marketData->updateStockSigma("AAPL", 0.25);
Expand All @@ -75,23 +79,21 @@ TEST_F(MarketDataTest, UpdateStockData) {
EXPECT_DOUBLE_EQ(stockData->getSigma(), 0.25);
EXPECT_TRUE(stockData->getCoupon().has_value());
EXPECT_DOUBLE_EQ(stockData->getCoupon().value(), 0.02);

EXPECT_TRUE(observer->wasUpdated());
}

TEST_F(MarketDataTest, UpdateNonExistentStock) {
EXPECT_THROW(auto stockData = marketData->getStockData("MSFT"), std::invalid_argument);

// Ensure exception is thrown when updating non-existent stock data
EXPECT_THROW(marketData->updateStockPrice("MSFT", 200.0), std::invalid_argument);
EXPECT_THROW(marketData->updateStockSigma("MSFT", 0.3), std::invalid_argument);
EXPECT_THROW(marketData->updateStockCoupon("MSFT", 0.04), std::invalid_argument);
}

TEST_F(MarketDataTest, RiskFreeRate) {
EXPECT_CALL(*observer, update()).Times(2);

marketData->setR(0.10);
EXPECT_DOUBLE_EQ(marketData->getR(), 0.10);
marketData->setR(0.05);
EXPECT_DOUBLE_EQ(marketData->getR(), 0.05);

marketData->setR(0.03);
EXPECT_DOUBLE_EQ(marketData->getR(), 0.03);
}
17 changes: 7 additions & 10 deletions tests/unit/test_support/mock_classes.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,19 @@
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "market_data/market_data.h"
#include "option/interface_option.h"

namespace OptionPricer::Mocks {
// Minimal Mock Option class
class Option final : public MarketDataObserver, public std::enable_shared_from_this<Option> {
// Mock class for Option
class Option final : public IOption {
public:
explicit Option(const std::string& ticker) : MarketDataObserver(ticker), updated_(false) {}
explicit Option(const std::string& ticker) : IOption(ticker) {}

void update() override { updated_ = true; }
bool wasUpdated() const { return updated_; }
void resetUpdated() { updated_ = false; }

private:
bool updated_;
MOCK_METHOD(void, update, (), (override));
MOCK_METHOD(std::shared_ptr<Option>, shared_from_this, (), ());
};

// Mock class for MarketData using Google Mock
// Mock class for MarketData
class MarketData final : public IMarketData {
public:
MOCK_METHOD(std::shared_ptr<const StockData>, getStockData, (const std::string& ticker), (const, override));
Expand Down

0 comments on commit 96181b8

Please sign in to comment.