/*
 * Copyright (c) 2017 comsuisse AG
 *
 * SPDX-License-Identifier: Apache-2.0
 */


#include <zephyr/kernel.h>
#include <zephyr/ztest.h>
#include <zephyr/device.h>
#include "i2s_api_test.h"

void test_main(void)
{
	const struct device *dev_i2s_rx;
	const struct device *dev_i2s_tx;

	k_thread_access_grant(k_current_get(),
			      &rx_mem_slab, &tx_mem_slab);

	dev_i2s_rx = device_get_binding(I2S_DEV_NAME_RX);
	if (dev_i2s_rx != NULL) {
		k_object_access_grant(dev_i2s_rx, k_current_get());
	}

	dev_i2s_tx = device_get_binding(I2S_DEV_NAME_TX);
	if (dev_i2s_tx != NULL) {
		k_object_access_grant(dev_i2s_tx, k_current_get());
	}

	ztest_test_suite(i2s_loopback_test,
		ztest_unit_test(test_i2s_tx_transfer_configure_0),
		ztest_unit_test(test_i2s_rx_transfer_configure_0),
		ztest_unit_test(test_i2s_transfer_short),
		ztest_unit_test(test_i2s_transfer_long),
		ztest_unit_test(test_i2s_rx_sync_start),
		ztest_unit_test(test_i2s_rx_empty_timeout),
		ztest_unit_test(test_i2s_transfer_restart),
		ztest_unit_test(test_i2s_transfer_rx_overrun),
		ztest_unit_test(test_i2s_transfer_tx_underrun));
	ztest_run_test_suite(i2s_loopback_test);

	ztest_test_suite(i2s_states_test,
		ztest_unit_test(test_i2s_tx_transfer_configure_1),
		ztest_unit_test(test_i2s_rx_transfer_configure_1),
		ztest_unit_test(test_i2s_state_not_ready_neg),
		ztest_unit_test(test_i2s_state_ready_neg),
		ztest_unit_test(test_i2s_state_running_neg),
		ztest_unit_test(test_i2s_state_stopping_neg),
		ztest_unit_test(test_i2s_state_error_neg));
	ztest_run_test_suite(i2s_states_test);

	ztest_test_suite(i2s_dir_both_loopback_test,
		ztest_unit_test(test_i2s_dir_both_transfer_configure_0),
		ztest_unit_test(test_i2s_dir_both_transfer_short),
		ztest_unit_test(test_i2s_dir_both_transfer_long),
		ztest_unit_test(test_i2s_dir_both_transfer_restart),
		ztest_unit_test(test_i2s_dir_both_transfer_rx_overrun),
		ztest_unit_test(test_i2s_dir_both_transfer_tx_underrun));
	ztest_run_test_suite(i2s_dir_both_loopback_test);

	ztest_test_suite(i2s_dir_both_states_test,
		ztest_unit_test(test_i2s_dir_both_transfer_configure_1),
		ztest_unit_test(test_i2s_dir_both_state_running_neg),
		ztest_unit_test(test_i2s_dir_both_state_stopping_neg),
		ztest_unit_test(test_i2s_dir_both_state_error_neg));
	ztest_run_test_suite(i2s_dir_both_states_test);

	/* Now run all tests in user mode */
	ztest_test_suite(i2s_user_loopback_test,
		ztest_user_unit_test(test_i2s_tx_transfer_configure_0),
		ztest_user_unit_test(test_i2s_rx_transfer_configure_0),
		ztest_user_unit_test(test_i2s_transfer_short),
		ztest_user_unit_test(test_i2s_transfer_long),
		ztest_user_unit_test(test_i2s_rx_sync_start),
		ztest_user_unit_test(test_i2s_rx_empty_timeout),
		ztest_user_unit_test(test_i2s_transfer_restart),
		ztest_user_unit_test(test_i2s_transfer_tx_underrun),
		ztest_user_unit_test(test_i2s_transfer_rx_overrun));
	ztest_run_test_suite(i2s_user_loopback_test);

	ztest_test_suite(i2s_user_states_test,
		ztest_user_unit_test(test_i2s_tx_transfer_configure_1),
		ztest_user_unit_test(test_i2s_rx_transfer_configure_1),
		ztest_user_unit_test(test_i2s_state_not_ready_neg),
		ztest_user_unit_test(test_i2s_state_ready_neg),
		ztest_user_unit_test(test_i2s_state_running_neg),
		ztest_user_unit_test(test_i2s_state_stopping_neg),
		ztest_user_unit_test(test_i2s_state_error_neg));
	ztest_run_test_suite(i2s_user_states_test);

	ztest_test_suite(i2s_dir_both_user_loopback_test,
		ztest_user_unit_test(test_i2s_dir_both_transfer_configure_0),
		ztest_user_unit_test(test_i2s_dir_both_transfer_short),
		ztest_user_unit_test(test_i2s_dir_both_transfer_long),
		ztest_user_unit_test(test_i2s_dir_both_transfer_restart),
		ztest_user_unit_test(test_i2s_dir_both_transfer_rx_overrun),
		ztest_user_unit_test(test_i2s_dir_both_transfer_tx_underrun));
	ztest_run_test_suite(i2s_dir_both_user_loopback_test);

	ztest_test_suite(i2s_dir_both_user_states_test,
		ztest_user_unit_test(test_i2s_dir_both_transfer_configure_1),
		ztest_user_unit_test(test_i2s_dir_both_state_running_neg),
		ztest_user_unit_test(test_i2s_dir_both_state_stopping_neg),
		ztest_user_unit_test(test_i2s_dir_both_state_error_neg));
	ztest_run_test_suite(i2s_dir_both_user_states_test);
}
