battery_tests.cpp (2445B)
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 }