1 /*
2  * Copyright (C) 2024 OWL Services LLC. All rights reserved.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <stdlib.h>
8 
9 #include <zephyr/ztest.h>
10 #include <zephyr/kernel.h>
11 #include <zephyr/dsp/dsp.h>
12 #include <zephyr/dsp/utils.h>
13 
14 #include "common/test_common.h"
15 
16 #define DEFINE_MULTIPLE_TEST_CASES(constructor, variant, array)                                    \
17 	FOR_EACH_IDX_FIXED_ARG(constructor, (), variant, array)
18 
19 #define RE_DEFINE_TEST_VARIANT3(...) DEFINE_TEST_VARIANT3(__VA_ARGS__)
20 
21 #define DEFINE_SHIFT_F32_CASE(n, args, func)                                                       \
22 	RE_DEFINE_TEST_VARIANT3(shift_f32, func, n, __DEBRACKET args)
23 
24 #define TEST_CASES_SHIFT_F32_TO_Q7 (-1.0F, 0, -128), (1.0F, 0, 127), (1.0F, 7, 1), (-1.0F, 7, -1)
25 
26 #define TEST_CASES_SHIFT_F32_TO_Q15                                                                \
27 	(-1.0F, 0, -32768), (1.0F, 0, 32767), (1.0F, 15, 1), (-1.0F, 15, -1)
28 
29 #define TEST_CASES_SHIFT_F32_TO_Q31                                                                \
30 	(-1.0F, 0, -2147483648), (1.0F, 0, 2147483647), (1.0F, 31, 1), (-1.0F, 31, -1)
31 
test_shift_f32_to_q7(const float32_t data,const uint32_t shift,const DSP_DATA q31_t expected)32 static void test_shift_f32_to_q7(const float32_t data, const uint32_t shift,
33 				 const DSP_DATA q31_t expected)
34 {
35 	q7_t shifted_data = Z_SHIFT_F32_TO_Q7(data, shift);
36 
37 	zassert_equal(shifted_data, expected,
38 		      "Conversion failed: %f shifted by %d = %d (expected %d)", (double)data, shift,
39 		      shifted_data, expected);
40 }
41 
test_shift_f32_to_q15(const float32_t data,const uint32_t shift,const DSP_DATA q31_t expected)42 static void test_shift_f32_to_q15(const float32_t data, const uint32_t shift,
43 				  const DSP_DATA q31_t expected)
44 {
45 	q15_t shifted_data = Z_SHIFT_F32_TO_Q15(data, shift);
46 
47 	zassert_equal(shifted_data, expected,
48 		      "Conversion failed: %f shifted by %d = %d (expected %d)", (double)data, shift,
49 		      shifted_data, expected);
50 }
51 
test_shift_f32_to_q31(const float32_t data,const uint32_t shift,const DSP_DATA q31_t expected)52 static void test_shift_f32_to_q31(const float32_t data, const uint32_t shift,
53 				  const DSP_DATA q31_t expected)
54 {
55 	q31_t shifted_data = Z_SHIFT_F32_TO_Q31(data, shift);
56 
57 	zassert_equal(shifted_data, expected,
58 		      "Conversion failed: %f shifted by %d = %d (expected %d)", (double)data, shift,
59 		      shifted_data, expected);
60 }
61 
62 DEFINE_MULTIPLE_TEST_CASES(DEFINE_SHIFT_F32_CASE, shift_f32_to_q7, TEST_CASES_SHIFT_F32_TO_Q7)
63 DEFINE_MULTIPLE_TEST_CASES(DEFINE_SHIFT_F32_CASE, shift_f32_to_q15, TEST_CASES_SHIFT_F32_TO_Q15)
64 DEFINE_MULTIPLE_TEST_CASES(DEFINE_SHIFT_F32_CASE, shift_f32_to_q31, TEST_CASES_SHIFT_F32_TO_Q31)
65 
66 ZTEST_SUITE(shift_f32, NULL, NULL, NULL, NULL, NULL);
67