aboutsummaryrefslogtreecommitdiff
path: root/quantum/battery/tests/battery_tests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/battery/tests/battery_tests.cpp')
-rw-r--r--quantum/battery/tests/battery_tests.cpp97
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 @@
+// Copyright 2025 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+
+using testing::_;
+
+class BatteryDriverMock {
+ public:
+ virtual ~BatteryDriverMock() {}
+
+ // mock methods
+ MOCK_METHOD0(battery_driver_init, void(void));
+ MOCK_METHOD0(battery_driver_sample_percent, uint8_t(void));
+ MOCK_METHOD1(battery_percent_changed_kb, void(uint8_t));
+};
+
+class BatteryTest : public ::testing::Test {
+ public:
+ BatteryTest() {
+ _batteryDriverMock.reset(new ::testing::NiceMock<BatteryDriverMock>());
+ }
+ virtual ~BatteryTest() {
+ _batteryDriverMock.reset();
+ }
+
+ static std::unique_ptr<BatteryDriverMock> _batteryDriverMock;
+};
+
+std::unique_ptr<BatteryDriverMock> BatteryTest::_batteryDriverMock;
+
+extern "C" {
+#include "quantum/battery/battery.h"
+#include "timer.h"
+
+void advance_time(uint32_t ms);
+
+void battery_driver_init(void) {
+ if (BatteryTest::_batteryDriverMock) {
+ BatteryTest::_batteryDriverMock->battery_driver_init();
+ }
+}
+
+uint8_t battery_driver_sample_percent(void) {
+ if (BatteryTest::_batteryDriverMock) {
+ return BatteryTest::_batteryDriverMock->battery_driver_sample_percent();
+ }
+ return 255;
+}
+
+void battery_percent_changed_kb(uint8_t level) {
+ if (BatteryTest::_batteryDriverMock) {
+ BatteryTest::_batteryDriverMock->battery_percent_changed_kb(level);
+ }
+}
+}
+
+TEST_F(BatteryTest, TestInit) {
+ // init driver and initial sample
+ EXPECT_CALL(*_batteryDriverMock, battery_driver_init()).Times(1);
+ EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(1);
+
+ battery_init();
+}
+
+TEST_F(BatteryTest, TestSampleCached) {
+ // sample before timeout
+ EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(0);
+
+ advance_time(1);
+ battery_task();
+}
+
+TEST_F(BatteryTest, TestSampleNotCached) {
+ // sample after timeout
+ EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(1);
+
+ advance_time(60000);
+ battery_task();
+}
+
+TEST_F(BatteryTest, TestGet) {
+ // sample does not directly sample
+ EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(0);
+
+ battery_get_percent();
+}
+
+TEST_F(BatteryTest, TestChanged) {
+ // callbacks on value changed
+ EXPECT_CALL(*_batteryDriverMock, battery_percent_changed_kb(_)).Times(1);
+
+ battery_task();
+ advance_time(60000);
+ battery_task();
+}