diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fe4dc8..dc27c3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,8 @@ enable_testing() include(GoogleTest) enable_fuzz_testing() -add_subdirectory(src/simple_examples) -add_subdirectory(src/state_example) -add_subdirectory(src/advanced_examples) +# add_subdirectory(src/simple_examples) +# add_subdirectory(src/state_example) +# add_subdirectory(src/advanced_examples) +# add_subdirectory(src/cpp-inheritance) +add_subdirectory(src/complex_test_fixture) diff --git a/src/complex_test_fixture/CMakeLists.txt b/src/complex_test_fixture/CMakeLists.txt new file mode 100644 index 0000000..c5cb5f4 --- /dev/null +++ b/src/complex_test_fixture/CMakeLists.txt @@ -0,0 +1,6 @@ +add_subdirectory(metrics) +add_subdirectory(publishers) +add_subdirectory(subscribers) +add_subdirectory(base) +add_subdirectory(child) +add_subdirectory(test) \ No newline at end of file diff --git a/src/complex_test_fixture/base/Activity.cpp b/src/complex_test_fixture/base/Activity.cpp new file mode 100644 index 0000000..92ed93a --- /dev/null +++ b/src/complex_test_fixture/base/Activity.cpp @@ -0,0 +1,16 @@ +#include "Activity.h" + +#include + +void Activity::Init() { + std::cout << "Activity::Init()" << std::endl; +} + +void Activity::Step() { + std::cout << "Activity::Step()" << std::endl; + step_count_++; + if (step_count_ > 10) { + *(char *)0xdeadc0de = 0; + } + processStep(); +} diff --git a/src/complex_test_fixture/base/Activity.h b/src/complex_test_fixture/base/Activity.h new file mode 100644 index 0000000..03a7814 --- /dev/null +++ b/src/complex_test_fixture/base/Activity.h @@ -0,0 +1,15 @@ +#pragma once + +class Activity { +public: + Activity() = default; + virtual ~Activity() = default; + + void Init(); + void Step(); + +protected: + virtual void processStep() = 0; // Pure virtual function +private: + int step_count_ = 0; +}; diff --git a/src/complex_test_fixture/base/CMakeLists.txt b/src/complex_test_fixture/base/CMakeLists.txt new file mode 100644 index 0000000..27b44cf --- /dev/null +++ b/src/complex_test_fixture/base/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(activity STATIC Activity.cpp) + +target_include_directories(activity PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/src/complex_test_fixture/child/CMakeLists.txt b/src/complex_test_fixture/child/CMakeLists.txt new file mode 100644 index 0000000..aa0d0dc --- /dev/null +++ b/src/complex_test_fixture/child/CMakeLists.txt @@ -0,0 +1,5 @@ +add_library(child_activity STATIC ChildActivity.cpp) + +target_include_directories(child_activity PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +target_link_libraries(child_activity PUBLIC activity) diff --git a/src/complex_test_fixture/child/ChildActivity.cpp b/src/complex_test_fixture/child/ChildActivity.cpp new file mode 100644 index 0000000..3f0282f --- /dev/null +++ b/src/complex_test_fixture/child/ChildActivity.cpp @@ -0,0 +1,9 @@ +#include "ChildActivity.h" + +#include + +ChildActivity::ChildActivity() {} + +void ChildActivity::processStep() { + std::cout << "ChildActivity::processStep()" << std::endl; +} diff --git a/src/complex_test_fixture/child/ChildActivity.h b/src/complex_test_fixture/child/ChildActivity.h new file mode 100644 index 0000000..b592a6a --- /dev/null +++ b/src/complex_test_fixture/child/ChildActivity.h @@ -0,0 +1,10 @@ +#pragma once +#include "Activity.h" + +class ChildActivity final : public Activity { +public: + ChildActivity(); + +protected: + void processStep() override; +}; diff --git a/src/complex_test_fixture/metrics/CMakeLists.txt b/src/complex_test_fixture/metrics/CMakeLists.txt new file mode 100644 index 0000000..5a5cb5a --- /dev/null +++ b/src/complex_test_fixture/metrics/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(metrics STATIC metricA.cpp metricB.cpp) + +target_include_directories(metrics PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/src/complex_test_fixture/metrics/metric.h b/src/complex_test_fixture/metrics/metric.h new file mode 100644 index 0000000..eb0d2fc --- /dev/null +++ b/src/complex_test_fixture/metrics/metric.h @@ -0,0 +1,9 @@ +#pragma once + +class Metric { + public: + virtual ~Metric() = default; + virtual void Set(int value) = 0; + virtual int Get() const = 0; + virtual void Reset() = 0; +}; \ No newline at end of file diff --git a/src/complex_test_fixture/metrics/metricA.cpp b/src/complex_test_fixture/metrics/metricA.cpp new file mode 100644 index 0000000..afc00a0 --- /dev/null +++ b/src/complex_test_fixture/metrics/metricA.cpp @@ -0,0 +1,13 @@ +#include "metricA.h" + +void MetricA::Set(int value) { + value_ = value; +} + +int MetricA::Get() const { + return value_; +} + +void MetricA::Reset() { + value_ = 0; +} \ No newline at end of file diff --git a/src/complex_test_fixture/metrics/metricA.h b/src/complex_test_fixture/metrics/metricA.h new file mode 100644 index 0000000..d829708 --- /dev/null +++ b/src/complex_test_fixture/metrics/metricA.h @@ -0,0 +1,15 @@ +#pragma once + +#include "metric.h" + +class MetricA : public Metric { + public: + explicit MetricA(int value) : value_(value) {}; + virtual ~MetricA() = default; + void Set(int value) override; + int Get() const override; + void Reset() override; + + private: + int value_{0}; +}; \ No newline at end of file diff --git a/src/complex_test_fixture/metrics/metricB.cpp b/src/complex_test_fixture/metrics/metricB.cpp new file mode 100644 index 0000000..2e3eae9 --- /dev/null +++ b/src/complex_test_fixture/metrics/metricB.cpp @@ -0,0 +1,13 @@ +#include "metricB.h" + +void MetricB::Set(int value) { + value_ = value; +} + +int MetricB::Get() const { + return value_; +} + +void MetricB::Reset() { + value_ = 0; +} \ No newline at end of file diff --git a/src/complex_test_fixture/metrics/metricB.h b/src/complex_test_fixture/metrics/metricB.h new file mode 100644 index 0000000..e1ab5d8 --- /dev/null +++ b/src/complex_test_fixture/metrics/metricB.h @@ -0,0 +1,15 @@ +#pragma once + +#include "metric.h" + +class MetricB : public Metric { + public: + explicit MetricB(int value) : value_(value) {}; + virtual ~MetricB() = default; + void Set(int value) override; + int Get() const override; + void Reset() override; + + private: + int value_{0}; +}; \ No newline at end of file diff --git a/src/complex_test_fixture/publishers/CMakeLists.txt b/src/complex_test_fixture/publishers/CMakeLists.txt new file mode 100644 index 0000000..3d6e298 --- /dev/null +++ b/src/complex_test_fixture/publishers/CMakeLists.txt @@ -0,0 +1,5 @@ +add_library(publishers STATIC PublisherA.cpp PublisherB.cpp) + +target_link_libraries(publishers PUBLIC metrics) + +target_include_directories(publishers PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/src/complex_test_fixture/publishers/Publisher.h b/src/complex_test_fixture/publishers/Publisher.h new file mode 100644 index 0000000..fb3321c --- /dev/null +++ b/src/complex_test_fixture/publishers/Publisher.h @@ -0,0 +1,13 @@ +#pragma once + +#include + + +class Publisher { + public: + Publisher() = default; + virtual ~Publisher() = default; + + virtual void Init() = 0; + virtual void Step() = 0; +}; diff --git a/src/complex_test_fixture/publishers/PublisherA.cpp b/src/complex_test_fixture/publishers/PublisherA.cpp new file mode 100644 index 0000000..2963b25 --- /dev/null +++ b/src/complex_test_fixture/publishers/PublisherA.cpp @@ -0,0 +1,14 @@ +#include "PublisherA.h" +#include + +void PublisherA::Init() { + std::cout << "PublisherA.Init(" << topic_ << ")" << std::endl; +} + +void PublisherA::Step() { + std::cout << "PublisherA.Step(" << topic_ << ")" << std::endl; +} + +void PublisherA::PublishInput(const MetricA& metric, const std::string& message) { + std::cout << "PublisherA.PublishInput(" << topic_ << ", " << message << ")" << std::endl; +} diff --git a/src/complex_test_fixture/publishers/PublisherA.h b/src/complex_test_fixture/publishers/PublisherA.h new file mode 100644 index 0000000..d87babd --- /dev/null +++ b/src/complex_test_fixture/publishers/PublisherA.h @@ -0,0 +1,22 @@ +#pragma once +#include +#include + +#include "Publisher.h" +#include "metricA.h" + +class PublisherA final : public Publisher { +public: + // Constructor + explicit PublisherA(std::string topic) : topic_(std::move(topic)) {} + + void Init() override; + + void Step() override; + + void PublishInput(const MetricA& metric, const std::string& message); + +private: + // Member variables + std::string topic_; +}; diff --git a/src/complex_test_fixture/publishers/PublisherB.cpp b/src/complex_test_fixture/publishers/PublisherB.cpp new file mode 100644 index 0000000..90fe20d --- /dev/null +++ b/src/complex_test_fixture/publishers/PublisherB.cpp @@ -0,0 +1,14 @@ +#include "PublisherB.h" +#include + +void PublisherB::Init() { + std::cout << "PublisherB.init(" << topic_ << ")" << std::endl; +} + +void PublisherB::Step() { + std::cout << "PublisherB.step(" << topic_ << ")" << std::endl; +} + +void PublisherB::PublishInput(const MetricB& metric, const std::string& message) { + std::cout << "PublisherB.publish(" << topic_ << ", " << message << ")" << std::endl; +} diff --git a/src/complex_test_fixture/publishers/PublisherB.h b/src/complex_test_fixture/publishers/PublisherB.h new file mode 100644 index 0000000..059654e --- /dev/null +++ b/src/complex_test_fixture/publishers/PublisherB.h @@ -0,0 +1,22 @@ +#pragma once +#include +#include + +#include "Publisher.h" +#include "metricB.h" + +class PublisherB final : public Publisher { +public: + // Constructor + explicit PublisherB(std::string topic) : topic_(std::move(topic)) {} + + void Init() override; + + void Step() override; + + void PublishInput(const MetricB& metric, const std::string& message); + +private: + // Member variables + std::string topic_; +}; diff --git a/src/complex_test_fixture/subscribers/CMakeLists.txt b/src/complex_test_fixture/subscribers/CMakeLists.txt new file mode 100644 index 0000000..1089157 --- /dev/null +++ b/src/complex_test_fixture/subscribers/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(subscribers STATIC SubscriberA.cpp) + +target_include_directories(subscribers PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/src/complex_test_fixture/subscribers/Subscriber.h b/src/complex_test_fixture/subscribers/Subscriber.h new file mode 100644 index 0000000..f9d02cb --- /dev/null +++ b/src/complex_test_fixture/subscribers/Subscriber.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +class Subscriber { +public: + Subscriber() = default; + virtual ~Subscriber() = default; + + virtual void Init() = 0; + virtual void Step() = 0; + virtual void ReceiveInput(const std::string& message) = 0; + +}; \ No newline at end of file diff --git a/src/complex_test_fixture/subscribers/SubscriberA.cpp b/src/complex_test_fixture/subscribers/SubscriberA.cpp new file mode 100644 index 0000000..735c12f --- /dev/null +++ b/src/complex_test_fixture/subscribers/SubscriberA.cpp @@ -0,0 +1,15 @@ +#include "SubscriberA.h" + +#include + +void SubscriberA::Init() { + std::cout << "SubscriberA.init(" << topic_ << ")" << std::endl; +} + +void SubscriberA::Step() { + std::cout << "SubscriberA.step(" << topic_ << ")" << std::endl; +} + +void SubscriberA::ReceiveInput(const std::string& message) { + std::cout << "SubscriberA.receive(" << topic_ << ", " << message << ")" << std::endl; +} \ No newline at end of file diff --git a/src/complex_test_fixture/subscribers/SubscriberA.h b/src/complex_test_fixture/subscribers/SubscriberA.h new file mode 100644 index 0000000..64fd517 --- /dev/null +++ b/src/complex_test_fixture/subscribers/SubscriberA.h @@ -0,0 +1,20 @@ +#pragma once + +#include "Subscriber.h" + +class SubscriberA : public Subscriber { +public: + SubscriberA(std::string topic) : topic_(std::move(topic)) {}; + virtual ~SubscriberA() = default; + + void Init() override; + + void Step() override; + + void ReceiveInput(const std::string& message) override; +private: + std::string topic_; +}; + + + diff --git a/src/complex_test_fixture/test/CMakeLists.txt b/src/complex_test_fixture/test/CMakeLists.txt new file mode 100644 index 0000000..cdeb3c0 --- /dev/null +++ b/src/complex_test_fixture/test/CMakeLists.txt @@ -0,0 +1,12 @@ +add_executable(child_activity_test ChildActivityTest.cpp ChildActivityFixture.cpp) + +# Link libraries +target_link_libraries(child_activity_test PRIVATE + child_activity + publishers + subscribers + GTest::gtest_main +) + +# Add test to CTest +add_test(NAME ChildActivityTest COMMAND child_activity_test) diff --git a/src/complex_test_fixture/test/ChildActivityFixture.cpp b/src/complex_test_fixture/test/ChildActivityFixture.cpp new file mode 100644 index 0000000..645feed --- /dev/null +++ b/src/complex_test_fixture/test/ChildActivityFixture.cpp @@ -0,0 +1,34 @@ +#include "ChildActivityFixture.h" + +ChildActivityFixture::ChildActivityFixture() { + std::cerr << "ChildActivityFixture constructor" << std::endl; + unit_ = std::make_unique(); +} + + +void ChildActivityFixture::SetUp() { + Init(); +} + +void ChildActivityFixture::Init() { + publisherA.Init(); + publisherB.Init(); + subscriberA.Init(); + unit_->Init(); +} + +void ChildActivityFixture::Step() { + publisherA.Step(); + publisherB.Step(); + unit_->Step(); + subscriberA.Step(); +} + +void ChildActivityFixture::SetPublisherInputMessages() { + publisherA.PublishInput(metricA, "messageA"); + publisherB.PublishInput(metricB, "messageB"); +} + +void ChildActivityFixture::SetSomeFlagEnabled(bool enabled) { + +} diff --git a/src/complex_test_fixture/test/ChildActivityFixture.h b/src/complex_test_fixture/test/ChildActivityFixture.h new file mode 100644 index 0000000..6228c5e --- /dev/null +++ b/src/complex_test_fixture/test/ChildActivityFixture.h @@ -0,0 +1,40 @@ +#pragma once + +#include + +#include "metricA.h" +#include "metricB.h" + +#include "PublisherA.h" +#include "PublisherB.h" + +#include "SubscriberA.h" + +#include "ChildActivity.h" + +class ChildActivityFixture : public ::testing::Test { +public: + + explicit ChildActivityFixture(); + + void Init(); + void Step(); + void SetPublisherInputMessages(); + + void SetSomeFlagEnabled(bool enabled); + + // Members of different publisher types + PublisherA publisherA{"topicA"}; + PublisherB publisherB{"topicB"}; + + MetricA metricA{1}; + MetricB metricB{2}; + + SubscriberA subscriberA{"topicA"}; + + + std::unique_ptr unit_{nullptr}; + +protected: + void SetUp() override; +}; \ No newline at end of file diff --git a/src/complex_test_fixture/test/ChildActivityTest.cpp b/src/complex_test_fixture/test/ChildActivityTest.cpp new file mode 100644 index 0000000..f7fb73e --- /dev/null +++ b/src/complex_test_fixture/test/ChildActivityTest.cpp @@ -0,0 +1,27 @@ +#include "ChildActivityFixture.h" + +class ChildActivityTest : public ChildActivityFixture { +protected: + void SetUp() override { + ChildActivityFixture::SetUp(); + } + + void CheckResults(int value) { + EXPECT_EQ(metricA.Get(), value); + } +}; + +TEST_F(ChildActivityTest, Test1) { + metricA.Set(1); + SetPublisherInputMessages(); + Step(); + CheckResults(1); +} + +TEST_F(ChildActivityTest, Test2) { + metricA.Set(2); + metricA.Reset(); + SetPublisherInputMessages(); + Step(); + CheckResults(0); +} \ No newline at end of file diff --git a/src/cpp-inheritance/CMakeLists.txt b/src/cpp-inheritance/CMakeLists.txt new file mode 100644 index 0000000..5b7e0c6 --- /dev/null +++ b/src/cpp-inheritance/CMakeLists.txt @@ -0,0 +1,6 @@ +add_subdirectory(base) +add_subdirectory(child) + +add_executable(inheritance main.cpp) + +target_link_libraries(inheritance upper_case_processor) \ No newline at end of file diff --git a/src/cpp-inheritance/base/CMakeLists.txt b/src/cpp-inheritance/base/CMakeLists.txt new file mode 100644 index 0000000..6a0a361 --- /dev/null +++ b/src/cpp-inheritance/base/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(data_processor STATIC data_processor.cpp) + +target_include_directories(data_processor PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/src/cpp-inheritance/base/data_processor.cpp b/src/cpp-inheritance/base/data_processor.cpp new file mode 100644 index 0000000..af4ea4c --- /dev/null +++ b/src/cpp-inheritance/base/data_processor.cpp @@ -0,0 +1,22 @@ +#include "data_processor.h" + +void DataProcessor::process(const std::vector& data) { + // Processed data storage + std::vector processedData; + + // Process each item using the virtual method + for (const auto& item : data) { + std::string result = processData(item); + processedData.push_back(result); + } + + // Output the results + for (const auto& item : processedData) { + std::cout << item << std::endl; + } +} + +std::string DataProcessor::processData(const std::string& input) { + // Default implementation (could be empty or provide basic processing) + return input; +} diff --git a/src/cpp-inheritance/base/data_processor.h b/src/cpp-inheritance/base/data_processor.h new file mode 100644 index 0000000..f796bda --- /dev/null +++ b/src/cpp-inheritance/base/data_processor.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include +#include + +class DataProcessor { +public: + void process(const std::vector& data); + +protected: + virtual std::string processData(const std::string& input); +}; diff --git a/src/cpp-inheritance/child/CMakeLists.txt b/src/cpp-inheritance/child/CMakeLists.txt new file mode 100644 index 0000000..585515c --- /dev/null +++ b/src/cpp-inheritance/child/CMakeLists.txt @@ -0,0 +1,5 @@ +add_library(upper_case_processor STATIC upper_case_processor.cpp) + +target_include_directories(upper_case_processor PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +target_link_libraries(upper_case_processor data_processor) \ No newline at end of file diff --git a/src/cpp-inheritance/child/upper_case_processor.cpp b/src/cpp-inheritance/child/upper_case_processor.cpp new file mode 100644 index 0000000..020e1a9 --- /dev/null +++ b/src/cpp-inheritance/child/upper_case_processor.cpp @@ -0,0 +1,7 @@ +#include "upper_case_processor.h" + +std::string UpperCaseProcessor::processData(const std::string& input) { + std::string output = input; + std::transform(output.begin(), output.end(), output.begin(), ::toupper); + return output; +} \ No newline at end of file diff --git a/src/cpp-inheritance/child/upper_case_processor.h b/src/cpp-inheritance/child/upper_case_processor.h new file mode 100644 index 0000000..ce10d46 --- /dev/null +++ b/src/cpp-inheritance/child/upper_case_processor.h @@ -0,0 +1,9 @@ +#pragma once + +#include "data_processor.h" +#include + +class UpperCaseProcessor : public DataProcessor { +protected: + std::string processData(const std::string& input) override; +}; diff --git a/src/cpp-inheritance/main.cpp b/src/cpp-inheritance/main.cpp new file mode 100644 index 0000000..2f42241 --- /dev/null +++ b/src/cpp-inheritance/main.cpp @@ -0,0 +1,12 @@ +#include "upper_case_processor.h" +#include +#include + +int main() { + std::vector data = {"Hello", "World", "Data Processing"}; + + UpperCaseProcessor processor; + processor.process(data); + + return 0; +}