/*
 * Copyright (c) 2018 Google LLC.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/*
 * This is mainly a parse test that verifies that Zephyr header files
 * compile in C++ mode.
 */

#include <string.h>
#include <zephyr/types.h>
#include <stdbool.h>

#include <init.h>
#include <device.h>
#include <kernel.h>
#include <net/buf.h>
#include <sys/byteorder.h>
#include <sys/crc.h>
#include <sys/crc.h>

#include <drivers/gpio.h>
#include <drivers/led_strip.h>
#include <drivers/spi.h>
#include <drivers/uart.h>
#include <usb/usb_device.h>
#include <usb/class/usb_hid.h>
#include <drivers/watchdog.h>

#include <ztest.h>

class foo_class {
public:
	foo_class(int foo) : foo(foo) {}
	int get_foo() const { return foo;}
private:
	int foo;
};

struct foo {
	int v1;
};
/* Check that BUILD_ASSERT compiles. */
BUILD_ASSERT(sizeof(foo) == sizeof(int));

static struct foo foos[5];
/* Check that ARRAY_SIZE compiles. */
BUILD_ASSERT(ARRAY_SIZE(foos) == 5, "expected 5 elements");

/* Check that SYS_INIT() compiles. */
static int test_init(const struct device *dev)
{
	return 0;
}

SYS_INIT(test_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);

/* Check that global static object constructors are called. */
foo_class static_foo(12345678);

static void test_global_static_ctor(void)
{
	zassert_equal(static_foo.get_foo(), 12345678, NULL);
}

/*
 * Check that dynamic memory allocation (usually, the C library heap) is
 * functional when the global static object constructors are called.
 */
foo_class *static_init_dynamic_foo = new foo_class(87654321);

static void test_global_static_ctor_dynmem(void)
{
	zassert_equal(static_init_dynamic_foo->get_foo(), 87654321, NULL);
}

static void test_new_delete(void)
{
	foo_class *test_foo = new foo_class(10);
	zassert_equal(test_foo->get_foo(), 10, NULL);
	delete test_foo;
}

void test_main(void)
{
	ztest_test_suite(cpp_tests,
			 ztest_unit_test(test_global_static_ctor),
			 ztest_unit_test(test_global_static_ctor_dynmem),
			 ztest_unit_test(test_new_delete)
		);

	ztest_run_test_suite(cpp_tests);
}
