/*
 * 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/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);
}
