tests-cpp_ctors-trampoline.c 1.71 KB
/*
 * Copyright (C) 2016-2017 Eistec AB
 *
 * This file is subject to the terms and conditions of the GNU Lesser
 * General Public License v2.1. See the file LICENSE in the top level
 * directory for more details.
 */

#include "embUnit.h"
#include "embUnit/embUnit.h"
#include "tests-cpp_ctors.h"
#include "thread.h" /* For thread_getpid() */

long tests_cpp_ctors_global_value(void);
long tests_cpp_ctors_static_value(void);
long tests_cpp_ctors_local_value(long number);

extern volatile long tests_cpp_ctors_magic1;
extern volatile long tests_cpp_ctors_magic2;
extern void *tests_cpp_ctors_order[8];

static void tests_cpp_global_ctors(void)
{
    long expected = tests_cpp_ctors_magic1;
    long actual = tests_cpp_ctors_global_value();
    /* Test to ensure that global constructors have executed */
    TEST_ASSERT_EQUAL_INT(expected, actual);
}

static void tests_cpp_static_ctors(void)
{
    for (long i = 1; i < 10; ++i) {
        long expected = tests_cpp_ctors_magic2 + i;
        long actual = tests_cpp_ctors_static_value();
        TEST_ASSERT_EQUAL_INT(expected, actual);
    }
}

static void tests_cpp_local_ctors(void)
{
    /* Test to ensure that local constructors are executed properly */
    long expected = thread_getpid() + 1;
    long actual = tests_cpp_ctors_local_value(thread_getpid());
    TEST_ASSERT_EQUAL_INT(expected, actual);
}

Test *tests_cpp_ctors_tests(void)
{
    EMB_UNIT_TESTFIXTURES(fixtures) {
        new_TestFixture(tests_cpp_local_ctors),
        new_TestFixture(tests_cpp_global_ctors),
        new_TestFixture(tests_cpp_static_ctors),
    };

    EMB_UNIT_TESTCALLER(cpp_tests, NULL, NULL, fixtures);

    return (Test *)&cpp_tests;
}

void tests_cpp_ctors(void)
{
    TESTS_RUN(tests_cpp_ctors_tests());
}