Create project skeleton

This commit is contained in:
Camden Dixie O'Brien 2024-12-25 18:08:50 +00:00
commit 21cf170b5a
8 changed files with 137 additions and 0 deletions

22
CMakeLists.txt Normal file
View File

@ -0,0 +1,22 @@
cmake_minimum_required(VERSION 3.10)
project(epec-mcu-emulator LANGUAGES C)
option(TESTS "Build unit tests" ON)
option(WERROR "Treat warnings as errors" OFF)
macro(set_default_target_options target)
set_property(TARGET ${target} PROPERTY C_STANDARD 11)
set_property(TARGET ${target} PROPERTY C_EXTENSIONS OFF)
target_compile_options(${target} PRIVATE -Wall -Wextra -pedantic)
if (${WERROR})
target_compile_options(${target} PRIVATE -Werror)
endif()
endmacro()
add_subdirectory(engine)
if (${TESTS})
enable_testing()
add_subdirectory(tests)
endif()

5
engine/CMakeLists.txt Normal file
View File

@ -0,0 +1,5 @@
add_library(engine
foo.c
)
set_default_target_options(engine)
target_include_directories(engine PUBLIC include)

11
engine/foo.c Normal file
View File

@ -0,0 +1,11 @@
/*
* Copyright (c) Camden Dixie O'Brien
* SPDX-License-Identifier: AGPL-3.0-only
*/
#include "foo.h"
int foo(void)
{
return 42;
}

11
engine/include/foo.h Normal file
View File

@ -0,0 +1,11 @@
/*
* Copyright (c) Camden Dixie O'Brien
* SPDX-License-Identifier: AGPL-3.0-only
*/
#ifndef FOO_H
#define FOO_H
int foo(void);
#endif

21
tests/CMakeLists.txt Normal file
View File

@ -0,0 +1,21 @@
add_library(testing testing.c)
set_default_target_options(testing)
target_include_directories(testing PUBLIC include)
function(add_test_suite source)
string(REGEX REPLACE ".c$" "" name ${source})
add_executable(${name} ${source})
set_default_target_options(${name})
target_link_libraries(${name} PRIVATE engine testing)
add_test(NAME ${name} COMMAND ${name})
endfunction()
function(add_test_suites)
foreach(source ${ARGN})
add_test_suite(${source})
endforeach()
endfunction()
add_test_suites(
foo_tests.c
)

20
tests/foo_tests.c Normal file
View File

@ -0,0 +1,20 @@
/*
* Copyright (c) Camden Dixie O'Brien
* SPDX-License-Identifier: AGPL-3.0-only
*/
#include "foo.h"
#include "testing.h"
static void test_foo(void)
{
const int res = foo();
ASSERT_EQ(42, res);
}
int main(void)
{
TESTING_BEGIN();
test_foo();
return TESTING_END();
}

39
tests/include/testing.h Normal file
View File

@ -0,0 +1,39 @@
/*
* Copyright (c) Camden Dixie O'Brien
* SPDX-License-Identifier: AGPL-3.0-only
*/
#ifndef TESTING_H
#define TESTING_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TESTING_BEGIN() fail_count = 0
#define TESTING_END() fail_count == 0 ? EXIT_SUCCESS : EXIT_FAILURE
#define FAIL \
do { \
++fail_count; \
printf("%s: FAIL @ %s:%d\n", __func__, __FILE__, __LINE__); \
return; \
} while (0)
#define ASSERT_FALSE(p) \
do { \
if (p) \
FAIL; \
} while (0)
#define ASSERT_TRUE(p) ASSERT_FALSE(!(p))
#define ASSERT_EQ(x, y) ASSERT_FALSE((x) != (y))
#define ASSERT_NE(x, y) ASSERT_FALSE((x) == (y))
#define ASSERT_LT(x, y) ASSERT_FALSE((x) <= (y))
#define ASSERT_NULL(p) ASSERT_FALSE(NULL != (p))
#define ASSERT_NOT_NULL(p) ASSERT_FALSE(NULL == (p))
#define ASSERT_MEM_EQ(p, q, n) ASSERT_FALSE(memcmp(p, q, n) != 0)
extern int fail_count;
#endif

8
tests/testing.c Normal file
View File

@ -0,0 +1,8 @@
/*
* Copyright (c) Camden Dixie O'Brien
* SPDX-License-Identifier: AGPL-3.0-only
*/
#include "testing.h"
int fail_count;