battery_tests.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright 2025 QMK
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "gtest/gtest.h"
  4. #include "gmock/gmock.h"
  5. using testing::_;
  6. class BatteryDriverMock {
  7. public:
  8. virtual ~BatteryDriverMock() {}
  9. // mock methods
  10. MOCK_METHOD0(battery_driver_init, void(void));
  11. MOCK_METHOD0(battery_driver_sample_percent, uint8_t(void));
  12. MOCK_METHOD1(battery_percent_changed_kb, void(uint8_t));
  13. };
  14. class BatteryTest : public ::testing::Test {
  15. public:
  16. BatteryTest() {
  17. _batteryDriverMock.reset(new ::testing::NiceMock<BatteryDriverMock>());
  18. }
  19. virtual ~BatteryTest() {
  20. _batteryDriverMock.reset();
  21. }
  22. static std::unique_ptr<BatteryDriverMock> _batteryDriverMock;
  23. };
  24. std::unique_ptr<BatteryDriverMock> BatteryTest::_batteryDriverMock;
  25. extern "C" {
  26. #include "quantum/battery/battery.h"
  27. #include "timer.h"
  28. void advance_time(uint32_t ms);
  29. void battery_driver_init(void) {
  30. if (BatteryTest::_batteryDriverMock) {
  31. BatteryTest::_batteryDriverMock->battery_driver_init();
  32. }
  33. }
  34. uint8_t battery_driver_sample_percent(void) {
  35. if (BatteryTest::_batteryDriverMock) {
  36. return BatteryTest::_batteryDriverMock->battery_driver_sample_percent();
  37. }
  38. return 255;
  39. }
  40. void battery_percent_changed_kb(uint8_t level) {
  41. if (BatteryTest::_batteryDriverMock) {
  42. BatteryTest::_batteryDriverMock->battery_percent_changed_kb(level);
  43. }
  44. }
  45. }
  46. TEST_F(BatteryTest, TestInit) {
  47. // init driver and initial sample
  48. EXPECT_CALL(*_batteryDriverMock, battery_driver_init()).Times(1);
  49. EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(1);
  50. battery_init();
  51. }
  52. TEST_F(BatteryTest, TestSampleCached) {
  53. // sample before timeout
  54. EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(0);
  55. advance_time(1);
  56. battery_task();
  57. }
  58. TEST_F(BatteryTest, TestSampleNotCached) {
  59. // sample after timeout
  60. EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(1);
  61. advance_time(60000);
  62. battery_task();
  63. }
  64. TEST_F(BatteryTest, TestGet) {
  65. // sample does not directly sample
  66. EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(0);
  67. battery_get_percent();
  68. }
  69. TEST_F(BatteryTest, TestChanged) {
  70. // callbacks on value changed
  71. EXPECT_CALL(*_batteryDriverMock, battery_percent_changed_kb(_)).Times(1);
  72. battery_task();
  73. advance_time(60000);
  74. battery_task();
  75. }