1 #pragma once
2 
3 #include "interfaces/sensor.hpp"
4 #include "interfaces/threshold.hpp"
5 #include "utils/conv_container.hpp"
6 
7 #include <vector>
8 
9 #include <gmock/gmock.h>
10 
11 class ThresholdMock :
12     public interfaces::Threshold,
13     public std::enable_shared_from_this<ThresholdMock>
14 {
15   public:
16     MOCK_METHOD(void, initialize, (), (override));
17 
18     MOCK_METHOD(LabeledThresholdParam, getThresholdParam, (),
19                 (const, override));
20 
21     MOCK_METHOD(void, updateSensors, (Sensors newSensors), (override));
22 
23     static std::vector<std::shared_ptr<interfaces::Threshold>>
makeThresholds(const LabeledTriggerThresholdParams & params)24         makeThresholds(const LabeledTriggerThresholdParams& params)
25     {
26         using namespace testing;
27         std::vector<std::shared_ptr<NiceMock<ThresholdMock>>> result;
28         if (std::holds_alternative<std::vector<numeric::LabeledThresholdParam>>(
29                 params))
30         {
31             auto unpackedParams =
32                 std::get<std::vector<numeric::LabeledThresholdParam>>(params);
33             for (const auto& param : unpackedParams)
34             {
35                 auto& thresholdMock = result.emplace_back(
36                     std::make_shared<NiceMock<ThresholdMock>>());
37                 ON_CALL(*thresholdMock, getThresholdParam())
38                     .WillByDefault(Return(param));
39             }
40         }
41         else
42         {
43             auto unpackedParams =
44                 std::get<std::vector<discrete::LabeledThresholdParam>>(params);
45             for (const auto& param : unpackedParams)
46             {
47                 auto& thresholdMock = result.emplace_back(
48                     std::make_shared<NiceMock<ThresholdMock>>());
49                 ON_CALL(*thresholdMock, getThresholdParam())
50                     .WillByDefault(Return(param));
51             }
52             if (unpackedParams.empty())
53             {
54                 auto& thresholdMock = result.emplace_back(
55                     std::make_shared<NiceMock<ThresholdMock>>());
56                 ON_CALL(*thresholdMock, getThresholdParam())
57                     .WillByDefault(Return(std::monostate{}));
58             }
59         }
60 
61         return utils::convContainer<std::shared_ptr<interfaces::Threshold>>(
62             result);
63     }
64 };
65