/*
 * Copyright (c) 2021 Stephanos Ioannidis <root@stephanos.io>
 * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <ztest.h>
#include <zephyr.h>
#include <stdlib.h>
#include <arm_math.h>
#include "../../common/test_common.h"

#include "misc_q31.pat"

#define SNR_ERROR_THRESH		((float32_t)100)
#define ABS_ERROR_THRESH_Q31		((q31_t)2)
#define ABS_ERROR_THRESH_FAST_Q31	((q31_t)11)
#define ABS_ERROR_THRESH_LD_Q31		((q31_t)30)

static void test_arm_correlate_q31(
	size_t in1_length, size_t in2_length, const q31_t *ref,
	size_t ref_length)
{
	q31_t *output;

	/* Allocate output buffer */
	output = calloc(ref_length, sizeof(q31_t));

	/* Run test function */
	arm_correlate_q31(in_com1, in1_length, in_com2, in2_length, output);

	/* Validate output */
	zassert_true(
		test_snr_error_q31(ref_length, ref, output, SNR_ERROR_THRESH),
		ASSERT_MSG_SNR_LIMIT_EXCEED);

	zassert_true(
		test_near_equal_q31(ref_length, ref, output,
			ABS_ERROR_THRESH_Q31),
		ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);

	/* Free output buffer */
	free(output);
}

#define DEFINE_CORRELATE_TEST(a, b) \
	DEFINE_TEST_VARIANT4( \
		arm_correlate_q31, a##_##b, a, b, \
		ref_correlate_##a##_##b, ARRAY_SIZE(ref_correlate_##a##_##b))

DEFINE_CORRELATE_TEST(4, 1);
DEFINE_CORRELATE_TEST(4, 2);
DEFINE_CORRELATE_TEST(4, 3);
DEFINE_CORRELATE_TEST(4, 8);
DEFINE_CORRELATE_TEST(4, 11);
DEFINE_CORRELATE_TEST(5, 1);
DEFINE_CORRELATE_TEST(5, 2);
DEFINE_CORRELATE_TEST(5, 3);
DEFINE_CORRELATE_TEST(5, 8);
DEFINE_CORRELATE_TEST(5, 11);
DEFINE_CORRELATE_TEST(6, 1);
DEFINE_CORRELATE_TEST(6, 2);
DEFINE_CORRELATE_TEST(6, 3);
DEFINE_CORRELATE_TEST(6, 8);
DEFINE_CORRELATE_TEST(6, 11);
DEFINE_CORRELATE_TEST(9, 1);
DEFINE_CORRELATE_TEST(9, 2);
DEFINE_CORRELATE_TEST(9, 3);
DEFINE_CORRELATE_TEST(9, 8);
DEFINE_CORRELATE_TEST(9, 11);
DEFINE_CORRELATE_TEST(10, 1);
DEFINE_CORRELATE_TEST(10, 2);
DEFINE_CORRELATE_TEST(10, 3);
DEFINE_CORRELATE_TEST(10, 8);
DEFINE_CORRELATE_TEST(10, 11);
DEFINE_CORRELATE_TEST(11, 1);
DEFINE_CORRELATE_TEST(11, 2);
DEFINE_CORRELATE_TEST(11, 3);
DEFINE_CORRELATE_TEST(11, 8);
DEFINE_CORRELATE_TEST(11, 11);
DEFINE_CORRELATE_TEST(12, 1);
DEFINE_CORRELATE_TEST(12, 2);
DEFINE_CORRELATE_TEST(12, 3);
DEFINE_CORRELATE_TEST(12, 8);
DEFINE_CORRELATE_TEST(12, 11);
DEFINE_CORRELATE_TEST(13, 1);
DEFINE_CORRELATE_TEST(13, 2);
DEFINE_CORRELATE_TEST(13, 3);
DEFINE_CORRELATE_TEST(13, 8);
DEFINE_CORRELATE_TEST(13, 11);

static void test_arm_conv_q31(
	size_t in1_length, size_t in2_length, const q31_t *ref,
	size_t ref_length)
{
	q31_t *output;

	/* Allocate output buffer */
	output = calloc(ref_length, sizeof(q31_t));

	/* Run test function */
	arm_conv_q31(in_com1, in1_length, in_com2, in2_length, output);

	/* Validate output */
	zassert_true(
		test_snr_error_q31(ref_length, ref, output, SNR_ERROR_THRESH),
		ASSERT_MSG_SNR_LIMIT_EXCEED);

	zassert_true(
		test_near_equal_q31(ref_length, ref, output,
			ABS_ERROR_THRESH_Q31),
		ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);

	/* Free output buffer */
	free(output);
}

#define DEFINE_CONV_TEST(a, b) \
	DEFINE_TEST_VARIANT4( \
		arm_conv_q31, a##_##b, a, b, \
		ref_conv_##a##_##b, ARRAY_SIZE(ref_conv_##a##_##b))

DEFINE_CONV_TEST(4, 1);
DEFINE_CONV_TEST(4, 2);
DEFINE_CONV_TEST(4, 3);
DEFINE_CONV_TEST(4, 8);
DEFINE_CONV_TEST(4, 11);
DEFINE_CONV_TEST(5, 1);
DEFINE_CONV_TEST(5, 2);
DEFINE_CONV_TEST(5, 3);
DEFINE_CONV_TEST(5, 8);
DEFINE_CONV_TEST(5, 11);
DEFINE_CONV_TEST(6, 1);
DEFINE_CONV_TEST(6, 2);
DEFINE_CONV_TEST(6, 3);
DEFINE_CONV_TEST(6, 8);
DEFINE_CONV_TEST(6, 11);
DEFINE_CONV_TEST(9, 1);
DEFINE_CONV_TEST(9, 2);
DEFINE_CONV_TEST(9, 3);
DEFINE_CONV_TEST(9, 8);
DEFINE_CONV_TEST(9, 11);
DEFINE_CONV_TEST(10, 1);
DEFINE_CONV_TEST(10, 2);
DEFINE_CONV_TEST(10, 3);
DEFINE_CONV_TEST(10, 8);
DEFINE_CONV_TEST(10, 11);
DEFINE_CONV_TEST(11, 1);
DEFINE_CONV_TEST(11, 2);
DEFINE_CONV_TEST(11, 3);
DEFINE_CONV_TEST(11, 8);
DEFINE_CONV_TEST(11, 11);
DEFINE_CONV_TEST(12, 1);
DEFINE_CONV_TEST(12, 2);
DEFINE_CONV_TEST(12, 3);
DEFINE_CONV_TEST(12, 8);
DEFINE_CONV_TEST(12, 11);
DEFINE_CONV_TEST(13, 1);
DEFINE_CONV_TEST(13, 2);
DEFINE_CONV_TEST(13, 3);
DEFINE_CONV_TEST(13, 8);
DEFINE_CONV_TEST(13, 11);

#ifdef CONFIG_CMSIS_DSP_TEST_FILTERING_MISC_CONV_PARTIAL
static void test_arm_conv_partial_q31(
	size_t first, size_t in1_length, size_t in2_length, const q31_t *ref,
	size_t ref_length)
{
	q31_t *output;
	q31_t *temp;
	arm_status status;

	/* Allocate output buffer */
	output = calloc(first + ref_length, sizeof(q31_t));
	temp = calloc(ref_length, sizeof(q31_t));

	/* Run test function */
	status = arm_conv_partial_q31(
			in_partial1, in1_length, in_partial2, in2_length,
			output, first, ref_length);

	zassert_equal(status, ARM_MATH_SUCCESS,
		      ASSERT_MSG_INCORRECT_COMP_RESULT);

	memcpy(temp, &output[first], ref_length * sizeof(q31_t));

	/* Validate output */
	zassert_true(
		test_snr_error_q31(ref_length, ref, temp, SNR_ERROR_THRESH),
		ASSERT_MSG_SNR_LIMIT_EXCEED);

	zassert_true(
		test_near_equal_q31(ref_length, ref, temp,
			ABS_ERROR_THRESH_Q31),
		ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);

	/* Free output buffer */
	free(output);
	free(temp);
}

static void test_arm_conv_partial_fast_q31(
	size_t first, size_t in1_length, size_t in2_length, const q31_t *ref,
	size_t ref_length)
{
	q31_t *output;
	q31_t *temp;
	arm_status status;

	/* Allocate output buffer */
	output = calloc(first + ref_length, sizeof(q31_t));
	temp = calloc(ref_length, sizeof(q31_t));

	/* Run test function */
	status = arm_conv_partial_fast_q31(
			in_partial1, in1_length, in_partial2, in2_length,
			output, first, ref_length);

	zassert_equal(status, ARM_MATH_SUCCESS,
		      ASSERT_MSG_INCORRECT_COMP_RESULT);

	memcpy(temp, &output[first], ref_length * sizeof(q31_t));

	/* Validate output */
	zassert_true(
		test_snr_error_q31(ref_length, ref, temp, SNR_ERROR_THRESH),
		ASSERT_MSG_SNR_LIMIT_EXCEED);

	zassert_true(
		test_near_equal_q31(ref_length, ref, temp,
			ABS_ERROR_THRESH_FAST_Q31),
		ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);

	/* Free output buffer */
	free(output);
	free(temp);
}
#else
static void test_arm_conv_partial_q31(
	size_t first, size_t in1_length, size_t in2_length, const q31_t *ref,
	size_t ref_length)
{
	ztest_test_skip();
}

static void test_arm_conv_partial_fast_q31(
	size_t first, size_t in1_length, size_t in2_length, const q31_t *ref,
	size_t ref_length)
{
	ztest_test_skip();
}
#endif /* CONFIG_CMSIS_DSP_TEST_FILTERING_MISC_CONV_PARTIAL */

#define DEFINE_CONV_PARTIAL_TEST(a, b, c) \
	DEFINE_TEST_VARIANT5( \
		arm_conv_partial_q31, a##_##b##_##c, a, b, c, \
		ref_conv_partial_##a##_##b##_##c, \
		ARRAY_SIZE(ref_conv_partial_##a##_##b##_##c)) \
	DEFINE_TEST_VARIANT5( \
		arm_conv_partial_fast_q31, a##_##b##_##c, a, b, c, \
		ref_conv_partial_##a##_##b##_##c, \
		ARRAY_SIZE(ref_conv_partial_##a##_##b##_##c))

DEFINE_CONV_PARTIAL_TEST(3, 6, 8);
DEFINE_CONV_PARTIAL_TEST(9, 6, 8);
DEFINE_CONV_PARTIAL_TEST(7, 6, 8);

static void test_arm_levinson_durbin_q31(
	size_t in_length, size_t err_index, const q31_t *in, const q31_t *ref,
	size_t ref_length)
{
	q31_t *output;
	q31_t err;

	/* Allocate output buffer */
	output = calloc(ref_length, sizeof(q31_t));

	/* Run test function */
	arm_levinson_durbin_q31(in, output, &err, in_length);

	/* Validate output */
	zassert_true(
		test_snr_error_q31(ref_length, ref, output, SNR_ERROR_THRESH),
		ASSERT_MSG_SNR_LIMIT_EXCEED);

	zassert_true(
		test_near_equal_q31(ref_length, ref, output,
			ABS_ERROR_THRESH_LD_Q31),
		ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);

	zassert_true(
		test_near_equal_q31(1, &in_levinson_durbin_err[err_index],
			&err, ABS_ERROR_THRESH_LD_Q31),
		ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);

	/* Free output buffer */
	free(output);
}

#define DEFINE_LEVINSON_DURBIN_TEST(a, b) \
	DEFINE_TEST_VARIANT5( \
		arm_levinson_durbin_q31, a##_##b, a, b, \
		in_levinson_durbin_##a##_##b, \
		ref_levinson_durbin_##a##_##b, \
		ARRAY_SIZE(ref_levinson_durbin_##a##_##b))

DEFINE_LEVINSON_DURBIN_TEST(3, 0);
DEFINE_LEVINSON_DURBIN_TEST(8, 1);
DEFINE_LEVINSON_DURBIN_TEST(11, 2);

void test_filtering_misc_q31(void)
{
	ztest_test_suite(filtering_misc_q31,
		ztest_unit_test(test_arm_correlate_q31_4_1),
		ztest_unit_test(test_arm_correlate_q31_4_2),
		ztest_unit_test(test_arm_correlate_q31_4_3),
		ztest_unit_test(test_arm_correlate_q31_4_8),
		ztest_unit_test(test_arm_correlate_q31_4_11),
		ztest_unit_test(test_arm_correlate_q31_5_1),
		ztest_unit_test(test_arm_correlate_q31_5_2),
		ztest_unit_test(test_arm_correlate_q31_5_3),
		ztest_unit_test(test_arm_correlate_q31_5_8),
		ztest_unit_test(test_arm_correlate_q31_5_11),
		ztest_unit_test(test_arm_correlate_q31_6_1),
		ztest_unit_test(test_arm_correlate_q31_6_2),
		ztest_unit_test(test_arm_correlate_q31_6_3),
		ztest_unit_test(test_arm_correlate_q31_6_8),
		ztest_unit_test(test_arm_correlate_q31_6_11),
		ztest_unit_test(test_arm_correlate_q31_9_1),
		ztest_unit_test(test_arm_correlate_q31_9_2),
		ztest_unit_test(test_arm_correlate_q31_9_3),
		ztest_unit_test(test_arm_correlate_q31_9_8),
		ztest_unit_test(test_arm_correlate_q31_9_11),
		ztest_unit_test(test_arm_correlate_q31_10_1),
		ztest_unit_test(test_arm_correlate_q31_10_2),
		ztest_unit_test(test_arm_correlate_q31_10_3),
		ztest_unit_test(test_arm_correlate_q31_10_8),
		ztest_unit_test(test_arm_correlate_q31_10_11),
		ztest_unit_test(test_arm_correlate_q31_11_1),
		ztest_unit_test(test_arm_correlate_q31_11_2),
		ztest_unit_test(test_arm_correlate_q31_11_3),
		ztest_unit_test(test_arm_correlate_q31_11_8),
		ztest_unit_test(test_arm_correlate_q31_11_11),
		ztest_unit_test(test_arm_correlate_q31_12_1),
		ztest_unit_test(test_arm_correlate_q31_12_2),
		ztest_unit_test(test_arm_correlate_q31_12_3),
		ztest_unit_test(test_arm_correlate_q31_12_8),
		ztest_unit_test(test_arm_correlate_q31_12_11),
		ztest_unit_test(test_arm_correlate_q31_13_1),
		ztest_unit_test(test_arm_correlate_q31_13_2),
		ztest_unit_test(test_arm_correlate_q31_13_3),
		ztest_unit_test(test_arm_correlate_q31_13_8),
		ztest_unit_test(test_arm_correlate_q31_13_11),
		ztest_unit_test(test_arm_conv_q31_4_1),
		ztest_unit_test(test_arm_conv_q31_4_2),
		ztest_unit_test(test_arm_conv_q31_4_3),
		ztest_unit_test(test_arm_conv_q31_4_8),
		ztest_unit_test(test_arm_conv_q31_4_11),
		ztest_unit_test(test_arm_conv_q31_5_1),
		ztest_unit_test(test_arm_conv_q31_5_2),
		ztest_unit_test(test_arm_conv_q31_5_3),
		ztest_unit_test(test_arm_conv_q31_5_8),
		ztest_unit_test(test_arm_conv_q31_5_11),
		ztest_unit_test(test_arm_conv_q31_6_1),
		ztest_unit_test(test_arm_conv_q31_6_2),
		ztest_unit_test(test_arm_conv_q31_6_3),
		ztest_unit_test(test_arm_conv_q31_6_8),
		ztest_unit_test(test_arm_conv_q31_6_11),
		ztest_unit_test(test_arm_conv_q31_9_1),
		ztest_unit_test(test_arm_conv_q31_9_2),
		ztest_unit_test(test_arm_conv_q31_9_3),
		ztest_unit_test(test_arm_conv_q31_9_8),
		ztest_unit_test(test_arm_conv_q31_9_11),
		ztest_unit_test(test_arm_conv_q31_10_1),
		ztest_unit_test(test_arm_conv_q31_10_2),
		ztest_unit_test(test_arm_conv_q31_10_3),
		ztest_unit_test(test_arm_conv_q31_10_8),
		ztest_unit_test(test_arm_conv_q31_10_11),
		ztest_unit_test(test_arm_conv_q31_11_1),
		ztest_unit_test(test_arm_conv_q31_11_2),
		ztest_unit_test(test_arm_conv_q31_11_3),
		ztest_unit_test(test_arm_conv_q31_11_8),
		ztest_unit_test(test_arm_conv_q31_11_11),
		ztest_unit_test(test_arm_conv_q31_12_1),
		ztest_unit_test(test_arm_conv_q31_12_2),
		ztest_unit_test(test_arm_conv_q31_12_3),
		ztest_unit_test(test_arm_conv_q31_12_8),
		ztest_unit_test(test_arm_conv_q31_12_11),
		ztest_unit_test(test_arm_conv_q31_13_1),
		ztest_unit_test(test_arm_conv_q31_13_2),
		ztest_unit_test(test_arm_conv_q31_13_3),
		ztest_unit_test(test_arm_conv_q31_13_8),
		ztest_unit_test(test_arm_conv_q31_13_11),
		ztest_unit_test(test_arm_conv_partial_q31_3_6_8),
		ztest_unit_test(test_arm_conv_partial_q31_9_6_8),
		ztest_unit_test(test_arm_conv_partial_q31_7_6_8),
		ztest_unit_test(test_arm_conv_partial_fast_q31_3_6_8),
		ztest_unit_test(test_arm_conv_partial_fast_q31_9_6_8),
		ztest_unit_test(test_arm_conv_partial_fast_q31_7_6_8),
		ztest_unit_test(test_arm_levinson_durbin_q31_3_0),
		ztest_unit_test(test_arm_levinson_durbin_q31_8_1),
		ztest_unit_test(test_arm_levinson_durbin_q31_11_2)
		);

	ztest_run_test_suite(filtering_misc_q31);
}
