/*
 * Copyright (c) 2021 Leica Geosystems AG
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <ztest.h>
#include <drivers/sensor.h>

const struct device *get_fuel_gauge_device(void)
{
	const struct device *dev = DEVICE_DT_GET_ANY(sbs_sbs_gauge);

	zassert_true(device_is_ready(dev), "Fuel Gauge not found");

	return dev;
}

void test_get_sensor_value(int16_t channel)
{
	struct sensor_value value;
	const struct device *dev = get_fuel_gauge_device();

	zassert_true(sensor_sample_fetch_chan(dev, channel) < 0, "Sample fetch failed");
	zassert_true(sensor_channel_get(dev, channel, &value) < 0, "Get sensor value failed");
}

void test_get_sensor_value_not_supp(int16_t channel)
{
	const struct device *dev = get_fuel_gauge_device();

	zassert_true(sensor_sample_fetch_chan(dev, channel) == -ENOTSUP, "Invalid function");
}

void test_get_gauge_voltage(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_VOLTAGE);
}

void test_get_gauge_current(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_AVG_CURRENT);
}

void test_get_stdby_current(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_STDBY_CURRENT);
}

void test_get_max_load_current(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_MAX_LOAD_CURRENT);
}

void test_get_temperature(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_TEMP);
}

void test_get_soc(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_STATE_OF_CHARGE);
}

void test_get_full_charge_capacity(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_FULL_CHARGE_CAPACITY);
}

void test_get_rem_charge_capacity(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_REMAINING_CHARGE_CAPACITY);
}

void test_get_nom_avail_capacity(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_NOM_AVAIL_CAPACITY);
}

void test_get_full_avail_capacity(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_FULL_AVAIL_CAPACITY);
}

void test_get_average_power(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_AVG_POWER);
}

void test_get_average_time_to_empty(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_TIME_TO_EMPTY);
}

void test_get_average_time_to_full(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_TIME_TO_FULL);
}

void test_get_cycle_count(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_CYCLE_COUNT);
}

void test_get_design_voltage(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_DESIGN_VOLTAGE);
}

void test_get_desired_voltage(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_DESIRED_VOLTAGE);
}

void test_get_desired_chg_current(void)
{
	test_get_sensor_value(SENSOR_CHAN_GAUGE_DESIRED_CHARGING_CURRENT);
}

void test_not_supported_channel(void)
{
	uint8_t channel;

	for (channel = SENSOR_CHAN_ACCEL_X; channel <= SENSOR_CHAN_RPM; channel++) {
		test_get_sensor_value_not_supp(channel);
	}
	/* SOH is not defined in the SBS 1.1 specifications */
	test_get_sensor_value_not_supp(SENSOR_CHAN_GAUGE_STATE_OF_HEALTH);
}
