summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt6
-rw-r--r--common.cmake6
-rw-r--r--lib/catch2/CMakeLists.txt5
-rw-r--r--lib/catch2/catch_runner.cpp28
-rw-r--r--lib/catch2/include/catch_runner.hpp6
-rw-r--r--test/CMakeLists.txt5
-rw-r--r--test/main/CMakeLists.txt5
-rw-r--r--test/main/main.cpp40
8 files changed, 79 insertions, 22 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a3c93d09..6e1b231b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,10 @@
cmake_minimum_required(VERSION 3.16)
include(common.cmake)
+# No exceptions in app builds (this is different in test builds).
+idf_build_set_property(COMPILE_OPTIONS "-DRESULT_DISABLE_EXCEPTIONS" APPEND)
+
+# Include all app components.
+list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/src")
+
project(gay-ipod-fw)
diff --git a/common.cmake b/common.cmake
index 59121379..7a947fdf 100644
--- a/common.cmake
+++ b/common.cmake
@@ -14,9 +14,6 @@ list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/result")
list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/lvgl")
list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/catch2")
-# Project components
-list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/src")
-
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
# Additional warnings used when compiling our components.
@@ -30,5 +27,4 @@ set(EXTRA_WARNINGS "-Wshadow" "-Wnon-virtual-dtor" "-Wunused"
# Extra build flags that should apply to the entire build. This should mostly
# just be used to setting flags that our external dependencies requires.
# Otherwise, prefer adding per-component build flags to keep things neat.
-idf_build_set_property(
- COMPILE_OPTIONS "-DRESULT_DISABLE_EXCEPTIONS -DLV_CONF_INCLUDE_SIMPLE" APPEND)
+idf_build_set_property(COMPILE_OPTIONS "-DLV_CONF_INCLUDE_SIMPLE" APPEND)
diff --git a/lib/catch2/CMakeLists.txt b/lib/catch2/CMakeLists.txt
index 2714474e..ac435074 100644
--- a/lib/catch2/CMakeLists.txt
+++ b/lib/catch2/CMakeLists.txt
@@ -1 +1,4 @@
-idf_component_register(SRCS "catch_runner.cpp" INCLUDE_DIRS "include")
+idf_component_register(
+ SRCS "catch_runner.cpp"
+ INCLUDE_DIRS "include"
+ REQUIRES "console")
diff --git a/lib/catch2/catch_runner.cpp b/lib/catch2/catch_runner.cpp
index 8cd5c120..2b8f9678 100644
--- a/lib/catch2/catch_runner.cpp
+++ b/lib/catch2/catch_runner.cpp
@@ -3,8 +3,28 @@
#define CATCH_CONFIG_RUNNER
#include "catch2/catch.hpp"
-void run_catch(void) {
- int argc = 1;
- char *argv = "catch2";
- Catch::Session().run( argc, &argv );
+#include <stdio.h>
+#include <string.h>
+#include "esp_console.h"
+#include "esp_log.h"
+#include "esp_system.h"
+
+// There must be exactly on Session instance at all times; attempting to destroy
+// this will result in memory corruption.
+static Catch::Session sCatchSession;
+
+int exec_catch2(int argc, char** argv) {
+ // Reset the existing configuration before applying a new one. Otherwise we
+ // will get the combination of all configs.
+ sCatchSession.configData() = Catch::ConfigData();
+
+ int result = sCatchSession.applyCommandLine(argc, argv);
+ if (result != 0) {
+ return result;
+ }
+
+ // Returns number of failures.
+ int failures = sCatchSession.run();
+
+ return failures > 0;
}
diff --git a/lib/catch2/include/catch_runner.hpp b/lib/catch2/include/catch_runner.hpp
index 527b7ff6..51e8c1bc 100644
--- a/lib/catch2/include/catch_runner.hpp
+++ b/lib/catch2/include/catch_runner.hpp
@@ -1,3 +1,7 @@
#pragma once
-void run_catch(void);
+/*
+ * Executes the Catch2 test runner as if called from the commandline on a
+ * standard unix-y system.
+ */
+int exec_catch2(int argc, char **argv);
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index ddcc063a..8d8229d3 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,9 +1,14 @@
cmake_minimum_required(VERSION 3.16)
include(../common.cmake)
+idf_build_set_property(
+ COMPILE_OPTIONS "-DCATCH_CONFIG_NO_POSIX_SIGNALS -DCATCH_CONFIG_FAST_COMPILE" APPEND)
+
# Treat warnings as errors for test purposes.
list(APPEND EXTRA_WARNINGS "-Werror")
+list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/src/drivers")
+
# List all components that include tests here.
set(TEST_COMPONENTS "drivers")
diff --git a/test/main/CMakeLists.txt b/test/main/CMakeLists.txt
index 687802d4..650dcc24 100644
--- a/test/main/CMakeLists.txt
+++ b/test/main/CMakeLists.txt
@@ -1 +1,4 @@
-idf_component_register(SRCS "main.cpp" INCLUDE_DIRS "." REQUIRE "catch2")
+idf_component_register(
+ SRCS "main.cpp"
+ INCLUDE_DIRS "."
+ REQUIRES "catch2")
diff --git a/test/main/main.cpp b/test/main/main.cpp
index 06e733c4..8dbbda8e 100644
--- a/test/main/main.cpp
+++ b/test/main/main.cpp
@@ -1,17 +1,37 @@
#include <stdio.h>
#include <string.h>
-static void print_banner(const char* text);
+#include "esp_console.h"
+#include "esp_log.h"
+#include "esp_system.h"
-extern "C" {
- void app_main(void)
- {
- print_banner("Running tests without [ignore] tag");
- }
-}
+#include "catch_runner.hpp"
-static void print_banner(const char* text)
-{
- printf("\n#### %s #####\n\n", text);
+void register_catch2() {
+ esp_console_cmd_t cmd{
+ .command = "catch",
+ .help = "Execute the catch2 test runner. Use -? for options.",
+ .hint = NULL,
+ .func = &exec_catch2,
+ .argtable = NULL};
+ esp_console_cmd_register(&cmd);
}
+extern "C" void app_main(void) {
+ esp_console_repl_t* repl = nullptr;
+ esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT();
+ repl_config.max_history_len = 16;
+ repl_config.prompt = " →";
+ repl_config.max_cmdline_length = 256;
+ // Catch2 needs a huge stack, since it does a lot of pretty string formatting.
+ repl_config.task_stack_size = 1024 * 24;
+
+ esp_console_dev_uart_config_t hw_config =
+ ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT();
+ ESP_ERROR_CHECK(esp_console_new_repl_uart(&hw_config, &repl_config, &repl));
+
+ esp_console_register_help_command();
+ register_catch2();
+
+ ESP_ERROR_CHECK(esp_console_start_repl(repl));
+}