/*
 * Copyright (c) 2022 BayLibre SAS
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/ztest.h>
#include <zephyr/kernel.h>

/**
 * @brief Test the Z_POW2_CEIL() macro
 *
 * @defgroup test_pow2_ceil Z_POW2_CEIL() tests
 *
 * @ingroup all_tests
 *
 * @{
 * @}
 */

/**
 * @brief Verify compile-time constant results
 *
 * @ingroup test_pow2_ceil
 *
 * @details Check if static array allocations are sized as expected.
 */

char static_array1[Z_POW2_CEIL(1)];
char static_array2[Z_POW2_CEIL(2)];
char static_array3[Z_POW2_CEIL(3)];
char static_array4[Z_POW2_CEIL(4)];
char static_array5[Z_POW2_CEIL(5)];
char static_array7[Z_POW2_CEIL(7)];
char static_array8[Z_POW2_CEIL(8)];
char static_array9[Z_POW2_CEIL(9)];

BUILD_ASSERT(sizeof(static_array1) == 1);
BUILD_ASSERT(sizeof(static_array2) == 2);
BUILD_ASSERT(sizeof(static_array3) == 4);
BUILD_ASSERT(sizeof(static_array4) == 4);
BUILD_ASSERT(sizeof(static_array5) == 8);
BUILD_ASSERT(sizeof(static_array7) == 8);
BUILD_ASSERT(sizeof(static_array8) == 8);
BUILD_ASSERT(sizeof(static_array9) == 16);

/**
 * @brief Verify run-time non-constant results
 *
 * @ingroup test_pow2_ceil
 *
 * @details Check if run-time non-constant results are as expected.
 *          Use a volatile variable to prevent compiler optimizations.
 */

static void test_pow2_ceil_x(unsigned long test_value,
			     unsigned long expected_result)
{
	volatile unsigned int x = test_value;
	unsigned int result = Z_POW2_CEIL(x);

	zassert_equal(result, expected_result,
		      "ZPOW2_CEIL(%lu) returned %lu, expected %lu",
		      test_value, result, expected_result);
}

ZTEST(pow2, test_pow2_ceil)
{
	test_pow2_ceil_x(1, 1);
	test_pow2_ceil_x(2, 2);
	test_pow2_ceil_x(3, 4);
	test_pow2_ceil_x(4, 4);
	test_pow2_ceil_x(5, 8);
	test_pow2_ceil_x(7, 8);
	test_pow2_ceil_x(8, 8);
	test_pow2_ceil_x(9, 16);
}
