Files
bacnet_stack/test/bacnet/basic/sys/linear/src/main.c
T

136 lines
3.9 KiB
C

/**
* @file
* @brief test linear interpolation APIs
* @date 2010
*
* @section LICENSE
* Copyright (c) 2010 Steve Karg <skarg@users.sourceforge.net>
*
* SPDX-License-Identifier: MIT
*/
#include <zephyr/ztest.h>
#include <bacnet/basic/sys/linear.h>
/**
* @addtogroup bacnet_tests
* @{
*/
/**
* Unit Test for linear interpolation of floating point values, rounded
*/
void testLinearInterpolateRound(void)
{
uint16_t x2 = 0;
uint16_t y1 = 0;
uint16_t y2 = 0;
uint16_t y3 = 0;
uint16_t x2_test = 0;
y2 = linear_interpolate_round(1, 1, 65535, 1, 100);
zassert_equal(y2, 1, NULL);
y2 = linear_interpolate_round(1, 1, 65535, 100, 1);
zassert_equal(y2, 100, NULL);
y2 = linear_interpolate_round(1, 65535, 65535, 1, 100);
zassert_equal(y2, 100, NULL);
y2 = linear_interpolate_round(1, 65535, 65535, 100, 1);
zassert_equal(y2, 1, NULL);
y2 = linear_interpolate_round(1, (65535 / 2), 65535, 1, 100);
zassert_equal(y2, 50, NULL);
y2 = linear_interpolate_round(1, (65535 / 4), 65535, 1, 100);
zassert_equal(y2, 26, NULL);
y2 = linear_interpolate_round(1, ((65535 * 3) / 4), 65535, 1, 100);
zassert_equal(y2, 75, NULL);
y2 = linear_interpolate_round(1, 1, 100, 1, 65535);
zassert_equal(y2, 1, NULL);
y2 = linear_interpolate_round(1, 100, 100, 1, 65535);
zassert_equal(y2, 65535, NULL);
y2 = linear_interpolate_round(1, 100 / 2, 100, 1, 65535);
zassert_equal(y2, 32437, NULL);
/* scaling from percent to steps and back */
for (x2 = 1; x2 <= 100; x2++) {
y2 = linear_interpolate_round(1, x2, 100, 1, 65535);
x2_test = linear_interpolate_round(1, y2, 65535, 1, 100);
zassert_equal(x2, x2_test, NULL);
}
/* test for low-trim, high-trim and scaling from percent to steps */
for (x2 = 1; x2 <= 100; x2++) {
y1 = linear_interpolate_round(1, 20, 100, 1, 65535);
y3 = linear_interpolate_round(1, 80, 100, 1, 65535);
y2 = linear_interpolate_round(1, x2, 100, y1, y3);
x2_test = linear_interpolate_round(y1, y2, y3, 1, 100);
zassert_equal(x2, x2_test, "x2=%hu x2_test=%hu\n", x2, x2_test);
}
y2 = linear_interpolate_round(1, 1, 65535, 20, 80);
zassert_equal(y2, 20, NULL);
y2 = linear_interpolate_round(1, 1, 65535, 80, 20);
zassert_equal(y2, 80, NULL);
y2 = linear_interpolate_round(1, 65535, 65535, 20, 80);
zassert_equal(y2, 80, NULL);
y2 = linear_interpolate_round(1, 65535, 65535, 80, 20);
zassert_equal(y2, 20, NULL);
}
/**
* Unit Test for linear interpolation of integers
*/
void testLinearInterpolateInt(void)
{
uint16_t y2 = 0;
y2 = linear_interpolate_int(1, 1, 65535, 1, 100);
zassert_equal(y2, 1, NULL);
y2 = linear_interpolate_int(1, 1, 65535, 100, 1);
zassert_equal(y2, 100, NULL);
y2 = linear_interpolate_int(1, 65535, 65535, 1, 100);
zassert_equal(y2, 100, NULL);
y2 = linear_interpolate_int(1, 65535, 65535, 100, 1);
zassert_equal(y2, 1, NULL);
y2 = linear_interpolate_int(1, (65535 / 4), 65535, 1, 100);
zassert_equal(y2, 25, NULL);
y2 = linear_interpolate_int(1, (65535 / 2), 65535, 1, 100);
zassert_equal(y2, 50, NULL);
y2 = linear_interpolate_int(1, ((65535 * 3) / 4), 65535, 1, 100);
zassert_equal(y2, 75, NULL);
y2 = linear_interpolate_int(1, 1, 100, 1, 65535);
zassert_equal(y2, 1, NULL);
y2 = linear_interpolate_int(1, 100, 100, 1, 65535);
zassert_equal(y2, 65535, NULL);
y2 = linear_interpolate_int(1, 100 / 2, 100, 1, 65535);
zassert_equal(y2, 32437, NULL);
}
/**
* @}
*/
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST_SUITE(Linear_Interpolate, NULL, NULL, NULL, NULL, NULL);
#else
void test_main(void)
{
ztest_test_suite(
Linear_Interpolate, ztest_unit_test(testLinearInterpolateRound),
ztest_unit_test(testLinearInterpolateInt));
ztest_run_test_suite(Linear_Interpolate);
}
#endif