qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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 }