| @@ -0,0 +1,10 @@ | |||||
| .pio/ | |||||
| .vscode/ | |||||
| .idea/ | |||||
| *.elf | |||||
| *.bin | |||||
| *.map | |||||
| *.o | |||||
| *.obj | |||||
| *.exe | |||||
| *.log | |||||
| @@ -1,41 +0,0 @@ | |||||
| #include <unity_config.h> | |||||
| #if !defined(UNITY_WEAK_ATTRIBUTE) && !defined(UNITY_WEAK_PRAGMA) | |||||
| # if defined(__GNUC__) || defined(__ghs__) /* __GNUC__ includes clang */ | |||||
| # if !(defined(__WIN32__) && defined(__clang__)) && !defined(__TMS470__) | |||||
| # define UNITY_WEAK_ATTRIBUTE __attribute__((weak)) | |||||
| # endif | |||||
| # endif | |||||
| #endif | |||||
| #ifdef __cplusplus | |||||
| extern "C" | |||||
| { | |||||
| #endif | |||||
| #ifdef UNITY_WEAK_ATTRIBUTE | |||||
| UNITY_WEAK_ATTRIBUTE void setUp(void) { } | |||||
| UNITY_WEAK_ATTRIBUTE void tearDown(void) { } | |||||
| UNITY_WEAK_ATTRIBUTE void suiteSetUp(void) { } | |||||
| UNITY_WEAK_ATTRIBUTE int suiteTearDown(int num_failures) { return num_failures; } | |||||
| #elif defined(UNITY_WEAK_PRAGMA) | |||||
| #pragma weak setUp | |||||
| void setUp(void) { } | |||||
| #pragma weak tearDown | |||||
| void tearDown(void) { } | |||||
| #pragma weak suiteSetUp | |||||
| void suiteSetUp(void) { } | |||||
| #pragma weak suiteTearDown | |||||
| int suiteTearDown(int num_failures) { return num_failures; } | |||||
| #endif | |||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif /* extern "C" */ | |||||
| #include <stdio.h> | |||||
| void unityOutputStart(unsigned long baudrate) { (void) baudrate; } | |||||
| void unityOutputChar(unsigned int c) { putchar(c); } | |||||
| void unityOutputFlush(void) { fflush(stdout); } | |||||
| void unityOutputComplete(void) { } | |||||
| @@ -1,31 +0,0 @@ | |||||
| #ifndef UNITY_CONFIG_H | |||||
| #define UNITY_CONFIG_H | |||||
| #ifndef NULL | |||||
| #ifndef __cplusplus | |||||
| #define NULL (void*)0 | |||||
| #else | |||||
| #define NULL 0 | |||||
| #endif | |||||
| #endif | |||||
| #ifdef __cplusplus | |||||
| extern "C" | |||||
| { | |||||
| #endif | |||||
| void unityOutputStart(unsigned long); | |||||
| void unityOutputChar(unsigned int); | |||||
| void unityOutputFlush(void); | |||||
| void unityOutputComplete(void); | |||||
| #define UNITY_OUTPUT_START() unityOutputStart((unsigned long) 115200) | |||||
| #define UNITY_OUTPUT_CHAR(c) unityOutputChar(c) | |||||
| #define UNITY_OUTPUT_FLUSH() unityOutputFlush() | |||||
| #define UNITY_OUTPUT_COMPLETE() unityOutputComplete() | |||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif /* extern "C" */ | |||||
| #endif /* UNITY_CONFIG_H */ | |||||
| @@ -1 +0,0 @@ | |||||
| 4def52d403ba6c4d9eee4b23d91cd36ab4086fa5 | |||||
| @@ -1,27 +0,0 @@ | |||||
| ############################################################################### | |||||
| # Unity Project - A Test Framework for C | |||||
| # .editorconfig - F. Zahn 2019 | |||||
| ############################################################################### | |||||
| # This is the topmost .editorconfig file | |||||
| root = true | |||||
| # Settings that apply to all languages / files | |||||
| [*] | |||||
| charset = utf-8 | |||||
| indent_size = 4 | |||||
| indent_style = space | |||||
| insert_final_newline = true | |||||
| trim_trailing_whitespace = true | |||||
| [*.md] | |||||
| trim_trailing_whitespace = false | |||||
| [*.txt] | |||||
| trim_trailing_whitespace = false | |||||
| [*.rb] | |||||
| indent_size = 2 | |||||
| [*.yml] | |||||
| indent_size = 2 | |||||
| @@ -1,31 +0,0 @@ | |||||
| * text=auto | |||||
| # These files are text and should be normalized (convert crlf to lf) | |||||
| *.rb text | |||||
| *.test text | |||||
| *.c text | |||||
| *.cpp text | |||||
| *.h text | |||||
| *.txt text | |||||
| *.yml text | |||||
| *.s79 text | |||||
| *.bat text | |||||
| *.xcl text | |||||
| *.inc text | |||||
| *.info text | |||||
| *.md text | |||||
| makefile text | |||||
| rakefile text | |||||
| meson.build text | |||||
| #These files are binary and should not be normalized | |||||
| *.doc binary | |||||
| *.odt binary | |||||
| *.pdf binary | |||||
| *.ewd binary | |||||
| *.eww binary | |||||
| *.dni binary | |||||
| *.wsdt binary | |||||
| *.dbgdt binary | |||||
| *.mac binary | |||||
| @@ -1,35 +0,0 @@ | |||||
| --- | |||||
| # Continuous Integration Workflow: Test case suite run + validation build check | |||||
| name: CI | |||||
| # Controls when the action will run. | |||||
| # Triggers the workflow on push or pull request events but only for the master branch | |||||
| on: | |||||
| push: | |||||
| branches: [ master ] | |||||
| pull_request: | |||||
| branches: [ master ] | |||||
| jobs: | |||||
| # Job: Unit test suite | |||||
| unit-tests: | |||||
| name: "Unit Tests" | |||||
| runs-on: ubuntu-latest | |||||
| strategy: | |||||
| matrix: | |||||
| ruby: ['2.7', '3.0', '3.1', '3.2'] | |||||
| steps: | |||||
| # Install Ruby Testing Tools | |||||
| - name: Setup Ruby Testing Tools | |||||
| run: | | |||||
| sudo gem install rspec | |||||
| sudo gem install rubocop -v 1.57.2 | |||||
| # Checks out repository under $GITHUB_WORKSPACE | |||||
| - name: Checkout Latest Repo | |||||
| uses: actions/checkout@v4 | |||||
| # Run Tests | |||||
| - name: Run All Unit Tests | |||||
| run: | | |||||
| cd test && rake ci | |||||
| @@ -1,19 +0,0 @@ | |||||
| build/ | |||||
| builddir/ | |||||
| test/sandbox | |||||
| .DS_Store | |||||
| examples/example_1/subprojects/unity | |||||
| examples/example_1/test1.exe | |||||
| examples/example_1/test2.exe | |||||
| examples/example_2/all_tests.exe | |||||
| examples/example_1/test1.out | |||||
| examples/example_1/test2.out | |||||
| examples/example_2/all_tests.out | |||||
| examples/example_4/builddir | |||||
| *.sublime-project | |||||
| *.sublime-workspace | |||||
| *.cmake | |||||
| Makefile | |||||
| CMakeFiles | |||||
| CMakeCache.txt | |||||
| !unityConfig.cmake | |||||
| @@ -1 +0,0 @@ | |||||
| {"type": "library", "name": "Unity", "version": "2.6.1", "spec": {"owner": "throwtheswitch", "id": 13894, "name": "Unity", "requirements": null, "uri": null}} | |||||
| @@ -1,172 +0,0 @@ | |||||
| ################################################################################### | |||||
| # # | |||||
| # NAME: CMakeLists.txt # | |||||
| # # | |||||
| # AUTHOR: Mike Karlesky, Mark VanderVoord, Greg Williams. # | |||||
| # WRITTEN BY: Michael Brockus. # | |||||
| # # | |||||
| # License: MIT # | |||||
| # # | |||||
| ################################################################################### | |||||
| cmake_minimum_required(VERSION 3.12) | |||||
| # Read src/unity.h file and get project version from it | |||||
| set(UNITY_HEADER "src/unity.h") | |||||
| file(STRINGS "${UNITY_HEADER}" UNITY_HEADER_CONTENT | |||||
| REGEX "^#define UNITY_VERSION_(MAJOR|MINOR|BUILD) +[0-9]+$" | |||||
| ) | |||||
| set(UNITY_HEADER_VERSION_MAJOR 0) | |||||
| set(UNITY_HEADER_VERSION_MINOR 0) | |||||
| set(UNITY_HEADER_VERSION_BUILD 0) | |||||
| foreach(VERSION_LINE IN LISTS UNITY_HEADER_CONTENT) | |||||
| foreach(VERSION_PART MAJOR MINOR BUILD) | |||||
| string(CONCAT REGEX_STRING "#define UNITY_VERSION_" | |||||
| "${VERSION_PART}" | |||||
| " +([0-9]+)" | |||||
| ) | |||||
| if(VERSION_LINE MATCHES "${REGEX_STRING}") | |||||
| set(UNITY_HEADER_VERSION_${VERSION_PART} "${CMAKE_MATCH_1}") | |||||
| endif() | |||||
| endforeach() | |||||
| endforeach() | |||||
| project(unity | |||||
| VERSION ${UNITY_HEADER_VERSION_MAJOR}.${UNITY_HEADER_VERSION_MINOR}.${UNITY_HEADER_VERSION_BUILD} | |||||
| LANGUAGES C | |||||
| DESCRIPTION "C Unit testing framework." | |||||
| ) | |||||
| # Options to Build With Extras ------------------------------------------------- | |||||
| option(UNITY_EXTENSION_FIXTURE "Compiles Unity with the \"fixture\" extension." OFF) | |||||
| option(UNITY_EXTENSION_MEMORY "Compiles Unity with the \"memory\" extension." OFF) | |||||
| set(UNITY_EXTENSION_FIXTURE_ENABLED $<BOOL:${UNITY_EXTENSION_FIXTURE}>) | |||||
| set(UNITY_EXTENSION_MEMORY_ENABLED $<OR:${UNITY_EXTENSION_FIXTURE_ENABLED},$<BOOL:${UNITY_EXTENSION_MEMORY}>>) | |||||
| if(${UNITY_EXTENSION_FIXTURE}) | |||||
| message(STATUS "Unity: Building with the fixture extension.") | |||||
| endif() | |||||
| if(${UNITY_EXTENSION_MEMORY}) | |||||
| message(STATUS "Unity: Building with the memory extension.") | |||||
| endif() | |||||
| # Main target ------------------------------------------------------------------ | |||||
| add_library(${PROJECT_NAME} STATIC) | |||||
| add_library(${PROJECT_NAME}::framework ALIAS ${PROJECT_NAME}) | |||||
| # Includes --------------------------------------------------------------------- | |||||
| include(GNUInstallDirs) | |||||
| include(CMakePackageConfigHelpers) | |||||
| target_sources(${PROJECT_NAME} | |||||
| PRIVATE | |||||
| src/unity.c | |||||
| $<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:extras/fixture/src/unity_fixture.c> | |||||
| $<$<BOOL:${UNITY_EXTENSION_MEMORY_ENABLED}>:extras/memory/src/unity_memory.c> | |||||
| ) | |||||
| target_include_directories(${PROJECT_NAME} | |||||
| PUBLIC | |||||
| $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src> | |||||
| $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> | |||||
| $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}> | |||||
| $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> | |||||
| $<BUILD_INTERFACE:$<$<BOOL:${UNITY_EXTENSION_MEMORY_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/memory/src>> | |||||
| $<BUILD_INTERFACE:$<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/fixture/src>> | |||||
| ) | |||||
| set(${PROJECT_NAME}_PUBLIC_HEADERS | |||||
| src/unity.h | |||||
| src/unity_internals.h | |||||
| $<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/fixture/src/unity_fixture.h> | |||||
| $<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/fixture/src/unity_fixture_internals.h> | |||||
| $<$<BOOL:${UNITY_EXTENSION_MEMORY_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/memory/src/unity_memory.h> | |||||
| ) | |||||
| set_target_properties(${PROJECT_NAME} | |||||
| PROPERTIES | |||||
| C_STANDARD 11 | |||||
| C_STANDARD_REQUIRED ON | |||||
| C_EXTENSIONS OFF | |||||
| PUBLIC_HEADER "${${PROJECT_NAME}_PUBLIC_HEADERS}" | |||||
| EXPORT_NAME framework | |||||
| ) | |||||
| target_compile_options(${PROJECT_NAME} | |||||
| PRIVATE | |||||
| # Clang | |||||
| $<$<C_COMPILER_ID:Clang>: | |||||
| -Wcast-align | |||||
| -Wcast-qual | |||||
| -Wconversion | |||||
| -Wexit-time-destructors | |||||
| -Wglobal-constructors | |||||
| -Wmissing-noreturn | |||||
| -Wmissing-prototypes | |||||
| -Wno-missing-braces | |||||
| -Wold-style-cast | |||||
| -Wshadow | |||||
| -Wweak-vtables | |||||
| -Werror | |||||
| -Wall | |||||
| $<$<VERSION_GREATER_EQUAL:$<C_COMPILER_VERSION>,8.0.0>:-Wextra-semi-stmt> | |||||
| > | |||||
| # GCC | |||||
| $<$<C_COMPILER_ID:GNU>: | |||||
| -Waddress | |||||
| -Waggregate-return | |||||
| -Wformat-nonliteral | |||||
| -Wformat-security | |||||
| -Wformat | |||||
| -Winit-self | |||||
| -Wmissing-declarations | |||||
| -Wmissing-include-dirs | |||||
| -Wno-multichar | |||||
| -Wno-parentheses | |||||
| -Wno-type-limits | |||||
| -Wno-unused-parameter | |||||
| -Wunreachable-code | |||||
| -Wwrite-strings | |||||
| -Wpointer-arith | |||||
| -Werror | |||||
| -Wall | |||||
| > | |||||
| # MSVC | |||||
| $<$<C_COMPILER_ID:MSVC>: | |||||
| /Wall | |||||
| > | |||||
| ) | |||||
| write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake | |||||
| VERSION ${PROJECT_VERSION} | |||||
| COMPATIBILITY SameMajorVersion | |||||
| ) | |||||
| ## Target installation | |||||
| install(TARGETS ${PROJECT_NAME} | |||||
| EXPORT ${PROJECT_NAME}Targets | |||||
| ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | |||||
| LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | |||||
| PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} | |||||
| COMPONENT library | |||||
| ) | |||||
| ## Target's cmake files: targets export | |||||
| install(EXPORT ${PROJECT_NAME}Targets | |||||
| NAMESPACE ${PROJECT_NAME}:: | |||||
| DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} | |||||
| ) | |||||
| ## Target's cmake files: config and version config for find_package() | |||||
| install(FILES ${PROJECT_NAME}Config.cmake | |||||
| ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake | |||||
| DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} | |||||
| ) | |||||
| @@ -1,21 +0,0 @@ | |||||
| The MIT License (MIT) | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
| of this software and associated documentation files (the "Software"), to deal | |||||
| in the Software without restriction, including without limitation the rights | |||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
| copies of the Software, and to permit persons to whom the Software is | |||||
| furnished to do so, subject to the following conditions: | |||||
| The above copyright notice and this permission notice shall be included in | |||||
| all copies or substantial portions of the Software. | |||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
| THE SOFTWARE. | |||||
| @@ -1,234 +0,0 @@ | |||||
| # Unity Test ![CI][] | |||||
| __Copyright (c) 2007 - 2024 Unity Project by Mike Karlesky, Mark VanderVoord, and Greg Williams__ | |||||
| Welcome to the Unity Test Project, one of the main projects of ThrowTheSwitch.org. | |||||
| Unity Test is a unit testing framework built for C, with a focus on working with embedded toolchains. | |||||
| This project is made to test code targetting microcontrollers big and small. | |||||
| The core project is a single C file and a pair of headers, allowing it to be added to your existing build setup without too much headache. | |||||
| You may use any compiler you wish, and may use most existing build systems including Make, CMake, etc. | |||||
| If you'd like to leave the hard work to us, you might be interested in Ceedling, a build tool also by ThrowTheSwitch.org. | |||||
| If you're new to Unity, we encourage you to tour the [getting started guide][]. | |||||
| You can also find the [change log][] and [known issues][] in our documentation. | |||||
| ## Getting Started | |||||
| The [docs][] folder contains a [getting started guide][] and much more tips about using Unity. | |||||
| ## Unity Assertion Summary | |||||
| For the full list, see [UnityAssertionsReference.md][]. | |||||
| ### Basic Validity Tests | |||||
| TEST_ASSERT_TRUE(condition) | |||||
| Evaluates whatever code is in condition and fails if it evaluates to false | |||||
| TEST_ASSERT_FALSE(condition) | |||||
| Evaluates whatever code is in condition and fails if it evaluates to true | |||||
| TEST_ASSERT(condition) | |||||
| Another way of calling `TEST_ASSERT_TRUE` | |||||
| TEST_ASSERT_UNLESS(condition) | |||||
| Another way of calling `TEST_ASSERT_FALSE` | |||||
| TEST_FAIL() | |||||
| TEST_FAIL_MESSAGE(message) | |||||
| This test is automatically marked as a failure. | |||||
| The message is output stating why. | |||||
| ### Numerical Assertions: Integers | |||||
| TEST_ASSERT_EQUAL_INT(expected, actual) | |||||
| TEST_ASSERT_EQUAL_INT8(expected, actual) | |||||
| TEST_ASSERT_EQUAL_INT16(expected, actual) | |||||
| TEST_ASSERT_EQUAL_INT32(expected, actual) | |||||
| TEST_ASSERT_EQUAL_INT64(expected, actual) | |||||
| Compare two integers for equality and display errors as signed integers. | |||||
| A cast will be performed to your natural integer size so often this can just be used. | |||||
| When you need to specify the exact size, you can use a specific version. | |||||
| TEST_ASSERT_EQUAL_UINT(expected, actual) | |||||
| TEST_ASSERT_EQUAL_UINT8(expected, actual) | |||||
| TEST_ASSERT_EQUAL_UINT16(expected, actual) | |||||
| TEST_ASSERT_EQUAL_UINT32(expected, actual) | |||||
| TEST_ASSERT_EQUAL_UINT64(expected, actual) | |||||
| Compare two integers for equality and display errors as unsigned integers. | |||||
| Like INT, there are variants for different sizes also. | |||||
| TEST_ASSERT_EQUAL_HEX(expected, actual) | |||||
| TEST_ASSERT_EQUAL_HEX8(expected, actual) | |||||
| TEST_ASSERT_EQUAL_HEX16(expected, actual) | |||||
| TEST_ASSERT_EQUAL_HEX32(expected, actual) | |||||
| TEST_ASSERT_EQUAL_HEX64(expected, actual) | |||||
| Compares two integers for equality and display errors as hexadecimal. | |||||
| Like the other integer comparisons, you can specify the size... | |||||
| here the size will also effect how many nibbles are shown (for example, `HEX16` will show 4 nibbles). | |||||
| TEST_ASSERT_EQUAL(expected, actual) | |||||
| Another way of calling TEST_ASSERT_EQUAL_INT | |||||
| TEST_ASSERT_INT_WITHIN(delta, expected, actual) | |||||
| Asserts that the actual value is within plus or minus delta of the expected value. | |||||
| This also comes in size specific variants. | |||||
| TEST_ASSERT_GREATER_THAN(threshold, actual) | |||||
| Asserts that the actual value is greater than the threshold. | |||||
| This also comes in size specific variants. | |||||
| TEST_ASSERT_LESS_THAN(threshold, actual) | |||||
| Asserts that the actual value is less than the threshold. | |||||
| This also comes in size specific variants. | |||||
| ### Arrays | |||||
| _ARRAY | |||||
| You can append `_ARRAY` to any of these macros to make an array comparison of that type. | |||||
| Here you will need to care a bit more about the actual size of the value being checked. | |||||
| You will also specify an additional argument which is the number of elements to compare. | |||||
| For example: | |||||
| TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, elements) | |||||
| _EACH_EQUAL | |||||
| Another array comparison option is to check that EVERY element of an array is equal to a single expected value. | |||||
| You do this by specifying the EACH_EQUAL macro. | |||||
| For example: | |||||
| TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, elements) | |||||
| ### Numerical Assertions: Bitwise | |||||
| TEST_ASSERT_BITS(mask, expected, actual) | |||||
| Use an integer mask to specify which bits should be compared between two other integers. | |||||
| High bits in the mask are compared, low bits ignored. | |||||
| TEST_ASSERT_BITS_HIGH(mask, actual) | |||||
| Use an integer mask to specify which bits should be inspected to determine if they are all set high. | |||||
| High bits in the mask are compared, low bits ignored. | |||||
| TEST_ASSERT_BITS_LOW(mask, actual) | |||||
| Use an integer mask to specify which bits should be inspected to determine if they are all set low. | |||||
| High bits in the mask are compared, low bits ignored. | |||||
| TEST_ASSERT_BIT_HIGH(bit, actual) | |||||
| Test a single bit and verify that it is high. | |||||
| The bit is specified 0-31 for a 32-bit integer. | |||||
| TEST_ASSERT_BIT_LOW(bit, actual) | |||||
| Test a single bit and verify that it is low. | |||||
| The bit is specified 0-31 for a 32-bit integer. | |||||
| ### Numerical Assertions: Floats | |||||
| TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) | |||||
| TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) | |||||
| Asserts that the actual value is within plus or minus delta of the expected value. | |||||
| TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual) | |||||
| TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual) | |||||
| Asserts that the actual value is NOT within plus or minus delta of the expected value. | |||||
| TEST_ASSERT_EQUAL_FLOAT(expected, actual) | |||||
| TEST_ASSERT_EQUAL_DOUBLE(expected, actual) | |||||
| Asserts that two floating point values are "equal" within a small % delta of the expected value. | |||||
| TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual) | |||||
| TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual) | |||||
| Asserts that two floating point values are NOT "equal" within a small % delta of the expected value. | |||||
| TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual) | |||||
| TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual) | |||||
| TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual) | |||||
| TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual) | |||||
| Asserts that the actual value is less than or greater than the threshold. | |||||
| There are also `LESS_OR_EQUAL` and `GREATER_OR_EQUAL` variations. | |||||
| These obey the same rules for equality as do `TEST_ASSERT_EQUAL_FLOAT` and `TEST_ASSERT_EQUAL_DOUBLE`: | |||||
| If the two values are within a small % delta of the expected value, the assertion will pass. | |||||
| ### String Assertions | |||||
| TEST_ASSERT_EQUAL_STRING(expected, actual) | |||||
| Compare two null-terminate strings. | |||||
| Fail if any character is different or if the lengths are different. | |||||
| TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len) | |||||
| Compare two strings. | |||||
| Fail if any character is different, stop comparing after len characters. | |||||
| TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, actual, message) | |||||
| Compare two null-terminate strings. | |||||
| Fail if any character is different or if the lengths are different. | |||||
| Output a custom message on failure. | |||||
| TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) | |||||
| Compare two strings. | |||||
| Fail if any character is different, stop comparing after len characters. | |||||
| Output a custom message on failure. | |||||
| ### Pointer Assertions | |||||
| Most pointer operations can be performed by simply using the integer comparisons above. | |||||
| However, a couple of special cases are added for clarity. | |||||
| TEST_ASSERT_NULL(pointer) | |||||
| Fails if the pointer is not equal to NULL | |||||
| TEST_ASSERT_NOT_NULL(pointer) | |||||
| Fails if the pointer is equal to NULL | |||||
| ### Memory Assertions | |||||
| TEST_ASSERT_EQUAL_MEMORY(expected, actual, len) | |||||
| Compare two blocks of memory. | |||||
| This is a good generic assertion for types that can't be coerced into acting like standard types... | |||||
| but since it's a memory compare, you have to be careful that your data types are packed. | |||||
| ### \_MESSAGE | |||||
| You can append `\_MESSAGE` to any of the macros to make them take an additional argument. | |||||
| This argument is a string that will be printed at the end of the failure strings. | |||||
| This is useful for specifying more information about the problem. | |||||
| [CI]: https://github.com/ThrowTheSwitch/Unity/workflows/CI/badge.svg | |||||
| [getting started guide]: docs/UnityGettingStartedGuide.md | |||||
| [change log]: docs/UnityChangeLog.md | |||||
| [known issues]: docs/UnityKnownIssues.md | |||||
| [docs]: docs/ | |||||
| [UnityAssertionsReference.md]: docs/UnityAssertionsReference.md | |||||
| @@ -1,7 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| @@ -1,120 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| if RUBY_PLATFORM =~ /(win|w)32$/ | |||||
| begin | |||||
| require 'Win32API' | |||||
| rescue LoadError | |||||
| puts 'ERROR! "Win32API" library not found' | |||||
| puts '"Win32API" is required for colour on a windows machine' | |||||
| puts ' try => "gem install Win32API" on the command line' | |||||
| puts | |||||
| end | |||||
| # puts | |||||
| # puts 'Windows Environment Detected...' | |||||
| # puts 'Win32API Library Found.' | |||||
| # puts | |||||
| end | |||||
| class ColourCommandLine | |||||
| def initialize | |||||
| return unless RUBY_PLATFORM =~ /(win|w)32$/ | |||||
| get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') | |||||
| @set_console_txt_attrb = | |||||
| Win32API.new('kernel32', 'SetConsoleTextAttribute', %w[L N], 'I') | |||||
| @hout = get_std_handle.call(-11) | |||||
| end | |||||
| def change_to(new_colour) | |||||
| if RUBY_PLATFORM =~ /(win|w)32$/ | |||||
| @set_console_txt_attrb.call(@hout, win32_colour(new_colour)) | |||||
| else | |||||
| "\033[30;#{posix_colour(new_colour)};22m" | |||||
| end | |||||
| end | |||||
| def win32_colour(colour) | |||||
| case colour | |||||
| when :black then 0 | |||||
| when :dark_blue then 1 | |||||
| when :dark_green then 2 | |||||
| when :dark_cyan then 3 | |||||
| when :dark_red then 4 | |||||
| when :dark_purple then 5 | |||||
| when :dark_yellow, :narrative then 6 | |||||
| when :default_white, :default, :dark_white then 7 | |||||
| when :silver then 8 | |||||
| when :blue then 9 | |||||
| when :green, :success then 10 | |||||
| when :cyan, :output then 11 | |||||
| when :red, :failure then 12 | |||||
| when :purple then 13 | |||||
| when :yellow then 14 | |||||
| when :white then 15 | |||||
| else | |||||
| 0 | |||||
| end | |||||
| end | |||||
| def posix_colour(colour) | |||||
| # ANSI Escape Codes - Foreground colors | |||||
| # | Code | Color | | |||||
| # | 39 | Default foreground color | | |||||
| # | 30 | Black | | |||||
| # | 31 | Red | | |||||
| # | 32 | Green | | |||||
| # | 33 | Yellow | | |||||
| # | 34 | Blue | | |||||
| # | 35 | Magenta | | |||||
| # | 36 | Cyan | | |||||
| # | 37 | Light gray | | |||||
| # | 90 | Dark gray | | |||||
| # | 91 | Light red | | |||||
| # | 92 | Light green | | |||||
| # | 93 | Light yellow | | |||||
| # | 94 | Light blue | | |||||
| # | 95 | Light magenta | | |||||
| # | 96 | Light cyan | | |||||
| # | 97 | White | | |||||
| case colour | |||||
| when :black then 30 | |||||
| when :red, :failure then 31 | |||||
| when :green, :success then 32 | |||||
| when :yellow then 33 | |||||
| when :blue, :narrative then 34 | |||||
| when :purple, :magenta then 35 | |||||
| when :cyan, :output then 36 | |||||
| when :white, :default_white then 37 | |||||
| when :default then 39 | |||||
| else | |||||
| 39 | |||||
| end | |||||
| end | |||||
| def out_c(mode, colour, str) | |||||
| case RUBY_PLATFORM | |||||
| when /(win|w)32$/ | |||||
| change_to(colour) | |||||
| $stdout.puts str if mode == :puts | |||||
| $stdout.print str if mode == :print | |||||
| change_to(:default_white) | |||||
| else | |||||
| $stdout.puts("#{change_to(colour)}#{str}\033[0m") if mode == :puts | |||||
| $stdout.print("#{change_to(colour)}#{str}\033[0m") if mode == :print | |||||
| end | |||||
| end | |||||
| end | |||||
| def colour_puts(role, str) | |||||
| ColourCommandLine.new.out_c(:puts, role, str) | |||||
| end | |||||
| def colour_print(role, str) | |||||
| ColourCommandLine.new.out_c(:print, role, str) | |||||
| end | |||||
| @@ -1,40 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| require_relative 'colour_prompt' | |||||
| $colour_output = true | |||||
| def report(message) | |||||
| if !$colour_output | |||||
| $stdout.puts(message) | |||||
| else | |||||
| message = message.join('\n') if message.instance_of?(Array) | |||||
| message.each_line do |line| | |||||
| line.chomp! | |||||
| colour = case line | |||||
| when /(?:total\s+)?tests:?\s+(\d+)\s+(?:total\s+)?failures:?\s+\d+\s+Ignored:?/i | |||||
| Regexp.last_match(1).to_i.zero? ? :green : :red | |||||
| when /PASS/ | |||||
| :green | |||||
| when /^OK$/ | |||||
| :green | |||||
| when /(?:FAIL|ERROR)/ | |||||
| :red | |||||
| when /IGNORE/ | |||||
| :yellow | |||||
| when /^(?:Creating|Compiling|Linking)/ | |||||
| :white | |||||
| else | |||||
| :silver | |||||
| end | |||||
| colour_puts(colour, line) | |||||
| end | |||||
| end | |||||
| $stdout.flush | |||||
| $stderr.flush | |||||
| end | |||||
| @@ -1,22 +0,0 @@ | |||||
| #!/usr/bin/env python3 | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| import re | |||||
| import sys | |||||
| ver_re = re.compile(r"^#define\s+UNITY_VERSION_(?:MAJOR|MINOR|BUILD)\s+(\d+)$") | |||||
| version = [] | |||||
| with open(sys.argv[1], "r") as f: | |||||
| for line in f: | |||||
| m = ver_re.match(line) | |||||
| if m: | |||||
| version.append(m.group(1)) | |||||
| print(".".join(version)) | |||||
| @@ -1,43 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| #this is a sample configuration file for generate_module | |||||
| #you would use it by calling generate_module with the -ygenerate_config.yml option | |||||
| #files like this are useful for customizing generate_module to your environment | |||||
| :generate_module: | |||||
| :defaults: | |||||
| #these defaults are used in place of any missing options at the command line | |||||
| :path_src: ../src/ | |||||
| :path_inc: ../src/ | |||||
| :path_tst: ../test/ | |||||
| :update_svn: true | |||||
| :includes: | |||||
| #use [] for no additional includes, otherwise list the includes on separate lines | |||||
| :src: | |||||
| - Defs.h | |||||
| - Board.h | |||||
| :inc: [] | |||||
| :tst: | |||||
| - Defs.h | |||||
| - Board.h | |||||
| - Exception.h | |||||
| :boilerplates: | |||||
| #these are inserted at the top of generated files. | |||||
| #just comment out or remove if not desired. | |||||
| #use %1$s where you would like the file name to appear (path/extension not included) | |||||
| :src: | | |||||
| //------------------------------------------- | |||||
| // %1$s.c | |||||
| //------------------------------------------- | |||||
| :inc: | | |||||
| //------------------------------------------- | |||||
| // %1$s.h | |||||
| //------------------------------------------- | |||||
| :tst: | | |||||
| //------------------------------------------- | |||||
| // Test%1$s.c : Units tests for %1$s.c | |||||
| //------------------------------------------- | |||||
| @@ -1,318 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| # This script creates all the files with start code necessary for a new module. | |||||
| # A simple module only requires a source file, header file, and test file. | |||||
| # Triad modules require a source, header, and test file for each triad type (like model, conductor, and hardware). | |||||
| require 'rubygems' | |||||
| require 'fileutils' | |||||
| require 'pathname' | |||||
| # TEMPLATE_TST | |||||
| TEMPLATE_TST ||= '#ifdef %5$s | |||||
| #include "unity.h" | |||||
| %2$s#include "%1$s.h" | |||||
| void setUp(void) | |||||
| { | |||||
| } | |||||
| void tearDown(void) | |||||
| { | |||||
| } | |||||
| void test_%4$s_NeedToImplement(void) | |||||
| { | |||||
| TEST_IGNORE_MESSAGE("Need to Implement %1$s"); | |||||
| } | |||||
| #endif // %5$s | |||||
| '.freeze | |||||
| # TEMPLATE_SRC | |||||
| TEMPLATE_SRC ||= '%2$s#include "%1$s.h" | |||||
| '.freeze | |||||
| # TEMPLATE_INC | |||||
| TEMPLATE_INC ||= '#ifndef %3$s_H | |||||
| #define %3$s_H | |||||
| %2$s | |||||
| #endif // %3$s_H | |||||
| '.freeze | |||||
| class UnityModuleGenerator | |||||
| ############################ | |||||
| def initialize(options = nil) | |||||
| @options = UnityModuleGenerator.default_options | |||||
| case options | |||||
| when NilClass then @options | |||||
| when String then @options.merge!(UnityModuleGenerator.grab_config(options)) | |||||
| when Hash then @options.merge!(options) | |||||
| else raise 'If you specify arguments, it should be a filename or a hash of options' | |||||
| end | |||||
| # Create default file paths if none were provided | |||||
| @options[:path_src] = "#{__dir__}/../src/" if @options[:path_src].nil? | |||||
| @options[:path_inc] = @options[:path_src] if @options[:path_inc].nil? | |||||
| @options[:path_tst] = "#{__dir__}/../test/" if @options[:path_tst].nil? | |||||
| @options[:path_src] += '/' unless @options[:path_src][-1] == 47 | |||||
| @options[:path_inc] += '/' unless @options[:path_inc][-1] == 47 | |||||
| @options[:path_tst] += '/' unless @options[:path_tst][-1] == 47 | |||||
| # Built in patterns | |||||
| @patterns = { | |||||
| 'src' => { | |||||
| '' => { inc: [] } | |||||
| }, | |||||
| 'test' => { | |||||
| '' => { inc: [] } | |||||
| }, | |||||
| 'dh' => { | |||||
| 'Driver' => { inc: [create_filename('%1$s', 'Hardware.h')] }, | |||||
| 'Hardware' => { inc: [] } | |||||
| }, | |||||
| 'dih' => { | |||||
| 'Driver' => { inc: [create_filename('%1$s', 'Hardware.h'), create_filename('%1$s', 'Interrupt.h')] }, | |||||
| 'Interrupt' => { inc: [create_filename('%1$s', 'Hardware.h')] }, | |||||
| 'Hardware' => { inc: [] } | |||||
| }, | |||||
| 'mch' => { | |||||
| 'Model' => { inc: [] }, | |||||
| 'Conductor' => { inc: [create_filename('%1$s', 'Model.h'), create_filename('%1$s', 'Hardware.h')] }, | |||||
| 'Hardware' => { inc: [] } | |||||
| }, | |||||
| 'mvp' => { | |||||
| 'Model' => { inc: [] }, | |||||
| 'Presenter' => { inc: [create_filename('%1$s', 'Model.h'), create_filename('%1$s', 'View.h')] }, | |||||
| 'View' => { inc: [] } | |||||
| } | |||||
| } | |||||
| end | |||||
| ############################ | |||||
| def self.default_options | |||||
| { | |||||
| pattern: 'src', | |||||
| includes: { | |||||
| src: [], | |||||
| inc: [], | |||||
| tst: [] | |||||
| }, | |||||
| update_svn: false, | |||||
| boilerplates: {}, | |||||
| test_prefix: 'Test', | |||||
| mock_prefix: 'Mock', | |||||
| test_define: 'TEST' | |||||
| } | |||||
| end | |||||
| ############################ | |||||
| def self.grab_config(config_file) | |||||
| options = default_options | |||||
| unless config_file.nil? || config_file.empty? | |||||
| require_relative 'yaml_helper' | |||||
| yaml_guts = YamlHelper.load_file(config_file) | |||||
| options.merge!(yaml_guts[:unity] || yaml_guts[:cmock]) | |||||
| raise "No :unity or :cmock section found in #{config_file}" unless options | |||||
| end | |||||
| options | |||||
| end | |||||
| ############################ | |||||
| def files_to_operate_on(module_name, pattern = nil) | |||||
| # strip any leading path information from the module name and save for later | |||||
| subfolder = File.dirname(module_name) | |||||
| module_name = File.basename(module_name) | |||||
| # create triad definition | |||||
| prefix = @options[:test_prefix] || 'Test' | |||||
| triad = [{ ext: '.c', path: @options[:path_src], prefix: '', template: TEMPLATE_SRC, inc: :src, boilerplate: @options[:boilerplates][:src] }, | |||||
| { ext: '.h', path: @options[:path_inc], prefix: '', template: TEMPLATE_INC, inc: :inc, boilerplate: @options[:boilerplates][:inc] }, | |||||
| { ext: '.c', path: @options[:path_tst], prefix: prefix, template: TEMPLATE_TST, inc: :tst, boilerplate: @options[:boilerplates][:tst], test_define: @options[:test_define] }] | |||||
| # prepare the pattern for use | |||||
| pattern = (pattern || @options[:pattern] || 'src').downcase | |||||
| patterns = @patterns[pattern] | |||||
| raise "ERROR: The design pattern '#{pattern}' specified isn't one that I recognize!" if patterns.nil? | |||||
| # single file patterns (currently just 'test') can reject the other parts of the triad | |||||
| triad.select! { |v| v[:inc] == :tst } if pattern == 'test' | |||||
| # Assemble the path/names of the files we need to work with. | |||||
| files = [] | |||||
| triad.each do |cfg| | |||||
| patterns.each_pair do |pattern_file, pattern_traits| | |||||
| submodule_name = create_filename(module_name, pattern_file) | |||||
| filename = cfg[:prefix] + submodule_name + cfg[:ext] | |||||
| files << { | |||||
| path: (Pathname.new("#{cfg[:path]}#{subfolder}") + filename).cleanpath, | |||||
| name: submodule_name, | |||||
| template: cfg[:template], | |||||
| test_define: cfg[:test_define], | |||||
| boilerplate: cfg[:boilerplate], | |||||
| includes: case (cfg[:inc]) | |||||
| when :src then (@options[:includes][:src] || []) | (pattern_traits[:inc].map { |f| format(f, module_name) }) | |||||
| when :inc then @options[:includes][:inc] || [] | |||||
| when :tst then (@options[:includes][:tst] || []) | (pattern_traits[:inc].map { |f| format("#{@options[:mock_prefix]}#{f}", module_name) }) | |||||
| end | |||||
| } | |||||
| end | |||||
| end | |||||
| files | |||||
| end | |||||
| ############################ | |||||
| def neutralize_filename(name, start_cap: true) | |||||
| return name if name.empty? | |||||
| name = name.split(/(?:\s+|_|(?=[A-Z][a-z]))|(?<=[a-z])(?=[A-Z])/).map(&:capitalize).join('_') | |||||
| name = name[0].downcase + name[1..] unless start_cap | |||||
| name | |||||
| end | |||||
| ############################ | |||||
| def create_filename(part1, part2 = '') | |||||
| name = part2.empty? ? part1 : "#{part1}_#{part2}" | |||||
| case (@options[:naming]) | |||||
| when 'bumpy' then neutralize_filename(name, start_cap: false).delete('_') | |||||
| when 'camel' then neutralize_filename(name).delete('_') | |||||
| when 'snake' then neutralize_filename(name).downcase | |||||
| when 'caps' then neutralize_filename(name).upcase | |||||
| else name | |||||
| end | |||||
| end | |||||
| ############################ | |||||
| def generate(module_name, pattern = nil) | |||||
| files = files_to_operate_on(module_name, pattern) | |||||
| # Abort if all of the module files already exist | |||||
| all_files_exist = true | |||||
| files.each do |file| | |||||
| all_files_exist = false unless File.exist?(file[:path]) | |||||
| end | |||||
| raise "ERROR: File #{files[0][:name]} already exists. Exiting." if all_files_exist | |||||
| # Create Source Modules | |||||
| files.each_with_index do |file, _i| | |||||
| # If this file already exists, don't overwrite it. | |||||
| if File.exist?(file[:path]) | |||||
| puts "File #{file[:path]} already exists!" | |||||
| next | |||||
| end | |||||
| # Create the path first if necessary. | |||||
| FileUtils.mkdir_p(File.dirname(file[:path]), verbose: false) | |||||
| File.open(file[:path], 'w') do |f| | |||||
| f.write("#{file[:boilerplate]}\n" % [file[:name]]) unless file[:boilerplate].nil? | |||||
| f.write(file[:template] % [file[:name], | |||||
| file[:includes].map { |ff| "#include \"#{ff}\"\n" }.join, | |||||
| file[:name].upcase.tr('-', '_'), | |||||
| file[:name].tr('-', '_'), | |||||
| file[:test_define]]) | |||||
| end | |||||
| if @options[:update_svn] | |||||
| `svn add \"#{file[:path]}\"` | |||||
| if $!.exitstatus.zero? | |||||
| puts "File #{file[:path]} created and added to source control" | |||||
| else | |||||
| puts "File #{file[:path]} created but FAILED adding to source control!" | |||||
| end | |||||
| else | |||||
| puts "File #{file[:path]} created" | |||||
| end | |||||
| end | |||||
| puts 'Generate Complete' | |||||
| end | |||||
| ############################ | |||||
| def destroy(module_name, pattern = nil) | |||||
| files_to_operate_on(module_name, pattern).each do |filespec| | |||||
| file = filespec[:path] | |||||
| if File.exist?(file) | |||||
| if @options[:update_svn] | |||||
| `svn delete \"#{file}\" --force` | |||||
| puts "File #{file} deleted and removed from source control" | |||||
| else | |||||
| FileUtils.remove(file) | |||||
| puts "File #{file} deleted" | |||||
| end | |||||
| else | |||||
| puts "File #{file} does not exist so cannot be removed." | |||||
| end | |||||
| end | |||||
| puts 'Destroy Complete' | |||||
| end | |||||
| end | |||||
| ############################ | |||||
| # Handle As Command Line If Called That Way | |||||
| if $0 == __FILE__ | |||||
| destroy = false | |||||
| options = {} | |||||
| module_name = nil | |||||
| # Parse the command line parameters. | |||||
| ARGV.each do |arg| | |||||
| case arg | |||||
| when /^-d/ then destroy = true | |||||
| when /^-u/ then options[:update_svn] = true | |||||
| when /^-p"?(\w+)"?/ then options[:pattern] = Regexp.last_match(1) | |||||
| when /^-s"?(.+)"?/ then options[:path_src] = Regexp.last_match(1) | |||||
| when /^-i"?(.+)"?/ then options[:path_inc] = Regexp.last_match(1) | |||||
| when /^-t"?(.+)"?/ then options[:path_tst] = Regexp.last_match(1) | |||||
| when /^-n"?(.+)"?/ then options[:naming] = Regexp.last_match(1) | |||||
| when /^-y"?(.+)"?/ then options = UnityModuleGenerator.grab_config(Regexp.last_match(1)) | |||||
| when /^(\w+)/ | |||||
| raise "ERROR: You can't have more than one Module name specified!" unless module_name.nil? | |||||
| module_name = arg | |||||
| when /^-(h|-help)/ | |||||
| ARGV = [].freeze | |||||
| else | |||||
| raise "ERROR: Unknown option specified '#{arg}'" | |||||
| end | |||||
| end | |||||
| unless ARGV[0] | |||||
| puts ["\nGENERATE MODULE\n-------- ------", | |||||
| "\nUsage: ruby generate_module [options] module_name", | |||||
| " -i\"include\" sets the path to output headers to 'include' (DEFAULT ../src)", | |||||
| " -s\"../src\" sets the path to output source to '../src' (DEFAULT ../src)", | |||||
| " -t\"C:/test\" sets the path to output source to 'C:/test' (DEFAULT ../test)", | |||||
| ' -p"MCH" sets the output pattern to MCH.', | |||||
| ' dh - driver hardware.', | |||||
| ' dih - driver interrupt hardware.', | |||||
| ' mch - model conductor hardware.', | |||||
| ' mvp - model view presenter.', | |||||
| ' src - just a source module, header and test. (DEFAULT)', | |||||
| ' test - just a test file.', | |||||
| ' -d destroy module instead of creating it.', | |||||
| ' -n"camel" sets the file naming convention.', | |||||
| ' bumpy - BumpyCaseFilenames.', | |||||
| ' camel - camelCaseFilenames.', | |||||
| ' snake - snake_case_filenames.', | |||||
| ' caps - CAPS_CASE_FILENAMES.', | |||||
| ' -u update subversion too (requires subversion command line)', | |||||
| ' -y"my.yml" selects a different yaml config file for module generation', | |||||
| ''].join("\n") | |||||
| exit | |||||
| end | |||||
| raise 'ERROR: You must have a Module name specified! (use option -h for help)' if module_name.nil? | |||||
| if destroy | |||||
| UnityModuleGenerator.new(options).destroy(module_name) | |||||
| else | |||||
| UnityModuleGenerator.new(options).generate(module_name) | |||||
| end | |||||
| end | |||||
| @@ -1,547 +0,0 @@ | |||||
| #!/usr/bin/ruby | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| class UnityTestRunnerGenerator | |||||
| def initialize(options = nil) | |||||
| @options = UnityTestRunnerGenerator.default_options | |||||
| case options | |||||
| when NilClass | |||||
| @options | |||||
| when String | |||||
| @options.merge!(UnityTestRunnerGenerator.grab_config(options)) | |||||
| when Hash | |||||
| # Check if some of these have been specified | |||||
| @options[:has_setup] = !options[:setup_name].nil? | |||||
| @options[:has_teardown] = !options[:teardown_name].nil? | |||||
| @options[:has_suite_setup] = !options[:suite_setup].nil? | |||||
| @options[:has_suite_teardown] = !options[:suite_teardown].nil? | |||||
| @options.merge!(options) | |||||
| else | |||||
| raise 'If you specify arguments, it should be a filename or a hash of options' | |||||
| end | |||||
| require_relative 'type_sanitizer' | |||||
| end | |||||
| def self.default_options | |||||
| { | |||||
| includes: [], | |||||
| defines: [], | |||||
| plugins: [], | |||||
| framework: :unity, | |||||
| test_prefix: 'test|spec|should', | |||||
| mock_prefix: 'Mock', | |||||
| mock_suffix: '', | |||||
| setup_name: 'setUp', | |||||
| teardown_name: 'tearDown', | |||||
| test_reset_name: 'resetTest', | |||||
| test_verify_name: 'verifyTest', | |||||
| main_name: 'main', # set to :auto to automatically generate each time | |||||
| main_export_decl: '', | |||||
| cmdline_args: false, | |||||
| omit_begin_end: false, | |||||
| use_param_tests: false, | |||||
| use_system_files: true, | |||||
| include_extensions: '(?:hpp|hh|H|h)', | |||||
| source_extensions: '(?:cpp|cc|ino|C|c)' | |||||
| } | |||||
| end | |||||
| def self.grab_config(config_file) | |||||
| options = default_options | |||||
| unless config_file.nil? || config_file.empty? | |||||
| require_relative 'yaml_helper' | |||||
| yaml_guts = YamlHelper.load_file(config_file) | |||||
| options.merge!(yaml_guts[:unity] || yaml_guts[:cmock]) | |||||
| raise "No :unity or :cmock section found in #{config_file}" unless options | |||||
| end | |||||
| options | |||||
| end | |||||
| def run(input_file, output_file, options = nil) | |||||
| @options.merge!(options) unless options.nil? | |||||
| # pull required data from source file | |||||
| source = File.read(input_file) | |||||
| source = source.force_encoding('ISO-8859-1').encode('utf-8', replace: nil) | |||||
| tests = find_tests(source) | |||||
| headers = find_includes(source) | |||||
| testfile_includes = @options[:use_system_files] ? (headers[:local] + headers[:system]) : (headers[:local]) | |||||
| used_mocks = find_mocks(testfile_includes) | |||||
| testfile_includes = (testfile_includes - used_mocks) | |||||
| testfile_includes.delete_if { |inc| inc =~ /(unity|cmock)/ } | |||||
| find_setup_and_teardown(source) | |||||
| # build runner file | |||||
| generate(input_file, output_file, tests, used_mocks, testfile_includes) | |||||
| # determine which files were used to return them | |||||
| all_files_used = [input_file, output_file] | |||||
| all_files_used += testfile_includes.map { |filename| "#{filename}.c" } unless testfile_includes.empty? | |||||
| all_files_used += @options[:includes] unless @options[:includes].empty? | |||||
| all_files_used += headers[:linkonly] unless headers[:linkonly].empty? | |||||
| all_files_used.uniq | |||||
| end | |||||
| def generate(input_file, output_file, tests, used_mocks, testfile_includes) | |||||
| File.open(output_file, 'w') do |output| | |||||
| create_header(output, used_mocks, testfile_includes) | |||||
| create_externs(output, tests, used_mocks) | |||||
| create_mock_management(output, used_mocks) | |||||
| create_setup(output) | |||||
| create_teardown(output) | |||||
| create_suite_setup(output) | |||||
| create_suite_teardown(output) | |||||
| create_reset(output) | |||||
| create_run_test(output) unless tests.empty? | |||||
| create_args_wrappers(output, tests) | |||||
| create_main(output, input_file, tests, used_mocks) | |||||
| end | |||||
| return unless @options[:header_file] && !@options[:header_file].empty? | |||||
| File.open(@options[:header_file], 'w') do |output| | |||||
| create_h_file(output, @options[:header_file], tests, testfile_includes, used_mocks) | |||||
| end | |||||
| end | |||||
| def find_tests(source) | |||||
| tests_and_line_numbers = [] | |||||
| # contains characters which will be substituted from within strings, doing | |||||
| # this prevents these characters from interfering with scrubbers | |||||
| # @ is not a valid C character, so there should be no clashes with files genuinely containing these markers | |||||
| substring_subs = { '{' => '@co@', '}' => '@cc@', ';' => '@ss@', '/' => '@fs@' } | |||||
| substring_re = Regexp.union(substring_subs.keys) | |||||
| substring_unsubs = substring_subs.invert # the inverse map will be used to fix the strings afterwords | |||||
| substring_unsubs['@quote@'] = '\\"' | |||||
| substring_unsubs['@apos@'] = '\\\'' | |||||
| substring_unre = Regexp.union(substring_unsubs.keys) | |||||
| source_scrubbed = source.clone | |||||
| source_scrubbed = source_scrubbed.gsub(/\\"/, '@quote@') # hide escaped quotes to allow capture of the full string/char | |||||
| source_scrubbed = source_scrubbed.gsub(/\\'/, '@apos@') # hide escaped apostrophes to allow capture of the full string/char | |||||
| source_scrubbed = source_scrubbed.gsub(/("[^"\n]*")|('[^'\n]*')/) { |s| s.gsub(substring_re, substring_subs) } # temporarily hide problematic characters within strings | |||||
| source_scrubbed = source_scrubbed.gsub(/\/\/(?:.+\/\*|\*(?:$|[^\/])).*$/, '') # remove line comments that comment out the start of blocks | |||||
| source_scrubbed = source_scrubbed.gsub(/\/\*.*?\*\//m, '') # remove block comments | |||||
| source_scrubbed = source_scrubbed.gsub(/\/\/.*$/, '') # remove line comments (all that remain) | |||||
| lines = source_scrubbed.split(/(^\s*\#.*$) | (;|\{|\}) /x) # Treat preprocessor directives as a logical line. Match ;, {, and } as end of lines | |||||
| .map { |line| line.gsub(substring_unre, substring_unsubs) } # unhide the problematic characters previously removed | |||||
| lines.each_with_index do |line, _index| | |||||
| # find tests | |||||
| next unless line =~ /^((?:\s*(?:TEST_(?:CASE|RANGE|MATRIX))\s*\(.*?\)\s*)*)\s*void\s+((?:#{@options[:test_prefix]}).*)\s*\(\s*(.*)\s*\)/m | |||||
| next unless line =~ /^((?:\s*(?:TEST_(?:CASE|RANGE|MATRIX))\s*\(.*?\)\s*)*)\s*void\s+((?:#{@options[:test_prefix]})\w*)\s*\(\s*(.*)\s*\)/m | |||||
| arguments = Regexp.last_match(1) | |||||
| name = Regexp.last_match(2) | |||||
| call = Regexp.last_match(3) | |||||
| params = Regexp.last_match(4) | |||||
| args = nil | |||||
| if @options[:use_param_tests] && !arguments.empty? | |||||
| args = [] | |||||
| type_and_args = arguments.split(/TEST_(CASE|RANGE|MATRIX)/) | |||||
| (1...type_and_args.length).step(2).each do |i| | |||||
| case type_and_args[i] | |||||
| when 'CASE' | |||||
| args << type_and_args[i + 1].sub(/^\s*\(\s*(.*?)\s*\)\s*$/m, '\1') | |||||
| when 'RANGE' | |||||
| args += type_and_args[i + 1].scan(/(\[|<)\s*(-?\d+.?\d*)\s*,\s*(-?\d+.?\d*)\s*,\s*(-?\d+.?\d*)\s*(\]|>)/m).map do |arg_values_str| | |||||
| exclude_end = arg_values_str[0] == '<' && arg_values_str[-1] == '>' | |||||
| arg_values_str[1...-1].map do |arg_value_str| | |||||
| arg_value_str.include?('.') ? arg_value_str.to_f : arg_value_str.to_i | |||||
| end.push(exclude_end) | |||||
| end.map do |arg_values| | |||||
| Range.new(arg_values[0], arg_values[1], arg_values[3]).step(arg_values[2]).to_a | |||||
| end.reduce(nil) do |result, arg_range_expanded| | |||||
| result.nil? ? arg_range_expanded.map { |a| [a] } : result.product(arg_range_expanded) | |||||
| end.map do |arg_combinations| | |||||
| arg_combinations.flatten.join(', ') | |||||
| end | |||||
| when 'MATRIX' | |||||
| single_arg_regex_string = /(?:(?:"(?:\\"|[^\\])*?")+|(?:'\\?.')+|(?:[^\s\]\["',]|\[[\d\S_-]+\])+)/.source | |||||
| args_regex = /\[((?:\s*#{single_arg_regex_string}\s*,?)*(?:\s*#{single_arg_regex_string})?\s*)\]/m | |||||
| arg_elements_regex = /\s*(#{single_arg_regex_string})\s*,\s*/m | |||||
| args += type_and_args[i + 1].scan(args_regex).flatten.map do |arg_values_str| | |||||
| "#{arg_values_str},".scan(arg_elements_regex) | |||||
| end.reduce do |result, arg_range_expanded| | |||||
| result.product(arg_range_expanded) | |||||
| end.map do |arg_combinations| | |||||
| arg_combinations.flatten.join(', ') | |||||
| end | |||||
| end | |||||
| end | |||||
| end | |||||
| tests_and_line_numbers << { test: name, args: args, call: call, params: params, line_number: 0 } | |||||
| end | |||||
| tests_and_line_numbers.uniq! { |v| v[:test] } | |||||
| # determine line numbers and create tests to run | |||||
| source_lines = source.split("\n") | |||||
| source_index = 0 | |||||
| tests_and_line_numbers.size.times do |i| | |||||
| source_lines[source_index..].each_with_index do |line, index| | |||||
| next unless line =~ /\s+#{tests_and_line_numbers[i][:test]}(?:\s|\()/ | |||||
| source_index += index | |||||
| tests_and_line_numbers[i][:line_number] = source_index + 1 | |||||
| break | |||||
| end | |||||
| end | |||||
| tests_and_line_numbers | |||||
| end | |||||
| def find_includes(source) | |||||
| # remove comments (block and line, in three steps to ensure correct precedence) | |||||
| source.gsub!(/\/\/(?:.+\/\*|\*(?:$|[^\/])).*$/, '') # remove line comments that comment out the start of blocks | |||||
| source.gsub!(/\/\*.*?\*\//m, '') # remove block comments | |||||
| source.gsub!(/\/\/.*$/, '') # remove line comments (all that remain) | |||||
| # parse out includes | |||||
| { | |||||
| local: source.scan(/^\s*#include\s+"\s*(.+\.#{@options[:include_extensions]})\s*"/).flatten, | |||||
| system: source.scan(/^\s*#include\s+<\s*(.+)\s*>/).flatten.map { |inc| "<#{inc}>" }, | |||||
| linkonly: source.scan(/^TEST_SOURCE_FILE\(\s*"\s*(.+\.#{@options[:source_extensions]})\s*"/).flatten | |||||
| } | |||||
| end | |||||
| def find_mocks(includes) | |||||
| mock_headers = [] | |||||
| includes.each do |include_path| | |||||
| include_file = File.basename(include_path) | |||||
| mock_headers << include_path if include_file =~ /^#{@options[:mock_prefix]}.*#{@options[:mock_suffix]}\.h$/i | |||||
| end | |||||
| mock_headers | |||||
| end | |||||
| def find_setup_and_teardown(source) | |||||
| @options[:has_setup] = source =~ /void\s+#{@options[:setup_name]}\s*\(/ | |||||
| @options[:has_teardown] = source =~ /void\s+#{@options[:teardown_name]}\s*\(/ | |||||
| @options[:has_suite_setup] ||= (source =~ /void\s+suiteSetUp\s*\(/) | |||||
| @options[:has_suite_teardown] ||= (source =~ /int\s+suiteTearDown\s*\(int\s+([a-zA-Z0-9_])+\s*\)/) | |||||
| end | |||||
| def create_header(output, mocks, testfile_includes = []) | |||||
| output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */') | |||||
| output.puts("\n/*=======Automagically Detected Files To Include=====*/") | |||||
| output.puts('extern "C" {') if @options[:externcincludes] | |||||
| output.puts("#include \"#{@options[:framework]}.h\"") | |||||
| output.puts('#include "cmock.h"') unless mocks.empty? | |||||
| output.puts('}') if @options[:externcincludes] | |||||
| if @options[:defines] && !@options[:defines].empty? | |||||
| output.puts('/* injected defines for unity settings, etc */') | |||||
| @options[:defines].each do |d| | |||||
| def_only = d.match(/(\w+).*/)[1] | |||||
| output.puts("#ifndef #{def_only}\n#define #{d}\n#endif /* #{def_only} */") | |||||
| end | |||||
| end | |||||
| if @options[:header_file] && !@options[:header_file].empty? | |||||
| output.puts("#include \"#{File.basename(@options[:header_file])}\"") | |||||
| else | |||||
| @options[:includes].flatten.uniq.compact.each do |inc| | |||||
| output.puts("#include #{inc.include?('<') ? inc : "\"#{inc}\""}") | |||||
| end | |||||
| testfile_includes.each do |inc| | |||||
| output.puts("#include #{inc.include?('<') ? inc : "\"#{inc}\""}") | |||||
| end | |||||
| end | |||||
| output.puts('extern "C" {') if @options[:externcincludes] | |||||
| mocks.each do |mock| | |||||
| output.puts("#include \"#{mock}\"") | |||||
| end | |||||
| output.puts('}') if @options[:externcincludes] | |||||
| output.puts('#include "CException.h"') if @options[:plugins].include?(:cexception) | |||||
| return unless @options[:enforce_strict_ordering] | |||||
| output.puts('') | |||||
| output.puts('int GlobalExpectCount;') | |||||
| output.puts('int GlobalVerifyOrder;') | |||||
| output.puts('char* GlobalOrderError;') | |||||
| end | |||||
| def create_externs(output, tests, _mocks) | |||||
| output.puts("\n/*=======External Functions This Runner Calls=====*/") | |||||
| output.puts("extern void #{@options[:setup_name]}(void);") | |||||
| output.puts("extern void #{@options[:teardown_name]}(void);") | |||||
| output.puts("\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif") if @options[:externc] | |||||
| tests.each do |test| | |||||
| output.puts("extern void #{test[:test]}(#{test[:call] || 'void'});") | |||||
| end | |||||
| output.puts("#ifdef __cplusplus\n}\n#endif") if @options[:externc] | |||||
| output.puts('') | |||||
| end | |||||
| def create_mock_management(output, mock_headers) | |||||
| output.puts("\n/*=======Mock Management=====*/") | |||||
| output.puts('static void CMock_Init(void)') | |||||
| output.puts('{') | |||||
| if @options[:enforce_strict_ordering] | |||||
| output.puts(' GlobalExpectCount = 0;') | |||||
| output.puts(' GlobalVerifyOrder = 0;') | |||||
| output.puts(' GlobalOrderError = NULL;') | |||||
| end | |||||
| mocks = mock_headers.map { |mock| File.basename(mock, '.*') } | |||||
| mocks.each do |mock| | |||||
| mock_clean = TypeSanitizer.sanitize_c_identifier(mock) | |||||
| output.puts(" #{mock_clean}_Init();") | |||||
| end | |||||
| output.puts("}\n") | |||||
| output.puts('static void CMock_Verify(void)') | |||||
| output.puts('{') | |||||
| mocks.each do |mock| | |||||
| mock_clean = TypeSanitizer.sanitize_c_identifier(mock) | |||||
| output.puts(" #{mock_clean}_Verify();") | |||||
| end | |||||
| output.puts("}\n") | |||||
| output.puts('static void CMock_Destroy(void)') | |||||
| output.puts('{') | |||||
| mocks.each do |mock| | |||||
| mock_clean = TypeSanitizer.sanitize_c_identifier(mock) | |||||
| output.puts(" #{mock_clean}_Destroy();") | |||||
| end | |||||
| output.puts("}\n") | |||||
| end | |||||
| def create_setup(output) | |||||
| return if @options[:has_setup] | |||||
| output.puts("\n/*=======Setup (stub)=====*/") | |||||
| output.puts("void #{@options[:setup_name]}(void) {}") | |||||
| end | |||||
| def create_teardown(output) | |||||
| return if @options[:has_teardown] | |||||
| output.puts("\n/*=======Teardown (stub)=====*/") | |||||
| output.puts("void #{@options[:teardown_name]}(void) {}") | |||||
| end | |||||
| def create_suite_setup(output) | |||||
| return if @options[:suite_setup].nil? | |||||
| output.puts("\n/*=======Suite Setup=====*/") | |||||
| output.puts('void suiteSetUp(void)') | |||||
| output.puts('{') | |||||
| output.puts(@options[:suite_setup]) | |||||
| output.puts('}') | |||||
| end | |||||
| def create_suite_teardown(output) | |||||
| return if @options[:suite_teardown].nil? | |||||
| output.puts("\n/*=======Suite Teardown=====*/") | |||||
| output.puts('int suiteTearDown(int num_failures)') | |||||
| output.puts('{') | |||||
| output.puts(@options[:suite_teardown]) | |||||
| output.puts('}') | |||||
| end | |||||
| def create_reset(output) | |||||
| output.puts("\n/*=======Test Reset Options=====*/") | |||||
| output.puts("void #{@options[:test_reset_name]}(void);") | |||||
| output.puts("void #{@options[:test_reset_name]}(void)") | |||||
| output.puts('{') | |||||
| output.puts(" #{@options[:teardown_name]}();") | |||||
| output.puts(' CMock_Verify();') | |||||
| output.puts(' CMock_Destroy();') | |||||
| output.puts(' CMock_Init();') | |||||
| output.puts(" #{@options[:setup_name]}();") | |||||
| output.puts('}') | |||||
| output.puts("void #{@options[:test_verify_name]}(void);") | |||||
| output.puts("void #{@options[:test_verify_name]}(void)") | |||||
| output.puts('{') | |||||
| output.puts(' CMock_Verify();') | |||||
| output.puts('}') | |||||
| end | |||||
| def create_run_test(output) | |||||
| require 'erb' | |||||
| file = File.read(File.join(__dir__, 'run_test.erb')) | |||||
| template = ERB.new(file, trim_mode: '<>') | |||||
| output.puts("\n#{template.result(binding)}") | |||||
| end | |||||
| def create_args_wrappers(output, tests) | |||||
| return unless @options[:use_param_tests] | |||||
| output.puts("\n/*=======Parameterized Test Wrappers=====*/") | |||||
| tests.each do |test| | |||||
| next if test[:args].nil? || test[:args].empty? | |||||
| test[:args].each.with_index(1) do |args, idx| | |||||
| output.puts("static void runner_args#{idx}_#{test[:test]}(void)") | |||||
| output.puts('{') | |||||
| output.puts(" #{test[:test]}(#{args});") | |||||
| output.puts("}\n") | |||||
| end | |||||
| end | |||||
| end | |||||
| def create_main(output, filename, tests, used_mocks) | |||||
| output.puts("\n/*=======MAIN=====*/") | |||||
| main_name = @options[:main_name].to_sym == :auto ? "main_#{filename.gsub('.c', '')}" : (@options[:main_name]).to_s | |||||
| if @options[:cmdline_args] | |||||
| if main_name != 'main' | |||||
| output.puts("#{@options[:main_export_decl]} int #{main_name}(int argc, char** argv);") | |||||
| end | |||||
| output.puts("#{@options[:main_export_decl]} int #{main_name}(int argc, char** argv)") | |||||
| output.puts('{') | |||||
| output.puts('#ifdef UNITY_USE_COMMAND_LINE_ARGS') | |||||
| output.puts(' int parse_status = UnityParseOptions(argc, argv);') | |||||
| output.puts(' if (parse_status != 0)') | |||||
| output.puts(' {') | |||||
| output.puts(' if (parse_status < 0)') | |||||
| output.puts(' {') | |||||
| output.puts(" UnityPrint(\"#{filename.gsub('.c', '').gsub(/\\/, '\\\\\\')}.\");") | |||||
| output.puts(' UNITY_PRINT_EOL();') | |||||
| tests.each do |test| | |||||
| if (!@options[:use_param_tests]) || test[:args].nil? || test[:args].empty? | |||||
| output.puts(" UnityPrint(\" #{test[:test]}\");") | |||||
| output.puts(' UNITY_PRINT_EOL();') | |||||
| else | |||||
| test[:args].each do |args| | |||||
| output.puts(" UnityPrint(\" #{test[:test]}(#{args})\");") | |||||
| output.puts(' UNITY_PRINT_EOL();') | |||||
| end | |||||
| end | |||||
| end | |||||
| output.puts(' return 0;') | |||||
| output.puts(' }') | |||||
| output.puts(' return parse_status;') | |||||
| output.puts(' }') | |||||
| output.puts('#endif') | |||||
| else | |||||
| main_return = @options[:omit_begin_end] ? 'void' : 'int' | |||||
| if main_name != 'main' | |||||
| output.puts("#{@options[:main_export_decl]} #{main_return} #{main_name}(void);") | |||||
| end | |||||
| output.puts("#{main_return} #{main_name}(void)") | |||||
| output.puts('{') | |||||
| end | |||||
| output.puts(' suiteSetUp();') if @options[:has_suite_setup] | |||||
| if @options[:omit_begin_end] | |||||
| output.puts(" UnitySetTestFile(\"#{filename.gsub(/\\/, '\\\\\\')}\");") | |||||
| else | |||||
| output.puts(" UnityBegin(\"#{filename.gsub(/\\/, '\\\\\\')}\");") | |||||
| end | |||||
| tests.each do |test| | |||||
| if (!@options[:use_param_tests]) || test[:args].nil? || test[:args].empty? | |||||
| output.puts(" run_test(#{test[:test]}, \"#{test[:test]}\", #{test[:line_number]});") | |||||
| else | |||||
| test[:args].each.with_index(1) do |args, idx| | |||||
| wrapper = "runner_args#{idx}_#{test[:test]}" | |||||
| testname = "#{test[:test]}(#{args})".dump | |||||
| output.puts(" run_test(#{wrapper}, #{testname}, #{test[:line_number]});") | |||||
| end | |||||
| end | |||||
| end | |||||
| output.puts | |||||
| output.puts(' CMock_Guts_MemFreeFinal();') unless used_mocks.empty? | |||||
| if @options[:has_suite_teardown] | |||||
| if @options[:omit_begin_end] | |||||
| output.puts(' (void) suite_teardown(0);') | |||||
| else | |||||
| output.puts(' return suiteTearDown(UNITY_END());') | |||||
| end | |||||
| else | |||||
| output.puts(' return UNITY_END();') unless @options[:omit_begin_end] | |||||
| end | |||||
| output.puts('}') | |||||
| end | |||||
| def create_h_file(output, filename, tests, testfile_includes, used_mocks) | |||||
| filename = File.basename(filename).gsub(/[-\/\\.,\s]/, '_').upcase | |||||
| output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */') | |||||
| output.puts("#ifndef _#{filename}") | |||||
| output.puts("#define _#{filename}\n\n") | |||||
| output.puts("#include \"#{@options[:framework]}.h\"") | |||||
| output.puts('#include "cmock.h"') unless used_mocks.empty? | |||||
| @options[:includes].flatten.uniq.compact.each do |inc| | |||||
| output.puts("#include #{inc.include?('<') ? inc : "\"#{inc}\""}") | |||||
| end | |||||
| testfile_includes.each do |inc| | |||||
| output.puts("#include #{inc.include?('<') ? inc : "\"#{inc}\""}") | |||||
| end | |||||
| output.puts "\n" | |||||
| tests.each do |test| | |||||
| if test[:params].nil? || test[:params].empty? | |||||
| output.puts("void #{test[:test]}(void);") | |||||
| else | |||||
| output.puts("void #{test[:test]}(#{test[:params]});") | |||||
| end | |||||
| end | |||||
| output.puts("#endif\n\n") | |||||
| end | |||||
| end | |||||
| if $0 == __FILE__ | |||||
| options = { includes: [] } | |||||
| # parse out all the options first (these will all be removed as we go) | |||||
| ARGV.reject! do |arg| | |||||
| case arg | |||||
| when '-cexception' | |||||
| options[:plugins] = [:cexception] | |||||
| true | |||||
| when '-externcincludes' | |||||
| options[:externcincludes] = true | |||||
| true | |||||
| when /\.*\.ya?ml$/ | |||||
| options = UnityTestRunnerGenerator.grab_config(arg) | |||||
| true | |||||
| when /--(\w+)="?(.*)"?/ | |||||
| options[Regexp.last_match(1).to_sym] = Regexp.last_match(2) | |||||
| true | |||||
| when /\.*\.(?:hpp|hh|H|h)$/ | |||||
| options[:includes] << arg | |||||
| true | |||||
| else false | |||||
| end | |||||
| end | |||||
| # make sure there is at least one parameter left (the input file) | |||||
| unless ARGV[0] | |||||
| puts ["\nusage: ruby #{__FILE__} (files) (options) input_test_file (output)", | |||||
| "\n input_test_file - this is the C file you want to create a runner for", | |||||
| ' output - this is the name of the runner file to generate', | |||||
| ' defaults to (input_test_file)_Runner', | |||||
| ' files:', | |||||
| ' *.yml / *.yaml - loads configuration from here in :unity or :cmock', | |||||
| ' *.h - header files are added as #includes in runner', | |||||
| ' options:', | |||||
| ' -cexception - include cexception support', | |||||
| ' -externc - add extern "C" for cpp support', | |||||
| ' --setup_name="" - redefine setUp func name to something else', | |||||
| ' --teardown_name="" - redefine tearDown func name to something else', | |||||
| ' --main_name="" - redefine main func name to something else', | |||||
| ' --test_prefix="" - redefine test prefix from default test|spec|should', | |||||
| ' --test_reset_name="" - redefine resetTest func name to something else', | |||||
| ' --test_verify_name="" - redefine verifyTest func name to something else', | |||||
| ' --suite_setup="" - code to execute for setup of entire suite', | |||||
| ' --suite_teardown="" - code to execute for teardown of entire suite', | |||||
| ' --use_param_tests=1 - enable parameterized tests (disabled by default)', | |||||
| ' --omit_begin_end=1 - omit calls to UnityBegin and UNITY_END (disabled by default)', | |||||
| ' --header_file="" - path/name of test header file to generate too'].join("\n") | |||||
| exit 1 | |||||
| end | |||||
| # create the default test runner name if not specified | |||||
| ARGV[1] = ARGV[0].gsub('.c', '_Runner.c') unless ARGV[1] | |||||
| UnityTestRunnerGenerator.new(options).run(ARGV[0], ARGV[1]) | |||||
| end | |||||
| @@ -1,390 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| #============================================================ | |||||
| # Author: John Theofanopoulos | |||||
| # A simple parser. Takes the output files generated during the | |||||
| # build process and extracts information relating to the tests. | |||||
| # | |||||
| # Notes: | |||||
| # To capture an output file under VS builds use the following: | |||||
| # devenv [build instructions] > Output.txt & type Output.txt | |||||
| # | |||||
| # To capture an output file under Linux builds use the following: | |||||
| # make | tee Output.txt | |||||
| # | |||||
| # This script can handle the following output formats: | |||||
| # - normal output (raw unity) | |||||
| # - fixture output (unity_fixture.h/.c) | |||||
| # - fixture output with verbose flag set ("-v") | |||||
| # - time output flag set (UNITY_INCLUDE_EXEC_TIME define enabled with milliseconds output) | |||||
| # | |||||
| # To use this parser use the following command | |||||
| # ruby parseOutput.rb [options] [file] | |||||
| # options: -xml : produce a JUnit compatible XML file | |||||
| # -suiteRequiredSuiteName | |||||
| # : replace default test suite name to | |||||
| # "RequiredSuiteName" (can be any name) | |||||
| # file: file to scan for results | |||||
| #============================================================ | |||||
| # Parser class for handling the input file | |||||
| class ParseOutput | |||||
| def initialize | |||||
| # internal data | |||||
| @class_name_idx = 0 | |||||
| @result_usual_idx = 3 | |||||
| @path_delim = nil | |||||
| # xml output related | |||||
| @xml_out = false | |||||
| @array_list = false | |||||
| # current suite name and statistics | |||||
| ## testsuite name | |||||
| @real_test_suite_name = 'Unity' | |||||
| ## classname for testcase | |||||
| @test_suite = nil | |||||
| @total_tests = 0 | |||||
| @test_passed = 0 | |||||
| @test_failed = 0 | |||||
| @test_ignored = 0 | |||||
| end | |||||
| # Set the flag to indicate if there will be an XML output file or not | |||||
| def set_xml_output | |||||
| @xml_out = true | |||||
| end | |||||
| # Set the flag to indicate if there will be an XML output file or not | |||||
| def test_suite_name=(cli_arg) | |||||
| @real_test_suite_name = cli_arg | |||||
| puts "Real test suite name will be '#{@real_test_suite_name}'" | |||||
| end | |||||
| def xml_encode_s(str) | |||||
| str.encode(:xml => :attr) | |||||
| end | |||||
| # If write our output to XML | |||||
| def write_xml_output | |||||
| output = File.open('report.xml', 'w') | |||||
| output << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" | |||||
| @array_list.each do |item| | |||||
| output << item << "\n" | |||||
| end | |||||
| end | |||||
| # Pushes the suite info as xml to the array list, which will be written later | |||||
| def push_xml_output_suite_info | |||||
| # Insert opening tag at front | |||||
| heading = "<testsuite name=#{xml_encode_s(@real_test_suite_name)} tests=\"#{@total_tests}\" failures=\"#{@test_failed}\" skips=\"#{@test_ignored}\">" | |||||
| @array_list.insert(0, heading) | |||||
| # Push back the closing tag | |||||
| @array_list.push '</testsuite>' | |||||
| end | |||||
| # Pushes xml output data to the array list, which will be written later | |||||
| def push_xml_output_passed(test_name, execution_time = 0) | |||||
| @array_list.push " <testcase classname=#{xml_encode_s(@test_suite)} name=#{xml_encode_s(test_name)} time=#{xml_encode_s((execution_time / 1000.0).to_s)} />" | |||||
| end | |||||
| # Pushes xml output data to the array list, which will be written later | |||||
| def push_xml_output_failed(test_name, reason, execution_time = 0) | |||||
| @array_list.push " <testcase classname=#{xml_encode_s(@test_suite)} name=#{xml_encode_s(test_name)} time=#{xml_encode_s((execution_time / 1000.0).to_s)} >" | |||||
| @array_list.push " <failure type=\"ASSERT FAILED\">#{reason}</failure>" | |||||
| @array_list.push ' </testcase>' | |||||
| end | |||||
| # Pushes xml output data to the array list, which will be written later | |||||
| def push_xml_output_ignored(test_name, reason, execution_time = 0) | |||||
| @array_list.push " <testcase classname=#{xml_encode_s(@test_suite)} name=#{xml_encode_s(test_name)} time=#{xml_encode_s((execution_time / 1000.0).to_s)} >" | |||||
| @array_list.push " <skipped type=\"TEST IGNORED\">#{reason}</skipped>" | |||||
| @array_list.push ' </testcase>' | |||||
| end | |||||
| # This function will try and determine when the suite is changed. This is | |||||
| # is the name that gets added to the classname parameter. | |||||
| def test_suite_verify(test_suite_name) | |||||
| # Split the path name | |||||
| test_name = test_suite_name.split(@path_delim) | |||||
| # Remove the extension and extract the base_name | |||||
| base_name = test_name[test_name.size - 1].split('.')[0] | |||||
| # Return if the test suite hasn't changed | |||||
| return unless base_name.to_s != @test_suite.to_s | |||||
| @test_suite = base_name | |||||
| printf "New Test: %s\n", @test_suite | |||||
| end | |||||
| # Prepares the line for verbose fixture output ("-v") | |||||
| def prepare_fixture_line(line) | |||||
| line = line.sub('IGNORE_TEST(', '') | |||||
| line = line.sub('TEST(', '') | |||||
| line = line.sub(')', ',') | |||||
| line = line.chomp | |||||
| array = line.split(',') | |||||
| array.map { |x| x.to_s.lstrip.chomp } | |||||
| end | |||||
| # Test was flagged as having passed so format the output. | |||||
| # This is using the Unity fixture output and not the original Unity output. | |||||
| def test_passed_unity_fixture(array) | |||||
| class_name = array[0] | |||||
| test_name = array[1] | |||||
| test_suite_verify(class_name) | |||||
| printf "%-40s PASS\n", test_name | |||||
| push_xml_output_passed(test_name) if @xml_out | |||||
| end | |||||
| # Test was flagged as having failed so format the output. | |||||
| # This is using the Unity fixture output and not the original Unity output. | |||||
| def test_failed_unity_fixture(array) | |||||
| class_name = array[0] | |||||
| test_name = array[1] | |||||
| test_suite_verify(class_name) | |||||
| reason_array = array[2].split(':') | |||||
| reason = "#{reason_array[-1].lstrip.chomp} at line: #{reason_array[-4]}" | |||||
| printf "%-40s FAILED\n", test_name | |||||
| push_xml_output_failed(test_name, reason) if @xml_out | |||||
| end | |||||
| # Test was flagged as being ignored so format the output. | |||||
| # This is using the Unity fixture output and not the original Unity output. | |||||
| def test_ignored_unity_fixture(array) | |||||
| class_name = array[0] | |||||
| test_name = array[1] | |||||
| reason = 'No reason given' | |||||
| if array.size > 2 | |||||
| reason_array = array[2].split(':') | |||||
| tmp_reason = reason_array[-1].lstrip.chomp | |||||
| reason = tmp_reason == 'IGNORE' ? 'No reason given' : tmp_reason | |||||
| end | |||||
| test_suite_verify(class_name) | |||||
| printf "%-40s IGNORED\n", test_name | |||||
| push_xml_output_ignored(test_name, reason) if @xml_out | |||||
| end | |||||
| # Test was flagged as having passed so format the output | |||||
| def test_passed(array) | |||||
| # ':' symbol will be valid in function args now | |||||
| real_method_name = array[@result_usual_idx - 1..-2].join(':') | |||||
| array = array[0..@result_usual_idx - 2] + [real_method_name] + [array[-1]] | |||||
| last_item = array.length - 1 | |||||
| test_time = get_test_time(array[last_item]) | |||||
| test_name = array[last_item - 1] | |||||
| test_suite_verify(array[@class_name_idx]) | |||||
| printf "%-40s PASS %10d ms\n", test_name, test_time | |||||
| return unless @xml_out | |||||
| push_xml_output_passed(test_name, test_time) if @xml_out | |||||
| end | |||||
| # Test was flagged as having failed so format the line | |||||
| def test_failed(array) | |||||
| # ':' symbol will be valid in function args now | |||||
| real_method_name = array[@result_usual_idx - 1..-3].join(':') | |||||
| array = array[0..@result_usual_idx - 3] + [real_method_name] + array[-2..] | |||||
| last_item = array.length - 1 | |||||
| test_time = get_test_time(array[last_item]) | |||||
| test_name = array[last_item - 2] | |||||
| reason = "#{array[last_item].chomp.lstrip} at line: #{array[last_item - 3]}" | |||||
| class_name = array[@class_name_idx] | |||||
| if test_name.start_with? 'TEST(' | |||||
| array2 = test_name.split(' ') | |||||
| test_suite = array2[0].sub('TEST(', '') | |||||
| test_suite = test_suite.sub(',', '') | |||||
| class_name = test_suite | |||||
| test_name = array2[1].sub(')', '') | |||||
| end | |||||
| test_suite_verify(class_name) | |||||
| printf "%-40s FAILED %10d ms\n", test_name, test_time | |||||
| push_xml_output_failed(test_name, reason, test_time) if @xml_out | |||||
| end | |||||
| # Test was flagged as being ignored so format the output | |||||
| def test_ignored(array) | |||||
| # ':' symbol will be valid in function args now | |||||
| real_method_name = array[@result_usual_idx - 1..-3].join(':') | |||||
| array = array[0..@result_usual_idx - 3] + [real_method_name] + array[-2..] | |||||
| last_item = array.length - 1 | |||||
| test_time = get_test_time(array[last_item]) | |||||
| test_name = array[last_item - 2] | |||||
| reason = array[last_item].chomp.lstrip | |||||
| class_name = array[@class_name_idx] | |||||
| if test_name.start_with? 'TEST(' | |||||
| array2 = test_name.split(' ') | |||||
| test_suite = array2[0].sub('TEST(', '') | |||||
| test_suite = test_suite.sub(',', '') | |||||
| class_name = test_suite | |||||
| test_name = array2[1].sub(')', '') | |||||
| end | |||||
| test_suite_verify(class_name) | |||||
| printf "%-40s IGNORED %10d ms\n", test_name, test_time | |||||
| push_xml_output_ignored(test_name, reason, test_time) if @xml_out | |||||
| end | |||||
| # Test time will be in ms | |||||
| def get_test_time(value_with_time) | |||||
| test_time_array = value_with_time.scan(/\((-?\d+.?\d*) ms\)\s*$/).flatten.map do |arg_value_str| | |||||
| arg_value_str.include?('.') ? arg_value_str.to_f : arg_value_str.to_i | |||||
| end | |||||
| test_time_array.any? ? test_time_array[0] : 0 | |||||
| end | |||||
| # Adjusts the os specific members according to the current path style | |||||
| # (Windows or Unix based) | |||||
| def detect_os_specifics(line) | |||||
| if line.include? '\\' | |||||
| # Windows X:\Y\Z | |||||
| @class_name_idx = 1 | |||||
| @path_delim = '\\' | |||||
| else | |||||
| # Unix Based /X/Y/Z | |||||
| @class_name_idx = 0 | |||||
| @path_delim = '/' | |||||
| end | |||||
| end | |||||
| # Main function used to parse the file that was captured. | |||||
| def process(file_name) | |||||
| @array_list = [] | |||||
| puts "Parsing file: #{file_name}" | |||||
| @test_passed = 0 | |||||
| @test_failed = 0 | |||||
| @test_ignored = 0 | |||||
| puts '' | |||||
| puts '=================== RESULTS =====================' | |||||
| puts '' | |||||
| # Apply binary encoding. Bad symbols will be unchanged | |||||
| File.open(file_name, 'rb').each do |line| | |||||
| # Typical test lines look like these: | |||||
| # ---------------------------------------------------- | |||||
| # 1. normal output: | |||||
| # <path>/<test_file>.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 | |||||
| # <path>/<test_file>.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented | |||||
| # <path>/<test_file>.c:115:test_tc5100_initCanVoidPtrs:PASS | |||||
| # | |||||
| # 2. fixture output | |||||
| # <path>/<test_file>.c:63:TEST(<test_group>, <test_function>):FAIL: Expected 0x00001234 Was 0x00005A5A | |||||
| # <path>/<test_file>.c:36:TEST(<test_group>, <test_function>):IGNORE | |||||
| # Note: "PASS" information won't be generated in this mode | |||||
| # | |||||
| # 3. fixture output with verbose information ("-v") | |||||
| # TEST(<test_group, <test_file>)<path>/<test_file>:168::FAIL: Expected 0x8D Was 0x8C | |||||
| # TEST(<test_group>, <test_file>)<path>/<test_file>:22::IGNORE: This Test Was Ignored On Purpose | |||||
| # IGNORE_TEST(<test_group, <test_file>) | |||||
| # TEST(<test_group, <test_file>) PASS | |||||
| # | |||||
| # Note: Where path is different on Unix vs Windows devices (Windows leads with a drive letter)! | |||||
| detect_os_specifics(line) | |||||
| line_array = line.split(':') | |||||
| # If we were able to split the line then we can look to see if any of our target words | |||||
| # were found. Case is important. | |||||
| next unless (line_array.size >= 4) || (line.start_with? 'TEST(') || (line.start_with? 'IGNORE_TEST(') | |||||
| # check if the output is fixture output (with verbose flag "-v") | |||||
| if (line.start_with? 'TEST(') || (line.start_with? 'IGNORE_TEST(') | |||||
| line_array = prepare_fixture_line(line) | |||||
| if line.include? ' PASS' | |||||
| test_passed_unity_fixture(line_array) | |||||
| @test_passed += 1 | |||||
| elsif line.include? 'FAIL' | |||||
| test_failed_unity_fixture(line_array) | |||||
| @test_failed += 1 | |||||
| elsif line.include? 'IGNORE' | |||||
| test_ignored_unity_fixture(line_array) | |||||
| @test_ignored += 1 | |||||
| end | |||||
| # normal output / fixture output (without verbose "-v") | |||||
| elsif line.include? ':PASS' | |||||
| test_passed(line_array) | |||||
| @test_passed += 1 | |||||
| elsif line.include? ':FAIL' | |||||
| test_failed(line_array) | |||||
| @test_failed += 1 | |||||
| elsif line.include? ':IGNORE:' | |||||
| test_ignored(line_array) | |||||
| @test_ignored += 1 | |||||
| elsif line.include? ':IGNORE' | |||||
| line_array.push('No reason given') | |||||
| test_ignored(line_array) | |||||
| @test_ignored += 1 | |||||
| elsif line_array.size >= 4 | |||||
| # We will check output from color compilation | |||||
| if line_array[@result_usual_idx..].any? { |l| l.include? 'PASS' } | |||||
| test_passed(line_array) | |||||
| @test_passed += 1 | |||||
| elsif line_array[@result_usual_idx..].any? { |l| l.include? 'FAIL' } | |||||
| test_failed(line_array) | |||||
| @test_failed += 1 | |||||
| elsif line_array[@result_usual_idx..-2].any? { |l| l.include? 'IGNORE' } | |||||
| test_ignored(line_array) | |||||
| @test_ignored += 1 | |||||
| elsif line_array[@result_usual_idx..].any? { |l| l.include? 'IGNORE' } | |||||
| line_array.push("No reason given (#{get_test_time(line_array[@result_usual_idx..])} ms)") | |||||
| test_ignored(line_array) | |||||
| @test_ignored += 1 | |||||
| end | |||||
| end | |||||
| @total_tests = @test_passed + @test_failed + @test_ignored | |||||
| end | |||||
| puts '' | |||||
| puts '=================== SUMMARY =====================' | |||||
| puts '' | |||||
| puts "Tests Passed : #{@test_passed}" | |||||
| puts "Tests Failed : #{@test_failed}" | |||||
| puts "Tests Ignored : #{@test_ignored}" | |||||
| return unless @xml_out | |||||
| # push information about the suite | |||||
| push_xml_output_suite_info | |||||
| # write xml output file | |||||
| write_xml_output | |||||
| end | |||||
| end | |||||
| # If the command line has no values in, used a default value of Output.txt | |||||
| parse_my_file = ParseOutput.new | |||||
| if ARGV.size >= 1 | |||||
| ARGV.each do |arg| | |||||
| if arg == '-xml' | |||||
| parse_my_file.set_xml_output | |||||
| elsif arg.start_with?('-suite') | |||||
| parse_my_file.test_suite_name = arg.delete_prefix('-suite') | |||||
| else | |||||
| parse_my_file.process(arg) | |||||
| break | |||||
| end | |||||
| end | |||||
| end | |||||
| @@ -1,37 +0,0 @@ | |||||
| /*=======Test Runner Used To Run Each Test=====*/ | |||||
| static void run_test(UnityTestFunction func, const char* name, UNITY_LINE_TYPE line_num) | |||||
| { | |||||
| Unity.CurrentTestName = name; | |||||
| Unity.CurrentTestLineNumber = (UNITY_UINT) line_num; | |||||
| #ifdef UNITY_USE_COMMAND_LINE_ARGS | |||||
| if (!UnityTestMatches()) | |||||
| return; | |||||
| #endif | |||||
| Unity.NumberOfTests++; | |||||
| UNITY_CLR_DETAILS(); | |||||
| UNITY_EXEC_TIME_START(); | |||||
| CMock_Init(); | |||||
| if (TEST_PROTECT()) | |||||
| { | |||||
| <% if @options[:plugins].include?(:cexception) %> | |||||
| volatile CEXCEPTION_T e; | |||||
| Try { | |||||
| <%= @options[:setup_name] %>(); | |||||
| func(); | |||||
| } Catch(e) { | |||||
| TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); | |||||
| } | |||||
| <% else %> | |||||
| <%= @options[:setup_name] %>(); | |||||
| func(); | |||||
| <% end %> | |||||
| } | |||||
| if (TEST_PROTECT()) | |||||
| { | |||||
| <%= @options[:teardown_name] %>(); | |||||
| CMock_Verify(); | |||||
| } | |||||
| CMock_Destroy(); | |||||
| UNITY_EXEC_TIME_STOP(); | |||||
| UnityConcludeTest(); | |||||
| } | |||||
| @@ -1,161 +0,0 @@ | |||||
| #! python3 | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| import sys | |||||
| import os | |||||
| from glob import glob | |||||
| import argparse | |||||
| from pyparsing import * | |||||
| from junit_xml import TestSuite, TestCase | |||||
| class UnityTestSummary: | |||||
| def __init__(self): | |||||
| self.report = '' | |||||
| self.total_tests = 0 | |||||
| self.failures = 0 | |||||
| self.ignored = 0 | |||||
| self.targets = 0 | |||||
| self.root = None | |||||
| self.output = None | |||||
| self.test_suites = dict() | |||||
| def run(self): | |||||
| # Clean up result file names | |||||
| results = [] | |||||
| for target in self.targets: | |||||
| results.append(target.replace('\\', '/')) | |||||
| # Dig through each result file, looking for details on pass/fail: | |||||
| for result_file in results: | |||||
| lines = list(map(lambda line: line.rstrip(), open(result_file, "r").read().split('\n'))) | |||||
| if len(lines) == 0: | |||||
| raise Exception("Empty test result file: %s" % result_file) | |||||
| # define an expression for your file reference | |||||
| entry_one = Combine( | |||||
| oneOf(list(alphas)) + ':/' + | |||||
| Word(alphanums + '_-./')) | |||||
| entry_two = Word(printables + ' ', excludeChars=':') | |||||
| entry = entry_one | entry_two | |||||
| delimiter = Literal(':').suppress() | |||||
| # Format of a result line is `[file_name]:line:test_name:RESULT[:msg]` | |||||
| tc_result_line = Group(ZeroOrMore(entry.setResultsName('tc_file_name')) | |||||
| + delimiter + entry.setResultsName('tc_line_nr') | |||||
| + delimiter + entry.setResultsName('tc_name') | |||||
| + delimiter + entry.setResultsName('tc_status') + | |||||
| Optional(delimiter + entry.setResultsName('tc_msg'))).setResultsName("tc_line") | |||||
| eol = LineEnd().suppress() | |||||
| sol = LineStart().suppress() | |||||
| blank_line = sol + eol | |||||
| # Format of the summary line is `# Tests # Failures # Ignored` | |||||
| tc_summary_line = Group(Word(nums).setResultsName("num_of_tests") + "Tests" + Word(nums).setResultsName( | |||||
| "num_of_fail") + "Failures" + Word(nums).setResultsName("num_of_ignore") + "Ignored").setResultsName( | |||||
| "tc_summary") | |||||
| tc_end_line = Or(Literal("FAIL"), Literal('Ok')).setResultsName("tc_result") | |||||
| # run it and see... | |||||
| pp1 = tc_result_line | Optional(tc_summary_line | tc_end_line) | |||||
| pp1.ignore(blank_line | OneOrMore("-")) | |||||
| result = list() | |||||
| for l in lines: | |||||
| result.append((pp1.parseString(l)).asDict()) | |||||
| # delete empty results | |||||
| result = filter(None, result) | |||||
| tc_list = list() | |||||
| for r in result: | |||||
| if 'tc_line' in r: | |||||
| tmp_tc_line = r['tc_line'] | |||||
| # get only the file name which will be used as the classname | |||||
| if 'tc_file_name' in tmp_tc_line: | |||||
| file_name = tmp_tc_line['tc_file_name'].split('\\').pop().split('/').pop().rsplit('.', 1)[0] | |||||
| else: | |||||
| file_name = result_file.strip("./") | |||||
| tmp_tc = TestCase(name=tmp_tc_line['tc_name'], classname=file_name) | |||||
| if 'tc_status' in tmp_tc_line: | |||||
| if str(tmp_tc_line['tc_status']) == 'IGNORE': | |||||
| if 'tc_msg' in tmp_tc_line: | |||||
| tmp_tc.add_skipped_info(message=tmp_tc_line['tc_msg'], | |||||
| output=r'[File]={0}, [Line]={1}'.format( | |||||
| tmp_tc_line['tc_file_name'], tmp_tc_line['tc_line_nr'])) | |||||
| else: | |||||
| tmp_tc.add_skipped_info(message=" ") | |||||
| elif str(tmp_tc_line['tc_status']) == 'FAIL': | |||||
| if 'tc_msg' in tmp_tc_line: | |||||
| tmp_tc.add_failure_info(message=tmp_tc_line['tc_msg'], | |||||
| output=r'[File]={0}, [Line]={1}'.format( | |||||
| tmp_tc_line['tc_file_name'], tmp_tc_line['tc_line_nr'])) | |||||
| else: | |||||
| tmp_tc.add_failure_info(message=" ") | |||||
| tc_list.append((str(result_file), tmp_tc)) | |||||
| for k, v in tc_list: | |||||
| try: | |||||
| self.test_suites[k].append(v) | |||||
| except KeyError: | |||||
| self.test_suites[k] = [v] | |||||
| ts = [] | |||||
| for suite_name in self.test_suites: | |||||
| ts.append(TestSuite(suite_name, self.test_suites[suite_name])) | |||||
| with open(self.output, 'w') as f: | |||||
| TestSuite.to_file(f, ts, prettyprint='True', encoding='utf-8') | |||||
| return self.report | |||||
| def set_targets(self, target_array): | |||||
| self.targets = target_array | |||||
| def set_root_path(self, path): | |||||
| self.root = path | |||||
| def set_output(self, output): | |||||
| self.output = output | |||||
| if __name__ == '__main__': | |||||
| uts = UnityTestSummary() | |||||
| parser = argparse.ArgumentParser(description= | |||||
| """Takes as input the collection of *.testpass and *.testfail result | |||||
| files, and converts them to a JUnit formatted XML.""") | |||||
| parser.add_argument('targets_dir', metavar='result_file_directory', | |||||
| type=str, nargs='?', default='./', | |||||
| help="""The location of your results files. | |||||
| Defaults to current directory if not specified.""") | |||||
| parser.add_argument('root_path', nargs='?', | |||||
| default='os.path.split(__file__)[0]', | |||||
| help="""Helpful for producing more verbose output if | |||||
| using relative paths.""") | |||||
| parser.add_argument('--output', '-o', type=str, default="result.xml", | |||||
| help="""The name of the JUnit-formatted file (XML).""") | |||||
| args = parser.parse_args() | |||||
| if args.targets_dir[-1] != '/': | |||||
| args.targets_dir+='/' | |||||
| targets = list(map(lambda x: x.replace('\\', '/'), glob(args.targets_dir + '*.test*'))) | |||||
| if len(targets) == 0: | |||||
| raise Exception("No *.testpass or *.testfail files found in '%s'" % args.targets_dir) | |||||
| uts.set_targets(targets) | |||||
| # set the root path | |||||
| uts.set_root_path(args.root_path) | |||||
| # set output | |||||
| uts.set_output(args.output) | |||||
| # run the summarizer | |||||
| print(uts.run()) | |||||
| @@ -1,253 +0,0 @@ | |||||
| #!/usr/bin/ruby | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| require 'fileutils' | |||||
| require 'optparse' | |||||
| require 'ostruct' | |||||
| require 'set' | |||||
| VERSION = 1.0 | |||||
| class ArgvParser | |||||
| # | |||||
| # Return a structure describing the options. | |||||
| # | |||||
| def self.parse(args) | |||||
| # The options specified on the command line will be collected in *options*. | |||||
| # We set default values here. | |||||
| options = OpenStruct.new | |||||
| options.results_dir = '.' | |||||
| options.root_path = '.' | |||||
| options.out_file = 'results.xml' | |||||
| opts = OptionParser.new do |o| | |||||
| o.banner = 'Usage: unity_to_junit.rb [options]' | |||||
| o.separator '' | |||||
| o.separator 'Specific options:' | |||||
| o.on('-r', '--results <dir>', 'Look for Unity Results files here.') do |results| | |||||
| # puts "results #{results}" | |||||
| options.results_dir = results | |||||
| end | |||||
| o.on('-p', '--root_path <path>', 'Prepend this path to files in results.') do |root_path| | |||||
| options.root_path = root_path | |||||
| end | |||||
| o.on('-o', '--output <filename>', 'XML file to generate.') do |out_file| | |||||
| # puts "out_file: #{out_file}" | |||||
| options.out_file = out_file | |||||
| end | |||||
| o.separator '' | |||||
| o.separator 'Common options:' | |||||
| # No argument, shows at tail. This will print an options summary. | |||||
| o.on_tail('-h', '--help', 'Show this message') do | |||||
| puts o | |||||
| exit | |||||
| end | |||||
| # Another typical switch to print the version. | |||||
| o.on_tail('--version', 'Show version') do | |||||
| puts "unity_to_junit.rb version #{VERSION}" | |||||
| exit | |||||
| end | |||||
| end | |||||
| opts.parse!(args) | |||||
| options | |||||
| end | |||||
| end | |||||
| class UnityToJUnit | |||||
| include FileUtils::Verbose | |||||
| attr_reader :report, :total_tests, :failures, :ignored | |||||
| attr_writer :targets, :root, :out_file | |||||
| def initialize | |||||
| @report = '' | |||||
| @unit_name = '' | |||||
| end | |||||
| def run | |||||
| # Clean up result file names | |||||
| results = @targets.map { |target| target.tr('\\', '/') } | |||||
| # puts "Output File: #{@out_file}" | |||||
| f = File.new(@out_file, 'w') | |||||
| write_xml_header(f) | |||||
| write_suites_header(f) | |||||
| results.each do |result_file| | |||||
| lines = File.readlines(result_file).map(&:chomp) | |||||
| raise "Empty test result file: #{result_file}" if lines.empty? | |||||
| result_output = get_details(result_file, lines) | |||||
| tests, failures, ignored = parse_test_summary(lines) | |||||
| result_output[:counts][:total] = tests | |||||
| result_output[:counts][:failed] = failures | |||||
| result_output[:counts][:ignored] = ignored | |||||
| result_output[:counts][:passed] = (result_output[:counts][:total] - result_output[:counts][:failed] - result_output[:counts][:ignored]) | |||||
| # use line[0] from the test output to get the test_file path and name | |||||
| test_file_str = lines[0].tr('\\', '/') | |||||
| test_file_str = test_file_str.split(':') | |||||
| test_file = if test_file_str.length < 2 | |||||
| result_file | |||||
| else | |||||
| "#{test_file_str[0]}:#{test_file_str[1]}" | |||||
| end | |||||
| result_output[:source][:path] = File.dirname(test_file) | |||||
| result_output[:source][:file] = File.basename(test_file) | |||||
| # save result_output | |||||
| @unit_name = File.basename(test_file, '.*') | |||||
| write_suite_header(result_output[:counts], f) | |||||
| write_failures(result_output, f) | |||||
| write_tests(result_output, f) | |||||
| write_ignored(result_output, f) | |||||
| write_suite_footer(f) | |||||
| end | |||||
| write_suites_footer(f) | |||||
| f.close | |||||
| end | |||||
| def usage(err_msg = nil) | |||||
| puts "\nERROR: " | |||||
| puts err_msg if err_msg | |||||
| puts 'Usage: unity_to_junit.rb [options]' | |||||
| puts '' | |||||
| puts 'Specific options:' | |||||
| puts ' -r, --results <dir> Look for Unity Results files here.' | |||||
| puts ' -p, --root_path <path> Prepend this path to files in results.' | |||||
| puts ' -o, --output <filename> XML file to generate.' | |||||
| puts '' | |||||
| puts 'Common options:' | |||||
| puts ' -h, --help Show this message' | |||||
| puts ' --version Show version' | |||||
| exit 1 | |||||
| end | |||||
| protected | |||||
| def get_details(_result_file, lines) | |||||
| results = results_structure | |||||
| lines.each do |line| | |||||
| line = line.tr('\\', '/') | |||||
| _src_file, src_line, test_name, status, msg = line.split(/:/) | |||||
| case status | |||||
| when 'IGNORE' then results[:ignores] << { test: test_name, line: src_line, message: msg } | |||||
| when 'FAIL' then results[:failures] << { test: test_name, line: src_line, message: msg } | |||||
| when 'PASS' then results[:successes] << { test: test_name, line: src_line, message: msg } | |||||
| end | |||||
| end | |||||
| results | |||||
| end | |||||
| def parse_test_summary(summary) | |||||
| raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } | |||||
| [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] | |||||
| end | |||||
| private | |||||
| def results_structure | |||||
| { | |||||
| source: { path: '', file: '' }, | |||||
| successes: [], | |||||
| failures: [], | |||||
| ignores: [], | |||||
| counts: { total: 0, passed: 0, failed: 0, ignored: 0 }, | |||||
| stdout: [] | |||||
| } | |||||
| end | |||||
| def write_xml_header(stream) | |||||
| stream.puts "<?xml version='1.0' encoding='utf-8' ?>" | |||||
| end | |||||
| def write_suites_header(stream) | |||||
| stream.puts '<testsuites>' | |||||
| end | |||||
| def write_suite_header(counts, stream) | |||||
| stream.puts "\t<testsuite errors=\"0\" skipped=\"#{counts[:ignored]}\" failures=\"#{counts[:failed]}\" tests=\"#{counts[:total]}\" name=\"unity\">" | |||||
| end | |||||
| def write_failures(results, stream) | |||||
| result = results[:failures] | |||||
| result.each do |item| | |||||
| filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) | |||||
| stream.puts "\t\t<testcase classname=\"#{@unit_name}\" name=\"#{item[:test]}\" time=\"0\">" | |||||
| stream.puts "\t\t\t<failure message=\"#{item[:message]}\" type=\"Assertion\"/>" | |||||
| stream.puts "\t\t\t<system-err>
[File] #{filename}
[Line] #{item[:line]}
</system-err>" | |||||
| stream.puts "\t\t</testcase>" | |||||
| end | |||||
| end | |||||
| def write_tests(results, stream) | |||||
| result = results[:successes] | |||||
| result.each do |item| | |||||
| stream.puts "\t\t<testcase classname=\"#{@unit_name}\" name=\"#{item[:test]}\" time=\"0\" />" | |||||
| end | |||||
| end | |||||
| def write_ignored(results, stream) | |||||
| result = results[:ignores] | |||||
| result.each do |item| | |||||
| filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) | |||||
| puts "Writing ignored tests for test harness: #{filename}" | |||||
| stream.puts "\t\t<testcase classname=\"#{@unit_name}\" name=\"#{item[:test]}\" time=\"0\">" | |||||
| stream.puts "\t\t\t<skipped message=\"#{item[:message]}\" type=\"Assertion\"/>" | |||||
| stream.puts "\t\t\t<system-err>
[File] #{filename}
[Line] #{item[:line]}
</system-err>" | |||||
| stream.puts "\t\t</testcase>" | |||||
| end | |||||
| end | |||||
| def write_suite_footer(stream) | |||||
| stream.puts "\t</testsuite>" | |||||
| end | |||||
| def write_suites_footer(stream) | |||||
| stream.puts '</testsuites>' | |||||
| end | |||||
| end | |||||
| if $0 == __FILE__ | |||||
| # parse out the command options | |||||
| options = ArgvParser.parse(ARGV) | |||||
| # create an instance to work with | |||||
| utj = UnityToJUnit.new | |||||
| begin | |||||
| # look in the specified or current directory for result files | |||||
| targets = "#{options.results_dir.tr('\\', '/')}**/*.test*" | |||||
| results = Dir[targets] | |||||
| raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? | |||||
| utj.targets = results | |||||
| # set the root path | |||||
| utj.root = options.root_path | |||||
| # set the output XML file name | |||||
| # puts "Output File from options: #{options.out_file}" | |||||
| utj.out_file = options.out_file | |||||
| # run the summarizer | |||||
| puts utj.run | |||||
| rescue StandardError => e | |||||
| utj.usage e.message | |||||
| end | |||||
| end | |||||
| @@ -1,28 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| require_relative 'yaml_helper' | |||||
| module RakefileHelpers | |||||
| class TestFileFilter | |||||
| def initialize(all_files = false) | |||||
| @all_files = all_files | |||||
| return unless @all_files | |||||
| file = 'test_file_filter.yml' | |||||
| return unless File.exist?(file) | |||||
| filters = YamlHelper.load_file(file) | |||||
| @all_files = filters[:all_files] | |||||
| @only_files = filters[:only_files] | |||||
| @exclude_files = filters[:exclude_files] | |||||
| end | |||||
| attr_accessor :all_files, :only_files, :exclude_files | |||||
| end | |||||
| end | |||||
| @@ -1,13 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| module TypeSanitizer | |||||
| def self.sanitize_c_identifier(unsanitized) | |||||
| # convert filename to valid C identifier by replacing invalid chars with '_' | |||||
| unsanitized.gsub(/[-\/\\.,\s]/, '_') | |||||
| end | |||||
| end | |||||
| @@ -1,140 +0,0 @@ | |||||
| #! python3 | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| import sys | |||||
| import os | |||||
| import re | |||||
| from glob import glob | |||||
| class UnityTestSummary: | |||||
| def __init__(self): | |||||
| self.report = '' | |||||
| self.total_tests = 0 | |||||
| self.failures = 0 | |||||
| self.ignored = 0 | |||||
| def run(self): | |||||
| # Clean up result file names | |||||
| results = [] | |||||
| for target in self.targets: | |||||
| results.append(target.replace('\\', '/')) | |||||
| # Dig through each result file, looking for details on pass/fail: | |||||
| failure_output = [] | |||||
| ignore_output = [] | |||||
| for result_file in results: | |||||
| lines = list(map(lambda line: line.rstrip(), open(result_file, "r").read().split('\n'))) | |||||
| if len(lines) == 0: | |||||
| raise Exception("Empty test result file: %s" % result_file) | |||||
| details = self.get_details(result_file, lines) | |||||
| failures = details['failures'] | |||||
| ignores = details['ignores'] | |||||
| if len(failures) > 0: failure_output.append('\n'.join(failures)) | |||||
| if len(ignores) > 0: ignore_output.append('n'.join(ignores)) | |||||
| tests,failures,ignored = self.parse_test_summary('\n'.join(lines)) | |||||
| self.total_tests += tests | |||||
| self.failures += failures | |||||
| self.ignored += ignored | |||||
| if self.ignored > 0: | |||||
| self.report += "\n" | |||||
| self.report += "--------------------------\n" | |||||
| self.report += "UNITY IGNORED TEST SUMMARY\n" | |||||
| self.report += "--------------------------\n" | |||||
| self.report += "\n".join(ignore_output) | |||||
| if self.failures > 0: | |||||
| self.report += "\n" | |||||
| self.report += "--------------------------\n" | |||||
| self.report += "UNITY FAILED TEST SUMMARY\n" | |||||
| self.report += "--------------------------\n" | |||||
| self.report += '\n'.join(failure_output) | |||||
| self.report += "\n" | |||||
| self.report += "--------------------------\n" | |||||
| self.report += "OVERALL UNITY TEST SUMMARY\n" | |||||
| self.report += "--------------------------\n" | |||||
| self.report += "{total_tests} TOTAL TESTS {failures} TOTAL FAILURES {ignored} IGNORED\n".format(total_tests = self.total_tests, failures=self.failures, ignored=self.ignored) | |||||
| self.report += "\n" | |||||
| return self.report | |||||
| def set_targets(self, target_array): | |||||
| self.targets = target_array | |||||
| def set_root_path(self, path): | |||||
| self.root = path | |||||
| def usage(self, err_msg=None): | |||||
| print("\nERROR: ") | |||||
| if err_msg: | |||||
| print(err_msg) | |||||
| print("\nUsage: unity_test_summary.py result_file_directory/ root_path/") | |||||
| print(" result_file_directory - The location of your results files.") | |||||
| print(" Defaults to current directory if not specified.") | |||||
| print(" Should end in / if specified.") | |||||
| print(" root_path - Helpful for producing more verbose output if using relative paths.") | |||||
| sys.exit(1) | |||||
| def get_details(self, result_file, lines): | |||||
| results = { 'failures': [], 'ignores': [], 'successes': [] } | |||||
| for line in lines: | |||||
| parts = line.split(':') | |||||
| if len(parts) == 5: | |||||
| src_file,src_line,test_name,status,msg = parts | |||||
| elif len(parts) == 4: | |||||
| src_file,src_line,test_name,status = parts | |||||
| msg = '' | |||||
| else: | |||||
| continue | |||||
| if len(self.root) > 0: | |||||
| line_out = "%s%s" % (self.root, line) | |||||
| else: | |||||
| line_out = line | |||||
| if status == 'IGNORE': | |||||
| results['ignores'].append(line_out) | |||||
| elif status == 'FAIL': | |||||
| results['failures'].append(line_out) | |||||
| elif status == 'PASS': | |||||
| results['successes'].append(line_out) | |||||
| return results | |||||
| def parse_test_summary(self, summary): | |||||
| m = re.search(r"([0-9]+) Tests ([0-9]+) Failures ([0-9]+) Ignored", summary) | |||||
| if not m: | |||||
| raise Exception("Couldn't parse test results: %s" % summary) | |||||
| return int(m.group(1)), int(m.group(2)), int(m.group(3)) | |||||
| if __name__ == '__main__': | |||||
| uts = UnityTestSummary() | |||||
| try: | |||||
| #look in the specified or current directory for result files | |||||
| if len(sys.argv) > 1: | |||||
| targets_dir = sys.argv[1] | |||||
| else: | |||||
| targets_dir = './' | |||||
| targets = list(map(lambda x: x.replace('\\', '/'), glob(targets_dir + '**/*.test*', recursive=True))) | |||||
| if len(targets) == 0: | |||||
| raise Exception("No *.testpass or *.testfail files found in '%s'" % targets_dir) | |||||
| uts.set_targets(targets) | |||||
| #set the root path | |||||
| if len(sys.argv) > 2: | |||||
| root_path = sys.argv[2] | |||||
| else: | |||||
| root_path = os.path.split(__file__)[0] | |||||
| uts.set_root_path(root_path) | |||||
| #run the summarizer | |||||
| print(uts.run()) | |||||
| except Exception as e: | |||||
| uts.usage(e) | |||||
| @@ -1,140 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| # !/usr/bin/ruby | |||||
| # | |||||
| # unity_test_summary.rb | |||||
| # | |||||
| require 'fileutils' | |||||
| require 'set' | |||||
| class UnityTestSummary | |||||
| include FileUtils::Verbose | |||||
| attr_reader :report, :total_tests, :failures, :ignored | |||||
| attr_writer :targets, :root | |||||
| def initialize(_opts = {}) | |||||
| @report = '' | |||||
| @total_tests = 0 | |||||
| @failures = 0 | |||||
| @ignored = 0 | |||||
| end | |||||
| def run | |||||
| # Clean up result file names | |||||
| results = @targets.map { |target| target.tr('\\', '/') } | |||||
| # Dig through each result file, looking for details on pass/fail: | |||||
| failure_output = [] | |||||
| ignore_output = [] | |||||
| results.each do |result_file| | |||||
| lines = File.readlines(result_file).map(&:chomp) | |||||
| raise "Empty test result file: #{result_file}" if lines.empty? | |||||
| output = get_details(result_file, lines) | |||||
| failure_output << output[:failures] unless output[:failures].empty? | |||||
| ignore_output << output[:ignores] unless output[:ignores].empty? | |||||
| tests, failures, ignored = parse_test_summary(lines) | |||||
| @total_tests += tests | |||||
| @failures += failures | |||||
| @ignored += ignored | |||||
| end | |||||
| if @ignored > 0 | |||||
| @report += "\n" | |||||
| @report += "--------------------------\n" | |||||
| @report += "UNITY IGNORED TEST SUMMARY\n" | |||||
| @report += "--------------------------\n" | |||||
| @report += ignore_output.flatten.join("\n") | |||||
| end | |||||
| if @failures > 0 | |||||
| @report += "\n" | |||||
| @report += "--------------------------\n" | |||||
| @report += "UNITY FAILED TEST SUMMARY\n" | |||||
| @report += "--------------------------\n" | |||||
| @report += failure_output.flatten.join("\n") | |||||
| end | |||||
| @report += "\n" | |||||
| @report += "--------------------------\n" | |||||
| @report += "OVERALL UNITY TEST SUMMARY\n" | |||||
| @report += "--------------------------\n" | |||||
| @report += "#{@total_tests} TOTAL TESTS #{@failures} TOTAL FAILURES #{@ignored} IGNORED\n" | |||||
| @report += "\n" | |||||
| end | |||||
| def usage(err_msg = nil) | |||||
| puts "\nERROR: " | |||||
| puts err_msg if err_msg | |||||
| puts "\nUsage: unity_test_summary.rb result_file_directory/ root_path/" | |||||
| puts ' result_file_directory - The location of your results files.' | |||||
| puts ' Defaults to current directory if not specified.' | |||||
| puts ' Should end in / if specified.' | |||||
| puts ' root_path - Helpful for producing more verbose output if using relative paths.' | |||||
| exit 1 | |||||
| end | |||||
| protected | |||||
| def get_details(_result_file, lines) | |||||
| results = { failures: [], ignores: [], successes: [] } | |||||
| lines.each do |line| | |||||
| status_match = line.match(/^[^:]+:[^:]+:\w+(?:\([^)]*\))?:([^:]+):?/) | |||||
| next unless status_match | |||||
| status = status_match.captures[0] | |||||
| line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\') | |||||
| case status | |||||
| when 'IGNORE' then results[:ignores] << line_out | |||||
| when 'FAIL' then results[:failures] << line_out | |||||
| when 'PASS' then results[:successes] << line_out | |||||
| end | |||||
| end | |||||
| results | |||||
| end | |||||
| def parse_test_summary(summary) | |||||
| raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } | |||||
| [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] | |||||
| end | |||||
| end | |||||
| if $0 == __FILE__ | |||||
| # parse out the command options | |||||
| opts, args = ARGV.partition { |v| v =~ /^--\w+/ } | |||||
| opts.map! { |v| v[2..].to_sym } | |||||
| # create an instance to work with | |||||
| uts = UnityTestSummary.new(opts) | |||||
| begin | |||||
| # look in the specified or current directory for result files | |||||
| args[0] ||= './' | |||||
| targets = "#{ARGV[0].tr('\\', '/')}**/*.test*" | |||||
| results = Dir[targets] | |||||
| raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? | |||||
| uts.targets = results | |||||
| # set the root path | |||||
| args[1] ||= "#{Dir.pwd}/" | |||||
| uts.root = ARGV[1] | |||||
| # run the summarizer | |||||
| puts uts.run | |||||
| rescue StandardError => e | |||||
| uts.usage e.message | |||||
| end | |||||
| end | |||||
| @@ -1,23 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| require 'yaml' | |||||
| module YamlHelper | |||||
| def self.load(body) | |||||
| if YAML.respond_to?(:unsafe_load) | |||||
| YAML.unsafe_load(body) | |||||
| else | |||||
| YAML.load(body) | |||||
| end | |||||
| end | |||||
| def self.load_file(file) | |||||
| body = File.read(file) | |||||
| self.load(body) | |||||
| end | |||||
| end | |||||
| @@ -1,48 +0,0 @@ | |||||
| project('Unity example', 'c', | |||||
| license: 'MIT', | |||||
| default_options: [ | |||||
| 'c_std=c99', | |||||
| 'warning_level=3', | |||||
| ], | |||||
| meson_version: '>= 0.49.0' | |||||
| ) | |||||
| unity_subproject = subproject('unity') | |||||
| unity_dependency = unity_subproject.get_variable('unity_dep') | |||||
| unity_gen_runner = unity_subproject.get_variable('gen_test_runner') | |||||
| src1 = files([ | |||||
| 'src' / 'ProductionCode.c', | |||||
| 'test' / 'TestProductionCode.c', | |||||
| ]) | |||||
| src2 = files([ | |||||
| 'src' / 'ProductionCode2.c', | |||||
| 'test' / 'TestProductionCode2.c', | |||||
| ]) | |||||
| inc = include_directories('src') | |||||
| test1 = executable('test1', | |||||
| sources: [ | |||||
| src1, | |||||
| unity_gen_runner.process('test' / 'TestProductionCode.c') | |||||
| ], | |||||
| include_directories: [ inc ], | |||||
| dependencies: [ unity_dependency ], | |||||
| ) | |||||
| test('test1', test1, | |||||
| should_fail: true) | |||||
| test2 = executable('test2', | |||||
| sources: [ | |||||
| src2, | |||||
| unity_gen_runner.process('test' / 'TestProductionCode2.c') | |||||
| ], | |||||
| include_directories: [ inc ], | |||||
| dependencies: [ unity_dependency ], | |||||
| ) | |||||
| test('test2', test2) | |||||
| @@ -1,12 +0,0 @@ | |||||
| Example 1 | |||||
| ========= | |||||
| Close to the simplest possible example of Unity, using only basic features. | |||||
| Build and run with Make | |||||
| --- | |||||
| Just run `make`. | |||||
| Build and run with Meson | |||||
| --- | |||||
| Run `meson setup build` to create the build directory, and then `meson test -C build` to build and run the tests. | |||||
| @@ -1,30 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode.h" | |||||
| int Counter = 0; | |||||
| int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; /* some obnoxious array to search that is 1-based indexing instead of 0. */ | |||||
| /* This function is supposed to search through NumbersToFind and find a particular number. | |||||
| * If it finds it, the index is returned. Otherwise 0 is returned which sorta makes sense since | |||||
| * NumbersToFind is indexed from 1. Unfortunately it's broken | |||||
| * (and should therefore be caught by our tests) */ | |||||
| int FindFunction_WhichIsBroken(int NumberToFind) | |||||
| { | |||||
| int i = 0; | |||||
| while (i < 8) /* Notice I should have been in braces */ | |||||
| i++; | |||||
| if (NumbersToFind[i] == NumberToFind) /* Yikes! I'm getting run after the loop finishes instead of during it! */ | |||||
| return i; | |||||
| return 0; | |||||
| } | |||||
| int FunctionWhichReturnsLocalVariable(void) | |||||
| { | |||||
| return Counter; | |||||
| } | |||||
| @@ -1,9 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| int FindFunction_WhichIsBroken(int NumberToFind); | |||||
| int FunctionWhichReturnsLocalVariable(void); | |||||
| @@ -1,17 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode2.h" | |||||
| char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction) | |||||
| { | |||||
| (void)Poor; | |||||
| (void)LittleFunction; | |||||
| /* Since There Are No Tests Yet, This Function Could Be Empty For All We Know. | |||||
| * Which isn't terribly useful... but at least we put in a TEST_IGNORE so we won't forget */ | |||||
| return (char*)0; | |||||
| } | |||||
| @@ -1,8 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction); | |||||
| @@ -1,3 +0,0 @@ | |||||
| [wrap-git] | |||||
| url = https://github.com/ThrowTheSwitch/Unity.git | |||||
| revision = head | |||||
| @@ -1,68 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode.h" | |||||
| #include "unity.h" | |||||
| /* sometimes you may want to get at local data in a module. | |||||
| * for example: If you plan to pass by reference, this could be useful | |||||
| * however, it should often be avoided */ | |||||
| extern int Counter; | |||||
| void setUp(void) | |||||
| { | |||||
| /* This is run before EACH TEST */ | |||||
| Counter = 0x5a5a; | |||||
| } | |||||
| void tearDown(void) | |||||
| { | |||||
| } | |||||
| void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void) | |||||
| { | |||||
| /* All of these should pass */ | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(78)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(2)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(33)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(999)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(-1)); | |||||
| } | |||||
| void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void) | |||||
| { | |||||
| /* You should see this line fail in your test summary */ | |||||
| TEST_ASSERT_EQUAL(1, FindFunction_WhichIsBroken(34)); | |||||
| /* Notice the rest of these didn't get a chance to run because the line above failed. | |||||
| * Unit tests abort each test function on the first sign of trouble. | |||||
| * Then NEXT test function runs as normal. */ | |||||
| TEST_ASSERT_EQUAL(8, FindFunction_WhichIsBroken(8888)); | |||||
| } | |||||
| void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void) | |||||
| { | |||||
| /* This should be true because setUp set this up for us before this test */ | |||||
| TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); | |||||
| /* This should be true because we can still change our answer */ | |||||
| Counter = 0x1234; | |||||
| TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void) | |||||
| { | |||||
| /* This should be true again because setup was rerun before this test (and after we changed it to 0x1234) */ | |||||
| TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void) | |||||
| { | |||||
| /* Sometimes you get the test wrong. When that happens, you get a failure too... and a quick look should tell | |||||
| * you what actually happened...which in this case was a failure to setup the initial condition. */ | |||||
| TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| @@ -1,37 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode2.h" | |||||
| #include "unity.h" | |||||
| /* These should be ignored because they are commented out in various ways: | |||||
| #include "whatever.h" | |||||
| #include "somethingelse.h" | |||||
| */ | |||||
| void setUp(void) | |||||
| { | |||||
| } | |||||
| void tearDown(void) | |||||
| { | |||||
| } | |||||
| void test_IgnoredTest(void) | |||||
| { | |||||
| TEST_IGNORE_MESSAGE("This Test Was Ignored On Purpose"); | |||||
| } | |||||
| void test_AnotherIgnoredTest(void) | |||||
| { | |||||
| TEST_IGNORE_MESSAGE("These Can Be Useful For Leaving Yourself Notes On What You Need To Do Yet"); | |||||
| } | |||||
| void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void) | |||||
| { | |||||
| TEST_IGNORE(); /* Like This */ | |||||
| } | |||||
| @@ -1,53 +0,0 @@ | |||||
| /* AUTOGENERATED FILE. DO NOT EDIT. */ | |||||
| /*=======Test Runner Used To Run Each Test Below=====*/ | |||||
| #define RUN_TEST(TestFunc, TestLineNum) \ | |||||
| { \ | |||||
| Unity.CurrentTestName = #TestFunc; \ | |||||
| Unity.CurrentTestLineNumber = TestLineNum; \ | |||||
| Unity.NumberOfTests++; \ | |||||
| if (TEST_PROTECT()) \ | |||||
| { \ | |||||
| setUp(); \ | |||||
| TestFunc(); \ | |||||
| } \ | |||||
| if (TEST_PROTECT()) \ | |||||
| { \ | |||||
| tearDown(); \ | |||||
| } \ | |||||
| UnityConcludeTest(); \ | |||||
| } | |||||
| /*=======Automagically Detected Files To Include=====*/ | |||||
| #include "unity.h" | |||||
| #include <setjmp.h> | |||||
| #include <stdio.h> | |||||
| #include "ProductionCode2.h" | |||||
| /*=======External Functions This Runner Calls=====*/ | |||||
| extern void setUp(void); | |||||
| extern void tearDown(void); | |||||
| extern void test_IgnoredTest(void); | |||||
| extern void test_AnotherIgnoredTest(void); | |||||
| extern void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void); | |||||
| /*=======Test Reset Option=====*/ | |||||
| void resetTest(void); | |||||
| void resetTest(void) | |||||
| { | |||||
| tearDown(); | |||||
| setUp(); | |||||
| } | |||||
| /*=======MAIN=====*/ | |||||
| int main(void) | |||||
| { | |||||
| UnityBegin("test/TestProductionCode2.c"); | |||||
| RUN_TEST(test_IgnoredTest, 18); | |||||
| RUN_TEST(test_AnotherIgnoredTest, 23); | |||||
| RUN_TEST(test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented, 28); | |||||
| return (UnityEnd()); | |||||
| } | |||||
| @@ -1,57 +0,0 @@ | |||||
| /* AUTOGENERATED FILE. DO NOT EDIT. */ | |||||
| /*=======Test Runner Used To Run Each Test Below=====*/ | |||||
| #define RUN_TEST(TestFunc, TestLineNum) \ | |||||
| { \ | |||||
| Unity.CurrentTestName = #TestFunc; \ | |||||
| Unity.CurrentTestLineNumber = TestLineNum; \ | |||||
| Unity.NumberOfTests++; \ | |||||
| if (TEST_PROTECT()) \ | |||||
| { \ | |||||
| setUp(); \ | |||||
| TestFunc(); \ | |||||
| } \ | |||||
| if (TEST_PROTECT()) \ | |||||
| { \ | |||||
| tearDown(); \ | |||||
| } \ | |||||
| UnityConcludeTest(); \ | |||||
| } | |||||
| /*=======Automagically Detected Files To Include=====*/ | |||||
| #include "unity.h" | |||||
| #include <setjmp.h> | |||||
| #include <stdio.h> | |||||
| #include "ProductionCode.h" | |||||
| /*=======External Functions This Runner Calls=====*/ | |||||
| extern void setUp(void); | |||||
| extern void tearDown(void); | |||||
| extern void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void); | |||||
| extern void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void); | |||||
| extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void); | |||||
| extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void); | |||||
| extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void); | |||||
| /*=======Test Reset Option=====*/ | |||||
| void resetTest(void); | |||||
| void resetTest(void) | |||||
| { | |||||
| tearDown(); | |||||
| setUp(); | |||||
| } | |||||
| /*=======MAIN=====*/ | |||||
| int main(void) | |||||
| { | |||||
| UnityBegin("test/TestProductionCode.c"); | |||||
| RUN_TEST(test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode, 20); | |||||
| RUN_TEST(test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken, 30); | |||||
| RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue, 41); | |||||
| RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain, 51); | |||||
| RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed, 57); | |||||
| return (UnityEnd()); | |||||
| } | |||||
| @@ -1,5 +0,0 @@ | |||||
| Example 2 | |||||
| ========= | |||||
| Same as the first example, but now using Unity's test fixture to group tests | |||||
| together. Using the test fixture also makes writing test runners much easier. | |||||
| @@ -1,30 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode.h" | |||||
| int Counter = 0; | |||||
| int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; //some obnoxious array to search that is 1-based indexing instead of 0. | |||||
| // This function is supposed to search through NumbersToFind and find a particular number. | |||||
| // If it finds it, the index is returned. Otherwise 0 is returned which sorta makes sense since | |||||
| // NumbersToFind is indexed from 1. Unfortunately it's broken | |||||
| // (and should therefore be caught by our tests) | |||||
| int FindFunction_WhichIsBroken(int NumberToFind) | |||||
| { | |||||
| int i = 0; | |||||
| while (i < 8) //Notice I should have been in braces | |||||
| i++; | |||||
| if (NumbersToFind[i] == NumberToFind) //Yikes! I'm getting run after the loop finishes instead of during it! | |||||
| return i; | |||||
| return 0; | |||||
| } | |||||
| int FunctionWhichReturnsLocalVariable(void) | |||||
| { | |||||
| return Counter; | |||||
| } | |||||
| @@ -1,9 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| int FindFunction_WhichIsBroken(int NumberToFind); | |||||
| int FunctionWhichReturnsLocalVariable(void); | |||||
| @@ -1,17 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode2.h" | |||||
| char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction) | |||||
| { | |||||
| (void)Poor; | |||||
| (void)LittleFunction; | |||||
| //Since There Are No Tests Yet, This Function Could Be Empty For All We Know. | |||||
| // Which isn't terribly useful... but at least we put in a TEST_IGNORE so we won't forget | |||||
| return (char*)0; | |||||
| } | |||||
| @@ -1,8 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction); | |||||
| @@ -1,71 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode.h" | |||||
| #include "unity.h" | |||||
| #include "unity_fixture.h" | |||||
| TEST_GROUP(ProductionCode); | |||||
| //sometimes you may want to get at local data in a module. | |||||
| //for example: If you plan to pass by reference, this could be useful | |||||
| //however, it should often be avoided | |||||
| extern int Counter; | |||||
| TEST_SETUP(ProductionCode) | |||||
| { | |||||
| //This is run before EACH TEST | |||||
| Counter = 0x5a5a; | |||||
| } | |||||
| TEST_TEAR_DOWN(ProductionCode) | |||||
| { | |||||
| } | |||||
| TEST(ProductionCode, FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode) | |||||
| { | |||||
| //All of these should pass | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(78)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(2)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(33)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(999)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(-1)); | |||||
| } | |||||
| TEST(ProductionCode, FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken) | |||||
| { | |||||
| // You should see this line fail in your test summary | |||||
| TEST_ASSERT_EQUAL(1, FindFunction_WhichIsBroken(34)); | |||||
| // Notice the rest of these didn't get a chance to run because the line above failed. | |||||
| // Unit tests abort each test function on the first sign of trouble. | |||||
| // Then NEXT test function runs as normal. | |||||
| TEST_ASSERT_EQUAL(8, FindFunction_WhichIsBroken(8888)); | |||||
| } | |||||
| TEST(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue) | |||||
| { | |||||
| //This should be true because setUp set this up for us before this test | |||||
| TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); | |||||
| //This should be true because we can still change our answer | |||||
| Counter = 0x1234; | |||||
| TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| TEST(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain) | |||||
| { | |||||
| //This should be true again because setup was rerun before this test (and after we changed it to 0x1234) | |||||
| TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| TEST(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed) | |||||
| { | |||||
| //Sometimes you get the test wrong. When that happens, you get a failure too... and a quick look should tell | |||||
| // you what actually happened...which in this case was a failure to setup the initial condition. | |||||
| TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| @@ -1,40 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode2.h" | |||||
| #include "unity.h" | |||||
| #include "unity_fixture.h" | |||||
| TEST_GROUP(ProductionCode2); | |||||
| /* These should be ignored because they are commented out in various ways: | |||||
| #include "whatever.h" | |||||
| */ | |||||
| //#include "somethingelse.h" | |||||
| TEST_SETUP(ProductionCode2) | |||||
| { | |||||
| } | |||||
| TEST_TEAR_DOWN(ProductionCode2) | |||||
| { | |||||
| } | |||||
| TEST(ProductionCode2, IgnoredTest) | |||||
| { | |||||
| TEST_IGNORE_MESSAGE("This Test Was Ignored On Purpose"); | |||||
| } | |||||
| TEST(ProductionCode2, AnotherIgnoredTest) | |||||
| { | |||||
| TEST_IGNORE_MESSAGE("These Can Be Useful For Leaving Yourself Notes On What You Need To Do Yet"); | |||||
| } | |||||
| TEST(ProductionCode2, ThisFunctionHasNotBeenTested_NeedsToBeImplemented) | |||||
| { | |||||
| TEST_IGNORE(); //Like This | |||||
| } | |||||
| @@ -1,16 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "unity.h" | |||||
| #include "unity_fixture.h" | |||||
| TEST_GROUP_RUNNER(ProductionCode2) | |||||
| { | |||||
| RUN_TEST_CASE(ProductionCode2, IgnoredTest); | |||||
| RUN_TEST_CASE(ProductionCode2, AnotherIgnoredTest); | |||||
| RUN_TEST_CASE(ProductionCode2, ThisFunctionHasNotBeenTested_NeedsToBeImplemented); | |||||
| } | |||||
| @@ -1,18 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "unity.h" | |||||
| #include "unity_fixture.h" | |||||
| TEST_GROUP_RUNNER(ProductionCode) | |||||
| { | |||||
| RUN_TEST_CASE(ProductionCode, FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode); | |||||
| RUN_TEST_CASE(ProductionCode, FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken); | |||||
| RUN_TEST_CASE(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue); | |||||
| RUN_TEST_CASE(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain); | |||||
| RUN_TEST_CASE(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed); | |||||
| } | |||||
| @@ -1,19 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "unity_fixture.h" | |||||
| static void RunAllTests(void) | |||||
| { | |||||
| RUN_TEST_GROUP(ProductionCode); | |||||
| RUN_TEST_GROUP(ProductionCode2); | |||||
| } | |||||
| int main(int argc, const char * argv[]) | |||||
| { | |||||
| return UnityMain(argc, argv, RunAllTests); | |||||
| } | |||||
| @@ -1,17 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "unity.h" | |||||
| #include "UnityHelper.h" | |||||
| #include <stdio.h> | |||||
| #include <string.h> | |||||
| void AssertEqualExampleStruct(const EXAMPLE_STRUCT_T expected, const EXAMPLE_STRUCT_T actual, const unsigned short line) | |||||
| { | |||||
| UNITY_TEST_ASSERT_EQUAL_INT(expected.x, actual.x, line, "Example Struct Failed For Field x"); | |||||
| UNITY_TEST_ASSERT_EQUAL_INT(expected.y, actual.y, line, "Example Struct Failed For Field y"); | |||||
| } | |||||
| @@ -1,19 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #ifndef _TESTHELPER_H | |||||
| #define _TESTHELPER_H | |||||
| #include "Types.h" | |||||
| void AssertEqualExampleStruct(const EXAMPLE_STRUCT_T expected, const EXAMPLE_STRUCT_T actual, const unsigned short line); | |||||
| #define UNITY_TEST_ASSERT_EQUAL_EXAMPLE_STRUCT_T(expected, actual, line, message) AssertEqualExampleStruct(expected, actual, line); | |||||
| #define TEST_ASSERT_EQUAL_EXAMPLE_STRUCT_T(expected, actual) UNITY_TEST_ASSERT_EQUAL_EXAMPLE_STRUCT_T(expected, actual, __LINE__, NULL); | |||||
| #endif // _TESTHELPER_H | |||||
| @@ -1,45 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| require 'rake' | |||||
| require 'rake/clean' | |||||
| require_relative 'rakefile_helper' | |||||
| TEMP_DIRS = [ | |||||
| File.join(__dir__, 'build') | |||||
| ].freeze | |||||
| TEMP_DIRS.each do |dir| | |||||
| directory(dir) | |||||
| CLOBBER.include(dir) | |||||
| end | |||||
| task prepare_for_tests: TEMP_DIRS | |||||
| # Load default configuration, for now | |||||
| DEFAULT_CONFIG_FILE = 'target_gcc_32.yml'.freeze | |||||
| configure_toolchain(DEFAULT_CONFIG_FILE) | |||||
| task unit: [:prepare_for_tests] do | |||||
| run_tests unit_test_files | |||||
| end | |||||
| desc 'Generate test summary' | |||||
| task :summary do | |||||
| report_summary | |||||
| end | |||||
| desc 'Build and test Unity' | |||||
| task all: %i[clean unit summary] | |||||
| task default: %i[clobber all] | |||||
| task ci: [:default] | |||||
| task cruise: [:default] | |||||
| desc 'Load configuration' | |||||
| task :config, :config_file do |_t, args| | |||||
| configure_toolchain(args[:config_file]) | |||||
| end | |||||
| @@ -1,255 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| require 'fileutils' | |||||
| require_relative '../../auto/unity_test_summary' | |||||
| require_relative '../../auto/generate_test_runner' | |||||
| require_relative '../../auto/colour_reporter' | |||||
| require_relative '../../auto/yaml_helper' | |||||
| C_EXTENSION = '.c'.freeze | |||||
| def load_configuration(config_file) | |||||
| $cfg_file = config_file | |||||
| $cfg = YamlHelper.load_file($cfg_file) | |||||
| end | |||||
| def configure_clean | |||||
| CLEAN.include("#{$cfg['compiler']['build_path']}*.*") unless $cfg['compiler']['build_path'].nil? | |||||
| end | |||||
| def configure_toolchain(config_file = DEFAULT_CONFIG_FILE) | |||||
| config_file += '.yml' unless config_file =~ /\.yml$/ | |||||
| load_configuration(config_file) | |||||
| configure_clean | |||||
| end | |||||
| def unit_test_files | |||||
| path = "#{$cfg['compiler']['unit_tests_path']}Test*#{C_EXTENSION}" | |||||
| path.tr!('\\', '/') | |||||
| FileList.new(path) | |||||
| end | |||||
| def local_include_dirs | |||||
| include_dirs = $cfg['compiler']['includes']['items'].dup | |||||
| include_dirs.delete_if { |dir| dir.is_a?(Array) } | |||||
| include_dirs | |||||
| end | |||||
| def extract_headers(filename) | |||||
| includes = [] | |||||
| lines = File.readlines(filename) | |||||
| lines.each do |line| | |||||
| m = line.match(/^\s*#include\s+"\s*(.+\.[hH])\s*"/) | |||||
| includes << m[1] unless m.nil? | |||||
| end | |||||
| includes | |||||
| end | |||||
| def find_source_file(header, paths) | |||||
| paths.each do |dir| | |||||
| src_file = dir + header.ext(C_EXTENSION) | |||||
| return src_file if File.exist?(src_file) | |||||
| end | |||||
| nil | |||||
| end | |||||
| def tackit(strings) | |||||
| if strings.is_a?(Array) | |||||
| "\"#{strings.join}\"" | |||||
| else | |||||
| strings | |||||
| end | |||||
| end | |||||
| def squash(prefix, items) | |||||
| result = '' | |||||
| items.each { |item| result += " #{prefix}#{tackit(item)}" } | |||||
| result | |||||
| end | |||||
| def build_compiler_fields | |||||
| command = tackit($cfg['compiler']['path']) | |||||
| defines = if $cfg['compiler']['defines']['items'].nil? | |||||
| '' | |||||
| else | |||||
| squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items']) | |||||
| end | |||||
| options = squash('', $cfg['compiler']['options']) | |||||
| includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) | |||||
| includes = includes.gsub(/\\ /, ' ').gsub(/\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) | |||||
| { command: command, defines: defines, options: options, includes: includes } | |||||
| end | |||||
| def compile(file, _defines = []) | |||||
| compiler = build_compiler_fields | |||||
| cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " \ | |||||
| "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" | |||||
| obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" | |||||
| execute(cmd_str + obj_file) | |||||
| obj_file | |||||
| end | |||||
| def build_linker_fields | |||||
| command = tackit($cfg['linker']['path']) | |||||
| options = if $cfg['linker']['options'].nil? | |||||
| '' | |||||
| else | |||||
| squash('', $cfg['linker']['options']) | |||||
| end | |||||
| includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? | |||||
| '' | |||||
| else | |||||
| squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) | |||||
| end.gsub(/\\ /, ' ').gsub(/\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) | |||||
| { command: command, options: options, includes: includes } | |||||
| end | |||||
| def link_it(exe_name, obj_list) | |||||
| linker = build_linker_fields | |||||
| cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]}" | |||||
| cmd_str += " #{(obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj}" }).join(' ')}" | |||||
| cmd_str += " #{$cfg['linker']['bin_files']['prefix']} " | |||||
| cmd_str += $cfg['linker']['bin_files']['destination'] | |||||
| cmd_str += exe_name + $cfg['linker']['bin_files']['extension'] | |||||
| execute(cmd_str) | |||||
| end | |||||
| def build_simulator_fields | |||||
| return nil if $cfg['simulator'].nil? | |||||
| command = if $cfg['simulator']['path'].nil? | |||||
| '' | |||||
| else | |||||
| "#{tackit($cfg['simulator']['path'])} " | |||||
| end | |||||
| pre_support = if $cfg['simulator']['pre_support'].nil? | |||||
| '' | |||||
| else | |||||
| squash('', $cfg['simulator']['pre_support']) | |||||
| end | |||||
| post_support = if $cfg['simulator']['post_support'].nil? | |||||
| '' | |||||
| else | |||||
| squash('', $cfg['simulator']['post_support']) | |||||
| end | |||||
| { command: command, pre_support: pre_support, post_support: post_support } | |||||
| end | |||||
| def execute(command_string, verbose = true, raise_on_fail = true) | |||||
| report command_string | |||||
| output = `#{command_string}`.chomp | |||||
| report(output) if verbose && !output.nil? && !output.empty? | |||||
| if !$?.nil? && !$?.exitstatus.zero? && raise_on_fail | |||||
| raise "Command failed. (Returned #{$?.exitstatus})" | |||||
| end | |||||
| output | |||||
| end | |||||
| def report_summary | |||||
| summary = UnityTestSummary.new | |||||
| summary.root = __dir__ | |||||
| results_glob = "#{$cfg['compiler']['build_path']}*.test*" | |||||
| results_glob.tr!('\\', '/') | |||||
| results = Dir[results_glob] | |||||
| summary.targets = results | |||||
| summary.run | |||||
| fail_out 'FAIL: There were failures' if summary.failures > 0 | |||||
| end | |||||
| def run_tests(test_files) | |||||
| report 'Running system tests...' | |||||
| # Tack on TEST define for compiling unit tests | |||||
| load_configuration($cfg_file) | |||||
| test_defines = ['TEST'] | |||||
| $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? | |||||
| $cfg['compiler']['defines']['items'] << 'TEST' | |||||
| include_dirs = local_include_dirs | |||||
| # Build and execute each unit test | |||||
| test_files.each do |test| | |||||
| obj_list = [] | |||||
| # Detect dependencies and build required required modules | |||||
| extract_headers(test).each do |header| | |||||
| # Compile corresponding source file if it exists | |||||
| src_file = find_source_file(header, include_dirs) | |||||
| obj_list << compile(src_file, test_defines) unless src_file.nil? | |||||
| end | |||||
| # Build the test runner (generate if configured to do so) | |||||
| test_base = File.basename(test, C_EXTENSION) | |||||
| runner_name = "#{test_base}_Runner.c" | |||||
| if $cfg['compiler']['runner_path'].nil? | |||||
| runner_path = $cfg['compiler']['build_path'] + runner_name | |||||
| test_gen = UnityTestRunnerGenerator.new($cfg_file) | |||||
| test_gen.run(test, runner_path) | |||||
| else | |||||
| runner_path = $cfg['compiler']['runner_path'] + runner_name | |||||
| end | |||||
| obj_list << compile(runner_path, test_defines) | |||||
| # Build the test module | |||||
| obj_list << compile(test, test_defines) | |||||
| # Link the test executable | |||||
| link_it(test_base, obj_list) | |||||
| # Execute unit test and generate results file | |||||
| simulator = build_simulator_fields | |||||
| executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] | |||||
| cmd_str = if simulator.nil? | |||||
| executable | |||||
| else | |||||
| "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" | |||||
| end | |||||
| output = execute(cmd_str, true, false) | |||||
| test_results = $cfg['compiler']['build_path'] + test_base | |||||
| test_results += if output.match(/OK$/m).nil? | |||||
| '.testfail' | |||||
| else | |||||
| '.testpass' | |||||
| end | |||||
| File.open(test_results, 'w') { |f| f.print output } | |||||
| end | |||||
| end | |||||
| def build_application(main) | |||||
| report 'Building application...' | |||||
| obj_list = [] | |||||
| load_configuration($cfg_file) | |||||
| main_path = $cfg['compiler']['source_path'] + main + C_EXTENSION | |||||
| # Detect dependencies and build required required modules | |||||
| include_dirs = get_local_include_dirs | |||||
| extract_headers(main_path).each do |header| | |||||
| src_file = find_source_file(header, include_dirs) | |||||
| obj_list << compile(src_file) unless src_file.nil? | |||||
| end | |||||
| # Build the main source file | |||||
| main_base = File.basename(main_path, C_EXTENSION) | |||||
| obj_list << compile(main_path) | |||||
| # Create the executable | |||||
| link_it(main_base, obj_list) | |||||
| end | |||||
| def fail_out(msg) | |||||
| puts msg | |||||
| puts 'Not returning exit code so continuous integration can pass' | |||||
| # exit(-1) # Only removed to pass example_3, which has failing tests on purpose. | |||||
| # Still fail if the build fails for any other reason. | |||||
| end | |||||
| @@ -1,13 +0,0 @@ | |||||
| Example 3 | |||||
| ========= | |||||
| This example project gives an example of some passing, ignored, and failing tests. | |||||
| It's simple and meant for you to look over and get an idea for what all of this stuff does. | |||||
| You can build and test using rake. The rake version will let you test with gcc or a couple | |||||
| versions of IAR. You can tweak the yaml files to get those versions running. | |||||
| Ruby is required if you're using the rake version (obviously). This version shows off most of | |||||
| Unity's advanced features (automatically creating test runners, fancy summaries, etc.) | |||||
| Without ruby, you have to maintain your own test runners. Do that for a while and you'll learn | |||||
| why you really want to start using the Ruby tools. | |||||
| @@ -1,30 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode.h" | |||||
| int Counter = 0; | |||||
| int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; //some obnoxious array to search that is 1-based indexing instead of 0. | |||||
| // This function is supposed to search through NumbersToFind and find a particular number. | |||||
| // If it finds it, the index is returned. Otherwise 0 is returned which sorta makes sense since | |||||
| // NumbersToFind is indexed from 1. Unfortunately it's broken | |||||
| // (and should therefore be caught by our tests) | |||||
| int FindFunction_WhichIsBroken(int NumberToFind) | |||||
| { | |||||
| int i = 0; | |||||
| while (i < 8) //Notice I should have been in braces | |||||
| i++; | |||||
| if (NumbersToFind[i] == NumberToFind) //Yikes! I'm getting run after the loop finishes instead of during it! | |||||
| return i; | |||||
| return 0; | |||||
| } | |||||
| int FunctionWhichReturnsLocalVariable(void) | |||||
| { | |||||
| return Counter; | |||||
| } | |||||
| @@ -1,9 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| int FindFunction_WhichIsBroken(int NumberToFind); | |||||
| int FunctionWhichReturnsLocalVariable(void); | |||||
| @@ -1,17 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode2.h" | |||||
| char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction) | |||||
| { | |||||
| (void)Poor; | |||||
| (void)LittleFunction; | |||||
| //Since There Are No Tests Yet, This Function Could Be Empty For All We Know. | |||||
| // Which isn't terribly useful... but at least we put in a TEST_IGNORE so we won't forget | |||||
| return (char*)0; | |||||
| } | |||||
| @@ -1,8 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction); | |||||
| @@ -1,54 +0,0 @@ | |||||
| # ========================================================================= | |||||
| # Unity - A Test Framework for C | |||||
| # ThrowTheSwitch.org | |||||
| # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| # SPDX-License-Identifier: MIT | |||||
| # ========================================================================= | |||||
| # Copied from ~Unity/targets/gcc_32.yml | |||||
| unity_root: &unity_root '../..' | |||||
| unity_source: &unity_source '../../src/' | |||||
| compiler: | |||||
| path: gcc | |||||
| source_path: &source_path 'src/' | |||||
| unit_tests_path: &unit_tests_path 'test/' | |||||
| build_path: &build_path 'build/' | |||||
| options: | |||||
| - '-c' | |||||
| - '-m32' | |||||
| - '-Wall' | |||||
| - '-Wno-address' | |||||
| - '-std=c99' | |||||
| - '-pedantic' | |||||
| includes: | |||||
| prefix: '-I' | |||||
| items: | |||||
| - *source_path | |||||
| - *unity_source | |||||
| - *unit_tests_path | |||||
| defines: | |||||
| prefix: '-D' | |||||
| items: | |||||
| - UNITY_INCLUDE_DOUBLE | |||||
| - UNITY_SUPPORT_TEST_CASES | |||||
| object_files: | |||||
| prefix: '-o' | |||||
| extension: '.o' | |||||
| destination: *build_path | |||||
| linker: | |||||
| path: gcc | |||||
| options: | |||||
| - -lm | |||||
| - '-m32' | |||||
| includes: | |||||
| prefix: '-I' | |||||
| object_files: | |||||
| path: *build_path | |||||
| extension: '.o' | |||||
| bin_files: | |||||
| prefix: '-o' | |||||
| extension: '.exe' | |||||
| destination: *build_path | |||||
| colour: true | |||||
| :unity: | |||||
| :plugins: [] | |||||
| @@ -1,68 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode.h" | |||||
| #include "unity.h" | |||||
| //sometimes you may want to get at local data in a module. | |||||
| //for example: If you plan to pass by reference, this could be useful | |||||
| //however, it should often be avoided | |||||
| extern int Counter; | |||||
| void setUp(void) | |||||
| { | |||||
| //This is run before EACH TEST | |||||
| Counter = 0x5a5a; | |||||
| } | |||||
| void tearDown(void) | |||||
| { | |||||
| } | |||||
| void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void) | |||||
| { | |||||
| //All of these should pass | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(78)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(1)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(33)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(999)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(-1)); | |||||
| } | |||||
| void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void) | |||||
| { | |||||
| // You should see this line fail in your test summary | |||||
| TEST_ASSERT_EQUAL(1, FindFunction_WhichIsBroken(34)); | |||||
| // Notice the rest of these didn't get a chance to run because the line above failed. | |||||
| // Unit tests abort each test function on the first sign of trouble. | |||||
| // Then NEXT test function runs as normal. | |||||
| TEST_ASSERT_EQUAL(8, FindFunction_WhichIsBroken(8888)); | |||||
| } | |||||
| void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void) | |||||
| { | |||||
| //This should be true because setUp set this up for us before this test | |||||
| TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); | |||||
| //This should be true because we can still change our answer | |||||
| Counter = 0x1234; | |||||
| TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void) | |||||
| { | |||||
| //This should be true again because setup was rerun before this test (and after we changed it to 0x1234) | |||||
| TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void) | |||||
| { | |||||
| //Sometimes you get the test wrong. When that happens, you get a failure too... and a quick look should tell | |||||
| // you what actually happened...which in this case was a failure to setup the initial condition. | |||||
| TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| @@ -1,37 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode2.h" | |||||
| #include "unity.h" | |||||
| /* These should be ignored because they are commented out in various ways: | |||||
| #include "whatever.h" | |||||
| */ | |||||
| //#include "somethingelse.h" | |||||
| void setUp(void) | |||||
| { | |||||
| } | |||||
| void tearDown(void) | |||||
| { | |||||
| } | |||||
| void test_IgnoredTest(void) | |||||
| { | |||||
| TEST_IGNORE_MESSAGE("This Test Was Ignored On Purpose"); | |||||
| } | |||||
| void test_AnotherIgnoredTest(void) | |||||
| { | |||||
| TEST_IGNORE_MESSAGE("These Can Be Useful For Leaving Yourself Notes On What You Need To Do Yet"); | |||||
| } | |||||
| void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void) | |||||
| { | |||||
| TEST_IGNORE(); //Like This | |||||
| } | |||||
| @@ -1,12 +0,0 @@ | |||||
| # | |||||
| # build script written by : Michael Brockus. | |||||
| # github repo author: Mike Karlesky, Mark VanderVoord, Greg Williams. | |||||
| # | |||||
| # license: MIT | |||||
| # | |||||
| project('example-4', 'c', meson_version: '>= 0.55.0') | |||||
| unity_dep = dependency('unity') | |||||
| subdir('src') | |||||
| subdir('test') | |||||
| @@ -1,15 +0,0 @@ | |||||
| Example 4 | |||||
| ========= | |||||
| Close to the simplest possible example of Unity, using only basic features. | |||||
| to build this example run "meson setup <build dir name>". | |||||
| Meson uses the Ninja build system to actually build the code. To start the | |||||
| build, simply type the following command. | |||||
| "ninja -C <build dir name>" | |||||
| Meson provides native support for running tests. The command to do that is simple. | |||||
| "meson test -C <build dir name>". | |||||
| @@ -1,30 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode.h" | |||||
| int Counter = 0; | |||||
| int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; /* some obnoxious array to search that is 1-based indexing instead of 0. */ | |||||
| /* This function is supposed to search through NumbersToFind and find a particular number. | |||||
| * If it finds it, the index is returned. Otherwise 0 is returned which sorta makes sense since | |||||
| * NumbersToFind is indexed from 1. Unfortunately it's broken | |||||
| * (and should therefore be caught by our tests) */ | |||||
| int FindFunction_WhichIsBroken(int NumberToFind) | |||||
| { | |||||
| int i = 0; | |||||
| while (i < 8) /* Notice I should have been in braces */ | |||||
| i++; | |||||
| if (NumbersToFind[i] == NumberToFind) /* Yikes! I'm getting run after the loop finishes instead of during it! */ | |||||
| return i; | |||||
| return 0; | |||||
| } | |||||
| int FunctionWhichReturnsLocalVariable(void) | |||||
| { | |||||
| return Counter; | |||||
| } | |||||
| @@ -1,9 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| int FindFunction_WhichIsBroken(int NumberToFind); | |||||
| int FunctionWhichReturnsLocalVariable(void); | |||||
| @@ -1,17 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode2.h" | |||||
| char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction) | |||||
| { | |||||
| (void)Poor; | |||||
| (void)LittleFunction; | |||||
| /* Since There Are No Tests Yet, This Function Could Be Empty For All We Know. | |||||
| * Which isn't terribly useful... but at least we put in a TEST_IGNORE so we won't forget */ | |||||
| return (char*)0; | |||||
| } | |||||
| @@ -1,8 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction); | |||||
| @@ -1,16 +0,0 @@ | |||||
| # | |||||
| # build script written by : Michael Brockus. | |||||
| # github repo author: Mike Karlesky, Mark VanderVoord, Greg Williams. | |||||
| # | |||||
| # license: MIT | |||||
| # | |||||
| inc_dir = include_directories('.') | |||||
| lib_list = {'a': ['ProductionCode.c' ], 'b': ['ProductionCode2.c']} | |||||
| foreach lib, src : lib_list | |||||
| set_variable(lib + '_lib', | |||||
| static_library(lib + '_lib', sources: src, include_directories: inc_dir)) | |||||
| endforeach | |||||
| a_dep = declare_dependency(link_with: a_lib, include_directories: inc_dir) | |||||
| b_dep = declare_dependency(link_with: b_lib, include_directories: inc_dir) | |||||
| @@ -1,6 +0,0 @@ | |||||
| [wrap-git] | |||||
| url = https://github.com/ThrowTheSwitch/Unity.git | |||||
| revision = head | |||||
| [provide] | |||||
| unity = unity_dep | |||||
| @@ -1,69 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode.h" | |||||
| #include "unity.h" | |||||
| /* sometimes you may want to get at local data in a module. | |||||
| * for example: If you plan to pass by reference, this could be useful | |||||
| * however, it should often be avoided */ | |||||
| extern int Counter; | |||||
| void setUp(void) | |||||
| { | |||||
| /* This is run before EACH TEST */ | |||||
| Counter = 0x5a5a; | |||||
| } | |||||
| void tearDown(void) | |||||
| { | |||||
| } | |||||
| void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void) | |||||
| { | |||||
| /* All of these should pass */ | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(78)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(2)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(33)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(999)); | |||||
| TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(-1)); | |||||
| } | |||||
| void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void) | |||||
| { | |||||
| /* You should see this line fail in your test summary */ | |||||
| TEST_ASSERT_EQUAL(1, FindFunction_WhichIsBroken(34)); | |||||
| /* Notice the rest of these didn't get a chance to run because the line above failed. | |||||
| * Unit tests abort each test function on the first sign of trouble. | |||||
| * Then NEXT test function runs as normal. */ | |||||
| TEST_ASSERT_EQUAL(8, FindFunction_WhichIsBroken(8888)); | |||||
| } | |||||
| void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void) | |||||
| { | |||||
| /* This should be true because setUp set this up for us before this test */ | |||||
| TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); | |||||
| /* This should be true because we can still change our answer */ | |||||
| Counter = 0x1234; | |||||
| TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void) | |||||
| { | |||||
| /* This should be true again because setup was rerun before this test (and after we changed it to 0x1234) */ | |||||
| TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void) | |||||
| { | |||||
| /* Sometimes you get the test wrong. When that happens, you get a failure too... and a quick look should tell | |||||
| * you what actually happened...which in this case was a failure to setup the initial condition. */ | |||||
| TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); | |||||
| } | |||||
| @@ -1,41 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #include "ProductionCode2.h" | |||||
| #include "unity.h" | |||||
| /* These should be ignored because they are commented out in various ways: | |||||
| #include "whatever.h" | |||||
| #include "somethingelse.h" | |||||
| */ | |||||
| void setUp(void) | |||||
| { | |||||
| } | |||||
| void tearDown(void) | |||||
| { | |||||
| } | |||||
| void test_IgnoredTest(void); | |||||
| void test_AnotherIgnoredTest(void); | |||||
| void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void); | |||||
| void test_IgnoredTest(void) | |||||
| { | |||||
| TEST_IGNORE_MESSAGE("This Test Was Ignored On Purpose"); | |||||
| } | |||||
| void test_AnotherIgnoredTest(void) | |||||
| { | |||||
| TEST_IGNORE_MESSAGE("These Can Be Useful For Leaving Yourself Notes On What You Need To Do Yet"); | |||||
| } | |||||
| void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void) | |||||
| { | |||||
| TEST_IGNORE(); /* Like This */ | |||||
| } | |||||
| @@ -1,7 +0,0 @@ | |||||
| # | |||||
| # build script written by : Michael Brockus. | |||||
| # github repo author: Mike Karlesky, Mark VanderVoord, Greg Williams. | |||||
| # | |||||
| # license: MIT | |||||
| # | |||||
| subdir('test_runners') | |||||
| @@ -1,53 +0,0 @@ | |||||
| /* AUTOGENERATED FILE. DO NOT EDIT. */ | |||||
| /*=======Test Runner Used To Run Each Test Below=====*/ | |||||
| #define RUN_TEST(TestFunc, TestLineNum) \ | |||||
| { \ | |||||
| Unity.CurrentTestName = #TestFunc; \ | |||||
| Unity.CurrentTestLineNumber = TestLineNum; \ | |||||
| Unity.NumberOfTests++; \ | |||||
| if (TEST_PROTECT()) \ | |||||
| { \ | |||||
| setUp(); \ | |||||
| TestFunc(); \ | |||||
| } \ | |||||
| if (TEST_PROTECT()) \ | |||||
| { \ | |||||
| tearDown(); \ | |||||
| } \ | |||||
| UnityConcludeTest(); \ | |||||
| } | |||||
| /*=======Automagically Detected Files To Include=====*/ | |||||
| #include "unity.h" | |||||
| #include <setjmp.h> | |||||
| #include <stdio.h> | |||||
| #include "ProductionCode2.h" | |||||
| /*=======External Functions This Runner Calls=====*/ | |||||
| extern void setUp(void); | |||||
| extern void tearDown(void); | |||||
| extern void test_IgnoredTest(void); | |||||
| extern void test_AnotherIgnoredTest(void); | |||||
| extern void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void); | |||||
| /*=======Test Reset Option=====*/ | |||||
| void resetTest(void); | |||||
| void resetTest(void) | |||||
| { | |||||
| tearDown(); | |||||
| setUp(); | |||||
| } | |||||
| /*=======MAIN=====*/ | |||||
| int main(void) | |||||
| { | |||||
| UnityBegin("test/TestProductionCode2.c"); | |||||
| RUN_TEST(test_IgnoredTest, 18); | |||||
| RUN_TEST(test_AnotherIgnoredTest, 23); | |||||
| RUN_TEST(test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented, 28); | |||||
| return (UnityEnd()); | |||||
| } | |||||
| @@ -1,57 +0,0 @@ | |||||
| /* AUTOGENERATED FILE. DO NOT EDIT. */ | |||||
| /*=======Test Runner Used To Run Each Test Below=====*/ | |||||
| #define RUN_TEST(TestFunc, TestLineNum) \ | |||||
| { \ | |||||
| Unity.CurrentTestName = #TestFunc; \ | |||||
| Unity.CurrentTestLineNumber = TestLineNum; \ | |||||
| Unity.NumberOfTests++; \ | |||||
| if (TEST_PROTECT()) \ | |||||
| { \ | |||||
| setUp(); \ | |||||
| TestFunc(); \ | |||||
| } \ | |||||
| if (TEST_PROTECT()) \ | |||||
| { \ | |||||
| tearDown(); \ | |||||
| } \ | |||||
| UnityConcludeTest(); \ | |||||
| } | |||||
| /*=======Automagically Detected Files To Include=====*/ | |||||
| #include "unity.h" | |||||
| #include <setjmp.h> | |||||
| #include <stdio.h> | |||||
| #include "ProductionCode.h" | |||||
| /*=======External Functions This Runner Calls=====*/ | |||||
| extern void setUp(void); | |||||
| extern void tearDown(void); | |||||
| extern void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void); | |||||
| extern void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void); | |||||
| extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void); | |||||
| extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void); | |||||
| extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void); | |||||
| /*=======Test Reset Option=====*/ | |||||
| void resetTest(void); | |||||
| void resetTest(void) | |||||
| { | |||||
| tearDown(); | |||||
| setUp(); | |||||
| } | |||||
| /*=======MAIN=====*/ | |||||
| int main(void) | |||||
| { | |||||
| UnityBegin("test/TestProductionCode.c"); | |||||
| RUN_TEST(test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode, 20); | |||||
| RUN_TEST(test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken, 30); | |||||
| RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue, 41); | |||||
| RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain, 51); | |||||
| RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed, 57); | |||||
| return (UnityEnd()); | |||||
| } | |||||
| @@ -1,13 +0,0 @@ | |||||
| # | |||||
| # build script written by : Michael Brockus. | |||||
| # github repo author: Mike Karlesky, Mark VanderVoord, Greg Williams. | |||||
| # | |||||
| # license: MIT | |||||
| # | |||||
| cases = [ | |||||
| ['TestProductionCode_Runner.c', join_paths('..' ,'TestProductionCode.c' )], | |||||
| ['TestProductionCode2_Runner.c', join_paths('..' ,'TestProductionCode2.c')] | |||||
| ] | |||||
| test('01-test-case', executable('01-test-case', cases[0], dependencies: [ a_dep, unity_dep ])) | |||||
| test('02-test-case', executable('02-test-case', cases[1], dependencies: [ b_dep, unity_dep ])) | |||||
| @@ -1,251 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| /* Unity Configuration | |||||
| * As of May 11th, 2016 at ThrowTheSwitch/Unity commit 837c529 | |||||
| * Update: December 29th, 2016 | |||||
| * See Also: Unity/docs/UnityConfigurationGuide.pdf | |||||
| * | |||||
| * Unity is designed to run on almost anything that is targeted by a C compiler. | |||||
| * It would be awesome if this could be done with zero configuration. While | |||||
| * there are some targets that come close to this dream, it is sadly not | |||||
| * universal. It is likely that you are going to need at least a couple of the | |||||
| * configuration options described in this document. | |||||
| * | |||||
| * All of Unity's configuration options are `#defines`. Most of these are simple | |||||
| * definitions. A couple are macros with arguments. They live inside the | |||||
| * unity_internals.h header file. We don't necessarily recommend opening that | |||||
| * file unless you really need to. That file is proof that a cross-platform | |||||
| * library is challenging to build. From a more positive perspective, it is also | |||||
| * proof that a great deal of complexity can be centralized primarily to one | |||||
| * place in order to provide a more consistent and simple experience elsewhere. | |||||
| * | |||||
| * Using These Options | |||||
| * It doesn't matter if you're using a target-specific compiler and a simulator | |||||
| * or a native compiler. In either case, you've got a couple choices for | |||||
| * configuring these options: | |||||
| * | |||||
| * 1. Because these options are specified via C defines, you can pass most of | |||||
| * these options to your compiler through command line compiler flags. Even | |||||
| * if you're using an embedded target that forces you to use their | |||||
| * overbearing IDE for all configuration, there will be a place somewhere in | |||||
| * your project to configure defines for your compiler. | |||||
| * 2. You can create a custom `unity_config.h` configuration file (present in | |||||
| * your toolchain's search paths). In this file, you will list definitions | |||||
| * and macros specific to your target. All you must do is define | |||||
| * `UNITY_INCLUDE_CONFIG_H` and Unity will rely on `unity_config.h` for any | |||||
| * further definitions it may need. | |||||
| */ | |||||
| #ifndef UNITY_CONFIG_H | |||||
| #define UNITY_CONFIG_H | |||||
| /* ************************* AUTOMATIC INTEGER TYPES *************************** | |||||
| * C's concept of an integer varies from target to target. The C Standard has | |||||
| * rules about the `int` matching the register size of the target | |||||
| * microprocessor. It has rules about the `int` and how its size relates to | |||||
| * other integer types. An `int` on one target might be 16 bits while on another | |||||
| * target it might be 64. There are more specific types in compilers compliant | |||||
| * with C99 or later, but that's certainly not every compiler you are likely to | |||||
| * encounter. Therefore, Unity has a number of features for helping to adjust | |||||
| * itself to match your required integer sizes. It starts off by trying to do it | |||||
| * automatically. | |||||
| **************************************************************************** */ | |||||
| /* The first attempt to guess your types is to check `limits.h`. Some compilers | |||||
| * that don't support `stdint.h` could include `limits.h`. If you don't | |||||
| * want Unity to check this file, define this to make it skip the inclusion. | |||||
| * Unity looks at UINT_MAX & ULONG_MAX, which were available since C89. | |||||
| */ | |||||
| /* #define UNITY_EXCLUDE_LIMITS_H */ | |||||
| /* The second thing that Unity does to guess your types is check `stdint.h`. | |||||
| * This file defines `UINTPTR_MAX`, since C99, that Unity can make use of to | |||||
| * learn about your system. It's possible you don't want it to do this or it's | |||||
| * possible that your system doesn't support `stdint.h`. If that's the case, | |||||
| * you're going to want to define this. That way, Unity will know to skip the | |||||
| * inclusion of this file and you won't be left with a compiler error. | |||||
| */ | |||||
| /* #define UNITY_EXCLUDE_STDINT_H */ | |||||
| /* ********************** MANUAL INTEGER TYPE DEFINITION *********************** | |||||
| * If you've disabled all of the automatic options above, you're going to have | |||||
| * to do the configuration yourself. There are just a handful of defines that | |||||
| * you are going to specify if you don't like the defaults. | |||||
| **************************************************************************** */ | |||||
| /* Define this to be the number of bits an `int` takes up on your system. The | |||||
| * default, if not auto-detected, is 32 bits. | |||||
| * | |||||
| * Example: | |||||
| */ | |||||
| /* #define UNITY_INT_WIDTH 16 */ | |||||
| /* Define this to be the number of bits a `long` takes up on your system. The | |||||
| * default, if not autodetected, is 32 bits. This is used to figure out what | |||||
| * kind of 64-bit support your system can handle. Does it need to specify a | |||||
| * `long` or a `long long` to get a 64-bit value. On 16-bit systems, this option | |||||
| * is going to be ignored. | |||||
| * | |||||
| * Example: | |||||
| */ | |||||
| /* #define UNITY_LONG_WIDTH 16 */ | |||||
| /* Define this to be the number of bits a pointer takes up on your system. The | |||||
| * default, if not autodetected, is 32-bits. If you're getting ugly compiler | |||||
| * warnings about casting from pointers, this is the one to look at. | |||||
| * | |||||
| * Example: | |||||
| */ | |||||
| /* #define UNITY_POINTER_WIDTH 64 */ | |||||
| /* Unity will automatically include 64-bit support if it auto-detects it, or if | |||||
| * your `int`, `long`, or pointer widths are greater than 32-bits. Define this | |||||
| * to enable 64-bit support if none of the other options already did it for you. | |||||
| * There can be a significant size and speed impact to enabling 64-bit support | |||||
| * on small targets, so don't define it if you don't need it. | |||||
| */ | |||||
| /* #define UNITY_SUPPORT_64 */ | |||||
| /* *************************** FLOATING POINT TYPES **************************** | |||||
| * In the embedded world, it's not uncommon for targets to have no support for | |||||
| * floating point operations at all or to have support that is limited to only | |||||
| * single precision. We are able to guess integer sizes on the fly because | |||||
| * integers are always available in at least one size. Floating point, on the | |||||
| * other hand, is sometimes not available at all. Trying to include `float.h` on | |||||
| * these platforms would result in an error. This leaves manual configuration as | |||||
| * the only option. | |||||
| **************************************************************************** */ | |||||
| /* By default, Unity guesses that you will want single precision floating point | |||||
| * support, but not double precision. It's easy to change either of these using | |||||
| * the include and exclude options here. You may include neither, just float, | |||||
| * or both, as suits your needs. | |||||
| */ | |||||
| /* #define UNITY_EXCLUDE_FLOAT */ | |||||
| /* #define UNITY_INCLUDE_DOUBLE */ | |||||
| /* #define UNITY_EXCLUDE_DOUBLE */ | |||||
| /* For features that are enabled, the following floating point options also | |||||
| * become available. | |||||
| */ | |||||
| /* Unity aims for as small of a footprint as possible and avoids most standard | |||||
| * library calls (some embedded platforms don't have a standard library!). | |||||
| * Because of this, its routines for printing integer values are minimalist and | |||||
| * hand-coded. To keep Unity universal, though, we eventually chose to develop | |||||
| * our own floating point print routines. Still, the display of floating point | |||||
| * values during a failure are optional. By default, Unity will print the | |||||
| * actual results of floating point assertion failures. So a failed assertion | |||||
| * will produce a message like "Expected 4.0 Was 4.25". If you would like less | |||||
| * verbose failure messages for floating point assertions, use this option to | |||||
| * give a failure message `"Values Not Within Delta"` and trim the binary size. | |||||
| */ | |||||
| /* #define UNITY_EXCLUDE_FLOAT_PRINT */ | |||||
| /* If enabled, Unity assumes you want your `FLOAT` asserts to compare standard C | |||||
| * floats. If your compiler supports a specialty floating point type, you can | |||||
| * always override this behavior by using this definition. | |||||
| * | |||||
| * Example: | |||||
| */ | |||||
| /* #define UNITY_FLOAT_TYPE float16_t */ | |||||
| /* If enabled, Unity assumes you want your `DOUBLE` asserts to compare standard | |||||
| * C doubles. If you would like to change this, you can specify something else | |||||
| * by using this option. For example, defining `UNITY_DOUBLE_TYPE` to `long | |||||
| * double` could enable gargantuan floating point types on your 64-bit processor | |||||
| * instead of the standard `double`. | |||||
| * | |||||
| * Example: | |||||
| */ | |||||
| /* #define UNITY_DOUBLE_TYPE long double */ | |||||
| /* If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as | |||||
| * documented in the Unity Assertion Guide, you will learn that they are not | |||||
| * really asserting that two values are equal but rather that two values are | |||||
| * "close enough" to equal. "Close enough" is controlled by these precision | |||||
| * configuration options. If you are working with 32-bit floats and/or 64-bit | |||||
| * doubles (the normal on most processors), you should have no need to change | |||||
| * these options. They are both set to give you approximately 1 significant bit | |||||
| * in either direction. The float precision is 0.00001 while the double is | |||||
| * 10^-12. For further details on how this works, see the appendix of the Unity | |||||
| * Assertion Guide. | |||||
| * | |||||
| * Example: | |||||
| */ | |||||
| /* #define UNITY_FLOAT_PRECISION 0.001f */ | |||||
| /* #define UNITY_DOUBLE_PRECISION 0.001f */ | |||||
| /* *************************** MISCELLANEOUS *********************************** | |||||
| * Miscellaneous configuration options for Unity | |||||
| **************************************************************************** */ | |||||
| /* Unity uses the stddef.h header included in the C standard library for the | |||||
| * "NULL" macro. Define this in order to disable the include of stddef.h. If you | |||||
| * do this, you have to make sure to provide your own "NULL" definition. | |||||
| */ | |||||
| /* #define UNITY_EXCLUDE_STDDEF_H */ | |||||
| /* Define this to enable the unity formatted print macro: | |||||
| * "TEST_PRINTF" | |||||
| */ | |||||
| /* #define UNITY_INCLUDE_PRINT_FORMATTED */ | |||||
| /* *************************** TOOLSET CUSTOMIZATION *************************** | |||||
| * In addition to the options listed above, there are a number of other options | |||||
| * which will come in handy to customize Unity's behavior for your specific | |||||
| * toolchain. It is possible that you may not need to touch any of these but | |||||
| * certain platforms, particularly those running in simulators, may need to jump | |||||
| * through extra hoops to operate properly. These macros will help in those | |||||
| * situations. | |||||
| **************************************************************************** */ | |||||
| /* By default, Unity prints its results to `stdout` as it runs. This works | |||||
| * perfectly fine in most situations where you are using a native compiler for | |||||
| * testing. It works on some simulators as well so long as they have `stdout` | |||||
| * routed back to the command line. There are times, however, where the | |||||
| * simulator will lack support for dumping results or you will want to route | |||||
| * results elsewhere for other reasons. In these cases, you should define the | |||||
| * `UNITY_OUTPUT_CHAR` macro. This macro accepts a single character at a time | |||||
| * (as an `int`, since this is the parameter type of the standard C `putchar` | |||||
| * function most commonly used). You may replace this with whatever function | |||||
| * call you like. | |||||
| * | |||||
| * Example: | |||||
| * Say you are forced to run your test suite on an embedded processor with no | |||||
| * `stdout` option. You decide to route your test result output to a custom | |||||
| * serial `RS232_putc()` function you wrote like thus: | |||||
| */ | |||||
| /* #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) */ | |||||
| /* #define UNITY_OUTPUT_CHAR_HEADER_DECLARATION RS232_putc(int) */ | |||||
| /* #define UNITY_OUTPUT_FLUSH() RS232_flush() */ | |||||
| /* #define UNITY_OUTPUT_FLUSH_HEADER_DECLARATION RS232_flush(void) */ | |||||
| /* #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) */ | |||||
| /* #define UNITY_OUTPUT_COMPLETE() RS232_close() */ | |||||
| /* Some compilers require a custom attribute to be assigned to pointers, like | |||||
| * `near` or `far`. In these cases, you can give Unity a safe default for these | |||||
| * by defining this option with the attribute you would like. | |||||
| * | |||||
| * Example: | |||||
| */ | |||||
| /* #define UNITY_PTR_ATTRIBUTE __attribute__((far)) */ | |||||
| /* #define UNITY_PTR_ATTRIBUTE near */ | |||||
| /* Print execution time of each test when executed in verbose mode | |||||
| * | |||||
| * Example: | |||||
| * | |||||
| * TEST - PASS (10 ms) | |||||
| */ | |||||
| /* #define UNITY_INCLUDE_EXEC_TIME */ | |||||
| #endif /* UNITY_CONFIG_H */ | |||||
| @@ -1,18 +0,0 @@ | |||||
| { | |||||
| "name": "Unity", | |||||
| "version": "2.6.1", | |||||
| "keywords": "unit-testing, testing, tdd, testing-framework", | |||||
| "description": "Simple Unit Testing for C", | |||||
| "homepage": "http://www.throwtheswitch.org/unity", | |||||
| "license": "MIT", | |||||
| "repository": { | |||||
| "type": "git", | |||||
| "url": "https://github.com/ThrowTheSwitch/Unity.git" | |||||
| }, | |||||
| "frameworks": "*", | |||||
| "platforms": "*", | |||||
| "headers": "unity.h", | |||||
| "build": { | |||||
| "extraScript": "platformio-build.py" | |||||
| } | |||||
| } | |||||
| @@ -1,80 +0,0 @@ | |||||
| # | |||||
| # build script written by : Michael Gene Brockus. | |||||
| # github repo author: Mike Karlesky, Mark VanderVoord, Greg Williams. | |||||
| # | |||||
| # license: MIT | |||||
| # | |||||
| project('unity', 'c', | |||||
| license: 'MIT', | |||||
| # Set project version to value extracted from unity.h header | |||||
| version: run_command( | |||||
| [ | |||||
| 'auto/extract_version.py', | |||||
| 'src/unity.h' | |||||
| ], | |||||
| check: true | |||||
| ).stdout().strip(), | |||||
| meson_version: '>=0.47.0', | |||||
| default_options: [ | |||||
| 'werror=true', | |||||
| 'c_std=c11' | |||||
| ] | |||||
| ) | |||||
| build_fixture = get_option('extension_fixture') | |||||
| build_memory = get_option('extension_memory') | |||||
| support_double = get_option('support_double') | |||||
| unity_args = [] | |||||
| unity_src = [] | |||||
| unity_inc = [] | |||||
| subdir('src') | |||||
| if build_fixture | |||||
| # Building the fixture extension implies building the memory | |||||
| # extension. | |||||
| build_memory = true | |||||
| subdir('extras/fixture/src') | |||||
| endif | |||||
| if build_memory | |||||
| subdir('extras/memory/src') | |||||
| endif | |||||
| if support_double | |||||
| unity_args += '-DUNITY_INCLUDE_DOUBLE' | |||||
| endif | |||||
| unity_lib = static_library(meson.project_name(), | |||||
| sources: unity_src, | |||||
| c_args: unity_args, | |||||
| include_directories: unity_inc, | |||||
| install: not meson.is_subproject(), | |||||
| ) | |||||
| unity_dep = declare_dependency( | |||||
| link_with: unity_lib, | |||||
| include_directories: unity_inc | |||||
| ) | |||||
| # Generate pkg-config file. | |||||
| if not meson.is_subproject() | |||||
| pkg = import('pkgconfig') | |||||
| pkg.generate( | |||||
| name: meson.project_name(), | |||||
| version: meson.project_version(), | |||||
| libraries: [ unity_lib ], | |||||
| description: 'C Unit testing framework.' | |||||
| ) | |||||
| endif | |||||
| # Create a generator that can be used by consumers of our build system to generate | |||||
| # test runners. | |||||
| gen_test_runner = generator( | |||||
| find_program('auto/generate_test_runner.rb'), | |||||
| output: '@BASENAME@_Runner.c', | |||||
| arguments: ['@INPUT@', '@OUTPUT@'] | |||||
| ) | |||||
| @@ -1,3 +0,0 @@ | |||||
| option('extension_fixture', type: 'boolean', value: 'false', description: 'Whether to enable the fixture extension.') | |||||
| option('extension_memory', type: 'boolean', value: 'false', description: 'Whether to enable the memory extension.') | |||||
| option('support_double', type: 'boolean', value: 'false', description: 'Whether to enable double precision floating point assertions.') | |||||
| @@ -1,19 +0,0 @@ | |||||
| import os | |||||
| Import("env") | |||||
| env.Append(CPPDEFINES=["UNITY_INCLUDE_CONFIG_H"]) | |||||
| # import "unity_config.h" folder to the library builder | |||||
| try: | |||||
| Import("projenv") | |||||
| projenv.Append(CPPDEFINES=["UNITY_INCLUDE_CONFIG_H"]) | |||||
| for p in projenv["CPPPATH"]: | |||||
| p = projenv.subst(p) | |||||
| if os.path.isfile(os.path.join(p, "unity_config.h")): | |||||
| env.Prepend(CPPPATH=[p]) | |||||
| # Stop at the first unity_config.h found to include. | |||||
| break | |||||
| except: | |||||
| pass | |||||
| @@ -1,17 +0,0 @@ | |||||
| # | |||||
| # build script written by : Michael Gene Brockus. | |||||
| # github repo author: Mike Karlesky, Mark VanderVoord, Greg Williams. | |||||
| # | |||||
| # license: MIT | |||||
| # | |||||
| unity_inc += include_directories('.') | |||||
| unity_src += files('unity.c') | |||||
| if not meson.is_subproject() | |||||
| install_headers( | |||||
| 'unity.h', | |||||
| 'unity_internals.h', | |||||
| subdir: meson.project_name() | |||||
| ) | |||||
| endif | |||||
| @@ -1,698 +0,0 @@ | |||||
| /* ========================================================================= | |||||
| Unity - A Test Framework for C | |||||
| ThrowTheSwitch.org | |||||
| Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams | |||||
| SPDX-License-Identifier: MIT | |||||
| ========================================================================= */ | |||||
| #ifndef UNITY_FRAMEWORK_H | |||||
| #define UNITY_FRAMEWORK_H | |||||
| #define UNITY | |||||
| #define UNITY_VERSION_MAJOR 2 | |||||
| #define UNITY_VERSION_MINOR 6 | |||||
| #define UNITY_VERSION_BUILD 1 | |||||
| #define UNITY_VERSION ((UNITY_VERSION_MAJOR << 16) | (UNITY_VERSION_MINOR << 8) | UNITY_VERSION_BUILD) | |||||
| #ifdef __cplusplus | |||||
| extern "C" | |||||
| { | |||||
| #endif | |||||
| #include "unity_internals.h" | |||||
| /*------------------------------------------------------- | |||||
| * Test Setup / Teardown | |||||
| *-------------------------------------------------------*/ | |||||
| /* These functions are intended to be called before and after each test. | |||||
| * If using unity directly, these will need to be provided for each test | |||||
| * executable built. If you are using the test runner generator and/or | |||||
| * Ceedling, these are optional. */ | |||||
| void setUp(void); | |||||
| void tearDown(void); | |||||
| /* These functions are intended to be called at the beginning and end of an | |||||
| * entire test suite. suiteTearDown() is passed the number of tests that | |||||
| * failed, and its return value becomes the exit code of main(). If using | |||||
| * Unity directly, you're in charge of calling these if they are desired. | |||||
| * If using Ceedling or the test runner generator, these will be called | |||||
| * automatically if they exist. */ | |||||
| void suiteSetUp(void); | |||||
| int suiteTearDown(int num_failures); | |||||
| /*------------------------------------------------------- | |||||
| * Test Reset and Verify | |||||
| *-------------------------------------------------------*/ | |||||
| /* These functions are intended to be called before during tests in order | |||||
| * to support complex test loops, etc. Both are NOT built into Unity. Instead | |||||
| * the test runner generator will create them. resetTest will run teardown and | |||||
| * setup again, verifying any end-of-test needs between. verifyTest will only | |||||
| * run the verification. */ | |||||
| void resetTest(void); | |||||
| void verifyTest(void); | |||||
| /*------------------------------------------------------- | |||||
| * Configuration Options | |||||
| *------------------------------------------------------- | |||||
| * All options described below should be passed as a compiler flag to all files using Unity. If you must add #defines, place them BEFORE the #include above. | |||||
| * Integers/longs/pointers | |||||
| * - Unity attempts to automatically discover your integer sizes | |||||
| * - define UNITY_EXCLUDE_STDINT_H to stop attempting to look in <stdint.h> | |||||
| * - define UNITY_EXCLUDE_LIMITS_H to stop attempting to look in <limits.h> | |||||
| * - If you cannot use the automatic methods above, you can force Unity by using these options: | |||||
| * - define UNITY_SUPPORT_64 | |||||
| * - set UNITY_INT_WIDTH | |||||
| * - set UNITY_LONG_WIDTH | |||||
| * - set UNITY_POINTER_WIDTH | |||||
| * Floats | |||||
| * - define UNITY_EXCLUDE_FLOAT to disallow floating point comparisons | |||||
| * - define UNITY_FLOAT_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_FLOAT | |||||
| * - define UNITY_FLOAT_TYPE to specify doubles instead of single precision floats | |||||
| * - define UNITY_INCLUDE_DOUBLE to allow double floating point comparisons | |||||
| * - define UNITY_EXCLUDE_DOUBLE to disallow double floating point comparisons (default) | |||||
| * - define UNITY_DOUBLE_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_DOUBLE | |||||
| * - define UNITY_DOUBLE_TYPE to specify something other than double | |||||
| * - define UNITY_EXCLUDE_FLOAT_PRINT to trim binary size, won't print floating point values in errors | |||||
| * Output | |||||
| * - by default, Unity prints to standard out with putchar. define UNITY_OUTPUT_CHAR(a) with a different function if desired | |||||
| * - define UNITY_DIFFERENTIATE_FINAL_FAIL to print FAILED (vs. FAIL) at test end summary - for automated search for failure | |||||
| * Optimization | |||||
| * - by default, line numbers are stored in unsigned shorts. Define UNITY_LINE_TYPE with a different type if your files are huge | |||||
| * - by default, test and failure counters are unsigned shorts. Define UNITY_COUNTER_TYPE with a different type if you want to save space or have more than 65535 Tests. | |||||
| * Test Cases | |||||
| * - define UNITY_SUPPORT_TEST_CASES to include the TEST_CASE macro, though really it's mostly about the runner generator script | |||||
| * Parameterized Tests | |||||
| * - you'll want to create a define of TEST_CASE(...), TEST_RANGE(...) and/or TEST_MATRIX(...) which basically evaluates to nothing | |||||
| * Tests with Arguments | |||||
| * - you'll want to define UNITY_USE_COMMAND_LINE_ARGS if you have the test runner passing arguments to Unity | |||||
| *------------------------------------------------------- | |||||
| * Basic Fail and Ignore | |||||
| *-------------------------------------------------------*/ | |||||
| #define TEST_FAIL_MESSAGE(message) UNITY_TEST_FAIL(__LINE__, (message)) | |||||
| #define TEST_FAIL() UNITY_TEST_FAIL(__LINE__, NULL) | |||||
| #define TEST_IGNORE_MESSAGE(message) UNITY_TEST_IGNORE(__LINE__, (message)) | |||||
| #define TEST_IGNORE() UNITY_TEST_IGNORE(__LINE__, NULL) | |||||
| #define TEST_MESSAGE(message) UnityMessage((message), __LINE__) | |||||
| #define TEST_ONLY() | |||||
| #ifdef UNITY_INCLUDE_PRINT_FORMATTED | |||||
| #define TEST_PRINTF(message, ...) UnityPrintF(__LINE__, (message), ##__VA_ARGS__) | |||||
| #endif | |||||
| /* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails. | |||||
| * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ | |||||
| #define TEST_PASS() TEST_ABORT() | |||||
| #define TEST_PASS_MESSAGE(message) do { UnityMessage((message), __LINE__); TEST_ABORT(); } while (0) | |||||
| /*------------------------------------------------------- | |||||
| * Build Directives | |||||
| *------------------------------------------------------- | |||||
| * These macros do nothing, but they are useful for additional build context. | |||||
| * Tools (like Ceedling) can scan for these directives and make use of them for | |||||
| * per-test-executable #include search paths and linking. */ | |||||
| /* Add source files to a test executable's compilation and linking. Ex: TEST_SOURCE_FILE("sandwiches.c") */ | |||||
| #define TEST_SOURCE_FILE(a) | |||||
| /* Customize #include search paths for a test executable's compilation. Ex: TEST_INCLUDE_PATH("src/module_a/inc") */ | |||||
| #define TEST_INCLUDE_PATH(a) | |||||
| /*------------------------------------------------------- | |||||
| * Test Asserts (simple) | |||||
| *-------------------------------------------------------*/ | |||||
| /* Boolean */ | |||||
| #define TEST_ASSERT(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expression Evaluated To FALSE") | |||||
| #define TEST_ASSERT_TRUE(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expected TRUE Was FALSE") | |||||
| #define TEST_ASSERT_UNLESS(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expression Evaluated To TRUE") | |||||
| #define TEST_ASSERT_FALSE(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expected FALSE Was TRUE") | |||||
| #define TEST_ASSERT_NULL(pointer) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, " Expected NULL") | |||||
| #define TEST_ASSERT_NOT_NULL(pointer) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, " Expected Non-NULL") | |||||
| #define TEST_ASSERT_EMPTY(pointer) UNITY_TEST_ASSERT_EMPTY( (pointer), __LINE__, " Expected Empty") | |||||
| #define TEST_ASSERT_NOT_EMPTY(pointer) UNITY_TEST_ASSERT_NOT_EMPTY((pointer), __LINE__, " Expected Non-Empty") | |||||
| /* Integers (of all sizes) */ | |||||
| #define TEST_ASSERT_EQUAL_INT(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_INT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_INT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_INT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_INT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_UINT(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_UINT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_UINT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_UINT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_UINT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_size_t(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_HEX(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_HEX8(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_HEX16(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_HEX32(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_HEX64(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_CHAR(expected, actual) UNITY_TEST_ASSERT_EQUAL_CHAR((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_BITS(mask, expected, actual) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_BITS_HIGH(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT)(-1), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT)(0), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT)1 << (bit)), (UNITY_UINT)(-1), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT)1 << (bit)), (UNITY_UINT)(0), (actual), __LINE__, NULL) | |||||
| /* Integer Not Equal To (of all sizes) */ | |||||
| #define TEST_ASSERT_NOT_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) | |||||
| /* Integer Greater Than/ Less Than (of all sizes) */ | |||||
| #define TEST_ASSERT_GREATER_THAN(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_CHAR(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_CHAR((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_CHAR(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_CHAR((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) | |||||
| /* Integer Ranges (of all sizes) */ | |||||
| #define TEST_ASSERT_INT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_INT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_INT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_INT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_INT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_UINT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_UINT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_UINT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_UINT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_UINT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_size_t_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_HEX_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_HEX8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_HEX16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_HEX32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_HEX64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_CHAR_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_CHAR_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| /* Integer Array Ranges (of all sizes) */ | |||||
| #define TEST_ASSERT_INT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_INT8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_INT16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_INT32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_UINT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_UINT8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_UINT16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_UINT32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_size_t_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_HEX_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_HEX8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_HEX16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_HEX32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| #define TEST_ASSERT_CHAR_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) | |||||
| /* Structs and Strings */ | |||||
| #define TEST_ASSERT_EQUAL_PTR(expected, actual) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_STRING(expected, actual) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_MEMORY(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, NULL) | |||||
| /* Arrays */ | |||||
| #define TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_size_t_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_HEX_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_CHAR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| /* Arrays Compared To Single Value */ | |||||
| #define TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_size_t(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_HEX(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_CHAR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_CHAR((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| /* Floating Point (If Enabled) */ | |||||
| #define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_FLOAT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual) UNITY_TEST_ASSERT_LESS_THAN_FLOAT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual) UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_FLOAT_IS_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_FLOAT_IS_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_FLOAT_IS_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_FLOAT_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_FLOAT_IS_NOT_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_FLOAT_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, NULL) | |||||
| /* Double (If Enabled) */ | |||||
| #define TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN((delta), (expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_LESS_THAN_DOUBLE((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_DOUBLE_IS_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NOT_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, NULL) | |||||
| /* Shorthand */ | |||||
| #ifdef UNITY_SHORTHAND_AS_OLD | |||||
| #define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") | |||||
| #endif | |||||
| #ifdef UNITY_SHORTHAND_AS_INT | |||||
| #define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) | |||||
| #endif | |||||
| #ifdef UNITY_SHORTHAND_AS_MEM | |||||
| #define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_MEMORY((&expected), (&actual), sizeof(expected), __LINE__, NULL) | |||||
| #define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) | |||||
| #endif | |||||
| #ifdef UNITY_SHORTHAND_AS_RAW | |||||
| #define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) == (actual)), __LINE__, " Expected Equal") | |||||
| #define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") | |||||
| #endif | |||||
| #ifdef UNITY_SHORTHAND_AS_NONE | |||||
| #define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) | |||||
| #define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) | |||||
| #endif | |||||
| /*------------------------------------------------------- | |||||
| * Test Asserts (with additional messages) | |||||
| *-------------------------------------------------------*/ | |||||
| /* Boolean */ | |||||
| #define TEST_ASSERT_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) | |||||
| #define TEST_ASSERT_TRUE_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) | |||||
| #define TEST_ASSERT_UNLESS_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) | |||||
| #define TEST_ASSERT_FALSE_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EMPTY_MESSAGE(pointer, message) UNITY_TEST_ASSERT_EMPTY( (pointer), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EMPTY_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_EMPTY((pointer), __LINE__, (message)) | |||||
| /* Integers (of all sizes) */ | |||||
| #define TEST_ASSERT_EQUAL_INT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_INT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_INT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_INT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_INT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_UINT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_UINT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_UINT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_UINT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_UINT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_size_t_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_HEX_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_HEX8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_HEX16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_HEX32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_HEX64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_BITS_MESSAGE(mask, expected, actual, message) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_BITS_HIGH_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_BITS_LOW_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(0), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_BIT_HIGH_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_BIT_LOW_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(0), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_CHAR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_CHAR((expected), (actual), __LINE__, (message)) | |||||
| /* Integer Not Equal To (of all sizes) */ | |||||
| #define TEST_ASSERT_NOT_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) | |||||
| /* Integer Greater Than/ Less Than (of all sizes) */ | |||||
| #define TEST_ASSERT_GREATER_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_CHAR((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_CHAR((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) | |||||
| /* Integer Ranges (of all sizes) */ | |||||
| #define TEST_ASSERT_INT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_INT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_INT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_INT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_INT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_UINT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_UINT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_UINT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_UINT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_UINT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_size_t_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_HEX_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_HEX8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_HEX16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_HEX32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_HEX64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_CHAR_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_CHAR_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| /* Integer Array Ranges (of all sizes) */ | |||||
| #define TEST_ASSERT_INT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_INT8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_INT16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_INT32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_INT64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_UINT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_UINT8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_UINT16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_UINT32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_UINT64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_size_t_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_HEX_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_HEX8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_HEX16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_HEX32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_HEX64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| #define TEST_ASSERT_CHAR_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) | |||||
| /* Structs and Strings */ | |||||
| #define TEST_ASSERT_EQUAL_PTR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_MEMORY_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, (message)) | |||||
| /* Arrays */ | |||||
| #define TEST_ASSERT_EQUAL_INT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_INT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_INT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_INT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_INT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_UINT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_UINT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_UINT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_UINT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_size_t_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_HEX_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_HEX8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_HEX16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_HEX32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_HEX64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_PTR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_STRING_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_MEMORY_ARRAY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_CHAR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| /* Arrays Compared To Single Value*/ | |||||
| #define TEST_ASSERT_EACH_EQUAL_INT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_INT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_INT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_INT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_INT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_UINT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_UINT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_UINT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_UINT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_UINT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_size_t_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_HEX_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_HEX8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_HEX16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_HEX64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_PTR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_STRING_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_MEMORY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_CHAR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_CHAR((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| /* Floating Point (If Enabled) */ | |||||
| #define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_FLOAT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_FLOAT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_FLOAT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_FLOAT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_THAN_FLOAT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_FLOAT_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_FLOAT_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_FLOAT_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_FLOAT_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_FLOAT_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_FLOAT_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, (message)) | |||||
| /* Double (If Enabled) */ | |||||
| #define TEST_ASSERT_DOUBLE_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_DOUBLE_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EQUAL_DOUBLE_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_EACH_EQUAL_DOUBLE_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_THAN_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_THAN_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_THAN_DOUBLE((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_LESS_OR_EQUAL_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_DOUBLE_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_DOUBLE_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, (message)) | |||||
| /* Shorthand */ | |||||
| #ifdef UNITY_SHORTHAND_AS_OLD | |||||
| #define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) | |||||
| #define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, (message)) | |||||
| #endif | |||||
| #ifdef UNITY_SHORTHAND_AS_INT | |||||
| #define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, message) | |||||
| #define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) | |||||
| #endif | |||||
| #ifdef UNITY_SHORTHAND_AS_MEM | |||||
| #define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((&expected), (&actual), sizeof(expected), __LINE__, message) | |||||
| #define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) | |||||
| #endif | |||||
| #ifdef UNITY_SHORTHAND_AS_RAW | |||||
| #define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) == (actual)), __LINE__, message) | |||||
| #define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, message) | |||||
| #endif | |||||
| #ifdef UNITY_SHORTHAND_AS_NONE | |||||
| #define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) | |||||
| #define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) | |||||
| #endif | |||||
| /* end of UNITY_FRAMEWORK_H */ | |||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif | |||||
| #endif | |||||
| @@ -1 +0,0 @@ | |||||
| include(${CMAKE_CURRENT_LIST_DIR}/unityTargets.cmake) | |||||
| @@ -1 +0,0 @@ | |||||
| throwtheswitch/Unity@^2.6.1 | |||||