// SPDX-License-Identifier: GPL-2.0+
/*
 *  HID to Linux Input mapping
 *
 *  Copyright (c) 2022 José Expósito <jose.exposito89@gmail.com>
 */

#include <kunit/test.h>

static void hid_test_input_update_battery_charge_status(struct kunit *test)
{
	struct hid_battery *bat;
	bool handled;

	bat = kunit_kzalloc(test, sizeof(*bat), GFP_KERNEL);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bat);

	handled = hidinput_update_battery_charge_status(bat, HID_DG_HEIGHT, 0);
	KUNIT_EXPECT_FALSE(test, handled);
	KUNIT_EXPECT_EQ(test, bat->charge_status, POWER_SUPPLY_STATUS_UNKNOWN);

	handled = hidinput_update_battery_charge_status(bat, HID_BAT_CHARGING, 0);
	KUNIT_EXPECT_TRUE(test, handled);
	KUNIT_EXPECT_EQ(test, bat->charge_status, POWER_SUPPLY_STATUS_DISCHARGING);

	handled = hidinput_update_battery_charge_status(bat, HID_BAT_CHARGING, 1);
	KUNIT_EXPECT_TRUE(test, handled);
	KUNIT_EXPECT_EQ(test, bat->charge_status, POWER_SUPPLY_STATUS_CHARGING);
}

static void hid_test_input_get_battery_property(struct kunit *test)
{
	struct power_supply *psy;
	struct hid_battery *bat;
	struct hid_device *dev;
	union power_supply_propval val;
	int ret;

	dev = kunit_kzalloc(test, sizeof(*dev), GFP_KERNEL);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);

	bat = kunit_kzalloc(test, sizeof(*bat), GFP_KERNEL);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bat);
	bat->dev = dev;
	bat->avoid_query = true;

	psy = kunit_kzalloc(test, sizeof(*psy), GFP_KERNEL);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, psy);
	psy->drv_data = bat;

	bat->status = HID_BATTERY_UNKNOWN;
	bat->charge_status = POWER_SUPPLY_STATUS_CHARGING;
	ret = hidinput_get_battery_property(psy, POWER_SUPPLY_PROP_STATUS, &val);
	KUNIT_EXPECT_EQ(test, ret, 0);
	KUNIT_EXPECT_EQ(test, val.intval, POWER_SUPPLY_STATUS_UNKNOWN);

	bat->status = HID_BATTERY_REPORTED;
	bat->charge_status = POWER_SUPPLY_STATUS_CHARGING;
	ret = hidinput_get_battery_property(psy, POWER_SUPPLY_PROP_STATUS, &val);
	KUNIT_EXPECT_EQ(test, ret, 0);
	KUNIT_EXPECT_EQ(test, val.intval, POWER_SUPPLY_STATUS_CHARGING);

	bat->status = HID_BATTERY_REPORTED;
	bat->charge_status = POWER_SUPPLY_STATUS_DISCHARGING;
	ret = hidinput_get_battery_property(psy, POWER_SUPPLY_PROP_STATUS, &val);
	KUNIT_EXPECT_EQ(test, ret, 0);
	KUNIT_EXPECT_EQ(test, val.intval, POWER_SUPPLY_STATUS_DISCHARGING);
}

static struct kunit_case hid_input_tests[] = {
	KUNIT_CASE(hid_test_input_update_battery_charge_status),
	KUNIT_CASE(hid_test_input_get_battery_property),
	{ }
};

static struct kunit_suite hid_input_test_suite = {
	.name = "hid_input",
	.test_cases = hid_input_tests,
};

kunit_test_suite(hid_input_test_suite);

MODULE_DESCRIPTION("HID input KUnit tests");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("José Expósito <jose.exposito89@gmail.com>");
