162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  HID to Linux Input mapping
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (c) 2022 José Expósito <jose.exposito89@gmail.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <kunit/test.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistatic void hid_test_input_set_battery_charge_status(struct kunit *test)
1162306a36Sopenharmony_ci{
1262306a36Sopenharmony_ci	struct hid_device *dev;
1362306a36Sopenharmony_ci	bool handled;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	dev = kunit_kzalloc(test, sizeof(*dev), GFP_KERNEL);
1662306a36Sopenharmony_ci	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	handled = hidinput_set_battery_charge_status(dev, HID_DG_HEIGHT, 0);
1962306a36Sopenharmony_ci	KUNIT_EXPECT_FALSE(test, handled);
2062306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, dev->battery_charge_status, POWER_SUPPLY_STATUS_UNKNOWN);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	handled = hidinput_set_battery_charge_status(dev, HID_BAT_CHARGING, 0);
2362306a36Sopenharmony_ci	KUNIT_EXPECT_TRUE(test, handled);
2462306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, dev->battery_charge_status, POWER_SUPPLY_STATUS_DISCHARGING);
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	handled = hidinput_set_battery_charge_status(dev, HID_BAT_CHARGING, 1);
2762306a36Sopenharmony_ci	KUNIT_EXPECT_TRUE(test, handled);
2862306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, dev->battery_charge_status, POWER_SUPPLY_STATUS_CHARGING);
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic void hid_test_input_get_battery_property(struct kunit *test)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	struct power_supply *psy;
3462306a36Sopenharmony_ci	struct hid_device *dev;
3562306a36Sopenharmony_ci	union power_supply_propval val;
3662306a36Sopenharmony_ci	int ret;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	dev = kunit_kzalloc(test, sizeof(*dev), GFP_KERNEL);
3962306a36Sopenharmony_ci	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
4062306a36Sopenharmony_ci	dev->battery_avoid_query = true;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	psy = kunit_kzalloc(test, sizeof(*psy), GFP_KERNEL);
4362306a36Sopenharmony_ci	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, psy);
4462306a36Sopenharmony_ci	psy->drv_data = dev;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	dev->battery_status = HID_BATTERY_UNKNOWN;
4762306a36Sopenharmony_ci	dev->battery_charge_status = POWER_SUPPLY_STATUS_CHARGING;
4862306a36Sopenharmony_ci	ret = hidinput_get_battery_property(psy, POWER_SUPPLY_PROP_STATUS, &val);
4962306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, ret, 0);
5062306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, val.intval, POWER_SUPPLY_STATUS_UNKNOWN);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	dev->battery_status = HID_BATTERY_REPORTED;
5362306a36Sopenharmony_ci	dev->battery_charge_status = POWER_SUPPLY_STATUS_CHARGING;
5462306a36Sopenharmony_ci	ret = hidinput_get_battery_property(psy, POWER_SUPPLY_PROP_STATUS, &val);
5562306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, ret, 0);
5662306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, val.intval, POWER_SUPPLY_STATUS_CHARGING);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	dev->battery_status = HID_BATTERY_REPORTED;
5962306a36Sopenharmony_ci	dev->battery_charge_status = POWER_SUPPLY_STATUS_DISCHARGING;
6062306a36Sopenharmony_ci	ret = hidinput_get_battery_property(psy, POWER_SUPPLY_PROP_STATUS, &val);
6162306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, ret, 0);
6262306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, val.intval, POWER_SUPPLY_STATUS_DISCHARGING);
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic struct kunit_case hid_input_tests[] = {
6662306a36Sopenharmony_ci	KUNIT_CASE(hid_test_input_set_battery_charge_status),
6762306a36Sopenharmony_ci	KUNIT_CASE(hid_test_input_get_battery_property),
6862306a36Sopenharmony_ci	{ }
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistatic struct kunit_suite hid_input_test_suite = {
7262306a36Sopenharmony_ci	.name = "hid_input",
7362306a36Sopenharmony_ci	.test_cases = hid_input_tests,
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cikunit_test_suite(hid_input_test_suite);
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ciMODULE_DESCRIPTION("HID input KUnit tests");
7962306a36Sopenharmony_ciMODULE_LICENSE("GPL");
8062306a36Sopenharmony_ciMODULE_AUTHOR("José Expósito <jose.exposito89@gmail.com>");
81