root/drivers/net/wireless/intel/iwlwifi/tests/utils.c
// SPDX-License-Identifier: GPL-2.0-only
/*
 * KUnit tests for utilities
 *
 * Copyright (C) 2024-2025 Intel Corporation
 */
#include "../iwl-utils.h"
#include <kunit/test.h>

MODULE_IMPORT_NS("IWLWIFI");

static const struct average_neg_db_case {
        const char *desc;
        u8 neg_dbm[22];
        s8 result;
} average_neg_db_cases[] = {
        {
                .desc = "Smallest possible value, all filled",
                .neg_dbm = {
                        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
                        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
                        128, 128
                },
                .result = -128,
        },
        {
                .desc = "Biggest possible value, all filled",
                .neg_dbm = {
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0,
                },
                .result = 0,
        },
        {
                .desc = "Smallest possible value, partial filled",
                .neg_dbm = {
                        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
                        0xff, 0xff, 0xff, 0xff, 0xff,
                        0xff, 0xff, 0xff, 0xff, 0xff,
                        0xff, 0xff,
                },
                .result = -128,
        },
        {
                .desc = "Biggest possible value, partial filled",
                .neg_dbm = {
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0xff, 0xff, 0xff, 0xff, 0xff,
                        0xff, 0xff, 0xff, 0xff, 0xff,
                        0xff, 0xff,
                },
                .result = 0,
        },
        {
                .desc = "Adding -80dBm to -75dBm until it is still rounded to -79dBm",
                .neg_dbm = {
                        75, 80, 80, 80, 80, 80, 80, 80, 80, 80,
                        80, 80, 80, 80, 80, 80, 80, 0xff, 0xff, 0xff,
                        0xff, 0xff,
                },
                .result = -79,
        },
        {
                .desc = "Adding -80dBm to -75dBm until it is just rounded to -80dBm",
                .neg_dbm = {
                        75, 80, 80, 80, 80, 80, 80, 80, 80, 80,
                        80, 80, 80, 80, 80, 80, 80, 80, 0xff, 0xff,
                        0xff, 0xff,
                },
                .result = -80,
        },
};

KUNIT_ARRAY_PARAM_DESC(average_neg_db, average_neg_db_cases, desc)

static void test_average_neg_db(struct kunit *test)
{
        const struct average_neg_db_case *params = test->param_value;
        u8 reversed[ARRAY_SIZE(params->neg_dbm)];
        int i;

        /* Test the values in the given order */
        KUNIT_ASSERT_EQ(test,
                        iwl_average_neg_dbm(params->neg_dbm,
                                            ARRAY_SIZE(params->neg_dbm)),
                        params->result);

        /* Test in reverse order */
        for (i = 0; i < ARRAY_SIZE(params->neg_dbm); i++)
                reversed[ARRAY_SIZE(params->neg_dbm) - i - 1] =
                        params->neg_dbm[i];
        KUNIT_ASSERT_EQ(test,
                        iwl_average_neg_dbm(reversed,
                                            ARRAY_SIZE(params->neg_dbm)),
                        params->result);
}

static struct kunit_case average_db_case[] = {
        KUNIT_CASE_PARAM(test_average_neg_db, average_neg_db_gen_params),
        {}
};

static struct kunit_suite average_db = {
        .name = "iwl-average-db",
        .test_cases = average_db_case,
};

kunit_test_suite(average_db);