/*
 * Copyright (c) 2019 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <array>
#include <functional>
#include <memory>
#include <vector>
#include <zephyr/ztest.h>
#include <zephyr/kernel.h>

BUILD_ASSERT(__cplusplus == 201703);

std::array<int, 4> array = {1, 2, 3, 4};
std::vector<int> vector;

ZTEST(libcxx_tests, test_array)
{
	zassert_equal(array.size(), 4, "unexpected size");
	zassert_equal(array[0], 1, "array[0] wrong");
	zassert_equal(array[3], 4, "array[3] wrong");

	std::array<uint8_t, 2> local = {1, 2};
	zassert_equal(local.size(), 2, "unexpected size");
	zassert_equal(local[0], 1, "local[0] wrong");
	zassert_equal(local[1], 2, "local[1] wrong");
}

ZTEST(libcxx_tests, test_vector)
{
	zassert_equal(vector.size(), 0, "vector init nonzero");
	for (auto v : array) {
		vector.push_back(v);
	}
	zassert_equal(vector.size(), array.size(), "vector store failed");
}

struct make_unique_data {
	static int ctors;
	static int dtors;
	int inst;

	make_unique_data () :
	inst{++ctors}
	{ }

	~make_unique_data ()
	{
		++dtors;
	}
};
int make_unique_data::ctors;
int make_unique_data::dtors;

ZTEST(libcxx_tests, test_make_unique)
{
	zassert_equal(make_unique_data::ctors, 0, "ctor count not initialized");
	zassert_equal(make_unique_data::dtors, 0, "dtor count not initialized");
	auto d = std::make_unique<make_unique_data>();
	zassert_true(static_cast<bool>(d), "allocation failed");
	zassert_equal(make_unique_data::ctors, 1, "ctr update failed");
	zassert_equal(d->inst, 1, "instance init failed");
	zassert_equal(make_unique_data::dtors, 0, "dtor count not zero");
	d.reset();
	zassert_false(d, "release failed");
	zassert_equal(make_unique_data::dtors, 1, "dtor count not incremented");
}

#if defined(CONFIG_CPP_EXCEPTIONS) && !defined(CONFIG_BOARD_M2GL025_MIV)
static void throw_exception(void)
{
	throw 42;
}

ZTEST(libcxx_tests, test_exception)
{
	try
	{
		throw_exception();
	}
	catch (int i)
	{
		zassert_equal(i, 42, "Incorrect exception value");
		return;
	}

	zassert_unreachable("Missing exception catch");
}
#else

ZTEST(libcxx_tests, test_exception)
{
	ztest_test_skip();
}
#endif

struct ThreadStack
{
	K_KERNEL_STACK_MEMBER(threadStack, 1024) {};
};

ZTEST(libcxx_tests, test_new_aligned)
{
	auto test_aligned = std::make_unique<ThreadStack>();
	zassert_not_null(test_aligned, "aligned allocation failed");
}

static void *libcxx_tests_setup(void)
{
	TC_PRINT("version %u\n", (uint32_t)__cplusplus);

	return NULL;
}
ZTEST_SUITE(libcxx_tests, NULL, libcxx_tests_setup, NULL, NULL, NULL);
