diff options
Diffstat (limited to 'quantum/battery/tests/battery_tests.cpp')
| -rw-r--r-- | quantum/battery/tests/battery_tests.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/quantum/battery/tests/battery_tests.cpp b/quantum/battery/tests/battery_tests.cpp new file mode 100644 index 0000000000..ee011be8a8 --- /dev/null +++ b/quantum/battery/tests/battery_tests.cpp | |||
| @@ -0,0 +1,97 @@ | |||
| 1 | // Copyright 2025 QMK | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "gtest/gtest.h" | ||
| 5 | #include "gmock/gmock.h" | ||
| 6 | |||
| 7 | using testing::_; | ||
| 8 | |||
| 9 | class BatteryDriverMock { | ||
| 10 | public: | ||
| 11 | virtual ~BatteryDriverMock() {} | ||
| 12 | |||
| 13 | // mock methods | ||
| 14 | MOCK_METHOD0(battery_driver_init, void(void)); | ||
| 15 | MOCK_METHOD0(battery_driver_sample_percent, uint8_t(void)); | ||
| 16 | MOCK_METHOD1(battery_percent_changed_kb, void(uint8_t)); | ||
| 17 | }; | ||
| 18 | |||
| 19 | class BatteryTest : public ::testing::Test { | ||
| 20 | public: | ||
| 21 | BatteryTest() { | ||
| 22 | _batteryDriverMock.reset(new ::testing::NiceMock<BatteryDriverMock>()); | ||
| 23 | } | ||
| 24 | virtual ~BatteryTest() { | ||
| 25 | _batteryDriverMock.reset(); | ||
| 26 | } | ||
| 27 | |||
| 28 | static std::unique_ptr<BatteryDriverMock> _batteryDriverMock; | ||
| 29 | }; | ||
| 30 | |||
| 31 | std::unique_ptr<BatteryDriverMock> BatteryTest::_batteryDriverMock; | ||
| 32 | |||
| 33 | extern "C" { | ||
| 34 | #include "quantum/battery/battery.h" | ||
| 35 | #include "timer.h" | ||
| 36 | |||
| 37 | void advance_time(uint32_t ms); | ||
| 38 | |||
| 39 | void battery_driver_init(void) { | ||
| 40 | if (BatteryTest::_batteryDriverMock) { | ||
| 41 | BatteryTest::_batteryDriverMock->battery_driver_init(); | ||
| 42 | } | ||
| 43 | } | ||
| 44 | |||
| 45 | uint8_t battery_driver_sample_percent(void) { | ||
| 46 | if (BatteryTest::_batteryDriverMock) { | ||
| 47 | return BatteryTest::_batteryDriverMock->battery_driver_sample_percent(); | ||
| 48 | } | ||
| 49 | return 255; | ||
| 50 | } | ||
| 51 | |||
| 52 | void battery_percent_changed_kb(uint8_t level) { | ||
| 53 | if (BatteryTest::_batteryDriverMock) { | ||
| 54 | BatteryTest::_batteryDriverMock->battery_percent_changed_kb(level); | ||
| 55 | } | ||
| 56 | } | ||
| 57 | } | ||
| 58 | |||
| 59 | TEST_F(BatteryTest, TestInit) { | ||
| 60 | // init driver and initial sample | ||
| 61 | EXPECT_CALL(*_batteryDriverMock, battery_driver_init()).Times(1); | ||
| 62 | EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(1); | ||
| 63 | |||
| 64 | battery_init(); | ||
| 65 | } | ||
| 66 | |||
| 67 | TEST_F(BatteryTest, TestSampleCached) { | ||
| 68 | // sample before timeout | ||
| 69 | EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(0); | ||
| 70 | |||
| 71 | advance_time(1); | ||
| 72 | battery_task(); | ||
| 73 | } | ||
| 74 | |||
| 75 | TEST_F(BatteryTest, TestSampleNotCached) { | ||
| 76 | // sample after timeout | ||
| 77 | EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(1); | ||
| 78 | |||
| 79 | advance_time(60000); | ||
| 80 | battery_task(); | ||
| 81 | } | ||
| 82 | |||
| 83 | TEST_F(BatteryTest, TestGet) { | ||
| 84 | // sample does not directly sample | ||
| 85 | EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(0); | ||
| 86 | |||
| 87 | battery_get_percent(); | ||
| 88 | } | ||
| 89 | |||
| 90 | TEST_F(BatteryTest, TestChanged) { | ||
| 91 | // callbacks on value changed | ||
| 92 | EXPECT_CALL(*_batteryDriverMock, battery_percent_changed_kb(_)).Times(1); | ||
| 93 | |||
| 94 | battery_task(); | ||
| 95 | advance_time(60000); | ||
| 96 | battery_task(); | ||
| 97 | } | ||
