/* * Copyright (c) 2022 Nordic Semiconductor ASA * SPDX-License-Identifier: Apache-2.0 */ #include #include /* * +-----+-----+ * | Val | Idx | * +-----+-----+ * | -10 | 0 | * | -5 | 1 | * +-----+-----+ * | 0 | 2 | * | 1 | 3 | * +-----+-----+ * | 100 | 4 | * | 130 | 5 | * | 160 | 6 | * | 190 | 7 | * | 220 | 8 | * | 250 | 9 | * | 290 | 10 | * +-----+-----+ * | 400 | 11 | * | 400 | 12 | * +-----+-----+ */ static const struct linear_range r[] = { LINEAR_RANGE_INIT(-10, 5U, 0U, 1U), LINEAR_RANGE_INIT(0, 1U, 2U, 3U), LINEAR_RANGE_INIT(100, 30U, 4U, 10U), LINEAR_RANGE_INIT(400, 0U, 11U, 12U), }; static const size_t r_cnt = ARRAY_SIZE(r); ZTEST(linear_range, test_linear_range_init) { zassert_equal(r[0].min, -10); zassert_equal(r[0].step, 5U); zassert_equal(r[0].min_idx, 0U); zassert_equal(r[0].max_idx, 1U); } ZTEST(linear_range, test_linear_range_values_count) { zassert_equal(linear_range_values_count(&r[0]), 2U); zassert_equal(linear_range_values_count(&r[1]), 2U); zassert_equal(linear_range_values_count(&r[2]), 7U); zassert_equal(linear_range_values_count(&r[3]), 2U); zassert_equal(linear_range_group_values_count(r, r_cnt), 13U); } ZTEST(linear_range, test_linear_range_get_max_value) { zassert_equal(linear_range_get_max_value(&r[0]), -5); zassert_equal(linear_range_get_max_value(&r[1]), 1); zassert_equal(linear_range_get_max_value(&r[2]), 280); zassert_equal(linear_range_get_max_value(&r[3]), 400); } ZTEST(linear_range, test_linear_range_get_value) { int ret; int32_t val; ret = linear_range_get_value(&r[0], 0U, &val); zassert_equal(ret, 0); zassert_equal(val, -10); ret = linear_range_get_value(&r[0], 1U, &val); zassert_equal(ret, 0); zassert_equal(val, -5); ret = linear_range_get_value(&r[1], 2U, &val); zassert_equal(ret, 0); zassert_equal(val, 0); ret = linear_range_get_value(&r[1], 3U, &val); zassert_equal(ret, 0); zassert_equal(val, 1); ret = linear_range_get_value(&r[2], 4U, &val); zassert_equal(ret, 0); zassert_equal(val, 100); ret = linear_range_get_value(&r[2], 5U, &val); zassert_equal(ret, 0); zassert_equal(val, 130); ret = linear_range_get_value(&r[2], 6U, &val); zassert_equal(ret, 0); zassert_equal(val, 160); ret = linear_range_get_value(&r[2], 7U, &val); zassert_equal(ret, 0); zassert_equal(val, 190); ret = linear_range_get_value(&r[2], 8U, &val); zassert_equal(ret, 0); zassert_equal(val, 220); ret = linear_range_get_value(&r[2], 9U, &val); zassert_equal(ret, 0); zassert_equal(val, 250); ret = linear_range_get_value(&r[2], 10U, &val); zassert_equal(ret, 0); zassert_equal(val, 280); ret = linear_range_get_value(&r[3], 11U, &val); zassert_equal(ret, 0); zassert_equal(val, 400); ret = linear_range_get_value(&r[3], 12U, &val); zassert_equal(ret, 0); zassert_equal(val, 400); ret = linear_range_get_value(&r[1], 13U, &val); zassert_equal(ret, -EINVAL); ret = linear_range_group_get_value(r, r_cnt, 0U, &val); zassert_equal(ret, 0); zassert_equal(val, -10); ret = linear_range_group_get_value(r, r_cnt, 1U, &val); zassert_equal(ret, 0); zassert_equal(val, -5); ret = linear_range_group_get_value(r, r_cnt, 2U, &val); zassert_equal(ret, 0); zassert_equal(val, 0); ret = linear_range_group_get_value(r, r_cnt, 3U, &val); zassert_equal(ret, 0); zassert_equal(val, 1); ret = linear_range_group_get_value(r, r_cnt, 4U, &val); zassert_equal(ret, 0); zassert_equal(val, 100); ret = linear_range_group_get_value(r, r_cnt, 5U, &val); zassert_equal(ret, 0); zassert_equal(val, 130); ret = linear_range_group_get_value(r, r_cnt, 6U, &val); zassert_equal(ret, 0); zassert_equal(val, 160); ret = linear_range_group_get_value(r, r_cnt, 7U, &val); zassert_equal(ret, 0); zassert_equal(val, 190); ret = linear_range_group_get_value(r, r_cnt, 8U, &val); zassert_equal(ret, 0); zassert_equal(val, 220); ret = linear_range_group_get_value(r, r_cnt, 9U, &val); zassert_equal(ret, 0); zassert_equal(val, 250); ret = linear_range_group_get_value(r, r_cnt, 10U, &val); zassert_equal(ret, 0); zassert_equal(val, 280); ret = linear_range_group_get_value(r, r_cnt, 11U, &val); zassert_equal(ret, 0); zassert_equal(val, 400); ret = linear_range_group_get_value(r, r_cnt, 12U, &val); zassert_equal(ret, 0); zassert_equal(val, 400); } ZTEST(linear_range, test_linear_range_get_index) { int ret; uint16_t idx; /* negative */ ret = linear_range_get_index(&r[0], -10, &idx); zassert_equal(ret, 0); zassert_equal(idx, 0U); ret = linear_range_get_index(&r[0], -7, &idx); zassert_equal(ret, 0); zassert_equal(idx, 1U); /* out of range (< min, > max) */ ret = linear_range_get_index(&r[1], -1, &idx); zassert_equal(ret, -ERANGE); zassert_equal(idx, 2U); ret = linear_range_get_index(&r[1], 2, &idx); zassert_equal(ret, -ERANGE); zassert_equal(idx, 3U); /* range limits */ ret = linear_range_get_index(&r[2], 100, &idx); zassert_equal(ret, 0); zassert_equal(idx, 4U); ret = linear_range_get_index(&r[2], 280, &idx); zassert_equal(ret, 0); zassert_equal(idx, 10U); /* rounding: 120->130 (5) */ ret = linear_range_get_index(&r[2], 120, &idx); zassert_equal(ret, 0); zassert_equal(idx, 5U); /* always minimum index in constant ranges */ ret = linear_range_get_index(&r[3], 400, &idx); zassert_equal(ret, 0); zassert_equal(idx, 11U); /* group */ ret = linear_range_group_get_index(r, r_cnt, -20, &idx); zassert_equal(ret, -ERANGE); zassert_equal(idx, 0U); ret = linear_range_group_get_index(r, r_cnt, -6, &idx); zassert_equal(ret, 0); zassert_equal(idx, 1U); ret = linear_range_group_get_index(r, r_cnt, 0, &idx); zassert_equal(ret, 0); zassert_equal(idx, 2U); ret = linear_range_group_get_index(r, r_cnt, 50, &idx); zassert_equal(ret, -ERANGE); zassert_equal(idx, 4U); ret = linear_range_group_get_index(r, r_cnt, 200, &idx); zassert_equal(ret, 0); zassert_equal(idx, 8U); ret = linear_range_group_get_index(r, r_cnt, 400, &idx); zassert_equal(ret, 0); zassert_equal(idx, 11U); } ZTEST(linear_range, test_linear_range_get_win_index) { int ret; uint16_t idx; /* negative */ ret = linear_range_get_win_index(&r[0], -10, -6, &idx); zassert_equal(ret, 0); zassert_equal(idx, 0U); ret = linear_range_get_win_index(&r[0], -7, -5, &idx); zassert_equal(ret, 0); zassert_equal(idx, 1U); /* no intersection */ ret = linear_range_get_win_index(&r[0], -20, -15, &idx); zassert_equal(ret, -EINVAL); ret = linear_range_get_win_index(&r[0], -4, -3, &idx); zassert_equal(ret, -EINVAL); /* out of range, partial intersection (< min, > max) */ ret = linear_range_get_win_index(&r[1], -1, 0, &idx); zassert_equal(ret, -ERANGE); zassert_equal(idx, 2U); ret = linear_range_get_win_index(&r[1], 1, 2, &idx); zassert_equal(ret, -ERANGE); zassert_equal(idx, 3U); /* min/max equal */ ret = linear_range_get_win_index(&r[2], 100, 100, &idx); zassert_equal(ret, 0); zassert_equal(idx, 4U); /* always minimum index that satisfies >= min */ ret = linear_range_get_win_index(&r[2], 100, 180, &idx); zassert_equal(ret, 0); zassert_equal(idx, 4U); /* rounding: 120->130, maximum < 130 */ ret = linear_range_get_win_index(&r[2], 120, 140, &idx); zassert_equal(ret, 0); zassert_equal(idx, 5U); /* rounding: 120->130, maximum > 125 (range too narrow) */ ret = linear_range_get_win_index(&r[2], 120, 125, &idx); zassert_equal(ret, -EINVAL); ret = linear_range_group_get_win_index(r, r_cnt, 120, 125, &idx); zassert_equal(ret, -EINVAL); /* always minimum index in constant ranges */ ret = linear_range_get_win_index(&r[3], 400, 400, &idx); zassert_equal(ret, 0); zassert_equal(idx, 11U); /* group */ ret = linear_range_group_get_win_index(r, r_cnt, -10, -8, &idx); zassert_equal(ret, 0); zassert_equal(idx, 0U); ret = linear_range_group_get_win_index(r, r_cnt, 0, 1, &idx); zassert_equal(ret, 0); zassert_equal(idx, 2U); ret = linear_range_group_get_win_index(r, r_cnt, 1, 120, &idx); zassert_equal(ret, -ERANGE); zassert_equal(idx, 3U); ret = linear_range_group_get_win_index(r, r_cnt, 120, 140, &idx); zassert_equal(ret, 0); zassert_equal(idx, 5U); ret = linear_range_group_get_win_index(r, r_cnt, 140, 400, &idx); zassert_equal(ret, -ERANGE); zassert_equal(idx, 10U); ret = linear_range_group_get_win_index(r, r_cnt, 400, 400, &idx); zassert_equal(ret, 0); zassert_equal(idx, 11U); ret = linear_range_group_get_win_index(r, r_cnt, 300, 310, &idx); zassert_equal(ret, -EINVAL); } ZTEST_SUITE(linear_range, NULL, NULL, NULL, NULL, NULL);