summaryrefslogtreecommitdiff
path: root/support/cJSON-master/tests
diff options
context:
space:
mode:
authorlijie <[email protected]>2018-12-18 14:13:02 +0800
committerlijie <[email protected]>2018-12-18 14:13:02 +0800
commita4abef91b597f226f918f506e7ff591a77f3b126 (patch)
treeb16c769bb9ec312b832b28d7315110f7daecc631 /support/cJSON-master/tests
parentfc99454ea9bce35065e34b28815f8cf417b37804 (diff)
修改包含cjson头文件形式,添加mrl的cjson源码v2.0.0
Diffstat (limited to 'support/cJSON-master/tests')
-rw-r--r--support/cJSON-master/tests/CMakeLists.txt115
-rw-r--r--support/cJSON-master/tests/cjson_add.c422
-rw-r--r--support/cJSON-master/tests/common.h122
-rw-r--r--support/cJSON-master/tests/compare_tests.c205
-rw-r--r--support/cJSON-master/tests/inputs/test122
-rw-r--r--support/cJSON-master/tests/inputs/test1.expected22
-rw-r--r--support/cJSON-master/tests/inputs/test101
-rw-r--r--support/cJSON-master/tests/inputs/test10.expected1
-rw-r--r--support/cJSON-master/tests/inputs/test118
-rw-r--r--support/cJSON-master/tests/inputs/test11.expected10
-rw-r--r--support/cJSON-master/tests/inputs/test211
-rw-r--r--support/cJSON-master/tests/inputs/test2.expected18
-rw-r--r--support/cJSON-master/tests/inputs/test326
-rw-r--r--support/cJSON-master/tests/inputs/test3.expected28
-rw-r--r--support/cJSON-master/tests/inputs/test488
-rw-r--r--support/cJSON-master/tests/inputs/test4.expected94
-rw-r--r--support/cJSON-master/tests/inputs/test527
-rw-r--r--support/cJSON-master/tests/inputs/test5.expected54
-rw-r--r--support/cJSON-master/tests/inputs/test616
-rw-r--r--support/cJSON-master/tests/inputs/test722
-rw-r--r--support/cJSON-master/tests/inputs/test7.expected19
-rw-r--r--support/cJSON-master/tests/inputs/test813
-rw-r--r--support/cJSON-master/tests/inputs/test8.expected13
-rw-r--r--support/cJSON-master/tests/inputs/test95
-rw-r--r--support/cJSON-master/tests/inputs/test9.expected1
-rw-r--r--support/cJSON-master/tests/json-patch-tests/.editorconfig10
-rw-r--r--support/cJSON-master/tests/json-patch-tests/.gitignore4
-rw-r--r--support/cJSON-master/tests/json-patch-tests/.npmignore2
-rw-r--r--support/cJSON-master/tests/json-patch-tests/README.md75
-rw-r--r--support/cJSON-master/tests/json-patch-tests/cjson-utils-tests.json91
-rw-r--r--support/cJSON-master/tests/json-patch-tests/package.json15
-rw-r--r--support/cJSON-master/tests/json-patch-tests/spec_tests.json233
-rw-r--r--support/cJSON-master/tests/json-patch-tests/tests.json464
-rw-r--r--support/cJSON-master/tests/json_patch_tests.c243
-rw-r--r--support/cJSON-master/tests/misc_tests.c579
-rw-r--r--support/cJSON-master/tests/misc_utils_tests.c80
-rw-r--r--support/cJSON-master/tests/old_utils_tests.c205
-rw-r--r--support/cJSON-master/tests/parse_array.c166
-rw-r--r--support/cJSON-master/tests/parse_examples.c214
-rw-r--r--support/cJSON-master/tests/parse_hex4.c73
-rw-r--r--support/cJSON-master/tests/parse_number.c110
-rw-r--r--support/cJSON-master/tests/parse_object.c176
-rw-r--r--support/cJSON-master/tests/parse_string.c135
-rw-r--r--support/cJSON-master/tests/parse_value.c112
-rw-r--r--support/cJSON-master/tests/parse_with_opts.c112
-rw-r--r--support/cJSON-master/tests/print_array.c100
-rw-r--r--support/cJSON-master/tests/print_number.c105
-rw-r--r--support/cJSON-master/tests/print_object.c101
-rw-r--r--support/cJSON-master/tests/print_string.c78
-rw-r--r--support/cJSON-master/tests/print_value.c107
-rw-r--r--support/cJSON-master/tests/readme_examples.c258
-rw-r--r--support/cJSON-master/tests/unity/.gitattributes30
-rw-r--r--support/cJSON-master/tests/unity/.gitignore9
-rw-r--r--support/cJSON-master/tests/unity/.travis.yml29
-rw-r--r--support/cJSON-master/tests/unity/README.md231
-rw-r--r--support/cJSON-master/tests/unity/auto/colour_prompt.rb118
-rw-r--r--support/cJSON-master/tests/unity/auto/colour_reporter.rb39
-rw-r--r--support/cJSON-master/tests/unity/auto/generate_config.yml36
-rw-r--r--support/cJSON-master/tests/unity/auto/generate_module.rb308
-rw-r--r--support/cJSON-master/tests/unity/auto/generate_test_runner.rb454
-rw-r--r--support/cJSON-master/tests/unity/auto/parse_output.rb220
-rw-r--r--support/cJSON-master/tests/unity/auto/stylize_as_junit.rb252
-rw-r--r--support/cJSON-master/tests/unity/auto/test_file_filter.rb25
-rw-r--r--support/cJSON-master/tests/unity/auto/type_sanitizer.rb6
-rw-r--r--support/cJSON-master/tests/unity/auto/unity_test_summary.py139
-rw-r--r--support/cJSON-master/tests/unity/auto/unity_test_summary.rb136
-rw-r--r--support/cJSON-master/tests/unity/auto/unity_to_junit.py146
-rw-r--r--support/cJSON-master/tests/unity/docs/ThrowTheSwitchCodingStandard.md207
-rw-r--r--support/cJSON-master/tests/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdfbin0 -> 144467 bytes
-rw-r--r--support/cJSON-master/tests/unity/docs/UnityAssertionsReference.md770
-rw-r--r--support/cJSON-master/tests/unity/docs/UnityConfigurationGuide.md435
-rw-r--r--support/cJSON-master/tests/unity/docs/UnityGettingStartedGuide.md191
-rw-r--r--support/cJSON-master/tests/unity/docs/UnityHelperScriptsGuide.md254
-rw-r--r--support/cJSON-master/tests/unity/docs/license.txt21
-rw-r--r--support/cJSON-master/tests/unity/examples/example_1/makefile71
-rw-r--r--support/cJSON-master/tests/unity/examples/example_1/readme.txt5
-rw-r--r--support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode.c24
-rw-r--r--support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode.h3
-rw-r--r--support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode2.c11
-rw-r--r--support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode2.h2
-rw-r--r--support/cJSON-master/tests/unity/examples/example_2/makefile70
-rw-r--r--support/cJSON-master/tests/unity/examples/example_2/readme.txt5
-rw-r--r--support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode.c24
-rw-r--r--support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode.h3
-rw-r--r--support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode2.c11
-rw-r--r--support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode2.h2
-rw-r--r--support/cJSON-master/tests/unity/examples/example_3/helper/UnityHelper.c10
-rw-r--r--support/cJSON-master/tests/unity/examples/example_3/helper/UnityHelper.h12
-rw-r--r--support/cJSON-master/tests/unity/examples/example_3/rakefile.rb43
-rw-r--r--support/cJSON-master/tests/unity/examples/example_3/rakefile_helper.rb249
-rw-r--r--support/cJSON-master/tests/unity/examples/example_3/readme.txt13
-rw-r--r--support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode.c24
-rw-r--r--support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode.h3
-rw-r--r--support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode2.c11
-rw-r--r--support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode2.h2
-rw-r--r--support/cJSON-master/tests/unity/examples/example_3/target_gcc_32.yml46
-rw-r--r--support/cJSON-master/tests/unity/examples/unity_config.h239
-rw-r--r--support/cJSON-master/tests/unity/extras/eclipse/error_parsers.txt26
-rw-r--r--support/cJSON-master/tests/unity/extras/fixture/rakefile.rb48
-rw-r--r--support/cJSON-master/tests/unity/extras/fixture/rakefile_helper.rb178
-rw-r--r--support/cJSON-master/tests/unity/extras/fixture/readme.txt9
-rw-r--r--support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture.c432
-rw-r--r--support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture.h83
-rw-r--r--support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture_internals.h51
-rw-r--r--support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture_malloc_overrides.h47
-rw-r--r--support/cJSON-master/tests/unity/release/build.info2
-rw-r--r--support/cJSON-master/tests/unity/release/version.info2
-rw-r--r--support/cJSON-master/tests/unity/src/unity.c1570
-rw-r--r--support/cJSON-master/tests/unity/src/unity.h503
-rw-r--r--support/cJSON-master/tests/unity/src/unity_internals.h870
-rw-r--r--support/cJSON-master/tests/unity_setup.c3
111 files changed, 13974 insertions, 0 deletions
diff --git a/support/cJSON-master/tests/CMakeLists.txt b/support/cJSON-master/tests/CMakeLists.txt
new file mode 100644
index 0000000..6f1688d
--- /dev/null
+++ b/support/cJSON-master/tests/CMakeLists.txt
@@ -0,0 +1,115 @@
+if(ENABLE_CJSON_TEST)
+ add_library(unity STATIC unity/src/unity.c)
+
+ # Disable -Werror for Unity
+ if (FLAG_SUPPORTED_Werror)
+ if ("${CMAKE_VERSION}" VERSION_LESS "2.8.12")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error")
+ else()
+ target_compile_options(unity PRIVATE "-Wno-error")
+ endif()
+ endif()
+ # Disable -fvisibility=hidden for Unity
+ if (FLAG_SUPPORTED_fvisibilityhidden)
+ if ("${CMAKE_VERSION}" VERSION_LESS "2.8.12")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=default")
+ else()
+ target_compile_options(unity PRIVATE "-fvisibility=default")
+ endif()
+ endif()
+ # Disable -fsanitize=float-divide-by-zero for Unity (GCC bug on x86 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80097)
+ if (FLAG_SUPPORTED_fsanitizefloatdividebyzero AND (CMAKE_C_COMPILER_ID STREQUAL "GNU"))
+ if ("${CMAKE_VERSION}" VERSION_LESS "2.8.12")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-sanitize=float-divide-by-zero")
+ else()
+ target_compile_options(unity PRIVATE "-fno-sanitize=float-divide-by-zero")
+ endif()
+ endif()
+ # Disable -Wswitch-enum for Unity
+ if (FLAG_SUPPORTED_Wswitchenum)
+ if ("${CMAKE_VERSION}" VERSION_LESS "2.8.12")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-switch-enum")
+ else()
+ target_compile_options(unity PRIVATE "-Wno-switch-enum")
+ endif()
+ endif()
+
+ #copy test files
+ file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/inputs")
+ file(GLOB test_files "inputs/*")
+ file(COPY ${test_files} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/inputs/")
+
+ set(unity_tests
+ parse_examples
+ parse_number
+ parse_hex4
+ parse_string
+ parse_array
+ parse_object
+ parse_value
+ print_string
+ print_number
+ print_array
+ print_object
+ print_value
+ misc_tests
+ parse_with_opts
+ compare_tests
+ cjson_add
+ readme_examples
+ )
+
+ option(ENABLE_VALGRIND OFF "Enable the valgrind memory checker for the tests.")
+ if (ENABLE_VALGRIND)
+ find_program(MEMORYCHECK_COMMAND valgrind)
+ if ("${MEMORYCHECK_COMMAND}" MATCHES "MEMORYCHECK_COMMAND-NOTFOUND")
+ message(WARNING "Valgrind couldn't be found.")
+ unset(MEMORYCHECK_COMMAND)
+ else()
+ set(MEMORYCHECK_COMMAND_OPTIONS --trace-children=yes --leak-check=full --error-exitcode=1 --suppressions=${CMAKE_CURRENT_SOURCE_DIR}/../valgrind.supp)
+ endif()
+ endif()
+
+ foreach(unity_test ${unity_tests})
+ add_executable("${unity_test}" "${unity_test}.c")
+ if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
+ target_sources(${unity_test} PRIVATE unity_setup.c)
+ endif()
+ target_link_libraries("${unity_test}" "${CJSON_LIB}" unity)
+ if(MEMORYCHECK_COMMAND)
+ add_test(NAME "${unity_test}"
+ COMMAND "${MEMORYCHECK_COMMAND}" ${MEMORYCHECK_COMMAND_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}/${unity_test}")
+ else()
+ add_test(NAME "${unity_test}"
+ COMMAND "./${unity_test}")
+ endif()
+ endforeach()
+
+ add_dependencies(check ${unity_tests})
+
+ if (ENABLE_CJSON_UTILS)
+ #copy test files
+ file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/json-patch-tests")
+ file(GLOB test_files "json-patch-tests/*")
+ file(COPY ${test_files} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/json-patch-tests/")
+
+ set (cjson_utils_tests
+ json_patch_tests
+ old_utils_tests
+ misc_utils_tests)
+
+ foreach (cjson_utils_test ${cjson_utils_tests})
+ add_executable("${cjson_utils_test}" "${cjson_utils_test}.c")
+ target_link_libraries("${cjson_utils_test}" "${CJSON_LIB}" "${CJSON_UTILS_LIB}" unity)
+ if(MEMORYCHECK_COMMAND)
+ add_test(NAME "${cjson_utils_test}"
+ COMMAND "${MEMORYCHECK_COMMAND}" ${MEMORYCHECK_COMMAND_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}/${cjson_utils_test}")
+ else()
+ add_test(NAME "${cjson_utils_test}"
+ COMMAND "./${cjson_utils_test}")
+ endif()
+ endforeach()
+
+ add_dependencies(check ${cjson_utils_tests})
+ endif()
+endif()
diff --git a/support/cJSON-master/tests/cjson_add.c b/support/cJSON-master/tests/cjson_add.c
new file mode 100644
index 0000000..00ffc34
--- /dev/null
+++ b/support/cJSON-master/tests/cjson_add.c
@@ -0,0 +1,422 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static void * CJSON_CDECL failing_malloc(size_t size)
+{
+ (void)size;
+ return NULL;
+}
+
+/* work around MSVC error C2322: '...' address of dillimport '...' is not static */
+static void CJSON_CDECL normal_free(void *pointer)
+{
+ free(pointer);
+}
+
+static cJSON_Hooks failing_hooks = {
+ failing_malloc,
+ normal_free
+};
+
+static void cjson_add_null_should_add_null(void)
+{
+ cJSON *root = cJSON_CreateObject();
+ cJSON *null = NULL;
+
+ cJSON_AddNullToObject(root, "null");
+
+ TEST_ASSERT_NOT_NULL(null = cJSON_GetObjectItemCaseSensitive(root, "null"));
+ TEST_ASSERT_EQUAL_INT(null->type, cJSON_NULL);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_null_should_fail_with_null_pointers(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ TEST_ASSERT_NULL(cJSON_AddNullToObject(NULL, "null"));
+ TEST_ASSERT_NULL(cJSON_AddNullToObject(root, NULL));
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_null_should_fail_on_allocation_failure(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ cJSON_InitHooks(&failing_hooks);
+
+ TEST_ASSERT_NULL(cJSON_AddNullToObject(root, "null"));
+
+ cJSON_InitHooks(NULL);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_true_should_add_true(void)
+{
+ cJSON *root = cJSON_CreateObject();
+ cJSON *true_item = NULL;
+
+ cJSON_AddTrueToObject(root, "true");
+
+ TEST_ASSERT_NOT_NULL(true_item = cJSON_GetObjectItemCaseSensitive(root, "true"));
+ TEST_ASSERT_EQUAL_INT(true_item->type, cJSON_True);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_true_should_fail_with_null_pointers(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ TEST_ASSERT_NULL(cJSON_AddTrueToObject(NULL, "true"));
+ TEST_ASSERT_NULL(cJSON_AddTrueToObject(root, NULL));
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_true_should_fail_on_allocation_failure(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ cJSON_InitHooks(&failing_hooks);
+
+ TEST_ASSERT_NULL(cJSON_AddTrueToObject(root, "true"));
+
+ cJSON_InitHooks(NULL);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_false_should_add_false(void)
+{
+ cJSON *root = cJSON_CreateObject();
+ cJSON *false_item = NULL;
+
+ cJSON_AddFalseToObject(root, "false");
+
+ TEST_ASSERT_NOT_NULL(false_item = cJSON_GetObjectItemCaseSensitive(root, "false"));
+ TEST_ASSERT_EQUAL_INT(false_item->type, cJSON_False);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_false_should_fail_with_null_pointers(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ TEST_ASSERT_NULL(cJSON_AddFalseToObject(NULL, "false"));
+ TEST_ASSERT_NULL(cJSON_AddFalseToObject(root, NULL));
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_false_should_fail_on_allocation_failure(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ cJSON_InitHooks(&failing_hooks);
+
+ TEST_ASSERT_NULL(cJSON_AddFalseToObject(root, "false"));
+
+ cJSON_InitHooks(NULL);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_bool_should_add_bool(void)
+{
+ cJSON *root = cJSON_CreateObject();
+ cJSON *true_item = NULL;
+ cJSON *false_item = NULL;
+
+ /* true */
+ cJSON_AddBoolToObject(root, "true", true);
+ TEST_ASSERT_NOT_NULL(true_item = cJSON_GetObjectItemCaseSensitive(root, "true"));
+ TEST_ASSERT_EQUAL_INT(true_item->type, cJSON_True);
+
+ /* false */
+ cJSON_AddBoolToObject(root, "false", false);
+ TEST_ASSERT_NOT_NULL(false_item = cJSON_GetObjectItemCaseSensitive(root, "false"));
+ TEST_ASSERT_EQUAL_INT(false_item->type, cJSON_False);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_bool_should_fail_with_null_pointers(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ TEST_ASSERT_NULL(cJSON_AddBoolToObject(NULL, "false", false));
+ TEST_ASSERT_NULL(cJSON_AddBoolToObject(root, NULL, false));
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_bool_should_fail_on_allocation_failure(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ cJSON_InitHooks(&failing_hooks);
+
+ TEST_ASSERT_NULL(cJSON_AddBoolToObject(root, "false", false));
+
+ cJSON_InitHooks(NULL);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_number_should_add_number(void)
+{
+ cJSON *root = cJSON_CreateObject();
+ cJSON *number = NULL;
+
+ cJSON_AddNumberToObject(root, "number", 42);
+
+ TEST_ASSERT_NOT_NULL(number = cJSON_GetObjectItemCaseSensitive(root, "number"));
+
+ TEST_ASSERT_EQUAL_INT(number->type, cJSON_Number);
+ TEST_ASSERT_EQUAL_DOUBLE(number->valuedouble, 42);
+ TEST_ASSERT_EQUAL_INT(number->valueint, 42);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_number_should_fail_with_null_pointers(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ TEST_ASSERT_NULL(cJSON_AddNumberToObject(NULL, "number", 42));
+ TEST_ASSERT_NULL(cJSON_AddNumberToObject(root, NULL, 42));
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_number_should_fail_on_allocation_failure(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ cJSON_InitHooks(&failing_hooks);
+
+ TEST_ASSERT_NULL(cJSON_AddNumberToObject(root, "number", 42));
+
+ cJSON_InitHooks(NULL);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_string_should_add_string(void)
+{
+ cJSON *root = cJSON_CreateObject();
+ cJSON *string = NULL;
+
+ cJSON_AddStringToObject(root, "string", "Hello World!");
+
+ TEST_ASSERT_NOT_NULL(string = cJSON_GetObjectItemCaseSensitive(root, "string"));
+ TEST_ASSERT_EQUAL_INT(string->type, cJSON_String);
+ TEST_ASSERT_EQUAL_STRING(string->valuestring, "Hello World!");
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_string_should_fail_with_null_pointers(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ TEST_ASSERT_NULL(cJSON_AddStringToObject(NULL, "string", "string"));
+ TEST_ASSERT_NULL(cJSON_AddStringToObject(root, NULL, "string"));
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_string_should_fail_on_allocation_failure(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ cJSON_InitHooks(&failing_hooks);
+
+ TEST_ASSERT_NULL(cJSON_AddStringToObject(root, "string", "string"));
+
+ cJSON_InitHooks(NULL);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_raw_should_add_raw(void)
+{
+ cJSON *root = cJSON_CreateObject();
+ cJSON *raw = NULL;
+
+ cJSON_AddRawToObject(root, "raw", "{}");
+
+ TEST_ASSERT_NOT_NULL(raw = cJSON_GetObjectItemCaseSensitive(root, "raw"));
+ TEST_ASSERT_EQUAL_INT(raw->type, cJSON_Raw);
+ TEST_ASSERT_EQUAL_STRING(raw->valuestring, "{}");
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_raw_should_fail_with_null_pointers(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ TEST_ASSERT_NULL(cJSON_AddRawToObject(NULL, "raw", "{}"));
+ TEST_ASSERT_NULL(cJSON_AddRawToObject(root, NULL, "{}"));
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_raw_should_fail_on_allocation_failure(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ cJSON_InitHooks(&failing_hooks);
+
+ TEST_ASSERT_NULL(cJSON_AddRawToObject(root, "raw", "{}"));
+
+ cJSON_InitHooks(NULL);
+
+ cJSON_Delete(root);
+}
+
+static void cJSON_add_object_should_add_object(void)
+{
+ cJSON *root = cJSON_CreateObject();
+ cJSON *object = NULL;
+
+ cJSON_AddObjectToObject(root, "object");
+ TEST_ASSERT_NOT_NULL(object = cJSON_GetObjectItemCaseSensitive(root, "object"));
+ TEST_ASSERT_EQUAL_INT(object->type, cJSON_Object);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_object_should_fail_with_null_pointers(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ TEST_ASSERT_NULL(cJSON_AddObjectToObject(NULL, "object"));
+ TEST_ASSERT_NULL(cJSON_AddObjectToObject(root, NULL));
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_object_should_fail_on_allocation_failure(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ cJSON_InitHooks(&failing_hooks);
+
+ TEST_ASSERT_NULL(cJSON_AddObjectToObject(root, "object"));
+
+ cJSON_InitHooks(NULL);
+
+ cJSON_Delete(root);
+}
+
+static void cJSON_add_array_should_add_array(void)
+{
+ cJSON *root = cJSON_CreateObject();
+ cJSON *array = NULL;
+
+ cJSON_AddArrayToObject(root, "array");
+ TEST_ASSERT_NOT_NULL(array = cJSON_GetObjectItemCaseSensitive(root, "array"));
+ TEST_ASSERT_EQUAL_INT(array->type, cJSON_Array);
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_array_should_fail_with_null_pointers(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ TEST_ASSERT_NULL(cJSON_AddArrayToObject(NULL, "array"));
+ TEST_ASSERT_NULL(cJSON_AddArrayToObject(root, NULL));
+
+ cJSON_Delete(root);
+}
+
+static void cjson_add_array_should_fail_on_allocation_failure(void)
+{
+ cJSON *root = cJSON_CreateObject();
+
+ cJSON_InitHooks(&failing_hooks);
+
+ TEST_ASSERT_NULL(cJSON_AddArrayToObject(root, "array"));
+
+ cJSON_InitHooks(NULL);
+
+ cJSON_Delete(root);
+}
+
+int CJSON_CDECL main(void)
+{
+ UNITY_BEGIN();
+
+ RUN_TEST(cjson_add_null_should_add_null);
+ RUN_TEST(cjson_add_null_should_fail_with_null_pointers);
+ RUN_TEST(cjson_add_null_should_fail_on_allocation_failure);
+
+ RUN_TEST(cjson_add_true_should_add_true);
+ RUN_TEST(cjson_add_true_should_fail_with_null_pointers);
+ RUN_TEST(cjson_add_true_should_fail_on_allocation_failure);
+
+ RUN_TEST(cjson_add_false_should_add_false);
+ RUN_TEST(cjson_add_false_should_fail_with_null_pointers);
+ RUN_TEST(cjson_add_false_should_fail_on_allocation_failure);
+
+ RUN_TEST(cjson_add_bool_should_add_bool);
+ RUN_TEST(cjson_add_bool_should_fail_with_null_pointers);
+ RUN_TEST(cjson_add_bool_should_fail_on_allocation_failure);
+
+ RUN_TEST(cjson_add_number_should_add_number);
+ RUN_TEST(cjson_add_number_should_fail_with_null_pointers);
+ RUN_TEST(cjson_add_number_should_fail_on_allocation_failure);
+
+ RUN_TEST(cjson_add_string_should_add_string);
+ RUN_TEST(cjson_add_string_should_fail_with_null_pointers);
+ RUN_TEST(cjson_add_string_should_fail_on_allocation_failure);
+
+ RUN_TEST(cjson_add_raw_should_add_raw);
+ RUN_TEST(cjson_add_raw_should_fail_with_null_pointers);
+ RUN_TEST(cjson_add_raw_should_fail_on_allocation_failure);
+
+ RUN_TEST(cJSON_add_object_should_add_object);
+ RUN_TEST(cjson_add_object_should_fail_with_null_pointers);
+ RUN_TEST(cjson_add_object_should_fail_on_allocation_failure);
+
+ RUN_TEST(cJSON_add_array_should_add_array);
+ RUN_TEST(cjson_add_array_should_fail_with_null_pointers);
+ RUN_TEST(cjson_add_array_should_fail_on_allocation_failure);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/common.h b/support/cJSON-master/tests/common.h
new file mode 100644
index 0000000..4db6bf8
--- /dev/null
+++ b/support/cJSON-master/tests/common.h
@@ -0,0 +1,122 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#ifndef CJSON_TESTS_COMMON_H
+#define CJSON_TESTS_COMMON_H
+
+#include "../cJSON.c"
+
+void reset(cJSON *item);
+void reset(cJSON *item) {
+ if ((item != NULL) && (item->child != NULL))
+ {
+ cJSON_Delete(item->child);
+ }
+ if ((item->valuestring != NULL) && !(item->type & cJSON_IsReference))
+ {
+ global_hooks.deallocate(item->valuestring);
+ }
+ if ((item->string != NULL) && !(item->type & cJSON_StringIsConst))
+ {
+ global_hooks.deallocate(item->string);
+ }
+
+ memset(item, 0, sizeof(cJSON));
+}
+
+char* read_file(const char *filename);
+char* read_file(const char *filename) {
+ FILE *file = NULL;
+ long length = 0;
+ char *content = NULL;
+ size_t read_chars = 0;
+
+ /* open in read binary mode */
+ file = fopen(filename, "rb");
+ if (file == NULL)
+ {
+ goto cleanup;
+ }
+
+ /* get the length */
+ if (fseek(file, 0, SEEK_END) != 0)
+ {
+ goto cleanup;
+ }
+ length = ftell(file);
+ if (length < 0)
+ {
+ goto cleanup;
+ }
+ if (fseek(file, 0, SEEK_SET) != 0)
+ {
+ goto cleanup;
+ }
+
+ /* allocate content buffer */
+ content = (char*)malloc((size_t)length + sizeof(""));
+ if (content == NULL)
+ {
+ goto cleanup;
+ }
+
+ /* read the file into memory */
+ read_chars = fread(content, sizeof(char), (size_t)length, file);
+ if ((long)read_chars != length)
+ {
+ free(content);
+ content = NULL;
+ goto cleanup;
+ }
+ content[read_chars] = '\0';
+
+
+cleanup:
+ if (file != NULL)
+ {
+ fclose(file);
+ }
+
+ return content;
+}
+
+/* assertion helper macros */
+#define assert_has_type(item, item_type) TEST_ASSERT_BITS_MESSAGE(0xFF, item_type, item->type, "Item doesn't have expected type.")
+#define assert_has_no_reference(item) TEST_ASSERT_BITS_MESSAGE(cJSON_IsReference, 0, item->type, "Item should not have a string as reference.")
+#define assert_has_no_const_string(item) TEST_ASSERT_BITS_MESSAGE(cJSON_StringIsConst, 0, item->type, "Item should not have a const string.")
+#define assert_has_valuestring(item) TEST_ASSERT_NOT_NULL_MESSAGE(item->valuestring, "Valuestring is NULL.")
+#define assert_has_no_valuestring(item) TEST_ASSERT_NULL_MESSAGE(item->valuestring, "Valuestring is not NULL.")
+#define assert_has_string(item) TEST_ASSERT_NOT_NULL_MESSAGE(item->string, "String is NULL")
+#define assert_has_no_string(item) TEST_ASSERT_NULL_MESSAGE(item->string, "String is not NULL.")
+#define assert_not_in_list(item) \
+ TEST_ASSERT_NULL_MESSAGE(item->next, "Linked list next pointer is not NULL.");\
+ TEST_ASSERT_NULL_MESSAGE(item->prev, "Linked list previous pointer is not NULL.")
+#define assert_has_child(item) TEST_ASSERT_NOT_NULL_MESSAGE(item->child, "Item doesn't have a child.")
+#define assert_has_no_child(item) TEST_ASSERT_NULL_MESSAGE(item->child, "Item has a child.")
+#define assert_is_invalid(item) \
+ assert_has_type(item, cJSON_Invalid);\
+ assert_not_in_list(item);\
+ assert_has_no_child(item);\
+ assert_has_no_string(item);\
+ assert_has_no_valuestring(item)
+
+#endif
diff --git a/support/cJSON-master/tests/compare_tests.c b/support/cJSON-master/tests/compare_tests.c
new file mode 100644
index 0000000..307d0e8
--- /dev/null
+++ b/support/cJSON-master/tests/compare_tests.c
@@ -0,0 +1,205 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static cJSON_bool compare_from_string(const char * const a, const char * const b, const cJSON_bool case_sensitive)
+{
+ cJSON *a_json = NULL;
+ cJSON *b_json = NULL;
+ cJSON_bool result = false;
+
+ a_json = cJSON_Parse(a);
+ TEST_ASSERT_NOT_NULL_MESSAGE(a_json, "Failed to parse a.");
+ b_json = cJSON_Parse(b);
+ TEST_ASSERT_NOT_NULL_MESSAGE(b_json, "Failed to parse b.");
+
+ result = cJSON_Compare(a_json, b_json, case_sensitive);
+
+ cJSON_Delete(a_json);
+ cJSON_Delete(b_json);
+
+ return result;
+}
+
+static void cjson_compare_should_compare_null_pointer_as_not_equal(void)
+{
+ TEST_ASSERT_FALSE(cJSON_Compare(NULL, NULL, true));
+ TEST_ASSERT_FALSE(cJSON_Compare(NULL, NULL, false));
+}
+
+static void cjson_compare_should_compare_invalid_as_not_equal(void)
+{
+ cJSON invalid[1];
+ memset(invalid, '\0', sizeof(invalid));
+
+ TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, false));
+ TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, true));
+}
+
+static void cjson_compare_should_compare_numbers(void)
+{
+ TEST_ASSERT_TRUE(compare_from_string("1", "1", true));
+ TEST_ASSERT_TRUE(compare_from_string("1", "1", false));
+ TEST_ASSERT_TRUE(compare_from_string("0.0001", "0.0001", true));
+ TEST_ASSERT_TRUE(compare_from_string("0.0001", "0.0001", false));
+
+ TEST_ASSERT_FALSE(compare_from_string("1", "2", true));
+ TEST_ASSERT_FALSE(compare_from_string("1", "2", false));
+}
+
+static void cjson_compare_should_compare_booleans(void)
+{
+ /* true */
+ TEST_ASSERT_TRUE(compare_from_string("true", "true", true));
+ TEST_ASSERT_TRUE(compare_from_string("true", "true", false));
+
+ /* false */
+ TEST_ASSERT_TRUE(compare_from_string("false", "false", true));
+ TEST_ASSERT_TRUE(compare_from_string("false", "false", false));
+
+ /* mixed */
+ TEST_ASSERT_FALSE(compare_from_string("true", "false", true));
+ TEST_ASSERT_FALSE(compare_from_string("true", "false", false));
+ TEST_ASSERT_FALSE(compare_from_string("false", "true", true));
+ TEST_ASSERT_FALSE(compare_from_string("false", "true", false));
+}
+
+static void cjson_compare_should_compare_null(void)
+{
+ TEST_ASSERT_TRUE(compare_from_string("null", "null", true));
+ TEST_ASSERT_TRUE(compare_from_string("null", "null", false));
+
+ TEST_ASSERT_FALSE(compare_from_string("null", "true", true));
+ TEST_ASSERT_FALSE(compare_from_string("null", "true", false));
+}
+
+static void cjson_compare_should_not_accept_invalid_types(void)
+{
+ cJSON invalid[1];
+ memset(invalid, '\0', sizeof(invalid));
+
+ invalid->type = cJSON_Number | cJSON_String;
+
+ TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, true));
+ TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, false));
+}
+
+static void cjson_compare_should_compare_strings(void)
+{
+ TEST_ASSERT_TRUE(compare_from_string("\"abcdefg\"", "\"abcdefg\"", true));
+ TEST_ASSERT_TRUE(compare_from_string("\"abcdefg\"", "\"abcdefg\"", false));
+
+ TEST_ASSERT_FALSE(compare_from_string("\"ABCDEFG\"", "\"abcdefg\"", true));
+ TEST_ASSERT_FALSE(compare_from_string("\"ABCDEFG\"", "\"abcdefg\"", false));
+}
+
+static void cjson_compare_should_compare_raw(void)
+{
+ cJSON *raw1 = NULL;
+ cJSON *raw2 = NULL;
+
+ raw1 = cJSON_Parse("\"[true, false]\"");
+ TEST_ASSERT_NOT_NULL(raw1);
+ raw2 = cJSON_Parse("\"[true, false]\"");
+ TEST_ASSERT_NOT_NULL(raw2);
+
+ raw1->type = cJSON_Raw;
+ raw2->type = cJSON_Raw;
+
+ TEST_ASSERT_TRUE(cJSON_Compare(raw1, raw2, true));
+ TEST_ASSERT_TRUE(cJSON_Compare(raw1, raw2, false));
+
+ cJSON_Delete(raw1);
+ cJSON_Delete(raw2);
+}
+
+static void cjson_compare_should_compare_arrays(void)
+{
+ TEST_ASSERT_TRUE(compare_from_string("[]", "[]", true));
+ TEST_ASSERT_TRUE(compare_from_string("[]", "[]", false));
+
+ TEST_ASSERT_TRUE(compare_from_string("[false,true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", true));
+ TEST_ASSERT_TRUE(compare_from_string("[false,true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", false));
+
+ TEST_ASSERT_TRUE(compare_from_string("[[[1], 2]]", "[[[1], 2]]", true));
+ TEST_ASSERT_TRUE(compare_from_string("[[[1], 2]]", "[[[1], 2]]", false));
+
+ TEST_ASSERT_FALSE(compare_from_string("[true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", true));
+ TEST_ASSERT_FALSE(compare_from_string("[true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", false));
+
+ /* Arrays that are a prefix of another array */
+ TEST_ASSERT_FALSE(compare_from_string("[1,2,3]", "[1,2]", true));
+ TEST_ASSERT_FALSE(compare_from_string("[1,2,3]", "[1,2]", false));
+}
+
+static void cjson_compare_should_compare_objects(void)
+{
+ TEST_ASSERT_TRUE(compare_from_string("{}", "{}", true));
+ TEST_ASSERT_TRUE(compare_from_string("{}", "{}", false));
+
+ TEST_ASSERT_TRUE(compare_from_string(
+ "{\"false\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
+ "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
+ true));
+ TEST_ASSERT_FALSE(compare_from_string(
+ "{\"False\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
+ "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
+ true));
+ TEST_ASSERT_TRUE(compare_from_string(
+ "{\"False\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
+ "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
+ false));
+ TEST_ASSERT_FALSE(compare_from_string(
+ "{\"Flse\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
+ "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
+ false));
+ /* test objects that are a subset of each other */
+ TEST_ASSERT_FALSE(compare_from_string(
+ "{\"one\": 1, \"two\": 2}",
+ "{\"one\": 1, \"two\": 2, \"three\": 3}",
+ true))
+ TEST_ASSERT_FALSE(compare_from_string(
+ "{\"one\": 1, \"two\": 2}",
+ "{\"one\": 1, \"two\": 2, \"three\": 3}",
+ false))
+}
+
+int CJSON_CDECL main(void)
+{
+ UNITY_BEGIN();
+
+ RUN_TEST(cjson_compare_should_compare_null_pointer_as_not_equal);
+ RUN_TEST(cjson_compare_should_compare_invalid_as_not_equal);
+ RUN_TEST(cjson_compare_should_compare_numbers);
+ RUN_TEST(cjson_compare_should_compare_booleans);
+ RUN_TEST(cjson_compare_should_compare_null);
+ RUN_TEST(cjson_compare_should_not_accept_invalid_types);
+ RUN_TEST(cjson_compare_should_compare_strings);
+ RUN_TEST(cjson_compare_should_compare_raw);
+ RUN_TEST(cjson_compare_should_compare_arrays);
+ RUN_TEST(cjson_compare_should_compare_objects);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/inputs/test1 b/support/cJSON-master/tests/inputs/test1
new file mode 100644
index 0000000..eacfbf5
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test1
@@ -0,0 +1,22 @@
+{
+ "glossary": {
+ "title": "example glossary",
+ "GlossDiv": {
+ "title": "S",
+ "GlossList": {
+ "GlossEntry": {
+ "ID": "SGML",
+ "SortAs": "SGML",
+ "GlossTerm": "Standard Generalized Markup Language",
+ "Acronym": "SGML",
+ "Abbrev": "ISO 8879:1986",
+ "GlossDef": {
+ "para": "A meta-markup language, used to create markup languages such as DocBook.",
+ "GlossSeeAlso": ["GML", "XML"]
+ },
+ "GlossSee": "markup"
+ }
+ }
+ }
+ }
+}
diff --git a/support/cJSON-master/tests/inputs/test1.expected b/support/cJSON-master/tests/inputs/test1.expected
new file mode 100644
index 0000000..a5839e8
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test1.expected
@@ -0,0 +1,22 @@
+{
+ "glossary": {
+ "title": "example glossary",
+ "GlossDiv": {
+ "title": "S",
+ "GlossList": {
+ "GlossEntry": {
+ "ID": "SGML",
+ "SortAs": "SGML",
+ "GlossTerm": "Standard Generalized Markup Language",
+ "Acronym": "SGML",
+ "Abbrev": "ISO 8879:1986",
+ "GlossDef": {
+ "para": "A meta-markup language, used to create markup languages such as DocBook.",
+ "GlossSeeAlso": ["GML", "XML"]
+ },
+ "GlossSee": "markup"
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test10 b/support/cJSON-master/tests/inputs/test10
new file mode 100644
index 0000000..d19eb8b
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test10
@@ -0,0 +1 @@
+["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
diff --git a/support/cJSON-master/tests/inputs/test10.expected b/support/cJSON-master/tests/inputs/test10.expected
new file mode 100644
index 0000000..747ba62
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test10.expected
@@ -0,0 +1 @@
+["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test11 b/support/cJSON-master/tests/inputs/test11
new file mode 100644
index 0000000..039c61b
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test11
@@ -0,0 +1,8 @@
+{
+"name": "Jack (\"Bee\") Nimble",
+"format": {"type": "rect",
+"width": 1920,
+"height": 1080,
+"interlace": false,"frame rate": 24
+}
+}
diff --git a/support/cJSON-master/tests/inputs/test11.expected b/support/cJSON-master/tests/inputs/test11.expected
new file mode 100644
index 0000000..24e72ec
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test11.expected
@@ -0,0 +1,10 @@
+{
+ "name": "Jack (\"Bee\") Nimble",
+ "format": {
+ "type": "rect",
+ "width": 1920,
+ "height": 1080,
+ "interlace": false,
+ "frame rate": 24
+ }
+} \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test2 b/support/cJSON-master/tests/inputs/test2
new file mode 100644
index 0000000..5600991
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test2
@@ -0,0 +1,11 @@
+{"menu": {
+ "id": "file",
+ "value": "File",
+ "popup": {
+ "menuitem": [
+ {"value": "New", "onclick": "CreateNewDoc()"},
+ {"value": "Open", "onclick": "OpenDoc()"},
+ {"value": "Close", "onclick": "CloseDoc()"}
+ ]
+ }
+}}
diff --git a/support/cJSON-master/tests/inputs/test2.expected b/support/cJSON-master/tests/inputs/test2.expected
new file mode 100644
index 0000000..d42a017
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test2.expected
@@ -0,0 +1,18 @@
+{
+ "menu": {
+ "id": "file",
+ "value": "File",
+ "popup": {
+ "menuitem": [{
+ "value": "New",
+ "onclick": "CreateNewDoc()"
+ }, {
+ "value": "Open",
+ "onclick": "OpenDoc()"
+ }, {
+ "value": "Close",
+ "onclick": "CloseDoc()"
+ }]
+ }
+ }
+} \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test3 b/support/cJSON-master/tests/inputs/test3
new file mode 100644
index 0000000..7f74aca
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test3
@@ -0,0 +1,26 @@
+{"widget": {
+ "debug": "on",
+ "window": {
+ "title": "Sample Konfabulator Widget",
+ "name": "main_window",
+ "width": 500,
+ "height": 500
+ },
+ "image": {
+ "src": "Images/Sun.png",
+ "name": "sun1",
+ "hOffset": 250,
+ "vOffset": 250,
+ "alignment": "center"
+ },
+ "text": {
+ "data": "Click Here",
+ "size": 36,
+ "style": "bold",
+ "name": "text1",
+ "hOffset": 250,
+ "vOffset": 100,
+ "alignment": "center",
+ "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
+ }
+}} \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test3.expected b/support/cJSON-master/tests/inputs/test3.expected
new file mode 100644
index 0000000..a9b9c55
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test3.expected
@@ -0,0 +1,28 @@
+{
+ "widget": {
+ "debug": "on",
+ "window": {
+ "title": "Sample Konfabulator Widget",
+ "name": "main_window",
+ "width": 500,
+ "height": 500
+ },
+ "image": {
+ "src": "Images/Sun.png",
+ "name": "sun1",
+ "hOffset": 250,
+ "vOffset": 250,
+ "alignment": "center"
+ },
+ "text": {
+ "data": "Click Here",
+ "size": 36,
+ "style": "bold",
+ "name": "text1",
+ "hOffset": 250,
+ "vOffset": 100,
+ "alignment": "center",
+ "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
+ }
+ }
+} \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test4 b/support/cJSON-master/tests/inputs/test4
new file mode 100644
index 0000000..55cd56b
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test4
@@ -0,0 +1,88 @@
+{"web-app": {
+ "servlet": [
+ {
+ "servlet-name": "cofaxCDS",
+ "servlet-class": "org.cofax.cds.CDSServlet",
+ "init-param": {
+ "configGlossary:installationAt": "Philadelphia, PA",
+ "configGlossary:adminEmail": "[email protected]",
+ "configGlossary:poweredBy": "Cofax",
+ "configGlossary:poweredByIcon": "/images/cofax.gif",
+ "configGlossary:staticPath": "/content/static",
+ "templateProcessorClass": "org.cofax.WysiwygTemplate",
+ "templateLoaderClass": "org.cofax.FilesTemplateLoader",
+ "templatePath": "templates",
+ "templateOverridePath": "",
+ "defaultListTemplate": "listTemplate.htm",
+ "defaultFileTemplate": "articleTemplate.htm",
+ "useJSP": false,
+ "jspListTemplate": "listTemplate.jsp",
+ "jspFileTemplate": "articleTemplate.jsp",
+ "cachePackageTagsTrack": 200,
+ "cachePackageTagsStore": 200,
+ "cachePackageTagsRefresh": 60,
+ "cacheTemplatesTrack": 100,
+ "cacheTemplatesStore": 50,
+ "cacheTemplatesRefresh": 15,
+ "cachePagesTrack": 200,
+ "cachePagesStore": 100,
+ "cachePagesRefresh": 10,
+ "cachePagesDirtyRead": 10,
+ "searchEngineListTemplate": "forSearchEnginesList.htm",
+ "searchEngineFileTemplate": "forSearchEngines.htm",
+ "searchEngineRobotsDb": "WEB-INF/robots.db",
+ "useDataStore": true,
+ "dataStoreClass": "org.cofax.SqlDataStore",
+ "redirectionClass": "org.cofax.SqlRedirection",
+ "dataStoreName": "cofax",
+ "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver",
+ "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon",
+ "dataStoreUser": "sa",
+ "dataStorePassword": "dataStoreTestQuery",
+ "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",
+ "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",
+ "dataStoreInitConns": 10,
+ "dataStoreMaxConns": 100,
+ "dataStoreConnUsageLimit": 100,
+ "dataStoreLogLevel": "debug",
+ "maxUrlLength": 500}},
+ {
+ "servlet-name": "cofaxEmail",
+ "servlet-class": "org.cofax.cds.EmailServlet",
+ "init-param": {
+ "mailHost": "mail1",
+ "mailHostOverride": "mail2"}},
+ {
+ "servlet-name": "cofaxAdmin",
+ "servlet-class": "org.cofax.cds.AdminServlet"},
+
+ {
+ "servlet-name": "fileServlet",
+ "servlet-class": "org.cofax.cds.FileServlet"},
+ {
+ "servlet-name": "cofaxTools",
+ "servlet-class": "org.cofax.cms.CofaxToolsServlet",
+ "init-param": {
+ "templatePath": "toolstemplates/",
+ "log": 1,
+ "logLocation": "/usr/local/tomcat/logs/CofaxTools.log",
+ "logMaxSize": "",
+ "dataLog": 1,
+ "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",
+ "dataLogMaxSize": "",
+ "removePageCache": "/content/admin/remove?cache=pages&id=",
+ "removeTemplateCache": "/content/admin/remove?cache=templates&id=",
+ "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",
+ "lookInContext": 1,
+ "adminGroupID": 4,
+ "betaServer": true}}],
+ "servlet-mapping": {
+ "cofaxCDS": "/",
+ "cofaxEmail": "/cofaxutil/aemail/*",
+ "cofaxAdmin": "/admin/*",
+ "fileServlet": "/static/*",
+ "cofaxTools": "/tools/*"},
+
+ "taglib": {
+ "taglib-uri": "cofax.tld",
+ "taglib-location": "/WEB-INF/tlds/cofax.tld"}}} \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test4.expected b/support/cJSON-master/tests/inputs/test4.expected
new file mode 100644
index 0000000..3648a95
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test4.expected
@@ -0,0 +1,94 @@
+{
+ "web-app": {
+ "servlet": [{
+ "servlet-name": "cofaxCDS",
+ "servlet-class": "org.cofax.cds.CDSServlet",
+ "init-param": {
+ "configGlossary:installationAt": "Philadelphia, PA",
+ "configGlossary:adminEmail": "[email protected]",
+ "configGlossary:poweredBy": "Cofax",
+ "configGlossary:poweredByIcon": "/images/cofax.gif",
+ "configGlossary:staticPath": "/content/static",
+ "templateProcessorClass": "org.cofax.WysiwygTemplate",
+ "templateLoaderClass": "org.cofax.FilesTemplateLoader",
+ "templatePath": "templates",
+ "templateOverridePath": "",
+ "defaultListTemplate": "listTemplate.htm",
+ "defaultFileTemplate": "articleTemplate.htm",
+ "useJSP": false,
+ "jspListTemplate": "listTemplate.jsp",
+ "jspFileTemplate": "articleTemplate.jsp",
+ "cachePackageTagsTrack": 200,
+ "cachePackageTagsStore": 200,
+ "cachePackageTagsRefresh": 60,
+ "cacheTemplatesTrack": 100,
+ "cacheTemplatesStore": 50,
+ "cacheTemplatesRefresh": 15,
+ "cachePagesTrack": 200,
+ "cachePagesStore": 100,
+ "cachePagesRefresh": 10,
+ "cachePagesDirtyRead": 10,
+ "searchEngineListTemplate": "forSearchEnginesList.htm",
+ "searchEngineFileTemplate": "forSearchEngines.htm",
+ "searchEngineRobotsDb": "WEB-INF/robots.db",
+ "useDataStore": true,
+ "dataStoreClass": "org.cofax.SqlDataStore",
+ "redirectionClass": "org.cofax.SqlRedirection",
+ "dataStoreName": "cofax",
+ "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver",
+ "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon",
+ "dataStoreUser": "sa",
+ "dataStorePassword": "dataStoreTestQuery",
+ "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",
+ "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",
+ "dataStoreInitConns": 10,
+ "dataStoreMaxConns": 100,
+ "dataStoreConnUsageLimit": 100,
+ "dataStoreLogLevel": "debug",
+ "maxUrlLength": 500
+ }
+ }, {
+ "servlet-name": "cofaxEmail",
+ "servlet-class": "org.cofax.cds.EmailServlet",
+ "init-param": {
+ "mailHost": "mail1",
+ "mailHostOverride": "mail2"
+ }
+ }, {
+ "servlet-name": "cofaxAdmin",
+ "servlet-class": "org.cofax.cds.AdminServlet"
+ }, {
+ "servlet-name": "fileServlet",
+ "servlet-class": "org.cofax.cds.FileServlet"
+ }, {
+ "servlet-name": "cofaxTools",
+ "servlet-class": "org.cofax.cms.CofaxToolsServlet",
+ "init-param": {
+ "templatePath": "toolstemplates/",
+ "log": 1,
+ "logLocation": "/usr/local/tomcat/logs/CofaxTools.log",
+ "logMaxSize": "",
+ "dataLog": 1,
+ "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",
+ "dataLogMaxSize": "",
+ "removePageCache": "/content/admin/remove?cache=pages&id=",
+ "removeTemplateCache": "/content/admin/remove?cache=templates&id=",
+ "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",
+ "lookInContext": 1,
+ "adminGroupID": 4,
+ "betaServer": true
+ }
+ }],
+ "servlet-mapping": {
+ "cofaxCDS": "/",
+ "cofaxEmail": "/cofaxutil/aemail/*",
+ "cofaxAdmin": "/admin/*",
+ "fileServlet": "/static/*",
+ "cofaxTools": "/tools/*"
+ },
+ "taglib": {
+ "taglib-uri": "cofax.tld",
+ "taglib-location": "/WEB-INF/tlds/cofax.tld"
+ }
+ }
+} \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test5 b/support/cJSON-master/tests/inputs/test5
new file mode 100644
index 0000000..49980ca
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test5
@@ -0,0 +1,27 @@
+{"menu": {
+ "header": "SVG Viewer",
+ "items": [
+ {"id": "Open"},
+ {"id": "OpenNew", "label": "Open New"},
+ null,
+ {"id": "ZoomIn", "label": "Zoom In"},
+ {"id": "ZoomOut", "label": "Zoom Out"},
+ {"id": "OriginalView", "label": "Original View"},
+ null,
+ {"id": "Quality"},
+ {"id": "Pause"},
+ {"id": "Mute"},
+ null,
+ {"id": "Find", "label": "Find..."},
+ {"id": "FindAgain", "label": "Find Again"},
+ {"id": "Copy"},
+ {"id": "CopyAgain", "label": "Copy Again"},
+ {"id": "CopySVG", "label": "Copy SVG"},
+ {"id": "ViewSVG", "label": "View SVG"},
+ {"id": "ViewSource", "label": "View Source"},
+ {"id": "SaveAs", "label": "Save As"},
+ null,
+ {"id": "Help"},
+ {"id": "About", "label": "About Adobe CVG Viewer..."}
+ ]
+}}
diff --git a/support/cJSON-master/tests/inputs/test5.expected b/support/cJSON-master/tests/inputs/test5.expected
new file mode 100644
index 0000000..886ed58
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test5.expected
@@ -0,0 +1,54 @@
+{
+ "menu": {
+ "header": "SVG Viewer",
+ "items": [{
+ "id": "Open"
+ }, {
+ "id": "OpenNew",
+ "label": "Open New"
+ }, null, {
+ "id": "ZoomIn",
+ "label": "Zoom In"
+ }, {
+ "id": "ZoomOut",
+ "label": "Zoom Out"
+ }, {
+ "id": "OriginalView",
+ "label": "Original View"
+ }, null, {
+ "id": "Quality"
+ }, {
+ "id": "Pause"
+ }, {
+ "id": "Mute"
+ }, null, {
+ "id": "Find",
+ "label": "Find..."
+ }, {
+ "id": "FindAgain",
+ "label": "Find Again"
+ }, {
+ "id": "Copy"
+ }, {
+ "id": "CopyAgain",
+ "label": "Copy Again"
+ }, {
+ "id": "CopySVG",
+ "label": "Copy SVG"
+ }, {
+ "id": "ViewSVG",
+ "label": "View SVG"
+ }, {
+ "id": "ViewSource",
+ "label": "View Source"
+ }, {
+ "id": "SaveAs",
+ "label": "Save As"
+ }, null, {
+ "id": "Help"
+ }, {
+ "id": "About",
+ "label": "About Adobe CVG Viewer..."
+ }]
+ }
+} \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test6 b/support/cJSON-master/tests/inputs/test6
new file mode 100644
index 0000000..d5cb28f
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test6
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+ <html>
+ <head>
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <style type="text/css">
+ html, body, iframe { margin: 0; padding: 0; height: 100%; }
+ iframe { display: block; width: 100%; border: none; }
+ </style>
+ <title>Application Error</title>
+ </head>
+ <body>
+ <iframe src="//s3.amazonaws.com/heroku_pages/error.html">
+ <p>Application Error</p>
+ </iframe>
+ </body>
+ </html> \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test7 b/support/cJSON-master/tests/inputs/test7
new file mode 100644
index 0000000..3308536
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test7
@@ -0,0 +1,22 @@
+[
+ {
+ "precision": "zip",
+ "Latitude": 37.7668,
+ "Longitude": -122.3959,
+ "Address": "",
+ "City": "SAN FRANCISCO",
+ "State": "CA",
+ "Zip": "94107",
+ "Country": "US"
+ },
+ {
+ "precision": "zip",
+ "Latitude": 37.371991,
+ "Longitude": -122.026020,
+ "Address": "",
+ "City": "SUNNYVALE",
+ "State": "CA",
+ "Zip": "94085",
+ "Country": "US"
+ }
+ ]
diff --git a/support/cJSON-master/tests/inputs/test7.expected b/support/cJSON-master/tests/inputs/test7.expected
new file mode 100644
index 0000000..15adf79
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test7.expected
@@ -0,0 +1,19 @@
+[{
+ "precision": "zip",
+ "Latitude": 37.7668,
+ "Longitude": -122.3959,
+ "Address": "",
+ "City": "SAN FRANCISCO",
+ "State": "CA",
+ "Zip": "94107",
+ "Country": "US"
+ }, {
+ "precision": "zip",
+ "Latitude": 37.371991,
+ "Longitude": -122.02602,
+ "Address": "",
+ "City": "SUNNYVALE",
+ "State": "CA",
+ "Zip": "94085",
+ "Country": "US"
+ }] \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test8 b/support/cJSON-master/tests/inputs/test8
new file mode 100644
index 0000000..4b1f5b9
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test8
@@ -0,0 +1,13 @@
+{
+ "Image": {
+ "Width": 800,
+ "Height": 600,
+ "Title": "View from 15th Floor",
+ "Thumbnail": {
+ "Url": "http:/*www.example.com/image/481989943",
+ "Height": 125,
+ "Width": "100"
+ },
+ "IDs": [116, 943, 234, 38793]
+ }
+ }
diff --git a/support/cJSON-master/tests/inputs/test8.expected b/support/cJSON-master/tests/inputs/test8.expected
new file mode 100644
index 0000000..2e6b731
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test8.expected
@@ -0,0 +1,13 @@
+{
+ "Image": {
+ "Width": 800,
+ "Height": 600,
+ "Title": "View from 15th Floor",
+ "Thumbnail": {
+ "Url": "http:/*www.example.com/image/481989943",
+ "Height": 125,
+ "Width": "100"
+ },
+ "IDs": [116, 943, 234, 38793]
+ }
+} \ No newline at end of file
diff --git a/support/cJSON-master/tests/inputs/test9 b/support/cJSON-master/tests/inputs/test9
new file mode 100644
index 0000000..2a939b9
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test9
@@ -0,0 +1,5 @@
+[
+ [0, -1, 0],
+ [1, 0, 0],
+ [0, 0, 1]
+ ]
diff --git a/support/cJSON-master/tests/inputs/test9.expected b/support/cJSON-master/tests/inputs/test9.expected
new file mode 100644
index 0000000..0eea3c9
--- /dev/null
+++ b/support/cJSON-master/tests/inputs/test9.expected
@@ -0,0 +1 @@
+[[0, -1, 0], [1, 0, 0], [0, 0, 1]] \ No newline at end of file
diff --git a/support/cJSON-master/tests/json-patch-tests/.editorconfig b/support/cJSON-master/tests/json-patch-tests/.editorconfig
new file mode 100644
index 0000000..dc79da4
--- /dev/null
+++ b/support/cJSON-master/tests/json-patch-tests/.editorconfig
@@ -0,0 +1,10 @@
+# EditorConfig is awesome: http://EditorConfig.org
+
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+trim_trailing_whitespace = true
+indent_style = space
diff --git a/support/cJSON-master/tests/json-patch-tests/.gitignore b/support/cJSON-master/tests/json-patch-tests/.gitignore
new file mode 100644
index 0000000..cd2b23d
--- /dev/null
+++ b/support/cJSON-master/tests/json-patch-tests/.gitignore
@@ -0,0 +1,4 @@
+*~
+\#*
+!.editorconfig
+!.gitignore
diff --git a/support/cJSON-master/tests/json-patch-tests/.npmignore b/support/cJSON-master/tests/json-patch-tests/.npmignore
new file mode 100644
index 0000000..2d6cdcb
--- /dev/null
+++ b/support/cJSON-master/tests/json-patch-tests/.npmignore
@@ -0,0 +1,2 @@
+.editorconfig
+.gitignore
diff --git a/support/cJSON-master/tests/json-patch-tests/README.md b/support/cJSON-master/tests/json-patch-tests/README.md
new file mode 100644
index 0000000..fb9e447
--- /dev/null
+++ b/support/cJSON-master/tests/json-patch-tests/README.md
@@ -0,0 +1,75 @@
+JSON Patch Tests
+================
+
+These are test cases for implementations of [IETF JSON Patch (RFC6902)](http://tools.ietf.org/html/rfc6902).
+
+Some implementations can be found at [jsonpatch.com](http://jsonpatch.com).
+
+
+Test Format
+-----------
+
+Each test file is a JSON document that contains an array of test records. A
+test record is an object with the following members:
+
+- doc: The JSON document to test against
+- patch: The patch(es) to apply
+- expected: The expected resulting document, OR
+- error: A string describing an expected error
+- comment: A string describing the test
+- disabled: True if the test should be skipped
+
+All fields except 'doc' and 'patch' are optional. Test records consisting only
+of a comment are also OK.
+
+
+Files
+-----
+
+- tests.json: the main test file
+- spec_tests.json: tests from the RFC6902 spec
+
+
+Writing Tests
+-------------
+
+All tests should have a descriptive comment. Tests should be as
+simple as possible - just what's required to test a specific piece of
+behavior. If you want to test interacting behaviors, create tests for
+each behavior as well as the interaction.
+
+If an 'error' member is specified, the error text should describe the
+error the implementation should raise - *not* what's being tested.
+Implementation error strings will vary, but the suggested error should
+be easily matched to the implementation error string. Try to avoid
+creating error tests that might pass because an incorrect error was
+reported.
+
+Please feel free to contribute!
+
+
+Credits
+-------
+
+The seed test set was adapted from Byron Ruth's
+[jsonpatch-js](https://github.com/bruth/jsonpatch-js/blob/master/test.js) and
+extended by [Mike McCabe](https://github.com/mikemccabe).
+
+
+License
+-------
+
+ Copyright 2014 The Authors
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
diff --git a/support/cJSON-master/tests/json-patch-tests/cjson-utils-tests.json b/support/cJSON-master/tests/json-patch-tests/cjson-utils-tests.json
new file mode 100644
index 0000000..28a5e30
--- /dev/null
+++ b/support/cJSON-master/tests/json-patch-tests/cjson-utils-tests.json
@@ -0,0 +1,91 @@
+[
+ {
+ "comment": "1",
+ "doc": { "foo": "bar"},
+ "patch": [{ "op": "add", "path": "/baz", "value": "qux" }],
+ "expected": {"baz": "qux", "foo": "bar"}
+ },
+ {
+ "comment": "2",
+ "doc": { "foo": [ "bar", "baz" ] },
+ "patch": [{ "op": "add", "path": "/foo/1", "value": "qux" }],
+ "expected": {"foo": [ "bar", "qux", "baz" ] }
+ },
+ {
+ "comment": "3",
+ "doc": {"baz": "qux","foo": "bar"},
+ "patch": [{ "op": "remove", "path": "/baz" }],
+ "expected": {"foo": "bar" }
+ },
+ {
+ "comment": "4",
+ "doc": { "foo": [ "bar", "qux", "baz" ] },
+ "patch": [{ "op": "remove", "path": "/foo/1" }],
+ "expected": {"foo": [ "bar", "baz" ] }
+ },
+ {
+ "comment": "5",
+ "doc": { "baz": "qux","foo": "bar"},
+ "patch": [{ "op": "replace", "path": "/baz", "value": "boo" }],
+ "expected": {"baz": "boo","foo": "bar"}
+ },
+ {
+ "comment": "6",
+ "doc": {"foo": {"bar": "baz","waldo": "fred"},"qux": {"corge": "grault"}},
+ "patch": [{ "op": "move", "from": "/foo/waldo", "path": "/qux/thud" }],
+ "expected": {"foo": {"bar": "baz"},"qux": {"corge": "grault","thud": "fred"}}
+ },
+ {
+ "comment": "7",
+ "doc": { "foo": [ "all", "grass", "cows", "eat" ] },
+ "patch": [ { "op": "move", "from": "/foo/1", "path": "/foo/3" }],
+ "expected": { "foo": [ "all", "cows", "eat", "grass" ] }
+ },
+ {
+ "comment": "8",
+ "doc": {"baz": "qux","foo": [ "a", 2, "c" ]},
+ "patch": [{ "op": "test", "path": "/baz", "value": "qux" },{ "op": "test", "path": "/foo/1", "value": 2 }]
+ },
+ {
+ "comment": "9",
+ "doc": { "baz": "qux" },
+ "patch": [ { "op": "test", "path": "/baz", "value": "bar" }],
+ "error": "\"bar\" doesn't exist"
+ },
+ {
+ "comment": "10",
+ "doc": { "foo": "bar" },
+ "patch": [{ "op": "add", "path": "/child", "value": { "grandchild": { } } }],
+ "expected": {"foo": "bar","child": {"grandchild": {}}}
+ },
+ {
+ "comment": "11",
+ "doc": { "foo": "bar" },
+ "patch": [{ "op": "add", "path": "/baz", "value": "qux", "xyz": 123 }],
+ "expected": {"foo": "bar","baz": "qux"}
+ },
+ {
+ "comment": "12",
+ "doc": { "foo": "bar" },
+ "patch": [{ "op": "add", "path": "/baz/bat", "value": "qux" }],
+ "error": "Can't add to nonexistent object"
+ },
+ {
+ "comment": "13",
+ "doc": {"/": 9,"~1": 10},
+ "patch": [{"op": "test", "path": "/~01", "value": 10}]
+ },
+ {
+ "comment": "14",
+ "doc": { "foo": ["bar"] },
+ "patch": [ { "op": "add", "path": "/foo/-", "value": ["abc", "def"] }],
+ "expected": {"foo": ["bar", ["abc", "def"]] }
+ },
+
+ {
+ "comment": "15",
+ "doc": {"foo": {"bar": 1}},
+ "patch": [{"op": "add", "path": "/foo/bar/baz", "value": "5"}],
+ "error": "attempting to add to subfield of non-object"
+ }
+]
diff --git a/support/cJSON-master/tests/json-patch-tests/package.json b/support/cJSON-master/tests/json-patch-tests/package.json
new file mode 100644
index 0000000..256f936
--- /dev/null
+++ b/support/cJSON-master/tests/json-patch-tests/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "json-patch-test-suite",
+ "version": "1.1.0",
+ "description": "JSON Patch RFC 6902 test suite",
+ "repository": "github:json-patch/json-patch-tests",
+ "homepage": "https://github.com/json-patch/json-patch-tests",
+ "bugs": "https://github.com/json-patch/json-patch-tests/issues",
+ "keywords": [
+ "JSON",
+ "Patch",
+ "test",
+ "suite"
+ ],
+ "license": "Apache-2.0"
+}
diff --git a/support/cJSON-master/tests/json-patch-tests/spec_tests.json b/support/cJSON-master/tests/json-patch-tests/spec_tests.json
new file mode 100644
index 0000000..c160535
--- /dev/null
+++ b/support/cJSON-master/tests/json-patch-tests/spec_tests.json
@@ -0,0 +1,233 @@
+[
+ {
+ "comment": "4.1. add with missing object",
+ "doc": { "q": { "bar": 2 } },
+ "patch": [ {"op": "add", "path": "/a/b", "value": 1} ],
+ "error":
+ "path /a does not exist -- missing objects are not created recursively"
+ },
+
+ {
+ "comment": "A.1. Adding an Object Member",
+ "doc": {
+ "foo": "bar"
+},
+ "patch": [
+ { "op": "add", "path": "/baz", "value": "qux" }
+],
+ "expected": {
+ "baz": "qux",
+ "foo": "bar"
+}
+ },
+
+ {
+ "comment": "A.2. Adding an Array Element",
+ "doc": {
+ "foo": [ "bar", "baz" ]
+},
+ "patch": [
+ { "op": "add", "path": "/foo/1", "value": "qux" }
+],
+ "expected": {
+ "foo": [ "bar", "qux", "baz" ]
+}
+ },
+
+ {
+ "comment": "A.3. Removing an Object Member",
+ "doc": {
+ "baz": "qux",
+ "foo": "bar"
+},
+ "patch": [
+ { "op": "remove", "path": "/baz" }
+],
+ "expected": {
+ "foo": "bar"
+}
+ },
+
+ {
+ "comment": "A.4. Removing an Array Element",
+ "doc": {
+ "foo": [ "bar", "qux", "baz" ]
+},
+ "patch": [
+ { "op": "remove", "path": "/foo/1" }
+],
+ "expected": {
+ "foo": [ "bar", "baz" ]
+}
+ },
+
+ {
+ "comment": "A.5. Replacing a Value",
+ "doc": {
+ "baz": "qux",
+ "foo": "bar"
+},
+ "patch": [
+ { "op": "replace", "path": "/baz", "value": "boo" }
+],
+ "expected": {
+ "baz": "boo",
+ "foo": "bar"
+}
+ },
+
+ {
+ "comment": "A.6. Moving a Value",
+ "doc": {
+ "foo": {
+ "bar": "baz",
+ "waldo": "fred"
+ },
+ "qux": {
+ "corge": "grault"
+ }
+},
+ "patch": [
+ { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" }
+],
+ "expected": {
+ "foo": {
+ "bar": "baz"
+ },
+ "qux": {
+ "corge": "grault",
+ "thud": "fred"
+ }
+}
+ },
+
+ {
+ "comment": "A.7. Moving an Array Element",
+ "doc": {
+ "foo": [ "all", "grass", "cows", "eat" ]
+},
+ "patch": [
+ { "op": "move", "from": "/foo/1", "path": "/foo/3" }
+],
+ "expected": {
+ "foo": [ "all", "cows", "eat", "grass" ]
+}
+
+ },
+
+ {
+ "comment": "A.8. Testing a Value: Success",
+ "doc": {
+ "baz": "qux",
+ "foo": [ "a", 2, "c" ]
+},
+ "patch": [
+ { "op": "test", "path": "/baz", "value": "qux" },
+ { "op": "test", "path": "/foo/1", "value": 2 }
+],
+ "expected": {
+ "baz": "qux",
+ "foo": [ "a", 2, "c" ]
+ }
+ },
+
+ {
+ "comment": "A.9. Testing a Value: Error",
+ "doc": {
+ "baz": "qux"
+},
+ "patch": [
+ { "op": "test", "path": "/baz", "value": "bar" }
+],
+ "error": "string not equivalent"
+ },
+
+ {
+ "comment": "A.10. Adding a nested Member Object",
+ "doc": {
+ "foo": "bar"
+},
+ "patch": [
+ { "op": "add", "path": "/child", "value": { "grandchild": { } } }
+],
+ "expected": {
+ "foo": "bar",
+ "child": {
+ "grandchild": {
+ }
+ }
+}
+ },
+
+ {
+ "comment": "A.11. Ignoring Unrecognized Elements",
+ "doc": {
+ "foo":"bar"
+},
+ "patch": [
+ { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 }
+],
+ "expected": {
+ "foo":"bar",
+ "baz":"qux"
+}
+ },
+
+ {
+ "comment": "A.12. Adding to a Non-existent Target",
+ "doc": {
+ "foo": "bar"
+},
+ "patch": [
+ { "op": "add", "path": "/baz/bat", "value": "qux" }
+],
+ "error": "add to a non-existent target"
+ },
+
+ {
+ "comment": "A.13 Invalid JSON Patch Document",
+ "doc": {
+ "foo": "bar"
+ },
+ "patch": [
+ { "op": "add", "path": "/baz", "value": "qux", "op": "remove" }
+],
+ "error": "operation has two 'op' members",
+ "disabled": true
+ },
+
+ {
+ "comment": "A.14. ~ Escape Ordering",
+ "doc": {
+ "/": 9,
+ "~1": 10
+ },
+ "patch": [{"op": "test", "path": "/~01", "value": 10}],
+ "expected": {
+ "/": 9,
+ "~1": 10
+ }
+ },
+
+ {
+ "comment": "A.15. Comparing Strings and Numbers",
+ "doc": {
+ "/": 9,
+ "~1": 10
+ },
+ "patch": [{"op": "test", "path": "/~01", "value": "10"}],
+ "error": "number is not equal to string"
+ },
+
+ {
+ "comment": "A.16. Adding an Array Value",
+ "doc": {
+ "foo": ["bar"]
+ },
+ "patch": [{ "op": "add", "path": "/foo/-", "value": ["abc", "def"] }],
+ "expected": {
+ "foo": ["bar", ["abc", "def"]]
+ }
+ }
+
+]
diff --git a/support/cJSON-master/tests/json-patch-tests/tests.json b/support/cJSON-master/tests/json-patch-tests/tests.json
new file mode 100644
index 0000000..2554078
--- /dev/null
+++ b/support/cJSON-master/tests/json-patch-tests/tests.json
@@ -0,0 +1,464 @@
+[
+ { "comment": "empty list, empty docs",
+ "doc": {},
+ "patch": [],
+ "expected": {} },
+
+ { "comment": "empty patch list",
+ "doc": {"foo": 1},
+ "patch": [],
+ "expected": {"foo": 1} },
+
+ { "comment": "rearrangements OK?",
+ "doc": {"foo": 1, "bar": 2},
+ "patch": [],
+ "expected": {"bar":2, "foo": 1} },
+
+ { "comment": "rearrangements OK? How about one level down ... array",
+ "doc": [{"foo": 1, "bar": 2}],
+ "patch": [],
+ "expected": [{"bar":2, "foo": 1}] },
+
+ { "comment": "rearrangements OK? How about one level down...",
+ "doc": {"foo":{"foo": 1, "bar": 2}},
+ "patch": [],
+ "expected": {"foo":{"bar":2, "foo": 1}} },
+
+ { "comment": "add replaces any existing field",
+ "doc": {"foo": null},
+ "patch": [{"op": "add", "path": "/foo", "value":1}],
+ "expected": {"foo": 1} },
+
+ { "comment": "toplevel array",
+ "doc": [],
+ "patch": [{"op": "add", "path": "/0", "value": "foo"}],
+ "expected": ["foo"] },
+
+ { "comment": "toplevel array, no change",
+ "doc": ["foo"],
+ "patch": [],
+ "expected": ["foo"] },
+
+ { "comment": "toplevel object, numeric string",
+ "doc": {},
+ "patch": [{"op": "add", "path": "/foo", "value": "1"}],
+ "expected": {"foo":"1"} },
+
+ { "comment": "toplevel object, integer",
+ "doc": {},
+ "patch": [{"op": "add", "path": "/foo", "value": 1}],
+ "expected": {"foo":1} },
+
+ { "comment": "Toplevel scalar values OK?",
+ "doc": "foo",
+ "patch": [{"op": "replace", "path": "", "value": "bar"}],
+ "expected": "bar",
+ "disabled": true },
+
+ { "comment": "replace object document with array document?",
+ "doc": {},
+ "patch": [{"op": "add", "path": "", "value": []}],
+ "expected": [] },
+
+ { "comment": "replace array document with object document?",
+ "doc": [],
+ "patch": [{"op": "add", "path": "", "value": {}}],
+ "expected": {} },
+
+ { "comment": "append to root array document?",
+ "doc": [],
+ "patch": [{"op": "add", "path": "/-", "value": "hi"}],
+ "expected": ["hi"] },
+
+ { "comment": "Add, / target",
+ "doc": {},
+ "patch": [ {"op": "add", "path": "/", "value":1 } ],
+ "expected": {"":1} },
+
+ { "comment": "Add, /foo/ deep target (trailing slash)",
+ "doc": {"foo": {}},
+ "patch": [ {"op": "add", "path": "/foo/", "value":1 } ],
+ "expected": {"foo":{"": 1}} },
+
+ { "comment": "Add composite value at top level",
+ "doc": {"foo": 1},
+ "patch": [{"op": "add", "path": "/bar", "value": [1, 2]}],
+ "expected": {"foo": 1, "bar": [1, 2]} },
+
+ { "comment": "Add into composite value",
+ "doc": {"foo": 1, "baz": [{"qux": "hello"}]},
+ "patch": [{"op": "add", "path": "/baz/0/foo", "value": "world"}],
+ "expected": {"foo": 1, "baz": [{"qux": "hello", "foo": "world"}]} },
+
+ { "doc": {"bar": [1, 2]},
+ "patch": [{"op": "add", "path": "/bar/8", "value": "5"}],
+ "error": "Out of bounds (upper)" },
+
+ { "doc": {"bar": [1, 2]},
+ "patch": [{"op": "add", "path": "/bar/-1", "value": "5"}],
+ "error": "Out of bounds (lower)" },
+
+ { "doc": {"foo": 1},
+ "patch": [{"op": "add", "path": "/bar", "value": true}],
+ "expected": {"foo": 1, "bar": true} },
+
+ { "doc": {"foo": 1},
+ "patch": [{"op": "add", "path": "/bar", "value": false}],
+ "expected": {"foo": 1, "bar": false} },
+
+ { "doc": {"foo": 1},
+ "patch": [{"op": "add", "path": "/bar", "value": null}],
+ "expected": {"foo": 1, "bar": null} },
+
+ { "comment": "0 can be an array index or object element name",
+ "doc": {"foo": 1},
+ "patch": [{"op": "add", "path": "/0", "value": "bar"}],
+ "expected": {"foo": 1, "0": "bar" } },
+
+ { "doc": ["foo"],
+ "patch": [{"op": "add", "path": "/1", "value": "bar"}],
+ "expected": ["foo", "bar"] },
+
+ { "doc": ["foo", "sil"],
+ "patch": [{"op": "add", "path": "/1", "value": "bar"}],
+ "expected": ["foo", "bar", "sil"] },
+
+ { "doc": ["foo", "sil"],
+ "patch": [{"op": "add", "path": "/0", "value": "bar"}],
+ "expected": ["bar", "foo", "sil"] },
+
+ { "comment": "push item to array via last index + 1",
+ "doc": ["foo", "sil"],
+ "patch": [{"op":"add", "path": "/2", "value": "bar"}],
+ "expected": ["foo", "sil", "bar"] },
+
+ { "comment": "add item to array at index > length should fail",
+ "doc": ["foo", "sil"],
+ "patch": [{"op":"add", "path": "/3", "value": "bar"}],
+ "error": "index is greater than number of items in array" },
+
+ { "comment": "test against implementation-specific numeric parsing",
+ "doc": {"1e0": "foo"},
+ "patch": [{"op": "test", "path": "/1e0", "value": "foo"}],
+ "expected": {"1e0": "foo"} },
+
+ { "comment": "test with bad number should fail",
+ "doc": ["foo", "bar"],
+ "patch": [{"op": "test", "path": "/1e0", "value": "bar"}],
+ "error": "test op shouldn't get array element 1" },
+
+ { "doc": ["foo", "sil"],
+ "patch": [{"op": "add", "path": "/bar", "value": 42}],
+ "error": "Object operation on array target" },
+
+ { "doc": ["foo", "sil"],
+ "patch": [{"op": "add", "path": "/1", "value": ["bar", "baz"]}],
+ "expected": ["foo", ["bar", "baz"], "sil"],
+ "comment": "value in array add not flattened" },
+
+ { "doc": {"foo": 1, "bar": [1, 2, 3, 4]},
+ "patch": [{"op": "remove", "path": "/bar"}],
+ "expected": {"foo": 1} },
+
+ { "doc": {"foo": 1, "baz": [{"qux": "hello"}]},
+ "patch": [{"op": "remove", "path": "/baz/0/qux"}],
+ "expected": {"foo": 1, "baz": [{}]} },
+
+ { "doc": {"foo": 1, "baz": [{"qux": "hello"}]},
+ "patch": [{"op": "replace", "path": "/foo", "value": [1, 2, 3, 4]}],
+ "expected": {"foo": [1, 2, 3, 4], "baz": [{"qux": "hello"}]} },
+
+ { "doc": {"foo": [1, 2, 3, 4], "baz": [{"qux": "hello"}]},
+ "patch": [{"op": "replace", "path": "/baz/0/qux", "value": "world"}],
+ "expected": {"foo": [1, 2, 3, 4], "baz": [{"qux": "world"}]} },
+
+ { "doc": ["foo"],
+ "patch": [{"op": "replace", "path": "/0", "value": "bar"}],
+ "expected": ["bar"] },
+
+ { "doc": [""],
+ "patch": [{"op": "replace", "path": "/0", "value": 0}],
+ "expected": [0] },
+
+ { "doc": [""],
+ "patch": [{"op": "replace", "path": "/0", "value": true}],
+ "expected": [true] },
+
+ { "doc": [""],
+ "patch": [{"op": "replace", "path": "/0", "value": false}],
+ "expected": [false] },
+
+ { "doc": [""],
+ "patch": [{"op": "replace", "path": "/0", "value": null}],
+ "expected": [null] },
+
+ { "doc": ["foo", "sil"],
+ "patch": [{"op": "replace", "path": "/1", "value": ["bar", "baz"]}],
+ "expected": ["foo", ["bar", "baz"]],
+ "comment": "value in array replace not flattened" },
+
+ { "comment": "replace whole document",
+ "doc": {"foo": "bar"},
+ "patch": [{"op": "replace", "path": "", "value": {"baz": "qux"}}],
+ "expected": {"baz": "qux"} },
+
+ { "comment": "test replace with missing parent key should fail",
+ "doc": {"bar": "baz"},
+ "patch": [{"op": "replace", "path": "/foo/bar", "value": false}],
+ "error": "replace op should fail with missing parent key" },
+
+ { "comment": "spurious patch properties",
+ "doc": {"foo": 1},
+ "patch": [{"op": "test", "path": "/foo", "value": 1, "spurious": 1}],
+ "expected": {"foo": 1} },
+
+ { "doc": {"foo": null},
+ "patch": [{"op": "test", "path": "/foo", "value": null}],
+ "expected": {"foo": null},
+ "comment": "null value should be valid obj property" },
+
+ { "doc": {"foo": null},
+ "patch": [{"op": "replace", "path": "/foo", "value": "truthy"}],
+ "expected": {"foo": "truthy"},
+ "comment": "null value should be valid obj property to be replaced with something truthy" },
+
+ { "doc": {"foo": null},
+ "patch": [{"op": "move", "from": "/foo", "path": "/bar"}],
+ "expected": {"bar": null},
+ "comment": "null value should be valid obj property to be moved" },
+
+ { "doc": {"foo": null},
+ "patch": [{"op": "copy", "from": "/foo", "path": "/bar"}],
+ "expected": {"foo": null, "bar": null},
+ "comment": "null value should be valid obj property to be copied" },
+
+ { "doc": {"foo": null},
+ "patch": [{"op": "remove", "path": "/foo"}],
+ "expected": {},
+ "comment": "null value should be valid obj property to be removed" },
+
+ { "doc": {"foo": "bar"},
+ "patch": [{"op": "replace", "path": "/foo", "value": null}],
+ "expected": {"foo": null},
+ "comment": "null value should still be valid obj property replace other value" },
+
+ { "doc": {"foo": {"foo": 1, "bar": 2}},
+ "patch": [{"op": "test", "path": "/foo", "value": {"bar": 2, "foo": 1}}],
+ "expected": {"foo": {"foo": 1, "bar": 2}},
+ "comment": "test should pass despite rearrangement" },
+
+ { "doc": {"foo": [{"foo": 1, "bar": 2}]},
+ "patch": [{"op": "test", "path": "/foo", "value": [{"bar": 2, "foo": 1}]}],
+ "expected": {"foo": [{"foo": 1, "bar": 2}]},
+ "comment": "test should pass despite (nested) rearrangement" },
+
+ { "doc": {"foo": {"bar": [1, 2, 5, 4]}},
+ "patch": [{"op": "test", "path": "/foo", "value": {"bar": [1, 2, 5, 4]}}],
+ "expected": {"foo": {"bar": [1, 2, 5, 4]}},
+ "comment": "test should pass - no error" },
+
+ { "doc": {"foo": {"bar": [1, 2, 5, 4]}},
+ "patch": [{"op": "test", "path": "/foo", "value": [1, 2]}],
+ "error": "test op should fail" },
+
+ { "comment": "Whole document",
+ "doc": { "foo": 1 },
+ "patch": [{"op": "test", "path": "", "value": {"foo": 1}}],
+ "disabled": true },
+
+ { "comment": "Empty-string element",
+ "doc": { "": 1 },
+ "patch": [{"op": "test", "path": "/", "value": 1}],
+ "expected": { "": 1 } },
+
+ { "doc": {
+ "foo": ["bar", "baz"],
+ "": 0,
+ "a/b": 1,
+ "c%d": 2,
+ "e^f": 3,
+ "g|h": 4,
+ "i\\j": 5,
+ "k\"l": 6,
+ " ": 7,
+ "m~n": 8
+ },
+ "patch": [{"op": "test", "path": "/foo", "value": ["bar", "baz"]},
+ {"op": "test", "path": "/foo/0", "value": "bar"},
+ {"op": "test", "path": "/", "value": 0},
+ {"op": "test", "path": "/a~1b", "value": 1},
+ {"op": "test", "path": "/c%d", "value": 2},
+ {"op": "test", "path": "/e^f", "value": 3},
+ {"op": "test", "path": "/g|h", "value": 4},
+ {"op": "test", "path": "/i\\j", "value": 5},
+ {"op": "test", "path": "/k\"l", "value": 6},
+ {"op": "test", "path": "/ ", "value": 7},
+ {"op": "test", "path": "/m~0n", "value": 8}],
+ "expected": {
+ "": 0,
+ " ": 7,
+ "a/b": 1,
+ "c%d": 2,
+ "e^f": 3,
+ "foo": [
+ "bar",
+ "baz"
+ ],
+ "g|h": 4,
+ "i\\j": 5,
+ "k\"l": 6,
+ "m~n": 8
+ }
+ },
+ { "comment": "Move to same location has no effect",
+ "doc": {"foo": 1},
+ "patch": [{"op": "move", "from": "/foo", "path": "/foo"}],
+ "expected": {"foo": 1} },
+
+ { "doc": {"foo": 1, "baz": [{"qux": "hello"}]},
+ "patch": [{"op": "move", "from": "/foo", "path": "/bar"}],
+ "expected": {"baz": [{"qux": "hello"}], "bar": 1} },
+
+ { "doc": {"baz": [{"qux": "hello"}], "bar": 1},
+ "patch": [{"op": "move", "from": "/baz/0/qux", "path": "/baz/1"}],
+ "expected": {"baz": [{}, "hello"], "bar": 1} },
+
+ { "doc": {"baz": [{"qux": "hello"}], "bar": 1},
+ "patch": [{"op": "copy", "from": "/baz/0", "path": "/boo"}],
+ "expected": {"baz":[{"qux":"hello"}],"bar":1,"boo":{"qux":"hello"}} },
+
+ { "comment": "replacing the root of the document is possible with add",
+ "doc": {"foo": "bar"},
+ "patch": [{"op": "add", "path": "", "value": {"baz": "qux"}}],
+ "expected": {"baz":"qux"}},
+
+ { "comment": "Adding to \"/-\" adds to the end of the array",
+ "doc": [ 1, 2 ],
+ "patch": [ { "op": "add", "path": "/-", "value": { "foo": [ "bar", "baz" ] } } ],
+ "expected": [ 1, 2, { "foo": [ "bar", "baz" ] } ]},
+
+ { "comment": "Adding to \"/-\" adds to the end of the array, even n levels down",
+ "doc": [ 1, 2, [ 3, [ 4, 5 ] ] ],
+ "patch": [ { "op": "add", "path": "/2/1/-", "value": { "foo": [ "bar", "baz" ] } } ],
+ "expected": [ 1, 2, [ 3, [ 4, 5, { "foo": [ "bar", "baz" ] } ] ] ]},
+
+ { "comment": "test remove with bad number should fail",
+ "doc": {"foo": 1, "baz": [{"qux": "hello"}]},
+ "patch": [{"op": "remove", "path": "/baz/1e0/qux"}],
+ "error": "remove op shouldn't remove from array with bad number" },
+
+ { "comment": "test remove on array",
+ "doc": [1, 2, 3, 4],
+ "patch": [{"op": "remove", "path": "/0"}],
+ "expected": [2, 3, 4] },
+
+ { "comment": "test repeated removes",
+ "doc": [1, 2, 3, 4],
+ "patch": [{ "op": "remove", "path": "/1" },
+ { "op": "remove", "path": "/2" }],
+ "expected": [1, 3] },
+
+ { "comment": "test remove with bad index should fail",
+ "doc": [1, 2, 3, 4],
+ "patch": [{"op": "remove", "path": "/1e0"}],
+ "error": "remove op shouldn't remove from array with bad number" },
+
+ { "comment": "test replace with bad number should fail",
+ "doc": [""],
+ "patch": [{"op": "replace", "path": "/1e0", "value": false}],
+ "error": "replace op shouldn't replace in array with bad number" },
+
+ { "comment": "test copy with bad number should fail",
+ "doc": {"baz": [1,2,3], "bar": 1},
+ "patch": [{"op": "copy", "from": "/baz/1e0", "path": "/boo"}],
+ "error": "copy op shouldn't work with bad number" },
+
+ { "comment": "test move with bad number should fail",
+ "doc": {"foo": 1, "baz": [1,2,3,4]},
+ "patch": [{"op": "move", "from": "/baz/1e0", "path": "/foo"}],
+ "error": "move op shouldn't work with bad number" },
+
+ { "comment": "test add with bad number should fail",
+ "doc": ["foo", "sil"],
+ "patch": [{"op": "add", "path": "/1e0", "value": "bar"}],
+ "error": "add op shouldn't add to array with bad number" },
+
+ { "comment": "missing 'value' parameter to add",
+ "doc": [ 1 ],
+ "patch": [ { "op": "add", "path": "/-" } ],
+ "error": "missing 'value' parameter" },
+
+ { "comment": "missing 'value' parameter to replace",
+ "doc": [ 1 ],
+ "patch": [ { "op": "replace", "path": "/0" } ],
+ "error": "missing 'value' parameter" },
+
+ { "comment": "missing 'value' parameter to test",
+ "doc": [ null ],
+ "patch": [ { "op": "test", "path": "/0" } ],
+ "error": "missing 'value' parameter" },
+
+ { "comment": "missing value parameter to test - where undef is falsy",
+ "doc": [ false ],
+ "patch": [ { "op": "test", "path": "/0" } ],
+ "error": "missing 'value' parameter" },
+
+ { "comment": "missing from parameter to copy",
+ "doc": [ 1 ],
+ "patch": [ { "op": "copy", "path": "/-" } ],
+ "error": "missing 'from' parameter" },
+
+ { "comment": "missing from location to copy",
+ "doc": { "foo": 1 },
+ "patch": [ { "op": "copy", "from": "/bar", "path": "/foo" } ],
+ "error": "missing 'from' location" },
+
+ { "comment": "missing from parameter to move",
+ "doc": { "foo": 1 },
+ "patch": [ { "op": "move", "path": "" } ],
+ "error": "missing 'from' parameter" },
+
+ { "comment": "missing from location to move",
+ "doc": { "foo": 1 },
+ "patch": [ { "op": "move", "from": "/bar", "path": "/foo" } ],
+ "error": "missing 'from' location" },
+
+ { "comment": "duplicate ops",
+ "doc": { "foo": "bar" },
+ "patch": [ { "op": "add", "path": "/baz", "value": "qux",
+ "op": "move", "from":"/foo" } ],
+ "error": "patch has two 'op' members",
+ "disabled": true },
+
+ { "comment": "unrecognized op should fail",
+ "doc": {"foo": 1},
+ "patch": [{"op": "spam", "path": "/foo", "value": 1}],
+ "error": "Unrecognized op 'spam'" },
+
+ { "comment": "test with bad array number that has leading zeros",
+ "doc": ["foo", "bar"],
+ "patch": [{"op": "test", "path": "/00", "value": "foo"}],
+ "error": "test op should reject the array value, it has leading zeros" },
+
+ { "comment": "test with bad array number that has leading zeros",
+ "doc": ["foo", "bar"],
+ "patch": [{"op": "test", "path": "/01", "value": "bar"}],
+ "error": "test op should reject the array value, it has leading zeros" },
+
+ { "comment": "Removing nonexistent field",
+ "doc": {"foo" : "bar"},
+ "patch": [{"op": "remove", "path": "/baz"}],
+ "error": "removing a nonexistent field should fail" },
+
+ { "comment": "Removing nonexistent index",
+ "doc": ["foo", "bar"],
+ "patch": [{"op": "remove", "path": "/2"}],
+ "error": "removing a nonexistent index should fail" },
+
+ { "comment": "Patch with different capitalisation than doc",
+ "doc": {"foo":"bar"},
+ "patch": [{"op": "add", "path": "/FOO", "value": "BAR"}],
+ "expected": {"foo": "bar", "FOO": "BAR"}
+ }
+
+]
diff --git a/support/cJSON-master/tests/json_patch_tests.c b/support/cJSON-master/tests/json_patch_tests.c
new file mode 100644
index 0000000..c2c88a4
--- /dev/null
+++ b/support/cJSON-master/tests/json_patch_tests.c
@@ -0,0 +1,243 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+#include "../cJSON_Utils.h"
+
+static cJSON *parse_test_file(const char * const filename)
+{
+ char *file = NULL;
+ cJSON *json = NULL;
+
+ file = read_file(filename);
+ TEST_ASSERT_NOT_NULL_MESSAGE(file, "Failed to read file.");
+
+ json = cJSON_Parse(file);
+ TEST_ASSERT_NOT_NULL_MESSAGE(json, "Failed to parse test json.");
+ TEST_ASSERT_TRUE_MESSAGE(cJSON_IsArray(json), "Json is not an array.");
+
+ free(file);
+
+ return json;
+}
+
+static cJSON_bool test_apply_patch(const cJSON * const test)
+{
+ cJSON *doc = NULL;
+ cJSON *patch = NULL;
+ cJSON *expected = NULL;
+ cJSON *error_element = NULL;
+ cJSON *comment = NULL;
+ cJSON *disabled = NULL;
+
+ cJSON *object = NULL;
+ cJSON_bool successful = false;
+
+ /* extract all the data out of the test */
+ comment = cJSON_GetObjectItemCaseSensitive(test, "comment");
+ if (cJSON_IsString(comment))
+ {
+ printf("Testing \"%s\"\n", comment->valuestring);
+ }
+ else
+ {
+ printf("Testing unkown\n");
+ }
+
+ disabled = cJSON_GetObjectItemCaseSensitive(test, "disabled");
+ if (cJSON_IsTrue(disabled))
+ {
+ printf("SKIPPED\n");
+ return true;
+ }
+
+ doc = cJSON_GetObjectItemCaseSensitive(test, "doc");
+ TEST_ASSERT_NOT_NULL_MESSAGE(doc, "No \"doc\" in the test.");
+ patch = cJSON_GetObjectItemCaseSensitive(test, "patch");
+ TEST_ASSERT_NOT_NULL_MESSAGE(patch, "No \"patch\"in the test.");
+ /* Make a working copy of 'doc' */
+ object = cJSON_Duplicate(doc, true);
+ TEST_ASSERT_NOT_NULL(object);
+
+ expected = cJSON_GetObjectItemCaseSensitive(test, "expected");
+ error_element = cJSON_GetObjectItemCaseSensitive(test, "error");
+ if (error_element != NULL)
+ {
+ /* excepting an error */
+ TEST_ASSERT_TRUE_MESSAGE(0 != cJSONUtils_ApplyPatchesCaseSensitive(object, patch), "Test didn't fail as it's supposed to.");
+
+ successful = true;
+ }
+ else
+ {
+ /* apply the patch */
+ TEST_ASSERT_EQUAL_INT_MESSAGE(0, cJSONUtils_ApplyPatchesCaseSensitive(object, patch), "Failed to apply patches.");
+ successful = true;
+
+ if (expected != NULL)
+ {
+ successful = cJSON_Compare(object, expected, true);
+ }
+ }
+
+ cJSON_Delete(object);
+
+ if (successful)
+ {
+ printf("OK\n");
+ }
+ else
+ {
+ printf("FAILED\n");
+ }
+
+ return successful;
+}
+
+static cJSON_bool test_generate_test(cJSON *test)
+{
+ cJSON *doc = NULL;
+ cJSON *patch = NULL;
+ cJSON *expected = NULL;
+ cJSON *disabled = NULL;
+
+ cJSON *object = NULL;
+ cJSON_bool successful = false;
+
+ char *printed_patch = NULL;
+
+ disabled = cJSON_GetObjectItemCaseSensitive(test, "disabled");
+ if (cJSON_IsTrue(disabled))
+ {
+ printf("SKIPPED\n");
+ return true;
+ }
+
+ doc = cJSON_GetObjectItemCaseSensitive(test, "doc");
+ TEST_ASSERT_NOT_NULL_MESSAGE(doc, "No \"doc\" in the test.");
+
+ /* Make a working copy of 'doc' */
+ object = cJSON_Duplicate(doc, true);
+ TEST_ASSERT_NOT_NULL(object);
+
+ expected = cJSON_GetObjectItemCaseSensitive(test, "expected");
+ if (expected == NULL)
+ {
+ cJSON_Delete(object);
+ /* if there is no expected output, this test doesn't make sense */
+ return true;
+ }
+
+ patch = cJSONUtils_GeneratePatchesCaseSensitive(doc, expected);
+ TEST_ASSERT_NOT_NULL_MESSAGE(patch, "Failed to generate patches.");
+
+ printed_patch = cJSON_Print(patch);
+ printf("%s\n", printed_patch);
+ free(printed_patch);
+
+ /* apply the generated patch */
+ TEST_ASSERT_EQUAL_INT_MESSAGE(0, cJSONUtils_ApplyPatchesCaseSensitive(object, patch), "Failed to apply generated patch.");
+
+ successful = cJSON_Compare(object, expected, true);
+
+ cJSON_Delete(patch);
+ cJSON_Delete(object);
+
+ if (successful)
+ {
+ printf("generated patch: OK\n");
+ }
+ else
+ {
+ printf("generated patch: FAILED\n");
+ }
+
+ return successful;
+}
+
+static void cjson_utils_should_pass_json_patch_test_tests(void)
+{
+ cJSON *tests = parse_test_file("json-patch-tests/tests.json");
+ cJSON *test = NULL;
+
+ cJSON_bool failed = false;
+ cJSON_ArrayForEach(test, tests)
+ {
+ failed |= !test_apply_patch(test);
+ failed |= !test_generate_test(test);
+ }
+
+ cJSON_Delete(tests);
+
+ TEST_ASSERT_FALSE_MESSAGE(failed, "Some tests failed.");
+}
+
+static void cjson_utils_should_pass_json_patch_test_spec_tests(void)
+{
+ cJSON *tests = parse_test_file("json-patch-tests/spec_tests.json");
+ cJSON *test = NULL;
+
+ cJSON_bool failed = false;
+ cJSON_ArrayForEach(test, tests)
+ {
+ failed |= !test_apply_patch(test);
+ failed |= !test_generate_test(test);
+ }
+
+ cJSON_Delete(tests);
+
+ TEST_ASSERT_FALSE_MESSAGE(failed, "Some tests failed.");
+}
+
+static void cjson_utils_should_pass_json_patch_test_cjson_utils_tests(void)
+{
+ cJSON *tests = parse_test_file("json-patch-tests/cjson-utils-tests.json");
+ cJSON *test = NULL;
+
+ cJSON_bool failed = false;
+ cJSON_ArrayForEach(test, tests)
+ {
+ failed |= !test_apply_patch(test);
+ failed |= !test_generate_test(test);
+ }
+
+ cJSON_Delete(tests);
+
+ TEST_ASSERT_FALSE_MESSAGE(failed, "Some tests failed.");
+}
+
+int main(void)
+{
+ UNITY_BEGIN();
+
+ RUN_TEST(cjson_utils_should_pass_json_patch_test_tests);
+ RUN_TEST(cjson_utils_should_pass_json_patch_test_spec_tests);
+ RUN_TEST(cjson_utils_should_pass_json_patch_test_cjson_utils_tests);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/misc_tests.c b/support/cJSON-master/tests/misc_tests.c
new file mode 100644
index 0000000..1635fa3
--- /dev/null
+++ b/support/cJSON-master/tests/misc_tests.c
@@ -0,0 +1,579 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+
+static void cjson_array_foreach_should_loop_over_arrays(void)
+{
+ cJSON array[1];
+ cJSON elements[10];
+ cJSON *element_pointer = NULL;
+ size_t i = 0;
+
+ memset(array, 0, sizeof(array));
+ memset(elements, 0, sizeof(elements));
+
+ /* create array */
+ array[0].child = &elements[0];
+ elements[0].prev = NULL;
+ elements[9].next = NULL;
+ for (i = 0; i < 9; i++)
+ {
+ elements[i].next = &elements[i + 1];
+ elements[i + 1].prev = &elements[i];
+ }
+
+ i = 0;
+ cJSON_ArrayForEach(element_pointer, array)
+ {
+ TEST_ASSERT_TRUE_MESSAGE(element_pointer == &elements[i], "Not iterating over array properly");
+ i++;
+ }
+}
+
+static void cjson_array_foreach_should_not_dereference_null_pointer(void)
+{
+ cJSON *array = NULL;
+ cJSON *element = NULL;
+ cJSON_ArrayForEach(element, array);
+}
+
+static void cjson_get_object_item_should_get_object_items(void)
+{
+ cJSON *item = NULL;
+ cJSON *found = NULL;
+
+ item = cJSON_Parse("{\"one\":1, \"Two\":2, \"tHree\":3}");
+
+ found = cJSON_GetObjectItem(NULL, "test");
+ TEST_ASSERT_NULL_MESSAGE(found, "Failed to fail on NULL pointer.");
+
+ found = cJSON_GetObjectItem(item, NULL);
+ TEST_ASSERT_NULL_MESSAGE(found, "Failed to fail on NULL string.");
+
+
+ found = cJSON_GetObjectItem(item, "one");
+ TEST_ASSERT_NOT_NULL_MESSAGE(found, "Failed to find first item.");
+ TEST_ASSERT_EQUAL_DOUBLE(found->valuedouble, 1);
+
+ found = cJSON_GetObjectItem(item, "tWo");
+ TEST_ASSERT_NOT_NULL_MESSAGE(found, "Failed to find first item.");
+ TEST_ASSERT_EQUAL_DOUBLE(found->valuedouble, 2);
+
+ found = cJSON_GetObjectItem(item, "three");
+ TEST_ASSERT_NOT_NULL_MESSAGE(found, "Failed to find item.");
+ TEST_ASSERT_EQUAL_DOUBLE(found->valuedouble, 3);
+
+ found = cJSON_GetObjectItem(item, "four");
+ TEST_ASSERT_NULL_MESSAGE(found, "Should not find something that isn't there.");
+
+ cJSON_Delete(item);
+}
+
+static void cjson_get_object_item_case_sensitive_should_get_object_items(void)
+{
+ cJSON *item = NULL;
+ cJSON *found = NULL;
+
+ item = cJSON_Parse("{\"one\":1, \"Two\":2, \"tHree\":3}");
+
+ found = cJSON_GetObjectItemCaseSensitive(NULL, "test");
+ TEST_ASSERT_NULL_MESSAGE(found, "Failed to fail on NULL pointer.");
+
+ found = cJSON_GetObjectItemCaseSensitive(item, NULL);
+ TEST_ASSERT_NULL_MESSAGE(found, "Failed to fail on NULL string.");
+
+ found = cJSON_GetObjectItemCaseSensitive(item, "one");
+ TEST_ASSERT_NOT_NULL_MESSAGE(found, "Failed to find first item.");
+ TEST_ASSERT_EQUAL_DOUBLE(found->valuedouble, 1);
+
+ found = cJSON_GetObjectItemCaseSensitive(item, "Two");
+ TEST_ASSERT_NOT_NULL_MESSAGE(found, "Failed to find first item.");
+ TEST_ASSERT_EQUAL_DOUBLE(found->valuedouble, 2);
+
+ found = cJSON_GetObjectItemCaseSensitive(item, "tHree");
+ TEST_ASSERT_NOT_NULL_MESSAGE(found, "Failed to find item.");
+ TEST_ASSERT_EQUAL_DOUBLE(found->valuedouble, 3);
+
+ found = cJSON_GetObjectItemCaseSensitive(item, "One");
+ TEST_ASSERT_NULL_MESSAGE(found, "Should not find something that isn't there.");
+
+ cJSON_Delete(item);
+}
+
+static void cjson_get_object_item_should_not_crash_with_array(void) {
+ cJSON *array = NULL;
+ cJSON *found = NULL;
+ array = cJSON_Parse("[1]");
+
+ found = cJSON_GetObjectItem(array, "name");
+ TEST_ASSERT_NULL(found);
+
+ cJSON_Delete(array);
+}
+
+static void cjson_get_object_item_case_sensitive_should_not_crash_with_array(void) {
+ cJSON *array = NULL;
+ cJSON *found = NULL;
+ array = cJSON_Parse("[1]");
+
+ found = cJSON_GetObjectItemCaseSensitive(array, "name");
+ TEST_ASSERT_NULL(found);
+
+ cJSON_Delete(array);
+}
+
+static void typecheck_functions_should_check_type(void)
+{
+ cJSON invalid[1];
+ cJSON item[1];
+ invalid->type = cJSON_Invalid;
+ invalid->type |= cJSON_StringIsConst;
+ item->type = cJSON_False;
+ item->type |= cJSON_StringIsConst;
+
+ TEST_ASSERT_FALSE(cJSON_IsInvalid(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsInvalid(item));
+ TEST_ASSERT_TRUE(cJSON_IsInvalid(invalid));
+
+ item->type = cJSON_False | cJSON_StringIsConst;
+ TEST_ASSERT_FALSE(cJSON_IsFalse(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsFalse(invalid));
+ TEST_ASSERT_TRUE(cJSON_IsFalse(item));
+ TEST_ASSERT_TRUE(cJSON_IsBool(item));
+
+ item->type = cJSON_True | cJSON_StringIsConst;
+ TEST_ASSERT_FALSE(cJSON_IsTrue(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsTrue(invalid));
+ TEST_ASSERT_TRUE(cJSON_IsTrue(item));
+ TEST_ASSERT_TRUE(cJSON_IsBool(item));
+
+ item->type = cJSON_NULL | cJSON_StringIsConst;
+ TEST_ASSERT_FALSE(cJSON_IsNull(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsNull(invalid));
+ TEST_ASSERT_TRUE(cJSON_IsNull(item));
+
+ item->type = cJSON_Number | cJSON_StringIsConst;
+ TEST_ASSERT_FALSE(cJSON_IsNumber(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsNumber(invalid));
+ TEST_ASSERT_TRUE(cJSON_IsNumber(item));
+
+ item->type = cJSON_String | cJSON_StringIsConst;
+ TEST_ASSERT_FALSE(cJSON_IsString(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsString(invalid));
+ TEST_ASSERT_TRUE(cJSON_IsString(item));
+
+ item->type = cJSON_Array | cJSON_StringIsConst;
+ TEST_ASSERT_FALSE(cJSON_IsArray(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsArray(invalid));
+ TEST_ASSERT_TRUE(cJSON_IsArray(item));
+
+ item->type = cJSON_Object | cJSON_StringIsConst;
+ TEST_ASSERT_FALSE(cJSON_IsObject(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsObject(invalid));
+ TEST_ASSERT_TRUE(cJSON_IsObject(item));
+
+ item->type = cJSON_Raw | cJSON_StringIsConst;
+ TEST_ASSERT_FALSE(cJSON_IsRaw(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsRaw(invalid));
+ TEST_ASSERT_TRUE(cJSON_IsRaw(item));
+}
+
+static void cjson_should_not_parse_to_deeply_nested_jsons(void)
+{
+ char deep_json[CJSON_NESTING_LIMIT + 1];
+ size_t position = 0;
+
+ for (position = 0; position < sizeof(deep_json); position++)
+ {
+ deep_json[position] = '[';
+ }
+ deep_json[sizeof(deep_json) - 1] = '\0';
+
+ TEST_ASSERT_NULL_MESSAGE(cJSON_Parse(deep_json), "To deep JSONs should not be parsed.");
+}
+
+static void cjson_set_number_value_should_set_numbers(void)
+{
+ cJSON number[1] = {{NULL, NULL, NULL, cJSON_Number, NULL, 0, 0, NULL}};
+
+ cJSON_SetNumberValue(number, 1.5);
+ TEST_ASSERT_EQUAL(1, number->valueint);
+ TEST_ASSERT_EQUAL_DOUBLE(1.5, number->valuedouble);
+
+ cJSON_SetNumberValue(number, -1.5);
+ TEST_ASSERT_EQUAL(-1, number->valueint);
+ TEST_ASSERT_EQUAL_DOUBLE(-1.5, number->valuedouble);
+
+ cJSON_SetNumberValue(number, 1 + (double)INT_MAX);
+ TEST_ASSERT_EQUAL(INT_MAX, number->valueint);
+ TEST_ASSERT_EQUAL_DOUBLE(1 + (double)INT_MAX, number->valuedouble);
+
+ cJSON_SetNumberValue(number, -1 + (double)INT_MIN);
+ TEST_ASSERT_EQUAL(INT_MIN, number->valueint);
+ TEST_ASSERT_EQUAL_DOUBLE(-1 + (double)INT_MIN, number->valuedouble);
+}
+
+static void cjson_detach_item_via_pointer_should_detach_items(void)
+{
+ cJSON list[4];
+ cJSON parent[1];
+
+ memset(list, '\0', sizeof(list));
+
+ /* link the list */
+ list[0].next = &(list[1]);
+ list[1].next = &(list[2]);
+ list[2].next = &(list[3]);
+
+ list[3].prev = &(list[2]);
+ list[2].prev = &(list[1]);
+ list[1].prev = &(list[0]);
+
+ parent->child = &list[0];
+
+ /* detach in the middle (list[1]) */
+ TEST_ASSERT_TRUE_MESSAGE(cJSON_DetachItemViaPointer(parent, &(list[1])) == &(list[1]), "Failed to detach in the middle.");
+ TEST_ASSERT_TRUE_MESSAGE((list[1].prev == NULL) && (list[1].next == NULL), "Didn't set pointers of detached item to NULL.");
+ TEST_ASSERT_TRUE((list[0].next == &(list[2])) && (list[2].prev == &(list[0])));
+
+ /* detach beginning (list[0]) */
+ TEST_ASSERT_TRUE_MESSAGE(cJSON_DetachItemViaPointer(parent, &(list[0])) == &(list[0]), "Failed to detach beginning.");
+ TEST_ASSERT_TRUE_MESSAGE((list[0].prev == NULL) && (list[0].next == NULL), "Didn't set pointers of detached item to NULL.");
+ TEST_ASSERT_TRUE_MESSAGE((list[2].prev == NULL) && (parent->child == &(list[2])), "Didn't set the new beginning.");
+
+ /* detach end (list[3])*/
+ TEST_ASSERT_TRUE_MESSAGE(cJSON_DetachItemViaPointer(parent, &(list[3])) == &(list[3]), "Failed to detach end.");
+ TEST_ASSERT_TRUE_MESSAGE((list[3].prev == NULL) && (list[3].next == NULL), "Didn't set pointers of detached item to NULL.");
+ TEST_ASSERT_TRUE_MESSAGE((list[2].next == NULL) && (parent->child == &(list[2])), "Didn't set the new end");
+
+ /* detach single item (list[2]) */
+ TEST_ASSERT_TRUE_MESSAGE(cJSON_DetachItemViaPointer(parent, &list[2]) == &list[2], "Failed to detach single item.");
+ TEST_ASSERT_TRUE_MESSAGE((list[2].prev == NULL) && (list[2].next == NULL), "Didn't set pointers of detached item to NULL.");
+ TEST_ASSERT_NULL_MESSAGE(parent->child, "Child of the parent wasn't set to NULL.");
+}
+
+static void cjson_replace_item_via_pointer_should_replace_items(void)
+{
+ cJSON replacements[3];
+ cJSON *beginning = NULL;
+ cJSON *middle = NULL;
+ cJSON *end = NULL;
+ cJSON *array = NULL;
+
+ beginning = cJSON_CreateNull();
+ TEST_ASSERT_NOT_NULL(beginning);
+ middle = cJSON_CreateNull();
+ TEST_ASSERT_NOT_NULL(middle);
+ end = cJSON_CreateNull();
+ TEST_ASSERT_NOT_NULL(end);
+
+ array = cJSON_CreateArray();
+ TEST_ASSERT_NOT_NULL(array);
+
+ cJSON_AddItemToArray(array, beginning);
+ cJSON_AddItemToArray(array, middle);
+ cJSON_AddItemToArray(array, end);
+
+
+ memset(replacements, '\0', sizeof(replacements));
+
+ /* replace beginning */
+ TEST_ASSERT_TRUE(cJSON_ReplaceItemViaPointer(array, beginning, &(replacements[0])));
+ TEST_ASSERT_NULL(replacements[0].prev);
+ TEST_ASSERT_TRUE(replacements[0].next == middle);
+ TEST_ASSERT_TRUE(middle->prev == &(replacements[0]));
+ TEST_ASSERT_TRUE(array->child == &(replacements[0]));
+
+ /* replace middle */
+ TEST_ASSERT_TRUE(cJSON_ReplaceItemViaPointer(array, middle, &(replacements[1])));
+ TEST_ASSERT_TRUE(replacements[1].prev == &(replacements[0]));
+ TEST_ASSERT_TRUE(replacements[1].next == end);
+ TEST_ASSERT_TRUE(end->prev == &(replacements[1]));
+
+ /* replace end */
+ TEST_ASSERT_TRUE(cJSON_ReplaceItemViaPointer(array, end, &(replacements[2])));
+ TEST_ASSERT_TRUE(replacements[2].prev == &(replacements[1]));
+ TEST_ASSERT_NULL(replacements[2].next);
+ TEST_ASSERT_TRUE(replacements[1].next == &(replacements[2]));
+
+ cJSON_free(array);
+}
+
+static void cjson_replace_item_in_object_should_preserve_name(void)
+{
+ cJSON root[1] = {{ NULL, NULL, NULL, 0, NULL, 0, 0, NULL }};
+ cJSON *child = NULL;
+ cJSON *replacement = NULL;
+
+ child = cJSON_CreateNumber(1);
+ TEST_ASSERT_NOT_NULL(child);
+ replacement = cJSON_CreateNumber(2);
+ TEST_ASSERT_NOT_NULL(replacement);
+
+ cJSON_AddItemToObject(root, "child", child);
+ cJSON_ReplaceItemInObject(root, "child", replacement);
+
+ TEST_ASSERT_TRUE(root->child == replacement);
+ TEST_ASSERT_EQUAL_STRING("child", replacement->string);
+
+ cJSON_Delete(replacement);
+}
+
+static void cjson_functions_shouldnt_crash_with_null_pointers(void)
+{
+ char buffer[10];
+ cJSON *item = cJSON_CreateString("item");
+
+ cJSON_InitHooks(NULL);
+ TEST_ASSERT_NULL(cJSON_Parse(NULL));
+ TEST_ASSERT_NULL(cJSON_ParseWithOpts(NULL, NULL, true));
+ TEST_ASSERT_NULL(cJSON_Print(NULL));
+ TEST_ASSERT_NULL(cJSON_PrintUnformatted(NULL));
+ TEST_ASSERT_NULL(cJSON_PrintBuffered(NULL, 10, true));
+ TEST_ASSERT_FALSE(cJSON_PrintPreallocated(NULL, buffer, sizeof(buffer), true));
+ TEST_ASSERT_FALSE(cJSON_PrintPreallocated(item, NULL, 1, true));
+ cJSON_Delete(NULL);
+ cJSON_GetArraySize(NULL);
+ TEST_ASSERT_NULL(cJSON_GetArrayItem(NULL, 0));
+ TEST_ASSERT_NULL(cJSON_GetObjectItem(NULL, "item"));
+ TEST_ASSERT_NULL(cJSON_GetObjectItem(item, NULL));
+ TEST_ASSERT_NULL(cJSON_GetObjectItemCaseSensitive(NULL, "item"));
+ TEST_ASSERT_NULL(cJSON_GetObjectItemCaseSensitive(item, NULL));
+ TEST_ASSERT_FALSE(cJSON_HasObjectItem(NULL, "item"));
+ TEST_ASSERT_FALSE(cJSON_HasObjectItem(item, NULL));
+ TEST_ASSERT_FALSE(cJSON_IsInvalid(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsFalse(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsTrue(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsBool(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsNull(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsNumber(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsString(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsArray(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsObject(NULL));
+ TEST_ASSERT_FALSE(cJSON_IsRaw(NULL));
+ TEST_ASSERT_NULL(cJSON_CreateString(NULL));
+ TEST_ASSERT_NULL(cJSON_CreateRaw(NULL));
+ TEST_ASSERT_NULL(cJSON_CreateIntArray(NULL, 10));
+ TEST_ASSERT_NULL(cJSON_CreateFloatArray(NULL, 10));
+ TEST_ASSERT_NULL(cJSON_CreateDoubleArray(NULL, 10));
+ TEST_ASSERT_NULL(cJSON_CreateStringArray(NULL, 10));
+ cJSON_AddItemToArray(NULL, item);
+ cJSON_AddItemToArray(item, NULL);
+ cJSON_AddItemToObject(item, "item", NULL);
+ cJSON_AddItemToObject(item, NULL, item);
+ cJSON_AddItemToObject(NULL, "item", item);
+ cJSON_AddItemToObjectCS(item, "item", NULL);
+ cJSON_AddItemToObjectCS(item, NULL, item);
+ cJSON_AddItemToObjectCS(NULL, "item", item);
+ cJSON_AddItemReferenceToArray(NULL, item);
+ cJSON_AddItemReferenceToArray(item, NULL);
+ cJSON_AddItemReferenceToObject(item, "item", NULL);
+ cJSON_AddItemReferenceToObject(item, NULL, item);
+ cJSON_AddItemReferenceToObject(NULL, "item", item);
+ TEST_ASSERT_NULL(cJSON_DetachItemViaPointer(NULL, item));
+ TEST_ASSERT_NULL(cJSON_DetachItemViaPointer(item, NULL));
+ TEST_ASSERT_NULL(cJSON_DetachItemFromArray(NULL, 0));
+ cJSON_DeleteItemFromArray(NULL, 0);
+ TEST_ASSERT_NULL(cJSON_DetachItemFromObject(NULL, "item"));
+ TEST_ASSERT_NULL(cJSON_DetachItemFromObject(item, NULL));
+ TEST_ASSERT_NULL(cJSON_DetachItemFromObjectCaseSensitive(NULL, "item"));
+ TEST_ASSERT_NULL(cJSON_DetachItemFromObjectCaseSensitive(item, NULL));
+ cJSON_DeleteItemFromObject(NULL, "item");
+ cJSON_DeleteItemFromObject(item, NULL);
+ cJSON_DeleteItemFromObjectCaseSensitive(NULL, "item");
+ cJSON_DeleteItemFromObjectCaseSensitive(item, NULL);
+ cJSON_InsertItemInArray(NULL, 0, item);
+ cJSON_InsertItemInArray(item, 0, NULL);
+ TEST_ASSERT_FALSE(cJSON_ReplaceItemViaPointer(NULL, item, item));
+ TEST_ASSERT_FALSE(cJSON_ReplaceItemViaPointer(item, NULL, item));
+ TEST_ASSERT_FALSE(cJSON_ReplaceItemViaPointer(item, item, NULL));
+ cJSON_ReplaceItemInArray(item, 0, NULL);
+ cJSON_ReplaceItemInArray(NULL, 0, item);
+ cJSON_ReplaceItemInObject(NULL, "item", item);
+ cJSON_ReplaceItemInObject(item, NULL, item);
+ cJSON_ReplaceItemInObject(item, "item", NULL);
+ cJSON_ReplaceItemInObjectCaseSensitive(NULL, "item", item);
+ cJSON_ReplaceItemInObjectCaseSensitive(item, NULL, item);
+ cJSON_ReplaceItemInObjectCaseSensitive(item, "item", NULL);
+ TEST_ASSERT_NULL(cJSON_Duplicate(NULL, true));
+ TEST_ASSERT_FALSE(cJSON_Compare(item, NULL, false));
+ TEST_ASSERT_FALSE(cJSON_Compare(NULL, item, false));
+ cJSON_Minify(NULL);
+ /* skipped because it is only used via a macro that checks for NULL */
+ /* cJSON_SetNumberHelper(NULL, 0); */
+
+ cJSON_Delete(item);
+}
+
+static void * CJSON_CDECL failing_realloc(void *pointer, size_t size)
+{
+ (void)size;
+ (void)pointer;
+ return NULL;
+}
+
+static void ensure_should_fail_on_failed_realloc(void)
+{
+ printbuffer buffer = {NULL, 10, 0, 0, false, false, {&malloc, &free, &failing_realloc}};
+ buffer.buffer = (unsigned char*)malloc(100);
+ TEST_ASSERT_NOT_NULL(buffer.buffer);
+
+ TEST_ASSERT_NULL_MESSAGE(ensure(&buffer, 200), "Ensure didn't fail with failing realloc.");
+}
+
+static void skip_utf8_bom_should_skip_bom(void)
+{
+ const unsigned char string[] = "\xEF\xBB\xBF{}";
+ parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.content = string;
+ buffer.length = sizeof(string);
+ buffer.hooks = global_hooks;
+
+ TEST_ASSERT_TRUE(skip_utf8_bom(&buffer) == &buffer);
+ TEST_ASSERT_EQUAL_UINT(3U, (unsigned int)buffer.offset);
+}
+
+static void skip_utf8_bom_should_not_skip_bom_if_not_at_beginning(void)
+{
+ const unsigned char string[] = " \xEF\xBB\xBF{}";
+ parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.content = string;
+ buffer.length = sizeof(string);
+ buffer.hooks = global_hooks;
+ buffer.offset = 1;
+
+ TEST_ASSERT_NULL(skip_utf8_bom(&buffer));
+}
+
+static void cjson_get_string_value_should_get_a_string(void)
+{
+ cJSON *string = cJSON_CreateString("test");
+ cJSON *number = cJSON_CreateNumber(1);
+
+ TEST_ASSERT_TRUE(cJSON_GetStringValue(string) == string->valuestring);
+ TEST_ASSERT_NULL(cJSON_GetStringValue(number));
+ TEST_ASSERT_NULL(cJSON_GetStringValue(NULL));
+
+ cJSON_Delete(number);
+ cJSON_Delete(string);
+}
+
+static void cjson_create_string_reference_should_create_a_string_reference(void) {
+ const char *string = "I am a string!";
+
+ cJSON *string_reference = cJSON_CreateStringReference(string);
+ TEST_ASSERT_TRUE(string_reference->valuestring == string);
+ TEST_ASSERT_EQUAL_INT(cJSON_IsReference | cJSON_String, string_reference->type);
+
+ cJSON_Delete(string_reference);
+}
+
+static void cjson_create_object_reference_should_create_an_object_reference(void) {
+ cJSON *number_reference = NULL;
+ cJSON *number_object = cJSON_CreateObject();
+ cJSON *number = cJSON_CreateNumber(42);
+ const char key[] = "number";
+
+ TEST_ASSERT_TRUE(cJSON_IsNumber(number));
+ TEST_ASSERT_TRUE(cJSON_IsObject(number_object));
+ cJSON_AddItemToObjectCS(number_object, key, number);
+
+ number_reference = cJSON_CreateObjectReference(number);
+ TEST_ASSERT_TRUE(number_reference->child == number);
+ TEST_ASSERT_EQUAL_INT(cJSON_Object | cJSON_IsReference, number_reference->type);
+
+ cJSON_Delete(number_object);
+ cJSON_Delete(number_reference);
+}
+
+static void cjson_create_array_reference_should_create_an_array_reference(void) {
+ cJSON *number_reference = NULL;
+ cJSON *number_array = cJSON_CreateArray();
+ cJSON *number = cJSON_CreateNumber(42);
+
+ TEST_ASSERT_TRUE(cJSON_IsNumber(number));
+ TEST_ASSERT_TRUE(cJSON_IsArray(number_array));
+ cJSON_AddItemToArray(number_array, number);
+
+ number_reference = cJSON_CreateArrayReference(number);
+ TEST_ASSERT_TRUE(number_reference->child == number);
+ TEST_ASSERT_EQUAL_INT(cJSON_Array | cJSON_IsReference, number_reference->type);
+
+ cJSON_Delete(number_array);
+ cJSON_Delete(number_reference);
+}
+
+static void cjson_add_item_to_object_should_not_use_after_free_when_string_is_aliased(void)
+{
+ cJSON *object = cJSON_CreateObject();
+ cJSON *number = cJSON_CreateNumber(42);
+ char *name = (char*)cJSON_strdup((const unsigned char*)"number", &global_hooks);
+
+ TEST_ASSERT_NOT_NULL(object);
+ TEST_ASSERT_NOT_NULL(number);
+ TEST_ASSERT_NOT_NULL(name);
+
+ number->string = name;
+
+ /* The following should not have a use after free
+ * that would show up in valgrind or with AddressSanitizer */
+ cJSON_AddItemToObject(object, number->string, number);
+
+ cJSON_Delete(object);
+}
+
+int CJSON_CDECL main(void)
+{
+ UNITY_BEGIN();
+
+ RUN_TEST(cjson_array_foreach_should_loop_over_arrays);
+ RUN_TEST(cjson_array_foreach_should_not_dereference_null_pointer);
+ RUN_TEST(cjson_get_object_item_should_get_object_items);
+ RUN_TEST(cjson_get_object_item_case_sensitive_should_get_object_items);
+ RUN_TEST(cjson_get_object_item_should_not_crash_with_array);
+ RUN_TEST(cjson_get_object_item_case_sensitive_should_not_crash_with_array);
+ RUN_TEST(typecheck_functions_should_check_type);
+ RUN_TEST(cjson_should_not_parse_to_deeply_nested_jsons);
+ RUN_TEST(cjson_set_number_value_should_set_numbers);
+ RUN_TEST(cjson_detach_item_via_pointer_should_detach_items);
+ RUN_TEST(cjson_replace_item_via_pointer_should_replace_items);
+ RUN_TEST(cjson_replace_item_in_object_should_preserve_name);
+ RUN_TEST(cjson_functions_shouldnt_crash_with_null_pointers);
+ RUN_TEST(ensure_should_fail_on_failed_realloc);
+ RUN_TEST(skip_utf8_bom_should_skip_bom);
+ RUN_TEST(skip_utf8_bom_should_not_skip_bom_if_not_at_beginning);
+ RUN_TEST(cjson_get_string_value_should_get_a_string);
+ RUN_TEST(cjson_create_string_reference_should_create_a_string_reference);
+ RUN_TEST(cjson_create_object_reference_should_create_an_object_reference);
+ RUN_TEST(cjson_create_array_reference_should_create_an_array_reference);
+ RUN_TEST(cjson_add_item_to_object_should_not_use_after_free_when_string_is_aliased);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/misc_utils_tests.c b/support/cJSON-master/tests/misc_utils_tests.c
new file mode 100644
index 0000000..7d300bc
--- /dev/null
+++ b/support/cJSON-master/tests/misc_utils_tests.c
@@ -0,0 +1,80 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+#include "../cJSON_Utils.h"
+
+static void cjson_utils_functions_shouldnt_crash_with_null_pointers(void)
+{
+ cJSON *item = cJSON_CreateString("item");
+ TEST_ASSERT_NOT_NULL(item);
+
+ TEST_ASSERT_NULL(cJSONUtils_GetPointer(item, NULL));
+ TEST_ASSERT_NULL(cJSONUtils_GetPointer(NULL, "pointer"));
+ TEST_ASSERT_NULL(cJSONUtils_GetPointerCaseSensitive(NULL, "pointer"));
+ TEST_ASSERT_NULL(cJSONUtils_GetPointerCaseSensitive(item, NULL));
+ TEST_ASSERT_NULL(cJSONUtils_GeneratePatches(item, NULL));
+ TEST_ASSERT_NULL(cJSONUtils_GeneratePatches(NULL, item));
+ TEST_ASSERT_NULL(cJSONUtils_GeneratePatchesCaseSensitive(item, NULL));
+ TEST_ASSERT_NULL(cJSONUtils_GeneratePatchesCaseSensitive(NULL, item));
+ cJSONUtils_AddPatchToArray(item, "path", "add", NULL);
+ cJSONUtils_AddPatchToArray(item, "path", NULL, item);
+ cJSONUtils_AddPatchToArray(item, NULL, "add", item);
+ cJSONUtils_AddPatchToArray(NULL, "path", "add", item);
+ cJSONUtils_ApplyPatches(item, NULL);
+ cJSONUtils_ApplyPatches(NULL, item);
+ cJSONUtils_ApplyPatchesCaseSensitive(item, NULL);
+ cJSONUtils_ApplyPatchesCaseSensitive(NULL, item);
+ TEST_ASSERT_NULL(cJSONUtils_MergePatch(item, NULL));
+ item = cJSON_CreateString("item");
+ TEST_ASSERT_NULL(cJSONUtils_MergePatchCaseSensitive(item, NULL));
+ item = cJSON_CreateString("item");
+ /* these calls are actually valid */
+ /* cJSONUtils_MergePatch(NULL, item); */
+ /* cJSONUtils_MergePatchCaseSensitive(NULL, item);*/
+ /* cJSONUtils_GenerateMergePatch(item, NULL); */
+ /* cJSONUtils_GenerateMergePatch(NULL, item); */
+ /* cJSONUtils_GenerateMergePatchCaseSensitive(item, NULL); */
+ /* cJSONUtils_GenerateMergePatchCaseSensitive(NULL, item); */
+
+ TEST_ASSERT_NULL(cJSONUtils_FindPointerFromObjectTo(item, NULL));
+ TEST_ASSERT_NULL(cJSONUtils_FindPointerFromObjectTo(NULL, item));
+ cJSONUtils_SortObject(NULL);
+ cJSONUtils_SortObjectCaseSensitive(NULL);
+
+ cJSON_Delete(item);
+}
+
+int main(void)
+{
+ UNITY_BEGIN();
+
+ RUN_TEST(cjson_utils_functions_shouldnt_crash_with_null_pointers);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/old_utils_tests.c b/support/cJSON-master/tests/old_utils_tests.c
new file mode 100644
index 0000000..08da6a6
--- /dev/null
+++ b/support/cJSON-master/tests/old_utils_tests.c
@@ -0,0 +1,205 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+#include "../cJSON_Utils.h"
+
+/* JSON Apply Merge tests: */
+static const char *merges[15][3] =
+{
+ {"{\"a\":\"b\"}", "{\"a\":\"c\"}", "{\"a\":\"c\"}"},
+ {"{\"a\":\"b\"}", "{\"b\":\"c\"}", "{\"a\":\"b\",\"b\":\"c\"}"},
+ {"{\"a\":\"b\"}", "{\"a\":null}", "{}"},
+ {"{\"a\":\"b\",\"b\":\"c\"}", "{\"a\":null}", "{\"b\":\"c\"}"},
+ {"{\"a\":[\"b\"]}", "{\"a\":\"c\"}", "{\"a\":\"c\"}"},
+ {"{\"a\":\"c\"}", "{\"a\":[\"b\"]}", "{\"a\":[\"b\"]}"},
+ {"{\"a\":{\"b\":\"c\"}}", "{\"a\":{\"b\":\"d\",\"c\":null}}", "{\"a\":{\"b\":\"d\"}}"},
+ {"{\"a\":[{\"b\":\"c\"}]}", "{\"a\":[1]}", "{\"a\":[1]}"},
+ {"[\"a\",\"b\"]", "[\"c\",\"d\"]", "[\"c\",\"d\"]"},
+ {"{\"a\":\"b\"}", "[\"c\"]", "[\"c\"]"},
+ {"{\"a\":\"foo\"}", "null", "null"},
+ {"{\"a\":\"foo\"}", "\"bar\"", "\"bar\""},
+ {"{\"e\":null}", "{\"a\":1}", "{\"e\":null,\"a\":1}"},
+ {"[1,2]", "{\"a\":\"b\",\"c\":null}", "{\"a\":\"b\"}"},
+ {"{}","{\"a\":{\"bb\":{\"ccc\":null}}}", "{\"a\":{\"bb\":{}}}"}
+};
+
+static void json_pointer_tests(void)
+{
+ cJSON *root = NULL;
+ const char *json=
+ "{"
+ "\"foo\": [\"bar\", \"baz\"],"
+ "\"\": 0,"
+ "\"a/b\": 1,"
+ "\"c%d\": 2,"
+ "\"e^f\": 3,"
+ "\"g|h\": 4,"
+ "\"i\\\\j\": 5,"
+ "\"k\\\"l\": 6,"
+ "\" \": 7,"
+ "\"m~n\": 8"
+ "}";
+
+ root = cJSON_Parse(json);
+
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, ""), root);
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/foo"), cJSON_GetObjectItem(root, "foo"));
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/foo/0"), cJSON_GetObjectItem(root, "foo")->child);
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/foo/0"), cJSON_GetObjectItem(root, "foo")->child);
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/"), cJSON_GetObjectItem(root, ""));
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/a~1b"), cJSON_GetObjectItem(root, "a/b"));
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/c%d"), cJSON_GetObjectItem(root, "c%d"));
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/c^f"), cJSON_GetObjectItem(root, "c^f"));
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/c|f"), cJSON_GetObjectItem(root, "c|f"));
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/i\\j"), cJSON_GetObjectItem(root, "i\\j"));
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/k\"l"), cJSON_GetObjectItem(root, "k\"l"));
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/ "), cJSON_GetObjectItem(root, " "));
+ TEST_ASSERT_EQUAL_PTR(cJSONUtils_GetPointer(root, "/m~0n"), cJSON_GetObjectItem(root, "m~n"));
+
+ cJSON_Delete(root);
+}
+
+static void misc_tests(void)
+{
+ /* Misc tests */
+ int numbers[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+ cJSON *object = NULL;
+ cJSON *nums = NULL;
+ cJSON *num6 = NULL;
+ char *pointer = NULL;
+
+ printf("JSON Pointer construct\n");
+ object = cJSON_CreateObject();
+ nums = cJSON_CreateIntArray(numbers, 10);
+ num6 = cJSON_GetArrayItem(nums, 6);
+ cJSON_AddItemToObject(object, "numbers", nums);
+
+ pointer = cJSONUtils_FindPointerFromObjectTo(object, num6);
+ TEST_ASSERT_EQUAL_STRING("/numbers/6", pointer);
+ free(pointer);
+
+ pointer = cJSONUtils_FindPointerFromObjectTo(object, nums);
+ TEST_ASSERT_EQUAL_STRING("/numbers", pointer);
+ free(pointer);
+
+ pointer = cJSONUtils_FindPointerFromObjectTo(object, object);
+ TEST_ASSERT_EQUAL_STRING("", pointer);
+ free(pointer);
+
+ cJSON_Delete(object);
+}
+
+static void sort_tests(void)
+{
+ /* Misc tests */
+ const char *random = "QWERTYUIOPASDFGHJKLZXCVBNM";
+ char buf[2] = {'\0', '\0'};
+ cJSON *sortme = NULL;
+ size_t i = 0;
+ cJSON *current_element = NULL;
+
+ /* JSON Sort test: */
+ sortme = cJSON_CreateObject();
+ for (i = 0; i < 26; i++)
+ {
+ buf[0] = random[i];
+ cJSON_AddItemToObject(sortme, buf, cJSON_CreateNumber(1));
+ }
+
+ cJSONUtils_SortObject(sortme);
+
+ /* check sorting */
+ current_element = sortme->child->next;
+ for (i = 1; (i < 26) && (current_element != NULL) && (current_element->prev != NULL); i++)
+ {
+ TEST_ASSERT_TRUE(current_element->string[0] >= current_element->prev->string[0]);
+ current_element = current_element->next;
+ }
+
+ cJSON_Delete(sortme);
+}
+
+static void merge_tests(void)
+{
+ size_t i = 0;
+ char *patchtext = NULL;
+ char *after = NULL;
+
+ /* Merge tests: */
+ printf("JSON Merge Patch tests\n");
+ for (i = 0; i < 15; i++)
+ {
+ cJSON *object_to_be_merged = cJSON_Parse(merges[i][0]);
+ cJSON *patch = cJSON_Parse(merges[i][1]);
+ patchtext = cJSON_PrintUnformatted(patch);
+ object_to_be_merged = cJSONUtils_MergePatch(object_to_be_merged, patch);
+ after = cJSON_PrintUnformatted(object_to_be_merged);
+ TEST_ASSERT_EQUAL_STRING(merges[i][2], after);
+
+ free(patchtext);
+ free(after);
+ cJSON_Delete(object_to_be_merged);
+ cJSON_Delete(patch);
+ }
+}
+
+static void generate_merge_tests(void)
+{
+ size_t i = 0;
+ char *patchedtext = NULL;
+
+ /* Generate Merge tests: */
+ for (i = 0; i < 15; i++)
+ {
+ cJSON *from = cJSON_Parse(merges[i][0]);
+ cJSON *to = cJSON_Parse(merges[i][2]);
+ cJSON *patch = cJSONUtils_GenerateMergePatch(from,to);
+ from = cJSONUtils_MergePatch(from,patch);
+ patchedtext = cJSON_PrintUnformatted(from);
+ TEST_ASSERT_EQUAL_STRING(merges[i][2], patchedtext);
+
+ cJSON_Delete(from);
+ cJSON_Delete(to);
+ cJSON_Delete(patch);
+ free(patchedtext);
+ }
+}
+
+int main(void)
+{
+ UNITY_BEGIN();
+
+ RUN_TEST(json_pointer_tests);
+ RUN_TEST(misc_tests);
+ RUN_TEST(sort_tests);
+ RUN_TEST(merge_tests);
+ RUN_TEST(generate_merge_tests);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/parse_array.c b/support/cJSON-master/tests/parse_array.c
new file mode 100644
index 0000000..dfaae29
--- /dev/null
+++ b/support/cJSON-master/tests/parse_array.c
@@ -0,0 +1,166 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static cJSON item[1];
+
+static void assert_is_array(cJSON *array_item)
+{
+ TEST_ASSERT_NOT_NULL_MESSAGE(array_item, "Item is NULL.");
+
+ assert_not_in_list(array_item);
+ assert_has_type(array_item, cJSON_Array);
+ assert_has_no_reference(array_item);
+ assert_has_no_const_string(array_item);
+ assert_has_no_valuestring(array_item);
+ assert_has_no_string(array_item);
+}
+
+static void assert_not_array(const char *json)
+{
+ parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.content = (const unsigned char*)json;
+ buffer.length = strlen(json) + sizeof("");
+ buffer.hooks = global_hooks;
+
+ TEST_ASSERT_FALSE(parse_array(item, &buffer));
+ assert_is_invalid(item);
+}
+
+static void assert_parse_array(const char *json)
+{
+ parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.content = (const unsigned char*)json;
+ buffer.length = strlen(json) + sizeof("");
+ buffer.hooks = global_hooks;
+
+ TEST_ASSERT_TRUE(parse_array(item, &buffer));
+ assert_is_array(item);
+}
+
+static void parse_array_should_parse_empty_arrays(void)
+{
+ assert_parse_array("[]");
+ assert_has_no_child(item);
+
+ assert_parse_array("[\n\t]");
+ assert_has_no_child(item);
+}
+
+
+static void parse_array_should_parse_arrays_with_one_element(void)
+{
+
+ assert_parse_array("[1]");
+ assert_has_child(item);
+ assert_has_type(item->child, cJSON_Number);
+ reset(item);
+
+ assert_parse_array("[\"hello!\"]");
+ assert_has_child(item);
+ assert_has_type(item->child, cJSON_String);
+ TEST_ASSERT_EQUAL_STRING("hello!", item->child->valuestring);
+ reset(item);
+
+ assert_parse_array("[[]]");
+ assert_has_child(item);
+ assert_is_array(item->child);
+ assert_has_no_child(item->child);
+ reset(item);
+
+ assert_parse_array("[null]");
+ assert_has_child(item);
+ assert_has_type(item->child, cJSON_NULL);
+ reset(item);
+}
+
+static void parse_array_should_parse_arrays_with_multiple_elements(void)
+{
+ assert_parse_array("[1\t,\n2, 3]");
+ assert_has_child(item);
+ TEST_ASSERT_NOT_NULL(item->child->next);
+ TEST_ASSERT_NOT_NULL(item->child->next->next);
+ TEST_ASSERT_NULL(item->child->next->next->next);
+ assert_has_type(item->child, cJSON_Number);
+ assert_has_type(item->child->next, cJSON_Number);
+ assert_has_type(item->child->next->next, cJSON_Number);
+ reset(item);
+
+ {
+ size_t i = 0;
+ cJSON *node = NULL;
+ int expected_types[7] =
+ {
+ cJSON_Number,
+ cJSON_NULL,
+ cJSON_True,
+ cJSON_False,
+ cJSON_Array,
+ cJSON_String,
+ cJSON_Object
+ };
+ assert_parse_array("[1, null, true, false, [], \"hello\", {}]");
+
+ node = item->child;
+ for (
+ i = 0;
+ (i < (sizeof(expected_types)/sizeof(int)))
+ && (node != NULL);
+ (void)i++, node = node->next)
+ {
+ TEST_ASSERT_BITS(0xFF, expected_types[i], node->type);
+ }
+ TEST_ASSERT_EQUAL_INT(i, 7);
+ reset(item);
+ }
+}
+
+static void parse_array_should_not_parse_non_arrays(void)
+{
+ assert_not_array("");
+ assert_not_array("[");
+ assert_not_array("]");
+ assert_not_array("{\"hello\":[]}");
+ assert_not_array("42");
+ assert_not_array("3.14");
+ assert_not_array("\"[]hello world!\n\"");
+}
+
+int CJSON_CDECL main(void)
+{
+ /* initialize cJSON item */
+ memset(item, 0, sizeof(cJSON));
+
+ UNITY_BEGIN();
+ RUN_TEST(parse_array_should_parse_empty_arrays);
+ RUN_TEST(parse_array_should_parse_arrays_with_one_element);
+ RUN_TEST(parse_array_should_parse_arrays_with_multiple_elements);
+ RUN_TEST(parse_array_should_not_parse_non_arrays);
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/parse_examples.c b/support/cJSON-master/tests/parse_examples.c
new file mode 100644
index 0000000..3aab77f
--- /dev/null
+++ b/support/cJSON-master/tests/parse_examples.c
@@ -0,0 +1,214 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static cJSON *parse_file(const char *filename)
+{
+ cJSON *parsed = NULL;
+ char *content = read_file(filename);
+
+ parsed = cJSON_Parse(content);
+
+ if (content != NULL)
+ {
+ free(content);
+ }
+
+ return parsed;
+}
+
+static void do_test(const char *test_name)
+{
+ char *expected = NULL;
+ char *actual = NULL;
+ cJSON *tree = NULL;
+
+ size_t test_name_length = 0;
+ /* path of the test input */
+ char *test_path = NULL;
+ /* path of the expected output */
+ char *expected_path = NULL;
+
+ test_name_length = strlen(test_name);
+
+ /* allocate file paths */
+#define TEST_DIR_PATH "inputs/"
+ test_path = (char*)malloc(sizeof(TEST_DIR_PATH) + test_name_length);
+ TEST_ASSERT_NOT_NULL_MESSAGE(test_path, "Failed to allocate test_path buffer.");
+ expected_path = (char*)malloc(sizeof(TEST_DIR_PATH) + test_name_length + sizeof(".expected"));
+ TEST_ASSERT_NOT_NULL_MESSAGE(expected_path, "Failed to allocate expected_path buffer.");
+
+ /* create file paths */
+ sprintf(test_path, TEST_DIR_PATH"%s", test_name);
+ sprintf(expected_path, TEST_DIR_PATH"%s.expected", test_name);
+
+ /* read expected output */
+ expected = read_file(expected_path);
+ TEST_ASSERT_NOT_NULL_MESSAGE(expected, "Failed to read expected output.");
+
+ /* read and parse test */
+ tree = parse_file(test_path);
+ TEST_ASSERT_NOT_NULL_MESSAGE(tree, "Failed to read of parse test.");
+
+ /* print the parsed tree */
+ actual = cJSON_Print(tree);
+ TEST_ASSERT_NOT_NULL_MESSAGE(actual, "Failed to print tree back to JSON.");
+
+
+ TEST_ASSERT_EQUAL_STRING(expected, actual);
+
+ /* cleanup resources */
+ if (expected != NULL)
+ {
+ free(expected);
+ }
+ if (tree != NULL)
+ {
+ cJSON_Delete(tree);
+ }
+ if (actual != NULL)
+ {
+ free(actual);
+ }
+ if (test_path != NULL)
+ {
+ free(test_path);
+ }
+ if (expected_path != NULL)
+ {
+ free(expected_path);
+ }
+}
+
+static void file_test1_should_be_parsed_and_printed(void)
+{
+ do_test("test1");
+}
+
+static void file_test2_should_be_parsed_and_printed(void)
+{
+ do_test("test2");
+}
+
+static void file_test3_should_be_parsed_and_printed(void)
+{
+ do_test("test3");
+}
+
+static void file_test4_should_be_parsed_and_printed(void)
+{
+ do_test("test4");
+}
+
+static void file_test5_should_be_parsed_and_printed(void)
+{
+ do_test("test5");
+}
+
+static void file_test6_should_not_be_parsed(void)
+{
+ char *test6 = NULL;
+ cJSON *tree = NULL;
+
+ test6 = read_file("inputs/test6");
+ TEST_ASSERT_NOT_NULL_MESSAGE(test6, "Failed to read test6 data.");
+
+ tree = cJSON_Parse(test6);
+ TEST_ASSERT_NULL_MESSAGE(tree, "Should fail to parse what is not JSON.");
+
+ TEST_ASSERT_EQUAL_PTR_MESSAGE(test6, cJSON_GetErrorPtr(), "Error pointer is incorrect.");
+
+ if (test6 != NULL)
+ {
+ free(test6);
+ }
+ if (tree != NULL)
+ {
+ cJSON_Delete(tree);
+ }
+}
+
+static void file_test7_should_be_parsed_and_printed(void)
+{
+ do_test("test7");
+}
+
+static void file_test8_should_be_parsed_and_printed(void)
+{
+ do_test("test8");
+}
+
+static void file_test9_should_be_parsed_and_printed(void)
+{
+ do_test("test9");
+}
+
+static void file_test10_should_be_parsed_and_printed(void)
+{
+ do_test("test10");
+}
+
+static void file_test11_should_be_parsed_and_printed(void)
+{
+ do_test("test11");
+}
+
+static void test12_should_not_be_parsed(void)
+{
+ const char *test12 = "{ \"name\": ";
+ cJSON *tree = NULL;
+
+ tree = cJSON_Parse(test12);
+ TEST_ASSERT_NULL_MESSAGE(tree, "Should fail to parse incomplete JSON.");
+
+ TEST_ASSERT_EQUAL_PTR_MESSAGE(test12 + strlen(test12), cJSON_GetErrorPtr(), "Error pointer is incorrect.");
+
+ if (tree != NULL)
+ {
+ cJSON_Delete(tree);
+ }
+}
+
+int CJSON_CDECL main(void)
+{
+ UNITY_BEGIN();
+ RUN_TEST(file_test1_should_be_parsed_and_printed);
+ RUN_TEST(file_test2_should_be_parsed_and_printed);
+ RUN_TEST(file_test3_should_be_parsed_and_printed);
+ RUN_TEST(file_test4_should_be_parsed_and_printed);
+ RUN_TEST(file_test5_should_be_parsed_and_printed);
+ RUN_TEST(file_test6_should_not_be_parsed);
+ RUN_TEST(file_test7_should_be_parsed_and_printed);
+ RUN_TEST(file_test8_should_be_parsed_and_printed);
+ RUN_TEST(file_test9_should_be_parsed_and_printed);
+ RUN_TEST(file_test10_should_be_parsed_and_printed);
+ RUN_TEST(file_test11_should_be_parsed_and_printed);
+ RUN_TEST(test12_should_not_be_parsed);
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/parse_hex4.c b/support/cJSON-master/tests/parse_hex4.c
new file mode 100644
index 0000000..83cbe65
--- /dev/null
+++ b/support/cJSON-master/tests/parse_hex4.c
@@ -0,0 +1,73 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static void parse_hex4_should_parse_all_combinations(void)
+{
+ unsigned int number = 0;
+ unsigned char digits_lower[6];
+ unsigned char digits_upper[6];
+ /* test all combinations */
+ for (number = 0; number <= 0xFFFF; number++)
+ {
+ TEST_ASSERT_EQUAL_INT_MESSAGE(4, sprintf((char*)digits_lower, "%.4x", number), "sprintf failed.");
+ TEST_ASSERT_EQUAL_INT_MESSAGE(4, sprintf((char*)digits_upper, "%.4X", number), "sprintf failed.");
+
+ TEST_ASSERT_EQUAL_INT_MESSAGE(number, parse_hex4(digits_lower), "Failed to parse lowercase digits.");
+ TEST_ASSERT_EQUAL_INT_MESSAGE(number, parse_hex4(digits_upper), "Failed to parse uppercase digits.");
+ }
+}
+
+static void parse_hex4_should_parse_mixed_case(void)
+{
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"beef"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"beeF"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"beEf"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"beEF"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"bEef"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"bEeF"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"bEEf"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"bEEF"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"Beef"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"BeeF"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"BeEf"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"BeEF"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"BEef"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"BEeF"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"BEEf"));
+ TEST_ASSERT_EQUAL_INT(0xBEEF, parse_hex4((const unsigned char*)"BEEF"));
+}
+
+int CJSON_CDECL main(void)
+{
+ UNITY_BEGIN();
+ RUN_TEST(parse_hex4_should_parse_all_combinations);
+ RUN_TEST(parse_hex4_should_parse_mixed_case);
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/parse_number.c b/support/cJSON-master/tests/parse_number.c
new file mode 100644
index 0000000..4cb72ec
--- /dev/null
+++ b/support/cJSON-master/tests/parse_number.c
@@ -0,0 +1,110 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static cJSON item[1];
+
+static void assert_is_number(cJSON *number_item)
+{
+ TEST_ASSERT_NOT_NULL_MESSAGE(number_item, "Item is NULL.");
+
+ assert_not_in_list(number_item);
+ assert_has_no_child(number_item);
+ assert_has_type(number_item, cJSON_Number);
+ assert_has_no_reference(number_item);
+ assert_has_no_const_string(number_item);
+ assert_has_no_valuestring(number_item);
+ assert_has_no_string(number_item);
+}
+
+static void assert_parse_number(const char *string, int integer, double real)
+{
+ parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.content = (const unsigned char*)string;
+ buffer.length = strlen(string) + sizeof("");
+
+ TEST_ASSERT_TRUE(parse_number(item, &buffer));
+ assert_is_number(item);
+ TEST_ASSERT_EQUAL_INT(integer, item->valueint);
+ TEST_ASSERT_EQUAL_DOUBLE(real, item->valuedouble);
+}
+
+static void parse_number_should_parse_zero(void)
+{
+ assert_parse_number("0", 0, 0);
+ assert_parse_number("0.0", 0, 0.0);
+ assert_parse_number("-0", 0, -0.0);
+}
+
+static void parse_number_should_parse_negative_integers(void)
+{
+ assert_parse_number("-1", -1, -1);
+ assert_parse_number("-32768", -32768, -32768.0);
+ assert_parse_number("-2147483648", (int)-2147483648.0, -2147483648.0);
+}
+
+static void parse_number_should_parse_positive_integers(void)
+{
+ assert_parse_number("1", 1, 1);
+ assert_parse_number("32767", 32767, 32767.0);
+ assert_parse_number("2147483647", (int)2147483647.0, 2147483647.0);
+}
+
+static void parse_number_should_parse_positive_reals(void)
+{
+ assert_parse_number("0.001", 0, 0.001);
+ assert_parse_number("10e-10", 0, 10e-10);
+ assert_parse_number("10E-10", 0, 10e-10);
+ assert_parse_number("10e10", INT_MAX, 10e10);
+ assert_parse_number("123e+127", INT_MAX, 123e127);
+ assert_parse_number("123e-128", 0, 123e-128);
+}
+
+static void parse_number_should_parse_negative_reals(void)
+{
+ assert_parse_number("-0.001", 0, -0.001);
+ assert_parse_number("-10e-10", 0, -10e-10);
+ assert_parse_number("-10E-10", 0, -10e-10);
+ assert_parse_number("-10e20", INT_MIN, -10e20);
+ assert_parse_number("-123e+127", INT_MIN, -123e127);
+ assert_parse_number("-123e-128", 0, -123e-128);
+}
+
+int CJSON_CDECL main(void)
+{
+ /* initialize cJSON item */
+ memset(item, 0, sizeof(cJSON));
+ UNITY_BEGIN();
+ RUN_TEST(parse_number_should_parse_zero);
+ RUN_TEST(parse_number_should_parse_negative_integers);
+ RUN_TEST(parse_number_should_parse_positive_integers);
+ RUN_TEST(parse_number_should_parse_positive_reals);
+ RUN_TEST(parse_number_should_parse_negative_reals);
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/parse_object.c b/support/cJSON-master/tests/parse_object.c
new file mode 100644
index 0000000..5f8e7cf
--- /dev/null
+++ b/support/cJSON-master/tests/parse_object.c
@@ -0,0 +1,176 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static cJSON item[1];
+
+static void assert_is_object(cJSON *object_item)
+{
+ TEST_ASSERT_NOT_NULL_MESSAGE(object_item, "Item is NULL.");
+
+ assert_not_in_list(object_item);
+ assert_has_type(object_item, cJSON_Object);
+ assert_has_no_reference(object_item);
+ assert_has_no_const_string(object_item);
+ assert_has_no_valuestring(object_item);
+ assert_has_no_string(object_item);
+}
+
+static void assert_is_child(cJSON *child_item, const char *name, int type)
+{
+ TEST_ASSERT_NOT_NULL_MESSAGE(child_item, "Child item is NULL.");
+ TEST_ASSERT_NOT_NULL_MESSAGE(child_item->string, "Child item doesn't have a name.");
+ TEST_ASSERT_EQUAL_STRING_MESSAGE(name, child_item->string, "Child item has the wrong name.");
+ TEST_ASSERT_BITS(0xFF, type, child_item->type);
+}
+
+static void assert_not_object(const char *json)
+{
+ parse_buffer parsebuffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ parsebuffer.content = (const unsigned char*)json;
+ parsebuffer.length = strlen(json) + sizeof("");
+ parsebuffer.hooks = global_hooks;
+
+ TEST_ASSERT_FALSE(parse_object(item, &parsebuffer));
+ assert_is_invalid(item);
+ reset(item);
+}
+
+static void assert_parse_object(const char *json)
+{
+ parse_buffer parsebuffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ parsebuffer.content = (const unsigned char*)json;
+ parsebuffer.length = strlen(json) + sizeof("");
+ parsebuffer.hooks = global_hooks;
+
+ TEST_ASSERT_TRUE(parse_object(item, &parsebuffer));
+ assert_is_object(item);
+}
+
+static void parse_object_should_parse_empty_objects(void)
+{
+ assert_parse_object("{}");
+ assert_has_no_child(item);
+ reset(item);
+
+ assert_parse_object("{\n\t}");
+ assert_has_no_child(item);
+ reset(item);
+}
+
+static void parse_object_should_parse_objects_with_one_element(void)
+{
+
+ assert_parse_object("{\"one\":1}");
+ assert_is_child(item->child, "one", cJSON_Number);
+ reset(item);
+
+ assert_parse_object("{\"hello\":\"world!\"}");
+ assert_is_child(item->child, "hello", cJSON_String);
+ reset(item);
+
+ assert_parse_object("{\"array\":[]}");
+ assert_is_child(item->child, "array", cJSON_Array);
+ reset(item);
+
+ assert_parse_object("{\"null\":null}");
+ assert_is_child(item->child, "null", cJSON_NULL);
+ reset(item);
+}
+
+static void parse_object_should_parse_objects_with_multiple_elements(void)
+{
+ assert_parse_object("{\"one\":1\t,\t\"two\"\n:2, \"three\":3}");
+ assert_is_child(item->child, "one", cJSON_Number);
+ assert_is_child(item->child->next, "two", cJSON_Number);
+ assert_is_child(item->child->next->next, "three", cJSON_Number);
+ reset(item);
+
+ {
+ size_t i = 0;
+ cJSON *node = NULL;
+ int expected_types[7] =
+ {
+ cJSON_Number,
+ cJSON_NULL,
+ cJSON_True,
+ cJSON_False,
+ cJSON_Array,
+ cJSON_String,
+ cJSON_Object
+ };
+ const char *expected_names[7] =
+ {
+ "one",
+ "NULL",
+ "TRUE",
+ "FALSE",
+ "array",
+ "world",
+ "object"
+ };
+ assert_parse_object("{\"one\":1, \"NULL\":null, \"TRUE\":true, \"FALSE\":false, \"array\":[], \"world\":\"hello\", \"object\":{}}");
+
+ node = item->child;
+ for (
+ i = 0;
+ (i < (sizeof(expected_types)/sizeof(int)))
+ && (node != NULL);
+ (void)i++, node = node->next)
+ {
+ assert_is_child(node, expected_names[i], expected_types[i]);
+ }
+ TEST_ASSERT_EQUAL_INT(i, 7);
+ reset(item);
+ }
+}
+
+static void parse_object_should_not_parse_non_objects(void)
+{
+ assert_not_object("");
+ assert_not_object("{");
+ assert_not_object("}");
+ assert_not_object("[\"hello\",{}]");
+ assert_not_object("42");
+ assert_not_object("3.14");
+ assert_not_object("\"{}hello world!\n\"");
+}
+
+int CJSON_CDECL main(void)
+{
+ /* initialize cJSON item */
+ memset(item, 0, sizeof(cJSON));
+
+ UNITY_BEGIN();
+ RUN_TEST(parse_object_should_parse_empty_objects);
+ RUN_TEST(parse_object_should_not_parse_non_objects);
+ RUN_TEST(parse_object_should_parse_objects_with_multiple_elements);
+ RUN_TEST(parse_object_should_parse_objects_with_one_element);
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/parse_string.c b/support/cJSON-master/tests/parse_string.c
new file mode 100644
index 0000000..ce1c138
--- /dev/null
+++ b/support/cJSON-master/tests/parse_string.c
@@ -0,0 +1,135 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static cJSON item[1];
+
+static void assert_is_string(cJSON *string_item)
+{
+ TEST_ASSERT_NOT_NULL_MESSAGE(string_item, "Item is NULL.");
+
+ assert_not_in_list(string_item);
+ assert_has_no_child(string_item);
+ assert_has_type(string_item, cJSON_String);
+ assert_has_no_reference(string_item);
+ assert_has_no_const_string(string_item);
+ assert_has_valuestring(string_item);
+ assert_has_no_string(string_item);
+}
+
+static void assert_parse_string(const char *string, const char *expected)
+{
+ parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.content = (const unsigned char*)string;
+ buffer.length = strlen(string) + sizeof("");
+ buffer.hooks = global_hooks;
+
+ TEST_ASSERT_TRUE_MESSAGE(parse_string(item, &buffer), "Couldn't parse string.");
+ assert_is_string(item);
+ TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, item->valuestring, "The parsed result isn't as expected.");
+ global_hooks.deallocate(item->valuestring);
+ item->valuestring = NULL;
+}
+
+static void assert_not_parse_string(const char * const string)
+{
+ parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.content = (const unsigned char*)string;
+ buffer.length = strlen(string) + sizeof("");
+ buffer.hooks = global_hooks;
+
+ TEST_ASSERT_FALSE_MESSAGE(parse_string(item, &buffer), "Malformed string should not be accepted.");
+ assert_is_invalid(item);
+}
+
+
+
+static void parse_string_should_parse_strings(void)
+{
+ assert_parse_string("\"\"", "");
+ assert_parse_string(
+ "\" !\\\"#$%&'()*+,-./\\/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_'abcdefghijklmnopqrstuvwxyz{|}~\"",
+ " !\"#$%&'()*+,-.//0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~");
+ assert_parse_string(
+ "\"\\\"\\\\\\/\\b\\f\\n\\r\\t\\u20AC\\u732b\"",
+ "\"\\/\b\f\n\r\t€猫");
+ reset(item);
+ assert_parse_string("\"\b\f\n\r\t\"", "\b\f\n\r\t");
+ reset(item);
+}
+
+static void parse_string_should_parse_utf16_surrogate_pairs(void)
+{
+ assert_parse_string("\"\\uD83D\\udc31\"", "🐱");
+ reset(item);
+}
+
+static void parse_string_should_not_parse_non_strings(void)
+{
+ assert_not_parse_string("this\" is not a string\"");
+ reset(item);
+ assert_not_parse_string("");
+ reset(item);
+}
+
+static void parse_string_should_not_parse_invalid_backslash(void)
+{
+ assert_not_parse_string("Abcdef\\123");
+ reset(item);
+ assert_not_parse_string("Abcdef\\e23");
+ reset(item);
+}
+
+static void parse_string_should_not_overflow_with_closing_backslash(void)
+{
+ assert_not_parse_string("\"000000000000000000\\");
+ reset(item);
+}
+
+static void parse_string_should_parse_bug_94(void)
+{
+ const char string[] = "\"~!@\\\\#$%^&*()\\\\\\\\-\\\\+{}[]:\\\\;\\\\\\\"\\\\<\\\\>?/.,DC=ad,DC=com\"";
+ assert_parse_string(string, "~!@\\#$%^&*()\\\\-\\+{}[]:\\;\\\"\\<\\>?/.,DC=ad,DC=com");
+ reset(item);
+}
+
+int CJSON_CDECL main(void)
+{
+ /* initialize cJSON item and error pointer */
+ memset(item, 0, sizeof(cJSON));
+
+ UNITY_BEGIN();
+ RUN_TEST(parse_string_should_parse_strings);
+ RUN_TEST(parse_string_should_parse_utf16_surrogate_pairs);
+ RUN_TEST(parse_string_should_not_parse_non_strings);
+ RUN_TEST(parse_string_should_not_parse_invalid_backslash);
+ RUN_TEST(parse_string_should_parse_bug_94);
+ RUN_TEST(parse_string_should_not_overflow_with_closing_backslash);
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/parse_value.c b/support/cJSON-master/tests/parse_value.c
new file mode 100644
index 0000000..6b6b095
--- /dev/null
+++ b/support/cJSON-master/tests/parse_value.c
@@ -0,0 +1,112 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static cJSON item[1];
+
+static void assert_is_value(cJSON *value_item, int type)
+{
+ TEST_ASSERT_NOT_NULL_MESSAGE(value_item, "Item is NULL.");
+
+ assert_not_in_list(value_item);
+ assert_has_type(value_item, type);
+ assert_has_no_reference(value_item);
+ assert_has_no_const_string(value_item);
+ assert_has_no_string(value_item);
+}
+
+static void assert_parse_value(const char *string, int type)
+{
+ parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.content = (const unsigned char*) string;
+ buffer.length = strlen(string) + sizeof("");
+ buffer.hooks = global_hooks;
+
+ TEST_ASSERT_TRUE(parse_value(item, &buffer));
+ assert_is_value(item, type);
+}
+
+static void parse_value_should_parse_null(void)
+{
+ assert_parse_value("null", cJSON_NULL);
+ reset(item);
+}
+
+static void parse_value_should_parse_true(void)
+{
+ assert_parse_value("true", cJSON_True);
+ reset(item);
+}
+
+static void parse_value_should_parse_false(void)
+{
+ assert_parse_value("false", cJSON_False);
+ reset(item);
+}
+
+static void parse_value_should_parse_number(void)
+{
+ assert_parse_value("1.5", cJSON_Number);
+ reset(item);
+}
+
+static void parse_value_should_parse_string(void)
+{
+ assert_parse_value("\"\"", cJSON_String);
+ reset(item);
+ assert_parse_value("\"hello\"", cJSON_String);
+ reset(item);
+}
+
+static void parse_value_should_parse_array(void)
+{
+ assert_parse_value("[]", cJSON_Array);
+ reset(item);
+}
+
+static void parse_value_should_parse_object(void)
+{
+ assert_parse_value("{}", cJSON_Object);
+ reset(item);
+}
+
+int CJSON_CDECL main(void)
+{
+ /* initialize cJSON item */
+ memset(item, 0, sizeof(cJSON));
+ UNITY_BEGIN();
+ RUN_TEST(parse_value_should_parse_null);
+ RUN_TEST(parse_value_should_parse_true);
+ RUN_TEST(parse_value_should_parse_false);
+ RUN_TEST(parse_value_should_parse_number);
+ RUN_TEST(parse_value_should_parse_string);
+ RUN_TEST(parse_value_should_parse_array);
+ RUN_TEST(parse_value_should_parse_object);
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/parse_with_opts.c b/support/cJSON-master/tests/parse_with_opts.c
new file mode 100644
index 0000000..e390b92
--- /dev/null
+++ b/support/cJSON-master/tests/parse_with_opts.c
@@ -0,0 +1,112 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static void parse_with_opts_should_handle_null(void)
+{
+ const char *error_pointer = NULL;
+ cJSON *item = NULL;
+ TEST_ASSERT_NULL_MESSAGE(cJSON_ParseWithOpts(NULL, &error_pointer, false), "Failed to handle NULL input.");
+ item = cJSON_ParseWithOpts("{}", NULL, false);
+ TEST_ASSERT_NOT_NULL_MESSAGE(item, "Failed to handle NULL error pointer.");
+ cJSON_Delete(item);
+ TEST_ASSERT_NULL_MESSAGE(cJSON_ParseWithOpts(NULL, NULL, false), "Failed to handle both NULL.");
+ TEST_ASSERT_NULL_MESSAGE(cJSON_ParseWithOpts("{", NULL, false), "Failed to handle NULL error pointer with parse error.");
+}
+
+static void parse_with_opts_should_handle_empty_strings(void)
+{
+ const char empty_string[] = "";
+ const char *error_pointer = NULL;
+
+ TEST_ASSERT_NULL(cJSON_ParseWithOpts(empty_string, NULL, false));
+ TEST_ASSERT_EQUAL_PTR(empty_string, cJSON_GetErrorPtr());
+
+ TEST_ASSERT_NULL(cJSON_ParseWithOpts(empty_string, &error_pointer, false));
+ TEST_ASSERT_EQUAL_PTR(empty_string, error_pointer);
+ TEST_ASSERT_EQUAL_PTR(empty_string, cJSON_GetErrorPtr());
+}
+
+static void parse_with_opts_should_handle_incomplete_json(void)
+{
+ const char json[] = "{ \"name\": ";
+ const char *parse_end = NULL;
+
+ TEST_ASSERT_NULL(cJSON_ParseWithOpts(json, &parse_end, false));
+ TEST_ASSERT_EQUAL_PTR(json + strlen(json), parse_end);
+ TEST_ASSERT_EQUAL_PTR(json + strlen(json), cJSON_GetErrorPtr());
+}
+
+static void parse_with_opts_should_require_null_if_requested(void)
+{
+ cJSON *item = cJSON_ParseWithOpts("{}", NULL, true);
+ TEST_ASSERT_NOT_NULL(item);
+ cJSON_Delete(item);
+ item = cJSON_ParseWithOpts("{} \n", NULL, true);
+ TEST_ASSERT_NOT_NULL(item);
+ cJSON_Delete(item);
+ TEST_ASSERT_NULL(cJSON_ParseWithOpts("{}x", NULL, true));
+}
+
+static void parse_with_opts_should_return_parse_end(void)
+{
+ const char json[] = "[] empty array XD";
+ const char *parse_end = NULL;
+
+ cJSON *item = cJSON_ParseWithOpts(json, &parse_end, false);
+ TEST_ASSERT_NOT_NULL(item);
+ TEST_ASSERT_EQUAL_PTR(json + 2, parse_end);
+ cJSON_Delete(item);
+}
+
+static void parse_with_opts_should_parse_utf8_bom(void)
+{
+ cJSON *with_bom = NULL;
+ cJSON *without_bom = NULL;
+
+ with_bom = cJSON_ParseWithOpts("\xEF\xBB\xBF{}", NULL, true);
+ TEST_ASSERT_NOT_NULL(with_bom);
+ without_bom = cJSON_ParseWithOpts("{}", NULL, true);
+ TEST_ASSERT_NOT_NULL(with_bom);
+
+ TEST_ASSERT_TRUE(cJSON_Compare(with_bom, without_bom, true));
+
+ cJSON_Delete(with_bom);
+ cJSON_Delete(without_bom);
+}
+
+int CJSON_CDECL main(void)
+{
+ UNITY_BEGIN();
+
+ RUN_TEST(parse_with_opts_should_handle_null);
+ RUN_TEST(parse_with_opts_should_handle_empty_strings);
+ RUN_TEST(parse_with_opts_should_handle_incomplete_json);
+ RUN_TEST(parse_with_opts_should_require_null_if_requested);
+ RUN_TEST(parse_with_opts_should_return_parse_end);
+ RUN_TEST(parse_with_opts_should_parse_utf8_bom);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/print_array.c b/support/cJSON-master/tests/print_array.c
new file mode 100644
index 0000000..7d40f2e
--- /dev/null
+++ b/support/cJSON-master/tests/print_array.c
@@ -0,0 +1,100 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static void assert_print_array(const char * const expected, const char * const input)
+{
+ unsigned char printed_unformatted[1024];
+ unsigned char printed_formatted[1024];
+
+ cJSON item[1];
+
+ printbuffer formatted_buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };
+ printbuffer unformatted_buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };
+
+ parse_buffer parsebuffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ parsebuffer.content = (const unsigned char*)input;
+ parsebuffer.length = strlen(input) + sizeof("");
+ parsebuffer.hooks = global_hooks;
+
+ /* buffer for formatted printing */
+ formatted_buffer.buffer = printed_formatted;
+ formatted_buffer.length = sizeof(printed_formatted);
+ formatted_buffer.offset = 0;
+ formatted_buffer.noalloc = true;
+ formatted_buffer.hooks = global_hooks;
+
+ /* buffer for unformatted printing */
+ unformatted_buffer.buffer = printed_unformatted;
+ unformatted_buffer.length = sizeof(printed_unformatted);
+ unformatted_buffer.offset = 0;
+ unformatted_buffer.noalloc = true;
+ unformatted_buffer.hooks = global_hooks;
+
+ memset(item, 0, sizeof(item));
+ TEST_ASSERT_TRUE_MESSAGE(parse_array(item, &parsebuffer), "Failed to parse array.");
+
+ unformatted_buffer.format = false;
+ TEST_ASSERT_TRUE_MESSAGE(print_array(item, &unformatted_buffer), "Failed to print unformatted string.");
+ TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted array is not correct.");
+
+ formatted_buffer.format = true;
+ TEST_ASSERT_TRUE_MESSAGE(print_array(item, &formatted_buffer), "Failed to print formatted string.");
+ TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, printed_formatted, "Formatted array is not correct.");
+
+ reset(item);
+}
+
+static void print_array_should_print_empty_arrays(void)
+{
+ assert_print_array("[]", "[]");
+}
+
+static void print_array_should_print_arrays_with_one_element(void)
+{
+
+ assert_print_array("[1]", "[1]");
+ assert_print_array("[\"hello!\"]", "[\"hello!\"]");
+ assert_print_array("[[]]", "[[]]");
+ assert_print_array("[null]", "[null]");
+}
+
+static void print_array_should_print_arrays_with_multiple_elements(void)
+{
+ assert_print_array("[1, 2, 3]", "[1,2,3]");
+ assert_print_array("[1, null, true, false, [], \"hello\", {\n\t}]", "[1,null,true,false,[],\"hello\",{}]");
+}
+
+int CJSON_CDECL main(void)
+{
+ /* initialize cJSON item */
+ UNITY_BEGIN();
+
+ RUN_TEST(print_array_should_print_empty_arrays);
+ RUN_TEST(print_array_should_print_arrays_with_one_element);
+ RUN_TEST(print_array_should_print_arrays_with_multiple_elements);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/print_number.c b/support/cJSON-master/tests/print_number.c
new file mode 100644
index 0000000..f2385f3
--- /dev/null
+++ b/support/cJSON-master/tests/print_number.c
@@ -0,0 +1,105 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static void assert_print_number(const char *expected, double input)
+{
+ unsigned char printed[1024];
+ cJSON item[1];
+ printbuffer buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.buffer = printed;
+ buffer.length = sizeof(printed);
+ buffer.offset = 0;
+ buffer.noalloc = true;
+ buffer.hooks = global_hooks;
+
+ memset(item, 0, sizeof(item));
+ cJSON_SetNumberValue(item, input);
+
+ TEST_ASSERT_TRUE_MESSAGE(print_number(item, &buffer), "Failed to print number.");
+ TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, buffer.buffer, "Printed number is not as expected.");
+}
+
+static void print_number_should_print_zero(void)
+{
+ assert_print_number("0", 0);
+}
+
+static void print_number_should_print_negative_integers(void)
+{
+ assert_print_number("-1", -1.0);
+ assert_print_number("-32768", -32768.0);
+ assert_print_number("-2147483648", -2147483648.0);
+}
+
+static void print_number_should_print_positive_integers(void)
+{
+ assert_print_number("1", 1.0);
+ assert_print_number("32767", 32767.0);
+ assert_print_number("2147483647", 2147483647.0);
+}
+
+static void print_number_should_print_positive_reals(void)
+{
+ assert_print_number("0.123", 0.123);
+ assert_print_number("1e-09", 10e-10);
+ assert_print_number("1000000000000", 10e11);
+ assert_print_number("1.23e+129", 123e+127);
+ assert_print_number("1.23e-126", 123e-128);
+ assert_print_number("3.1415926535897931", 3.1415926535897931);
+}
+
+static void print_number_should_print_negative_reals(void)
+{
+ assert_print_number("-0.0123", -0.0123);
+ assert_print_number("-1e-09", -10e-10);
+ assert_print_number("-1e+21", -10e20);
+ assert_print_number("-1.23e+129", -123e+127);
+ assert_print_number("-1.23e-126", -123e-128);
+}
+
+static void print_number_should_print_non_number(void)
+{
+ TEST_IGNORE();
+ /* FIXME: Cannot test this easily in C89! */
+ /* assert_print_number("null", NaN); */
+ /* assert_print_number("null", INFTY); */
+ /* assert_print_number("null", -INFTY); */
+}
+
+int CJSON_CDECL main(void)
+{
+ /* initialize cJSON item */
+ UNITY_BEGIN();
+
+ RUN_TEST(print_number_should_print_zero);
+ RUN_TEST(print_number_should_print_negative_integers);
+ RUN_TEST(print_number_should_print_positive_integers);
+ RUN_TEST(print_number_should_print_positive_reals);
+ RUN_TEST(print_number_should_print_negative_reals);
+ RUN_TEST(print_number_should_print_non_number);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/print_object.c b/support/cJSON-master/tests/print_object.c
new file mode 100644
index 0000000..3ed0bfe
--- /dev/null
+++ b/support/cJSON-master/tests/print_object.c
@@ -0,0 +1,101 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static void assert_print_object(const char * const expected, const char * const input)
+{
+ unsigned char printed_unformatted[1024];
+ unsigned char printed_formatted[1024];
+
+ cJSON item[1];
+
+ printbuffer formatted_buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };
+ printbuffer unformatted_buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };
+ parse_buffer parsebuffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+
+ /* buffer for parsing */
+ parsebuffer.content = (const unsigned char*)input;
+ parsebuffer.length = strlen(input) + sizeof("");
+ parsebuffer.hooks = global_hooks;
+
+ /* buffer for formatted printing */
+ formatted_buffer.buffer = printed_formatted;
+ formatted_buffer.length = sizeof(printed_formatted);
+ formatted_buffer.offset = 0;
+ formatted_buffer.noalloc = true;
+ formatted_buffer.hooks = global_hooks;
+
+ /* buffer for unformatted printing */
+ unformatted_buffer.buffer = printed_unformatted;
+ unformatted_buffer.length = sizeof(printed_unformatted);
+ unformatted_buffer.offset = 0;
+ unformatted_buffer.noalloc = true;
+ unformatted_buffer.hooks = global_hooks;
+
+ memset(item, 0, sizeof(item));
+ TEST_ASSERT_TRUE_MESSAGE(parse_object(item, &parsebuffer), "Failed to parse object.");
+
+ unformatted_buffer.format = false;
+ TEST_ASSERT_TRUE_MESSAGE(print_object(item, &unformatted_buffer), "Failed to print unformatted string.");
+ TEST_ASSERT_EQUAL_STRING_MESSAGE(input, printed_unformatted, "Unformatted object is not correct.");
+
+ formatted_buffer.format = true;
+ TEST_ASSERT_TRUE_MESSAGE(print_object(item, &formatted_buffer), "Failed to print formatted string.");
+ TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, printed_formatted, "Formatted ojbect is not correct.");
+
+ reset(item);
+}
+
+static void print_object_should_print_empty_objects(void)
+{
+ assert_print_object("{\n}", "{}");
+}
+
+static void print_object_should_print_objects_with_one_element(void)
+{
+
+ assert_print_object("{\n\t\"one\":\t1\n}", "{\"one\":1}");
+ assert_print_object("{\n\t\"hello\":\t\"world!\"\n}", "{\"hello\":\"world!\"}");
+ assert_print_object("{\n\t\"array\":\t[]\n}", "{\"array\":[]}");
+ assert_print_object("{\n\t\"null\":\tnull\n}", "{\"null\":null}");
+}
+
+static void print_object_should_print_objects_with_multiple_elements(void)
+{
+ assert_print_object("{\n\t\"one\":\t1,\n\t\"two\":\t2,\n\t\"three\":\t3\n}", "{\"one\":1,\"two\":2,\"three\":3}");
+ assert_print_object("{\n\t\"one\":\t1,\n\t\"NULL\":\tnull,\n\t\"TRUE\":\ttrue,\n\t\"FALSE\":\tfalse,\n\t\"array\":\t[],\n\t\"world\":\t\"hello\",\n\t\"object\":\t{\n\t}\n}", "{\"one\":1,\"NULL\":null,\"TRUE\":true,\"FALSE\":false,\"array\":[],\"world\":\"hello\",\"object\":{}}");
+}
+
+int CJSON_CDECL main(void)
+{
+ /* initialize cJSON item */
+ UNITY_BEGIN();
+
+ RUN_TEST(print_object_should_print_empty_objects);
+ RUN_TEST(print_object_should_print_objects_with_one_element);
+ RUN_TEST(print_object_should_print_objects_with_multiple_elements);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/print_string.c b/support/cJSON-master/tests/print_string.c
new file mode 100644
index 0000000..e6f5b92
--- /dev/null
+++ b/support/cJSON-master/tests/print_string.c
@@ -0,0 +1,78 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static void assert_print_string(const char *expected, const char *input)
+{
+ unsigned char printed[1024];
+ printbuffer buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.buffer = printed;
+ buffer.length = sizeof(printed);
+ buffer.offset = 0;
+ buffer.noalloc = true;
+ buffer.hooks = global_hooks;
+
+ TEST_ASSERT_TRUE_MESSAGE(print_string_ptr((const unsigned char*)input, &buffer), "Failed to print string.");
+ TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, printed, "The printed string isn't as expected.");
+}
+
+static void print_string_should_print_empty_strings(void)
+{
+ assert_print_string("\"\"", "");
+ assert_print_string("\"\"", NULL);
+}
+
+static void print_string_should_print_ascii(void)
+{
+ char ascii[0x7F];
+ size_t i = 1;
+
+ /* create ascii table */
+ for (i = 1; i < 0x7F; i++)
+ {
+ ascii[i-1] = (char)i;
+ }
+ ascii[0x7F-1] = '\0';
+
+ assert_print_string("\"\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\"",
+ ascii);
+}
+
+static void print_string_should_print_utf8(void)
+{
+ assert_print_string("\"ü猫慕\"", "ü猫慕");
+}
+
+int CJSON_CDECL main(void)
+{
+ /* initialize cJSON item */
+ UNITY_BEGIN();
+
+ RUN_TEST(print_string_should_print_empty_strings);
+ RUN_TEST(print_string_should_print_ascii);
+ RUN_TEST(print_string_should_print_utf8);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/print_value.c b/support/cJSON-master/tests/print_value.c
new file mode 100644
index 0000000..b54db5b
--- /dev/null
+++ b/support/cJSON-master/tests/print_value.c
@@ -0,0 +1,107 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static void assert_print_value(const char *input)
+{
+ unsigned char printed[1024];
+ cJSON item[1];
+ printbuffer buffer = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };
+ parse_buffer parsebuffer = { 0, 0, 0, 0, { 0, 0, 0 } };
+ buffer.buffer = printed;
+ buffer.length = sizeof(printed);
+ buffer.offset = 0;
+ buffer.noalloc = true;
+ buffer.hooks = global_hooks;
+
+ parsebuffer.content = (const unsigned char*)input;
+ parsebuffer.length = strlen(input) + sizeof("");
+ parsebuffer.hooks = global_hooks;
+
+ memset(item, 0, sizeof(item));
+
+ TEST_ASSERT_TRUE_MESSAGE(parse_value(item, &parsebuffer), "Failed to parse value.");
+
+ TEST_ASSERT_TRUE_MESSAGE(print_value(item, &buffer), "Failed to print value.");
+ TEST_ASSERT_EQUAL_STRING_MESSAGE(input, buffer.buffer, "Printed value is not as expected.");
+
+ reset(item);
+}
+
+static void print_value_should_print_null(void)
+{
+ assert_print_value("null");
+}
+
+static void print_value_should_print_true(void)
+{
+ assert_print_value("true");
+}
+
+static void print_value_should_print_false(void)
+{
+ assert_print_value("false");
+}
+
+static void print_value_should_print_number(void)
+{
+ assert_print_value("1.5");
+}
+
+static void print_value_should_print_string(void)
+{
+ assert_print_value("\"\"");
+ assert_print_value("\"hello\"");
+}
+
+static void print_value_should_print_array(void)
+{
+ assert_print_value("[]");
+}
+
+static void print_value_should_print_object(void)
+{
+ assert_print_value("{}");
+}
+
+int CJSON_CDECL main(void)
+{
+ /* initialize cJSON item */
+ UNITY_BEGIN();
+
+ RUN_TEST(print_value_should_print_null);
+ RUN_TEST(print_value_should_print_true);
+ RUN_TEST(print_value_should_print_false);
+ RUN_TEST(print_value_should_print_number);
+ RUN_TEST(print_value_should_print_string);
+ RUN_TEST(print_value_should_print_array);
+ RUN_TEST(print_value_should_print_object);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/readme_examples.c b/support/cJSON-master/tests/readme_examples.c
new file mode 100644
index 0000000..1ab1b13
--- /dev/null
+++ b/support/cJSON-master/tests/readme_examples.c
@@ -0,0 +1,258 @@
+/*
+ Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+ 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.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static const char *json = "{\n\
+\t\"name\":\t\"Awesome 4K\",\n\
+\t\"resolutions\":\t[{\n\
+\t\t\t\"width\":\t1280,\n\
+\t\t\t\"height\":\t720\n\
+\t\t}, {\n\
+\t\t\t\"width\":\t1920,\n\
+\t\t\t\"height\":\t1080\n\
+\t\t}, {\n\
+\t\t\t\"width\":\t3840,\n\
+\t\t\t\"height\":\t2160\n\
+\t\t}]\n\
+}";
+
+static char* create_monitor(void)
+{
+ const unsigned int resolution_numbers[3][2] = {
+ {1280, 720},
+ {1920, 1080},
+ {3840, 2160}
+ };
+ char *string = NULL;
+ cJSON *name = NULL;
+ cJSON *resolutions = NULL;
+ cJSON *resolution = NULL;
+ cJSON *width = NULL;
+ cJSON *height = NULL;
+ size_t index = 0;
+
+ cJSON *monitor = cJSON_CreateObject();
+ if (monitor == NULL)
+ {
+ goto end;
+ }
+
+ name = cJSON_CreateString("Awesome 4K");
+ if (name == NULL)
+ {
+ goto end;
+ }
+ /* after creation was successful, immediately add it to the monitor,
+ * thereby transfering ownership of the pointer to it */
+ cJSON_AddItemToObject(monitor, "name", name);
+
+ resolutions = cJSON_CreateArray();
+ if (resolutions == NULL)
+ {
+ goto end;
+ }
+ cJSON_AddItemToObject(monitor, "resolutions", resolutions);
+
+ for (index = 0; index < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++index)
+ {
+ resolution = cJSON_CreateObject();
+ if (resolution == NULL)
+ {
+ goto end;
+ }
+ cJSON_AddItemToArray(resolutions, resolution);
+
+ width = cJSON_CreateNumber(resolution_numbers[index][0]);
+ if (width == NULL)
+ {
+ goto end;
+ }
+ cJSON_AddItemToObject(resolution, "width", width);
+
+ height = cJSON_CreateNumber(resolution_numbers[index][1]);
+ if (height == NULL)
+ {
+ goto end;
+ }
+ cJSON_AddItemToObject(resolution, "height", height);
+ }
+
+ string = cJSON_Print(monitor);
+ if (string == NULL)
+ {
+ fprintf(stderr, "Failed to print monitor.\n");
+ }
+
+end:
+ cJSON_Delete(monitor);
+ return string;
+}
+
+static char *create_monitor_with_helpers(void)
+{
+ const unsigned int resolution_numbers[3][2] = {
+ {1280, 720},
+ {1920, 1080},
+ {3840, 2160}
+ };
+ char *string = NULL;
+ cJSON *resolutions = NULL;
+ size_t index = 0;
+
+ cJSON *monitor = cJSON_CreateObject();
+
+ if (cJSON_AddStringToObject(monitor, "name", "Awesome 4K") == NULL)
+ {
+ goto end;
+ }
+
+ resolutions = cJSON_AddArrayToObject(monitor, "resolutions");
+ if (resolutions == NULL)
+ {
+ goto end;
+ }
+
+ for (index = 0; index < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++index)
+ {
+ cJSON *resolution = cJSON_CreateObject();
+
+ if (cJSON_AddNumberToObject(resolution, "width", resolution_numbers[index][0]) == NULL)
+ {
+ goto end;
+ }
+
+ if(cJSON_AddNumberToObject(resolution, "height", resolution_numbers[index][1]) == NULL)
+ {
+ goto end;
+ }
+
+ cJSON_AddItemToArray(resolutions, resolution);
+ }
+
+ string = cJSON_Print(monitor);
+ if (string == NULL) {
+ fprintf(stderr, "Failed to print monitor.\n");
+ }
+
+end:
+ cJSON_Delete(monitor);
+ return string;
+}
+
+/* return 1 if the monitor supports full hd, 0 otherwise */
+static int supports_full_hd(const char * const monitor)
+{
+ const cJSON *resolution = NULL;
+ const cJSON *resolutions = NULL;
+ const cJSON *name = NULL;
+ int status = 0;
+ cJSON *monitor_json = cJSON_Parse(monitor);
+ if (monitor_json == NULL)
+ {
+ const char *error_ptr = cJSON_GetErrorPtr();
+ if (error_ptr != NULL)
+ {
+ fprintf(stderr, "Error before: %s\n", error_ptr);
+ }
+ status = 0;
+ goto end;
+ }
+
+ name = cJSON_GetObjectItemCaseSensitive(monitor_json, "name");
+ if (cJSON_IsString(name) && (name->valuestring != NULL))
+ {
+ printf("Checking monitor \"%s\"\n", name->valuestring);
+ }
+
+ resolutions = cJSON_GetObjectItemCaseSensitive(monitor_json, "resolutions");
+ cJSON_ArrayForEach(resolution, resolutions)
+ {
+ cJSON *width = cJSON_GetObjectItemCaseSensitive(resolution, "width");
+ cJSON *height = cJSON_GetObjectItemCaseSensitive(resolution, "height");
+
+ if (!cJSON_IsNumber(width) || !cJSON_IsNumber(height))
+ {
+ status = 0;
+ goto end;
+ }
+
+ if ((width->valuedouble == 1920) && (height->valuedouble == 1080))
+ {
+ status = 1;
+ goto end;
+ }
+ }
+
+end:
+ cJSON_Delete(monitor_json);
+ return status;
+}
+
+static void create_monitor_should_create_a_monitor(void)
+{
+ char *monitor = create_monitor();
+
+ TEST_ASSERT_EQUAL_STRING(monitor, json);
+
+ free(monitor);
+}
+
+static void create_monitor_with_helpers_should_create_a_monitor(void)
+{
+ char *monitor = create_monitor_with_helpers();
+
+ TEST_ASSERT_EQUAL_STRING(json, monitor);
+
+ free(monitor);
+}
+
+static void supports_full_hd_should_check_for_full_hd_support(void)
+{
+ static const char *monitor_without_hd = "{\n\
+\t\t\"name\": \"lame monitor\",\n\
+\t\t\"resolutions\":\t[{\n\
+\t\t\t\"width\":\t640,\n\
+\t\t\t\"height\":\t480\n\
+\t\t}]\n\
+}";
+
+ TEST_ASSERT(supports_full_hd(json));
+ TEST_ASSERT_FALSE(supports_full_hd(monitor_without_hd));
+}
+
+int CJSON_CDECL main(void)
+{
+ UNITY_BEGIN();
+
+ RUN_TEST(create_monitor_should_create_a_monitor);
+ RUN_TEST(create_monitor_with_helpers_should_create_a_monitor);
+ RUN_TEST(supports_full_hd_should_check_for_full_hd_support);
+
+ return UNITY_END();
+}
diff --git a/support/cJSON-master/tests/unity/.gitattributes b/support/cJSON-master/tests/unity/.gitattributes
new file mode 100644
index 0000000..ad95226
--- /dev/null
+++ b/support/cJSON-master/tests/unity/.gitattributes
@@ -0,0 +1,30 @@
+* 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
+
+
+#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
diff --git a/support/cJSON-master/tests/unity/.gitignore b/support/cJSON-master/tests/unity/.gitignore
new file mode 100644
index 0000000..a383c3c
--- /dev/null
+++ b/support/cJSON-master/tests/unity/.gitignore
@@ -0,0 +1,9 @@
+build/
+test/sandbox
+.DS_Store
+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
diff --git a/support/cJSON-master/tests/unity/.travis.yml b/support/cJSON-master/tests/unity/.travis.yml
new file mode 100644
index 0000000..bd165b1
--- /dev/null
+++ b/support/cJSON-master/tests/unity/.travis.yml
@@ -0,0 +1,29 @@
+language: c
+
+matrix:
+ include:
+ - os: osx
+ compiler: clang
+ osx_image: xcode7.3
+ - os: linux
+ dist: trusty
+ compiler: gcc
+
+before_install:
+ - if [ "$TRAVIS_OS_NAME" == "osx" ]; then rvm install 2.1 && rvm use 2.1 && ruby -v; fi
+ - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install --assume-yes --quiet gcc-multilib; fi
+install:
+ - gem install rspec
+ - gem install rubocop
+script:
+ - cd test && rake ci
+ - make -s
+ - make -s DEBUG=-m32 #32-bit architecture with 64-bit support
+ - make -s DEBUG=-m32 UNITY_SUPPORT_64= #32-bit build without 64-bit types
+ - make -s UNITY_INCLUDE_DOUBLE= # without double
+ - cd ../extras/fixture/test && rake ci
+ - make -s default noStdlibMalloc
+ - make -s C89
+ - cd ../../../examples/example_1 && make -s ci
+ - cd ../example_2 && make -s ci
+ - cd ../example_3 && rake
diff --git a/support/cJSON-master/tests/unity/README.md b/support/cJSON-master/tests/unity/README.md
new file mode 100644
index 0000000..ec73b4a
--- /dev/null
+++ b/support/cJSON-master/tests/unity/README.md
@@ -0,0 +1,231 @@
+Unity Test API
+==============
+
+[![Unity Build Status](https://api.travis-ci.org/ThrowTheSwitch/Unity.png?branch=master)](https://travis-ci.org/ThrowTheSwitch/Unity)
+__Copyright (c) 2007 - 2017 Unity Project by Mike Karlesky, Mark VanderVoord, and Greg Williams__
+
+Running Tests
+-------------
+
+ RUN_TEST(func, linenum)
+
+Each Test is run within the macro `RUN_TEST`. This macro performs necessary setup before the test is called and handles cleanup and result tabulation afterwards.
+
+Ignoring Tests
+--------------
+
+There are times when a test is incomplete or not valid for some reason. At these times, TEST_IGNORE can be called. Control will immediately be returned to the caller of the test, and no failures will be returned.
+
+ TEST_IGNORE()
+
+Ignore this test and return immediately
+
+ TEST_IGNORE_MESSAGE (message)
+
+Ignore this test and return immediately. Output a message stating why the test was ignored.
+
+Aborting Tests
+--------------
+
+There are times when a test will contain an infinite loop on error conditions, or there may be reason to escape from the test early without executing the rest of the test. A pair of macros support this functionality in Unity. The first `TEST_PROTECT` sets up the feature, and handles emergency abort cases. `TEST_ABORT` can then be used at any time within the tests to return to the last `TEST_PROTECT` call.
+
+ TEST_PROTECT()
+
+Setup and Catch macro
+
+ TEST_ABORT()
+
+Abort Test macro
+
+Example:
+
+ main()
+ {
+ if (TEST_PROTECT())
+ {
+ MyTest();
+ }
+ }
+
+If MyTest calls `TEST_ABORT`, program control will immediately return to `TEST_PROTECT` with a return value of zero.
+
+
+Unity Assertion Summary
+=======================
+
+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,
+like when comparing arrays, 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)
+
+Asserts that the actual value is 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.
+
+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.
+
diff --git a/support/cJSON-master/tests/unity/auto/colour_prompt.rb b/support/cJSON-master/tests/unity/auto/colour_prompt.rb
new file mode 100644
index 0000000..0f1dc4e
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/colour_prompt.rb
@@ -0,0 +1,118 @@
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+# [Released under MIT License. Please refer to license.txt for details]
+# ==========================================
+
+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 # ColourCommandLine
+
+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
diff --git a/support/cJSON-master/tests/unity/auto/colour_reporter.rb b/support/cJSON-master/tests/unity/auto/colour_reporter.rb
new file mode 100644
index 0000000..bb1fbfc
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/colour_reporter.rb
@@ -0,0 +1,39 @@
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+# [Released under MIT License. Please refer to license.txt for details]
+# ==========================================
+
+require "#{File.expand_path(File.dirname(__FILE__))}/colour_prompt"
+
+$colour_output = true
+
+def report(message)
+ if !$colour_output
+ $stdout.puts(message)
+ else
+ message = message.join('\n') if message.class == 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
diff --git a/support/cJSON-master/tests/unity/auto/generate_config.yml b/support/cJSON-master/tests/unity/auto/generate_config.yml
new file mode 100644
index 0000000..4a5e474
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/generate_config.yml
@@ -0,0 +1,36 @@
+#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
+ //-------------------------------------------
diff --git a/support/cJSON-master/tests/unity/auto/generate_module.rb b/support/cJSON-master/tests/unity/auto/generate_module.rb
new file mode 100644
index 0000000..13b4cc7
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/generate_module.rb
@@ -0,0 +1,308 @@
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+# [Released under MIT License. Please refer to license.txt for details]
+# ==========================================
+
+# 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 ||= '#include "unity.h"
+%2$s#include "%1$s.h"
+
+void setUp(void)
+{
+}
+
+void tearDown(void)
+{
+}
+
+void test_%1$s_NeedToImplement(void)
+{
+ TEST_IGNORE_MESSAGE("Need to Implement %1$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)
+ here = File.expand_path(File.dirname(__FILE__)) + '/'
+
+ @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] = here + '../src/' if @options[:path_src].nil?
+ @options[:path_inc] = @options[:path_src] if @options[:path_inc].nil?
+ @options[:path_tst] = here + '../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'
+ }
+ end
+
+ ############################
+ def self.grab_config(config_file)
+ options = default_options
+ unless config_file.nil? || config_file.empty?
+ require 'yaml'
+ yaml_guts = YAML.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] }]
+
+ # 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],
+ 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 create_filename(part1, part2 = '')
+ if part2.empty?
+ case (@options[:naming])
+ when 'bumpy' then part1
+ when 'camel' then part1
+ when 'snake' then part1.downcase
+ when 'caps' then part1.upcase
+ else part1
+ end
+ else
+ case (@options[:naming])
+ when 'bumpy' then part1 + part2
+ when 'camel' then part1 + part2
+ when 'snake' then part1.downcase + '_' + part2.downcase
+ when 'caps' then part1.upcase + '_' + part2.upcase
+ else part1 + '_' + part2
+ end
+ 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])
+ 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
diff --git a/support/cJSON-master/tests/unity/auto/generate_test_runner.rb b/support/cJSON-master/tests/unity/auto/generate_test_runner.rb
new file mode 100644
index 0000000..344a2d0
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/generate_test_runner.rb
@@ -0,0 +1,454 @@
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+# [Released under MIT License. Please refer to license.txt for details]
+# ==========================================
+
+File.expand_path(File.join(File.dirname(__FILE__), 'colour_prompt'))
+
+class UnityTestRunnerGenerator
+ def initialize(options = nil)
+ @options = UnityTestRunnerGenerator.default_options
+ case options
+ when NilClass then @options
+ when String then @options.merge!(UnityTestRunnerGenerator.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
+ require "#{File.expand_path(File.dirname(__FILE__))}/type_sanitizer"
+ end
+
+ def self.default_options
+ {
+ includes: [],
+ defines: [],
+ plugins: [],
+ framework: :unity,
+ test_prefix: 'test|spec|should',
+ mock_prefix: 'Mock',
+ setup_name: 'setUp',
+ teardown_name: 'tearDown',
+ main_name: 'main', # set to :auto to automatically generate each time
+ main_export_decl: '',
+ cmdline_args: false,
+ use_param_tests: false
+ }
+ end
+
+ def self.grab_config(config_file)
+ options = default_options
+ unless config_file.nil? || config_file.empty?
+ require 'yaml'
+ yaml_guts = YAML.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 = (headers[:local] + headers[:system])
+ used_mocks = find_mocks(testfile_includes)
+ testfile_includes = (testfile_includes - used_mocks)
+ testfile_includes.delete_if { |inc| inc =~ /(unity|cmock)/ }
+
+ # 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_suite_setup(output)
+ create_suite_teardown(output)
+ create_reset(output, used_mocks)
+ 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 = []
+
+ source_scrubbed = source.clone
+ source_scrubbed = source_scrubbed.gsub(/"[^"\n]*"/, '') # remove things in strings
+ source_scrubbed = source_scrubbed.gsub(/\/\/.*$/, '') # remove line comments
+ source_scrubbed = source_scrubbed.gsub(/\/\*.*?\*\//m, '') # remove block comments
+ lines = source_scrubbed.split(/(^\s*\#.*$) # Treat preprocessor directives as a logical line
+ | (;|\{|\}) /x) # Match ;, {, and } as end of lines
+
+ lines.each_with_index do |line, _index|
+ # find tests
+ next unless line =~ /^((?:\s*TEST_CASE\s*\(.*?\)\s*)*)\s*void\s+((?:#{@options[:test_prefix]}).*)\s*\(\s*(.*)\s*\)/
+ 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 = []
+ arguments.scan(/\s*TEST_CASE\s*\((.*)\)\s*$/) { |a| args << a[0] }
+ 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..-1].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
+ includes = {
+ local: source.scan(/^\s*#include\s+\"\s*(.+)\.[hH]\s*\"/).flatten,
+ system: source.scan(/^\s*#include\s+<\s*(.+)\s*>/).flatten.map { |inc| "<#{inc}>" },
+ linkonly: source.scan(/^TEST_FILE\(\s*\"\s*(.+)\.[cC]\w*\s*\"/).flatten
+ }
+ includes
+ 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]}/i
+ end
+ mock_headers
+ end
+
+ def create_header(output, mocks, testfile_includes = [])
+ output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */')
+ create_runtest(output, mocks)
+ output.puts("\n/*=======Automagically Detected Files To Include=====*/")
+ output.puts('#ifdef __WIN32__')
+ output.puts('#define UNITY_INCLUDE_SETUP_STUBS')
+ output.puts('#endif')
+ output.puts("#include \"#{@options[:framework]}.h\"")
+ output.puts('#include "cmock.h"') unless mocks.empty?
+ output.puts('#include <setjmp.h>')
+ output.puts('#include <stdio.h>')
+ if @options[:defines] && !@options[:defines].empty?
+ @options[:defines].each { |d| output.puts("#define #{d}") }
+ 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.gsub('.h', '')}.h\""}")
+ end
+ testfile_includes.each do |inc|
+ output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h', '')}.h\""}")
+ end
+ end
+ mocks.each do |mock|
+ output.puts("#include \"#{mock.gsub('.h', '')}.h\"")
+ end
+ 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);")
+ tests.each do |test|
+ output.puts("extern void #{test[:test]}(#{test[:call] || 'void'});")
+ end
+ output.puts('')
+ end
+
+ def create_mock_management(output, mock_headers)
+ return if mock_headers.empty?
+
+ 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_suite_setup(output)
+ output.puts("\n/*=======Suite Setup=====*/")
+ output.puts('static void suite_setup(void)')
+ output.puts('{')
+ if @options[:suite_setup].nil?
+ # New style, call suiteSetUp() if we can use weak symbols
+ output.puts('#if defined(UNITY_WEAK_ATTRIBUTE) || defined(UNITY_WEAK_PRAGMA)')
+ output.puts(' suiteSetUp();')
+ output.puts('#endif')
+ else
+ # Old style, C code embedded in the :suite_setup option
+ output.puts(@options[:suite_setup])
+ end
+ output.puts('}')
+ end
+
+ def create_suite_teardown(output)
+ output.puts("\n/*=======Suite Teardown=====*/")
+ output.puts('static int suite_teardown(int num_failures)')
+ output.puts('{')
+ if @options[:suite_teardown].nil?
+ # New style, call suiteTearDown() if we can use weak symbols
+ output.puts('#if defined(UNITY_WEAK_ATTRIBUTE) || defined(UNITY_WEAK_PRAGMA)')
+ output.puts(' return suiteTearDown(num_failures);')
+ output.puts('#else')
+ output.puts(' return num_failures;')
+ output.puts('#endif')
+ else
+ # Old style, C code embedded in the :suite_teardown option
+ output.puts(@options[:suite_teardown])
+ end
+ output.puts('}')
+ end
+
+ def create_runtest(output, used_mocks)
+ cexception = @options[:plugins].include? :cexception
+ va_args1 = @options[:use_param_tests] ? ', ...' : ''
+ va_args2 = @options[:use_param_tests] ? '__VA_ARGS__' : ''
+ output.puts("\n/*=======Test Runner Used To Run Each Test Below=====*/")
+ output.puts('#define RUN_TEST_NO_ARGS') if @options[:use_param_tests]
+ output.puts("#define RUN_TEST(TestFunc, TestLineNum#{va_args1}) \\")
+ output.puts('{ \\')
+ output.puts(" Unity.CurrentTestName = #TestFunc#{va_args2.empty? ? '' : " \"(\" ##{va_args2} \")\""}; \\")
+ output.puts(' Unity.CurrentTestLineNumber = TestLineNum; \\')
+ output.puts(' if (UnityTestMatches()) { \\') if @options[:cmdline_args]
+ output.puts(' Unity.NumberOfTests++; \\')
+ output.puts(' CMock_Init(); \\') unless used_mocks.empty?
+ output.puts(' UNITY_CLR_DETAILS(); \\') unless used_mocks.empty?
+ output.puts(' if (TEST_PROTECT()) \\')
+ output.puts(' { \\')
+ output.puts(' CEXCEPTION_T e; \\') if cexception
+ output.puts(' Try { \\') if cexception
+ output.puts(" #{@options[:setup_name]}(); \\")
+ output.puts(" TestFunc(#{va_args2}); \\")
+ output.puts(' } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \\') if cexception
+ output.puts(' } \\')
+ output.puts(' if (TEST_PROTECT()) \\')
+ output.puts(' { \\')
+ output.puts(" #{@options[:teardown_name]}(); \\")
+ output.puts(' CMock_Verify(); \\') unless used_mocks.empty?
+ output.puts(' } \\')
+ output.puts(' CMock_Destroy(); \\') unless used_mocks.empty?
+ output.puts(' UnityConcludeTest(); \\')
+ output.puts(' } \\') if @options[:cmdline_args]
+ output.puts("}\n")
+ end
+
+ def create_reset(output, used_mocks)
+ output.puts("\n/*=======Test Reset Option=====*/")
+ output.puts('void resetTest(void);')
+ output.puts('void resetTest(void)')
+ output.puts('{')
+ output.puts(' CMock_Verify();') unless used_mocks.empty?
+ output.puts(' CMock_Destroy();') unless used_mocks.empty?
+ output.puts(" #{@options[:teardown_name]}();")
+ output.puts(' CMock_Init();') unless used_mocks.empty?
+ output.puts(" #{@options[:setup_name]}();")
+ output.puts('}')
+ end
+
+ def create_main(output, filename, tests, used_mocks)
+ output.puts("\n\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(' 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', '')}.\");")
+ output.puts(' UNITY_PRINT_EOL();')
+ if @options[:use_param_tests]
+ tests.each do |test|
+ if test[:args].nil? || test[:args].empty?
+ output.puts(" UnityPrint(\" #{test[:test]}(RUN_TEST_NO_ARGS)\");")
+ 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
+ else
+ tests.each { |test| output.puts(" UnityPrint(\" #{test[:test]}\");\n UNITY_PRINT_EOL();") }
+ end
+ output.puts(' return 0;')
+ output.puts(' }')
+ output.puts(' return parse_status;')
+ output.puts(' }')
+ else
+ if main_name != 'main'
+ output.puts("#{@options[:main_export_decl]} int #{main_name}(void);")
+ end
+ output.puts("int #{main_name}(void)")
+ output.puts('{')
+ end
+ output.puts(' suite_setup();')
+ output.puts(" UnityBegin(\"#{filename.gsub(/\\/, '\\\\\\')}\");")
+ if @options[:use_param_tests]
+ tests.each do |test|
+ if test[:args].nil? || test[:args].empty?
+ output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, RUN_TEST_NO_ARGS);")
+ else
+ test[:args].each { |args| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, #{args});") }
+ end
+ end
+ else
+ tests.each { |test| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]});") }
+ end
+ output.puts
+ output.puts(' CMock_Guts_MemFreeFinal();') unless used_mocks.empty?
+ output.puts(" return suite_teardown(UnityEnd());")
+ 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.gsub('.h', '')}.h\""}")
+ end
+ testfile_includes.each do |inc|
+ output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h', '')}.h\""}")
+ 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 /\.*\.ya?ml/
+ options = UnityTestRunnerGenerator.grab_config(arg)
+ true
+ when /--(\w+)=\"?(.*)\"?/
+ options[Regexp.last_match(1).to_sym] = Regexp.last_match(2)
+ true
+ when /\.*\.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',
+ ' --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',
+ ' --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)',
+ ' --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
diff --git a/support/cJSON-master/tests/unity/auto/parse_output.rb b/support/cJSON-master/tests/unity/auto/parse_output.rb
new file mode 100644
index 0000000..f16cdb0
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/parse_output.rb
@@ -0,0 +1,220 @@
+#============================================================
+# 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 GCC/Linux builds use the following:
+# make | tee Output.txt
+#
+# To use this parser use the following command
+# ruby parseOutput.rb [options] [file]
+# options: -xml : produce a JUnit compatible XML file
+# file : file to scan for results
+#============================================================
+
+class ParseOutput
+ def initialize
+ @test_flag = false
+ @xml_out = false
+ @array_list = false
+ @total_tests = false
+ @class_index = false
+ end
+
+ # Set the flag to indicate if there will be an XML output file or not
+ def set_xml_output
+ @xml_out = true
+ 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
+ output << "</testsuite>\n"
+ 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)
+ return if @test_flag
+
+ @test_flag = true
+ # Split the path name
+ test_name = test_suite_name.split('/')
+ # Remove the extension
+ base_name = test_name[test_name.size - 1].split('.')
+ @test_suite = 'test.' + base_name[0]
+ printf "New Test: %s\n", @test_suite
+ end
+
+ # Test was flagged as having passed so format the output
+ def test_passed(array)
+ last_item = array.length - 1
+ test_name = array[last_item - 1]
+ test_suite_verify(array[@class_name])
+ printf "%-40s PASS\n", test_name
+
+ return unless @xml_out
+
+ @array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '"/>'
+ 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)
+ test_suite = array[0].sub('TEST(', '')
+ test_suite = test_suite.sub(',', '')
+ test_name = array[1].sub(')', '')
+
+ return unless @xml_out
+
+ @array_list.push ' <testcase classname="' + test_suite + '" name="' + test_name + '"/>'
+ end
+
+ # Test was flagged as being ingored so format the output
+ def test_ignored(array)
+ last_item = array.length - 1
+ test_name = array[last_item - 2]
+ reason = array[last_item].chomp
+ test_suite_verify(array[@class_name])
+ printf "%-40s IGNORED\n", test_name
+
+ if test_name.start_with? 'TEST('
+ array2 = test_name.split(' ')
+ @test_suite = array2[0].sub('TEST(', '')
+ @test_suite = @test_suite.sub(',', '')
+ test_name = array2[1].sub(')', '')
+ end
+
+ return unless @xml_out
+
+ @array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '">'
+ @array_list.push ' <skipped type="TEST IGNORED"> ' + reason + ' </skipped>'
+ @array_list.push ' </testcase>'
+ end
+
+ # Test was flagged as having failed so format the line
+ def test_failed(array)
+ last_item = array.length - 1
+ test_name = array[last_item - 2]
+ reason = array[last_item].chomp + ' at line: ' + array[last_item - 3]
+ test_suite_verify(array[@class_name])
+ printf "%-40s FAILED\n", test_name
+
+ if test_name.start_with? 'TEST('
+ array2 = test_name.split(' ')
+ @test_suite = array2[0].sub('TEST(', '')
+ @test_suite = @test_suite.sub(',', '')
+ test_name = array2[1].sub(')', '')
+ end
+
+ return unless @xml_out
+
+ @array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '">'
+ @array_list.push ' <failure type="ASSERT FAILED"> ' + reason + ' </failure>'
+ @array_list.push ' </testcase>'
+ end
+
+ # Figure out what OS we are running on. For now we are assuming if it's not Windows it must
+ # be Unix based.
+ def detect_os
+ os = RUBY_PLATFORM.split('-')
+ @class_name = if os.size == 2
+ if os[1] == 'mingw32'
+ 1
+ else
+ 0
+ end
+ else
+ 0
+ end
+ end
+
+ # Main function used to parse the file that was captured.
+ def process(name)
+ @test_flag = false
+ @array_list = []
+
+ detect_os
+
+ puts 'Parsing file: ' + name
+
+ test_pass = 0
+ test_fail = 0
+ test_ignore = 0
+ puts ''
+ puts '=================== RESULTS ====================='
+ puts ''
+ File.open(name).each do |line|
+ # Typical test lines look like this:
+ # <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
+ #
+ # where path is different on Unix vs Windows devices (Windows leads with a drive letter)
+ 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.
+ if (line_array.size >= 4) || (line.start_with? 'TEST(')
+ # Determine if this test passed
+ if line.include? ':PASS'
+ test_passed(line_array)
+ test_pass += 1
+ elsif line.include? ':FAIL:'
+ test_failed(line_array)
+ test_fail += 1
+ elsif line.include? ':IGNORE:'
+ test_ignored(line_array)
+ test_ignore += 1
+ elsif line.start_with? 'TEST('
+ if line.include? ' PASS'
+ line_array = line.split(' ')
+ test_passed_unity_fixture(line_array)
+ test_pass += 1
+ end
+ # If none of the keywords are found there are no more tests for this suite so clear
+ # the test flag
+ else
+ @test_flag = false
+ end
+ else
+ @test_flag = false
+ end
+ end
+ puts ''
+ puts '=================== SUMMARY ====================='
+ puts ''
+ puts 'Tests Passed : ' + test_pass.to_s
+ puts 'Tests Failed : ' + test_fail.to_s
+ puts 'Tests Ignored : ' + test_ignore.to_s
+ @total_tests = test_pass + test_fail + test_ignore
+
+ return unless @xml_out
+
+ heading = '<testsuite tests="' + @total_tests.to_s + '" failures="' + test_fail.to_s + '"' + ' skips="' + test_ignore.to_s + '">'
+ @array_list.insert(0, heading)
+ 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 |a|
+ if a == '-xml'
+ parse_my_file.set_xml_output
+ else
+ parse_my_file.process(a)
+ break
+ end
+ end
+end
diff --git a/support/cJSON-master/tests/unity/auto/stylize_as_junit.rb b/support/cJSON-master/tests/unity/auto/stylize_as_junit.rb
new file mode 100644
index 0000000..b3d8f40
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/stylize_as_junit.rb
@@ -0,0 +1,252 @@
+#!/usr/bin/ruby
+#
+# unity_to_junit.rb
+#
+require 'fileutils'
+require 'optparse'
+require 'ostruct'
+require 'set'
+
+require 'pp'
+
+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 # parse()
+end # class OptparseExample
+
+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
+
+ def here
+ File.expand_path(File.dirname(__FILE__))
+ 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>&#xD;[File] #{filename}&#xD;[Line] #{item[:line]}&#xD;</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>&#xD;[File] #{filename}&#xD;[Line] #{item[:line]}&#xD;</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 # UnityToJUnit
+
+if __FILE__ == $0
+ # 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
diff --git a/support/cJSON-master/tests/unity/auto/test_file_filter.rb b/support/cJSON-master/tests/unity/auto/test_file_filter.rb
new file mode 100644
index 0000000..aad28e3
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/test_file_filter.rb
@@ -0,0 +1,25 @@
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+# [Released under MIT License. Please refer to license.txt for details]
+# ==========================================
+
+require'yaml'
+
+module RakefileHelpers
+ class TestFileFilter
+ def initialize(all_files = false)
+ @all_files = all_files
+
+ return false unless @all_files
+ return false unless File.exist?('test_file_filter.yml')
+
+ filters = YAML.load_file('test_file_filter.yml')
+ @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
diff --git a/support/cJSON-master/tests/unity/auto/type_sanitizer.rb b/support/cJSON-master/tests/unity/auto/type_sanitizer.rb
new file mode 100644
index 0000000..dafb882
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/type_sanitizer.rb
@@ -0,0 +1,6 @@
+module TypeSanitizer
+ def self.sanitize_c_identifier(unsanitized)
+ # convert filename to valid C identifier by replacing invalid chars with '_'
+ unsanitized.gsub(/[-\/\\\.\,\s]/, '_')
+ end
+end
diff --git a/support/cJSON-master/tests/unity/auto/unity_test_summary.py b/support/cJSON-master/tests/unity/auto/unity_test_summary.py
new file mode 100644
index 0000000..4c20e52
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/unity_test_summary.py
@@ -0,0 +1,139 @@
+#! python3
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2015 Alexander Mueller / [email protected]
+# [Released under MIT License. Please refer to license.txt for details]
+# Based on the ruby script by Mike Karlesky, Mark VanderVoord, Greg Williams
+# ==========================================
+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*')))
+ 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)
diff --git a/support/cJSON-master/tests/unity/auto/unity_test_summary.rb b/support/cJSON-master/tests/unity/auto/unity_test_summary.rb
new file mode 100644
index 0000000..b37dc5f
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/unity_test_summary.rb
@@ -0,0 +1,136 @@
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+# [Released under MIT License. Please refer to license.txt for details]
+# ==========================================
+
+# !/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|
+ _src_file, _src_line, _test_name, status, _msg = line.split(/:/)
+ 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
+
+ def here
+ File.expand_path(File.dirname(__FILE__))
+ end
+end
+
+if $0 == __FILE__
+
+ # parse out the command options
+ opts, args = ARGV.partition { |v| v =~ /^--\w+/ }
+ opts.map! { |v| v[2..-1].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
diff --git a/support/cJSON-master/tests/unity/auto/unity_to_junit.py b/support/cJSON-master/tests/unity/auto/unity_to_junit.py
new file mode 100644
index 0000000..71dd568
--- /dev/null
+++ b/support/cJSON-master/tests/unity/auto/unity_to_junit.py
@@ -0,0 +1,146 @@
+import sys
+import os
+from glob import glob
+
+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.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()
+ tc_result_line = Group(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
+
+ 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
+ file_name = tmp_tc_line['tc_file_name'].split('\\').pop().split('/').pop().rsplit('.', 1)[0]
+ 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('result.xml', '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
+
+ @staticmethod
+ def usage(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)
+
+
+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*')))
+ 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:
+ UnityTestSummary.usage(e)
diff --git a/support/cJSON-master/tests/unity/docs/ThrowTheSwitchCodingStandard.md b/support/cJSON-master/tests/unity/docs/ThrowTheSwitchCodingStandard.md
new file mode 100644
index 0000000..a85adef
--- /dev/null
+++ b/support/cJSON-master/tests/unity/docs/ThrowTheSwitchCodingStandard.md
@@ -0,0 +1,207 @@
+# ThrowTheSwitch.org Coding Standard
+
+Hi. Welcome to the coding standard for ThrowTheSwitch.org. For the most part,
+we try to follow these standards to unify our contributors' code into a cohesive
+unit (puns intended). You might find places where these standards aren't
+followed. We're not perfect. Please be polite where you notice these discrepancies
+and we'll try to be polite when we notice yours.
+
+;)
+
+
+## Why Have A Coding Standard?
+
+Being consistent makes code easier to understand. We've made an attempt to keep
+our standard simple because we also believe that we can only expect someone to
+follow something that is understandable. Please do your best.
+
+
+## Our Philosophy
+
+Before we get into details on syntax, let's take a moment to talk about our
+vision for these tools. We're C developers and embedded software developers.
+These tools are great to test any C code, but catering to embedded software has
+made us more tolerant of compiler quirks. There are a LOT of quirky compilers
+out there. By quirky I mean "doesn't follow standards because they feel like
+they have a license to do as they wish."
+
+Our philosophy is "support every compiler we can". Most often, this means that
+we aim for writing C code that is standards compliant (often C89... that seems
+to be a sweet spot that is almost always compatible). But it also means these
+tools are tolerant of things that aren't common. Some that aren't even
+compliant. There are configuration options to override the size of standard
+types. There are configuration options to force Unity to not use certain
+standard library functions. A lot of Unity is configurable and we have worked
+hard to make it not TOO ugly in the process.
+
+Similarly, our tools that parse C do their best. They aren't full C parsers
+(yet) and, even if they were, they would still have to accept non-standard
+additions like gcc extensions or specifying `@0x1000` to force a variable to
+compile to a particular location. It's just what we do, because we like
+everything to Just Work™.
+
+Speaking of having things Just Work™, that's our second philosophy. By that, we
+mean that we do our best to have EVERY configuration option have a logical
+default. We believe that if you're working with a simple compiler and target,
+you shouldn't need to configure very much... we try to make the tools guess as
+much as they can, but give the user the power to override it when it's wrong.
+
+
+## Naming Things
+
+Let's talk about naming things. Programming is all about naming things. We name
+files, functions, variables, and so much more. While we're not always going to
+find the best name for something, we actually put quite a bit of effort into
+finding *What Something WANTS to be Called*™.
+
+When naming things, we more or less follow this hierarchy, the first being the
+most important to us (but we do all four whenever possible):
+1. Readable
+2. Descriptive
+3. Consistent
+4. Memorable
+
+
+#### Readable
+
+We want to read our code. This means we like names and flow that are more
+naturally read. We try to avoid double negatives. We try to avoid cryptic
+abbreviations (sticking to ones we feel are common).
+
+
+#### Descriptive
+
+We like descriptive names for things, especially functions and variables.
+Finding the right name for something is an important endeavor. You might notice
+from poking around our code that this often results in names that are a little
+longer than the average. Guilty. We're okay with a tiny bit more typing if it
+means our code is easier to understand.
+
+There are two exceptions to this rule that we also stick to as religiously as
+possible:
+
+First, while we realize hungarian notation (and similar systems for encoding
+type information into variable names) is providing a more descriptive name, we
+feel that (for the average developer) it takes away from readability and
+therefore is to be avoided.
+
+Second, loop counters and other local throw-away variables often have a purpose
+which is obvious. There's no need, therefore, to get carried away with complex
+naming. We find i, j, and k are better loop counters than loopCounterVar or
+whatnot. We only break this rule when we see that more description could improve
+understanding of an algorithm.
+
+
+#### Consistent
+
+We like consistency, but we're not really obsessed with it. We try to name our
+configuration macros in a consistent fashion... you'll notice a repeated use of
+UNITY_EXCLUDE_BLAH or UNITY_USES_BLAH macros. This helps users avoid having to
+remember each macro's details.
+
+
+#### Memorable
+
+Where ever it doesn't violate the above principles, we try to apply memorable
+names. Sometimes this means using something that is simply descriptive, but
+often we strive for descriptive AND unique... we like quirky names that stand
+out in our memory and are easier to search for. Take a look through the file
+names in Ceedling and you'll get a good idea of what we are talking about here.
+Why use preprocess when you can use preprocessinator? Or what better describes a
+module in charge of invoking tasks during releases than release_invoker? Don't
+get carried away. The names are still descriptive and fulfill the above
+requirements, but they don't feel stale.
+
+
+## C and C++ Details
+
+We don't really want to add to the style battles out there. Tabs or spaces?
+How many spaces? Where do the braces go? These are age-old questions that will
+never be answered... or at least not answered in a way that will make everyone
+happy.
+
+We've decided on our own style preferences. If you'd like to contribute to these
+projects (and we hope that you do), then we ask if you do your best to follow
+the same. It will only hurt a little. We promise.
+
+
+#### Whitespace
+
+Our C-style is to use spaces and to use 4 of them per indent level. It's a nice
+power-of-2 number that looks decent on a wide screen. We have no more reason
+than that. We break that rule when we have lines that wrap (macros or function
+arguments or whatnot). When that happens, we like to indent further to line
+things up in nice tidy columns.
+
+```C
+ if (stuff_happened)
+ {
+ do_something();
+ }
+```
+
+
+#### Case
+
+- Files - all lower case with underscores.
+- Variables - all lower case with underscores
+- Macros - all caps with underscores.
+- Typedefs - all caps with underscores. (also ends with _T).
+- Functions - camel cased. Usually named ModuleName_FuncName
+- Constants and Globals - camel cased.
+
+
+#### Braces
+
+The left brace is on the next line after the declaration. The right brace is
+directly below that. Everything in between in indented one level. If you're
+catching an error and you have a one-line, go ahead and to it on the same line.
+
+```C
+ while (blah)
+ {
+ //Like so. Even if only one line, we use braces.
+ }
+```
+
+
+#### Comments
+
+Do you know what we hate? Old-school C block comments. BUT, we're using them
+anyway. As we mentioned, our goal is to support every compiler we can,
+especially embedded compilers. There are STILL C compilers out there that only
+support old-school block comments. So that is what we're using. We apologize. We
+think they are ugly too.
+
+
+## Ruby Details
+
+Is there really such thing as a Ruby coding standard? Ruby is such a free form
+language, it seems almost sacrilegious to suggest that people should comply to
+one method! We'll keep it really brief!
+
+
+#### Whitespace
+
+Our Ruby style is to use spaces and to use 2 of them per indent level. It's a
+nice power-of-2 number that really grooves with Ruby's compact style. We have no
+more reason than that. We break that rule when we have lines that wrap. When
+that happens, we like to indent further to line things up in nice tidy columns.
+
+
+#### Case
+
+- Files - all lower case with underscores.
+- Variables - all lower case with underscores
+- Classes, Modules, etc - Camel cased.
+- Functions - all lower case with underscores
+- Constants - all upper case with underscores
+
+
+## Documentation
+
+Egad. Really? We use markdown and we like pdf files because they can be made to
+look nice while still being portable. Good enough?
+
+
+*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)*
diff --git a/support/cJSON-master/tests/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf b/support/cJSON-master/tests/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf
new file mode 100644
index 0000000..28f0c32
--- /dev/null
+++ b/support/cJSON-master/tests/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf
Binary files differ
diff --git a/support/cJSON-master/tests/unity/docs/UnityAssertionsReference.md b/support/cJSON-master/tests/unity/docs/UnityAssertionsReference.md
new file mode 100644
index 0000000..2dcf5e3
--- /dev/null
+++ b/support/cJSON-master/tests/unity/docs/UnityAssertionsReference.md
@@ -0,0 +1,770 @@
+# Unity Assertions Reference
+
+## Background and Overview
+
+### Super Condensed Version
+
+- An assertion establishes truth (i.e. boolean True) for a single condition.
+Upon boolean False, an assertion stops execution and reports the failure.
+- Unity is mainly a rich collection of assertions and the support to gather up
+and easily execute those assertions.
+- The structure of Unity allows you to easily separate test assertions from
+source code in, well, test code.
+- Unity's assertions:
+- Come in many, many flavors to handle different C types and assertion cases.
+- Use context to provide detailed and helpful failure messages.
+- Document types, expected values, and basic behavior in your source code for
+free.
+
+
+### Unity Is Several Things But Mainly It's Assertions
+
+One way to think of Unity is simply as a rich collection of assertions you can
+use to establish whether your source code behaves the way you think it does.
+Unity provides a framework to easily organize and execute those assertions in
+test code separate from your source code.
+
+
+### What's an Assertion?
+
+At their core, assertions are an establishment of truth - boolean truth. Was this
+thing equal to that thing? Does that code doohickey have such-and-such property
+or not? You get the idea. Assertions are executable code (to appreciate the big
+picture on this read up on the difference between
+[link:Dynamic Verification and Static Analysis]). A failing assertion stops
+execution and reports an error through some appropriate I/O channel (e.g.
+stdout, GUI, file, blinky light).
+
+Fundamentally, for dynamic verification all you need is a single assertion
+mechanism. In fact, that's what the [assert() macro in C's standard library](http://en.wikipedia.org/en/wiki/Assert.h)
+is for. So why not just use it? Well, we can do far better in the reporting
+department. C's `assert()` is pretty dumb as-is and is particularly poor for
+handling common data types like arrays, structs, etc. And, without some other
+support, it's far too tempting to litter source code with C's `assert()`'s. It's
+generally much cleaner, manageable, and more useful to separate test and source
+code in the way Unity facilitates.
+
+
+### Unity's Assertions: Helpful Messages _and_ Free Source Code Documentation
+
+Asserting a simple truth condition is valuable, but using the context of the
+assertion is even more valuable. For instance, if you know you're comparing bit
+flags and not just integers, then why not use that context to give explicit,
+readable, bit-level feedback when an assertion fails?
+
+That's what Unity's collection of assertions do - capture context to give you
+helpful, meaningful assertion failure messages. In fact, the assertions
+themselves also serve as executable documentation about types and values in your
+source code. So long as your tests remain current with your source and all those
+tests pass, you have a detailed, up-to-date view of the intent and mechanisms in
+your source code. And due to a wondrous mystery, well-tested code usually tends
+to be well designed code.
+
+
+## Assertion Conventions and Configurations
+
+### Naming and Parameter Conventions
+
+The convention of assertion parameters generally follows this order:
+
+ TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} )
+
+The very simplest assertion possible uses only a single "actual" parameter (e.g.
+a simple null check).
+
+"Actual" is the value being tested and unlike the other parameters in an
+assertion construction is the only parameter present in all assertion variants.
+"Modifiers" are masks, ranges, bit flag specifiers, floating point deltas.
+"Expected" is your expected value (duh) to compare to an "actual" value; it's
+marked as an optional parameter because some assertions only need a single
+"actual" parameter (e.g. null check).
+"Size/count" refers to string lengths, number of array elements, etc.
+
+Many of Unity's assertions are apparent duplications in that the same data type
+is handled by several assertions. The differences among these are in how failure
+messages are presented. For instance, a `_HEX` variant of an assertion prints
+the expected and actual values of that assertion formatted as hexadecimal.
+
+
+#### TEST_ASSERT_X_MESSAGE Variants
+
+_All_ assertions are complemented with a variant that includes a simple string
+message as a final parameter. The string you specify is appended to an assertion
+failure message in Unity output.
+
+For brevity, the assertion variants with a message parameter are not listed
+below. Just tack on `_MESSAGE` as the final component to any assertion name in
+the reference list below and add a string as the final parameter.
+
+_Example:_
+
+ TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} )
+
+becomes messageified like thus...
+
+ TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message )
+
+
+#### TEST_ASSERT_X_ARRAY Variants
+
+Unity provides a collection of assertions for arrays containing a variety of
+types. These are documented in the Array section below. These are almost on par
+with the `_MESSAGE`variants of Unity's Asserts in that for pretty much any Unity
+type assertion you can tack on `_ARRAY` and run assertions on an entire block of
+memory.
+
+ TEST_ASSERT_EQUAL_TYPEX_ARRAY( expected, actual, {size/count} )
+
+"Expected" is an array itself.
+"Size/count" is one or two parameters necessary to establish the number of array
+elements and perhaps the length of elements within the array.
+
+Notes:
+- The `_MESSAGE` variant convention still applies here to array assertions. The
+`_MESSAGE` variants of the `_ARRAY` assertions have names ending with
+`_ARRAY_MESSAGE`.
+- Assertions for handling arrays of floating point values are grouped with float
+and double assertions (see immediately following section).
+
+
+### TEST_ASSERT_EACH_EQUAL_X Variants
+
+Unity provides a collection of assertions for arrays containing a variety of
+types which can be compared to a single value as well. These are documented in
+the Each Equal section below. these are almost on par with the `_MESSAGE`
+variants of Unity's Asserts in that for pretty much any Unity type assertion you
+can inject _EACH_EQUAL and run assertions on an entire block of memory.
+
+ TEST_ASSERT_EACH_EQUAL_TYPEX( expected, actual, {size/count} )
+
+"Expected" is a single value to compare to.
+"Actual" is an array where each element will be compared to the expected value.
+"Size/count" is one of two parameters necessary to establish the number of array
+elements and perhaps the length of elements within the array.
+
+Notes:
+- The `_MESSAGE` variant convention still applies here to Each Equal assertions.
+- Assertions for handling Each Equal of floating point values are grouped with
+float and double assertions (see immediately following section).
+
+
+### Configuration
+
+#### Floating Point Support Is Optional
+
+Support for floating point types is configurable. That is, by defining the
+appropriate preprocessor symbols, floats and doubles can be individually enabled
+or disabled in Unity code. This is useful for embedded targets with no floating
+point math support (i.e. Unity compiles free of errors for fixed point only
+platforms). See Unity documentation for specifics.
+
+
+#### Maximum Data Type Width Is Configurable
+
+Not all targets support 64 bit wide types or even 32 bit wide types. Define the
+appropriate preprocessor symbols and Unity will omit all operations from
+compilation that exceed the maximum width of your target. See Unity
+documentation for specifics.
+
+
+## The Assertions in All Their Blessed Glory
+
+### Basic Fail and Ignore
+
+##### `TEST_FAIL()`
+
+This fella is most often used in special conditions where your test code is
+performing logic beyond a simple assertion. That is, in practice, `TEST_FAIL()`
+will always be found inside a conditional code block.
+
+_Examples:_
+- Executing a state machine multiple times that increments a counter your test
+code then verifies as a final step.
+- Triggering an exception and verifying it (as in Try / Catch / Throw - see the
+[CException](https://github.com/ThrowTheSwitch/CException) project).
+
+##### `TEST_IGNORE()`
+
+Marks a test case (i.e. function meant to contain test assertions) as ignored.
+Usually this is employed as a breadcrumb to come back and implement a test case.
+An ignored test case has effects if other assertions are in the enclosing test
+case (see Unity documentation for more).
+
+### Boolean
+
+##### `TEST_ASSERT (condition)`
+
+##### `TEST_ASSERT_TRUE (condition)`
+
+##### `TEST_ASSERT_FALSE (condition)`
+
+##### `TEST_ASSERT_UNLESS (condition)`
+
+A simple wording variation on `TEST_ASSERT_FALSE`.The semantics of
+`TEST_ASSERT_UNLESS` aid readability in certain test constructions or
+conditional statements.
+
+##### `TEST_ASSERT_NULL (pointer)`
+
+##### `TEST_ASSERT_NOT_NULL (pointer)`
+
+
+### Signed and Unsigned Integers (of all sizes)
+
+Large integer sizes can be disabled for build targets that do not support them.
+For example, if your target only supports up to 16 bit types, by defining the
+appropriate symbols Unity can be configured to omit 32 and 64 bit operations
+that would break compilation (see Unity documentation for more). Refer to
+Advanced Asserting later in this document for advice on dealing with other word
+sizes.
+
+##### `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)`
+
+##### `TEST_ASSERT_EQUAL (expected, actual)`
+
+##### `TEST_ASSERT_NOT_EQUAL (expected, actual)`
+
+##### `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)`
+
+
+### Unsigned Integers (of all sizes) in Hexadecimal
+
+All `_HEX` assertions are identical in function to unsigned integer assertions
+but produce failure messages with the `expected` and `actual` values formatted
+in hexadecimal. Unity output is big endian.
+
+##### `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)`
+
+
+### Masked and Bit-level Assertions
+
+Masked and bit-level assertions produce output formatted in hexadecimal. Unity
+output is big endian.
+
+
+##### `TEST_ASSERT_BITS (mask, expected, actual)`
+
+Only compares the masked (i.e. high) bits of `expected` and `actual` parameters.
+
+
+##### `TEST_ASSERT_BITS_HIGH (mask, actual)`
+
+Asserts the masked bits of the `actual` parameter are high.
+
+
+##### `TEST_ASSERT_BITS_LOW (mask, actual)`
+
+Asserts the masked bits of the `actual` parameter are low.
+
+
+##### `TEST_ASSERT_BIT_HIGH (bit, actual)`
+
+Asserts the specified bit of the `actual` parameter is high.
+
+
+##### `TEST_ASSERT_BIT_LOW (bit, actual)`
+
+Asserts the specified bit of the `actual` parameter is low.
+
+### Integer Less Than / Greater Than
+
+These assertions verify that the `actual` parameter is less than or greater
+than `threshold` (exclusive). For example, if the threshold value is 0 for the
+greater than assertion will fail if it is 0 or less.
+
+##### `TEST_ASSERT_GREATER_THAN (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_INT (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_INT8 (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_INT16 (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_INT32 (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_UINT (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_UINT8 (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_UINT16 (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_UINT32 (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_HEX8 (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_HEX16 (threshold, actual)`
+
+##### `TEST_ASSERT_GREATER_THAN_HEX32 (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_INT (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_INT8 (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_INT16 (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_INT32 (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_UINT (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_UINT8 (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_UINT16 (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_UINT32 (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_HEX8 (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_HEX16 (threshold, actual)`
+
+##### `TEST_ASSERT_LESS_THAN_HEX32 (threshold, actual)`
+
+
+### Integer Ranges (of all sizes)
+
+These assertions verify that the `expected` parameter is within +/- `delta`
+(inclusive) of the `actual` parameter. For example, if the expected value is 10
+and the delta is 3 then the assertion will fail for any value outside the range
+of 7 - 13.
+
+##### `TEST_ASSERT_INT_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_INT8_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_INT16_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_INT32_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_INT64_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_UINT_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_UINT8_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_UINT16_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_UINT32_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_UINT64_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_HEX_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_HEX8_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_HEX16_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_HEX32_WITHIN (delta, expected, actual)`
+
+##### `TEST_ASSERT_HEX64_WITHIN (delta, expected, actual)`
+
+
+### Structs and Strings
+
+##### `TEST_ASSERT_EQUAL_PTR (expected, actual)`
+
+Asserts that the pointers point to the same memory location.
+
+
+##### `TEST_ASSERT_EQUAL_STRING (expected, actual)`
+
+Asserts that the null terminated (`'\0'`)strings are identical. If strings are
+of different lengths or any portion of the strings before their terminators
+differ, the assertion fails. Two NULL strings (i.e. zero length) are considered
+equivalent.
+
+
+##### `TEST_ASSERT_EQUAL_MEMORY (expected, actual, len)`
+
+Asserts that the contents of the memory specified by the `expected` and `actual`
+pointers is identical. The size of the memory blocks in bytes is specified by
+the `len` parameter.
+
+
+### Arrays
+
+`expected` and `actual` parameters are both arrays. `num_elements` specifies the
+number of elements in the arrays to compare.
+
+`_HEX` assertions produce failure messages with expected and actual array
+contents formatted in hexadecimal.
+
+For array of strings comparison behavior, see comments for
+`TEST_ASSERT_EQUAL_STRING` in the preceding section.
+
+Assertions fail upon the first element in the compared arrays found not to
+match. Failure messages specify the array index of the failed comparison.
+
+##### `TEST_ASSERT_EQUAL_INT_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_INT8_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_INT16_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_INT32_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_INT64_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_UINT_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_UINT8_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_UINT16_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_UINT32_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_UINT64_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_HEX_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_HEX8_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_HEX16_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_HEX32_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_HEX64_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_PTR_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_STRING_ARRAY (expected, actual, num_elements)`
+
+##### `TEST_ASSERT_EQUAL_MEMORY_ARRAY (expected, actual, len, num_elements)`
+
+`len` is the memory in bytes to be compared at each array element.
+
+
+### Each Equal (Arrays to Single Value)
+
+`expected` are single values and `actual` are arrays. `num_elements` specifies
+the number of elements in the arrays to compare.
+
+`_HEX` assertions produce failure messages with expected and actual array
+contents formatted in hexadecimal.
+
+Assertions fail upon the first element in the compared arrays found not to
+match. Failure messages specify the array index of the failed comparison.
+
+#### `TEST_ASSERT_EACH_EQUAL_INT (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_INT8 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_INT16 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_INT32 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_INT64 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_UINT (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_UINT8 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_UINT16 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_UINT32 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_UINT64 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_HEX (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_HEX8 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_HEX16 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_HEX32 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_HEX64 (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_PTR (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_STRING (expected, actual, num_elements)`
+
+#### `TEST_ASSERT_EACH_EQUAL_MEMORY (expected, actual, len, num_elements)`
+
+`len` is the memory in bytes to be compared at each array element.
+
+
+### Floating Point (If enabled)
+
+##### `TEST_ASSERT_FLOAT_WITHIN (delta, expected, actual)`
+
+Asserts that the `actual` value is within +/- `delta` of the `expected` value.
+The nature of floating point representation is such that exact evaluations of
+equality are not guaranteed.
+
+
+##### `TEST_ASSERT_EQUAL_FLOAT (expected, actual)`
+
+Asserts that the ?actual?value is "close enough to be considered equal" to the
+`expected` value. If you are curious about the details, refer to the Advanced
+Asserting section for more details on this. Omitting a user-specified delta in a
+floating point assertion is both a shorthand convenience and a requirement of
+code generation conventions for CMock.
+
+
+##### `TEST_ASSERT_EQUAL_FLOAT_ARRAY (expected, actual, num_elements)`
+
+See Array assertion section for details. Note that individual array element
+float comparisons are executed using T?EST_ASSERT_EQUAL_FLOAT?.That is, user
+specified delta comparison values requires a custom-implemented floating point
+array assertion.
+
+
+##### `TEST_ASSERT_FLOAT_IS_INF (actual)`
+
+Asserts that `actual` parameter is equivalent to positive infinity floating
+point representation.
+
+
+##### `TEST_ASSERT_FLOAT_IS_NEG_INF (actual)`
+
+Asserts that `actual` parameter is equivalent to negative infinity floating
+point representation.
+
+
+##### `TEST_ASSERT_FLOAT_IS_NAN (actual)`
+
+Asserts that `actual` parameter is a Not A Number floating point representation.
+
+
+##### `TEST_ASSERT_FLOAT_IS_DETERMINATE (actual)`
+
+Asserts that ?actual?parameter is a floating point representation usable for
+mathematical operations. That is, the `actual` parameter is neither positive
+infinity nor negative infinity nor Not A Number floating point representations.
+
+
+##### `TEST_ASSERT_FLOAT_IS_NOT_INF (actual)`
+
+Asserts that `actual` parameter is a value other than positive infinity floating
+point representation.
+
+
+##### `TEST_ASSERT_FLOAT_IS_NOT_NEG_INF (actual)`
+
+Asserts that `actual` parameter is a value other than negative infinity floating
+point representation.
+
+
+##### `TEST_ASSERT_FLOAT_IS_NOT_NAN (actual)`
+
+Asserts that `actual` parameter is a value other than Not A Number floating
+point representation.
+
+
+##### `TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE (actual)`
+
+Asserts that `actual` parameter is not usable for mathematical operations. That
+is, the `actual` parameter is either positive infinity or negative infinity or
+Not A Number floating point representations.
+
+
+### Double (If enabled)
+
+##### `TEST_ASSERT_DOUBLE_WITHIN (delta, expected, actual)`
+
+Asserts that the `actual` value is within +/- `delta` of the `expected` value.
+The nature of floating point representation is such that exact evaluations of
+equality are not guaranteed.
+
+
+##### `TEST_ASSERT_EQUAL_DOUBLE (expected, actual)`
+
+Asserts that the `actual` value is "close enough to be considered equal" to the
+`expected` value. If you are curious about the details, refer to the Advanced
+Asserting section for more details. Omitting a user-specified delta in a
+floating point assertion is both a shorthand convenience and a requirement of
+code generation conventions for CMock.
+
+
+##### `TEST_ASSERT_EQUAL_DOUBLE_ARRAY (expected, actual, num_elements)`
+
+See Array assertion section for details. Note that individual array element
+double comparisons are executed using `TEST_ASSERT_EQUAL_DOUBLE`.That is, user
+specified delta comparison values requires a custom implemented double array
+assertion.
+
+
+##### `TEST_ASSERT_DOUBLE_IS_INF (actual)`
+
+Asserts that `actual` parameter is equivalent to positive infinity floating
+point representation.
+
+
+##### `TEST_ASSERT_DOUBLE_IS_NEG_INF (actual)`
+
+Asserts that `actual` parameter is equivalent to negative infinity floating point
+representation.
+
+
+##### `TEST_ASSERT_DOUBLE_IS_NAN (actual)`
+
+Asserts that `actual` parameter is a Not A Number floating point representation.
+
+
+##### `TEST_ASSERT_DOUBLE_IS_DETERMINATE (actual)`
+
+Asserts that `actual` parameter is a floating point representation usable for
+mathematical operations. That is, the ?actual?parameter is neither positive
+infinity nor negative infinity nor Not A Number floating point representations.
+
+
+##### `TEST_ASSERT_DOUBLE_IS_NOT_INF (actual)`
+
+Asserts that `actual` parameter is a value other than positive infinity floating
+point representation.
+
+
+##### `TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF (actual)`
+
+Asserts that `actual` parameter is a value other than negative infinity floating
+point representation.
+
+
+##### `TEST_ASSERT_DOUBLE_IS_NOT_NAN (actual)`
+
+Asserts that `actual` parameter is a value other than Not A Number floating
+point representation.
+
+
+##### `TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE (actual)`
+
+Asserts that `actual` parameter is not usable for mathematical operations. That
+is, the `actual` parameter is either positive infinity or negative infinity or
+Not A Number floating point representations.
+
+
+## Advanced Asserting: Details On Tricky Assertions
+
+This section helps you understand how to deal with some of the trickier
+assertion situations you may run into. It will give you a glimpse into some of
+the under-the-hood details of Unity's assertion mechanisms. If you're one of
+those people who likes to know what is going on in the background, read on. If
+not, feel free to ignore the rest of this document until you need it.
+
+
+### How do the EQUAL assertions work for FLOAT and DOUBLE?
+
+As you may know, directly checking for equality between a pair of floats or a
+pair of doubles is sloppy at best and an outright no-no at worst. Floating point
+values can often be represented in multiple ways, particularly after a series of
+operations on a value. Initializing a variable to the value of 2.0 is likely to
+result in a floating point representation of 2 x 20,but a series of
+mathematical operations might result in a representation of 8 x 2-2
+that also evaluates to a value of 2. At some point repeated operations cause
+equality checks to fail.
+
+So Unity doesn't do direct floating point comparisons for equality. Instead, it
+checks if two floating point values are "really close." If you leave Unity
+running with defaults, "really close" means "within a significant bit or two."
+Under the hood, `TEST_ASSERT_EQUAL_FLOAT` is really `TEST_ASSERT_FLOAT_WITHIN`
+with the `delta` parameter calculated on the fly. For single precision, delta is
+the expected value multiplied by 0.00001, producing a very small proportional
+range around the expected value.
+
+If you are expecting a value of 20,000.0 the delta is calculated to be 0.2. So
+any value between 19,999.8 and 20,000.2 will satisfy the equality check. This
+works out to be roughly a single bit of range for a single-precision number, and
+that's just about as tight a tolerance as you can reasonably get from a floating
+point value.
+
+So what happens when it's zero? Zero - even more than other floating point
+values - can be represented many different ways. It doesn't matter if you have
+0 x 20or 0 x 263.It's still zero, right? Luckily, if you
+subtract these values from each other, they will always produce a difference of
+zero, which will still fall between 0 plus or minus a delta of 0. So it still
+works!
+
+Double precision floating point numbers use a much smaller multiplier, again
+approximating a single bit of error.
+
+If you don't like these ranges and you want to make your floating point equality
+assertions less strict, you can change these multipliers to whatever you like by
+defining UNITY_FLOAT_PRECISION and UNITY_DOUBLE_PRECISION. See Unity
+documentation for more.
+
+
+### How do we deal with targets with non-standard int sizes?
+
+It's "fun" that C is a standard where something as fundamental as an integer
+varies by target. According to the C standard, an `int` is to be the target's
+natural register size, and it should be at least 16-bits and a multiple of a
+byte. It also guarantees an order of sizes:
+
+```C
+char <= short <= int <= long <= long long
+```
+
+Most often, `int` is 32-bits. In many cases in the embedded world, `int` is
+16-bits. There are rare microcontrollers out there that have 24-bit integers,
+and this remains perfectly standard C.
+
+To make things even more interesting, there are compilers and targets out there
+that have a hard choice to make. What if their natural register size is 10-bits
+or 12-bits? Clearly they can't fulfill _both_ the requirement to be at least
+16-bits AND the requirement to match the natural register size. In these
+situations, they often choose the natural register size, leaving us with
+something like this:
+
+```C
+char (8 bit) <= short (12 bit) <= int (12 bit) <= long (16 bit)
+```
+
+Um... yikes. It's obviously breaking a rule or two... but they had to break SOME
+rules, so they made a choice.
+
+When the C99 standard rolled around, it introduced alternate standard-size types.
+It also introduced macros for pulling in MIN/MAX values for your integer types.
+It's glorious! Unfortunately, many embedded compilers can't be relied upon to
+use the C99 types (Sometimes because they have weird register sizes as described
+above. Sometimes because they don't feel like it?).
+
+A goal of Unity from the beginning was to support every combination of
+microcontroller or microprocessor and C compiler. Over time, we've gotten really
+close to this. There are a few tricks that you should be aware of, though, if
+you're going to do this effectively on some of these more idiosyncratic targets.
+
+First, when setting up Unity for a new target, you're going to want to pay
+special attention to the macros for automatically detecting types
+(where available) or manually configuring them yourself. You can get information
+on both of these in Unity's documentation.
+
+What about the times where you suddenly need to deal with something odd, like a
+24-bit `int`? The simplest solution is to use the next size up. If you have a
+24-bit `int`, configure Unity to use 32-bit integers. If you have a 12-bit
+`int`, configure Unity to use 16 bits. There are two ways this is going to
+affect you:
+
+1. When Unity displays errors for you, it's going to pad the upper unused bits
+with zeros.
+2. You're going to have to be careful of assertions that perform signed
+operations, particularly `TEST_ASSERT_INT_WITHIN`.Such assertions might wrap
+your `int` in the wrong place, and you could experience false failures. You can
+always back down to a simple `TEST_ASSERT` and do the operations yourself.
+
+
+*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)*
diff --git a/support/cJSON-master/tests/unity/docs/UnityConfigurationGuide.md b/support/cJSON-master/tests/unity/docs/UnityConfigurationGuide.md
new file mode 100644
index 0000000..96e5358
--- /dev/null
+++ b/support/cJSON-master/tests/unity/docs/UnityConfigurationGuide.md
@@ -0,0 +1,435 @@
+# Unity Configuration Guide
+
+## C Standards, Compilers and Microcontrollers
+
+The embedded software world contains its challenges. Compilers support different
+revisions of the C Standard. They ignore requirements in places, sometimes to
+make the language more usable in some special regard. Sometimes it's to simplify
+their support. Sometimes it's due to specific quirks of the microcontroller they
+are targeting. Simulators add another dimension to this menagerie.
+
+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.
+
+
+## The Options
+
+### Integer Types
+
+If you've been a C developer for long, you probably already know that 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.
+
+
+##### `UNITY_EXCLUDE_STDINT_H`
+
+The first thing that Unity does to guess your types is check `stdint.h`.
+This file includes defines like `UINT_MAX` that Unity can make use of to
+learn a lot about your system. It's possible you don't want it to do this
+(um. why not?) or (more likely) 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.
+
+_Example:_
+ #define UNITY_EXCLUDE_STDINT_H
+
+
+##### `UNITY_EXCLUDE_LIMITS_H`
+
+The second attempt to guess your types is to check `limits.h`. Some compilers
+that don't support `stdint.h` could include `limits.h` instead. If you don't
+want Unity to check this file either, define this to make it skip the inclusion.
+
+_Example:_
+ #define UNITY_EXCLUDE_LIMITS_H
+
+
+If you've disabled both of the automatic options above, you're going to have to
+do the configuration yourself. Don't worry. Even this isn't too bad... there are
+just a handful of defines that you are going to specify if you don't like the
+defaults.
+
+
+##### `UNITY_INT_WIDTH`
+
+Define this to be the number of bits an `int` takes up on your system. The
+default, if not autodetected, is 32 bits.
+
+_Example:_
+ #define UNITY_INT_WIDTH 16
+
+
+##### `UNITY_LONG_WIDTH`
+
+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
+
+
+##### `UNITY_POINTER_WIDTH`
+
+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_SUPPORT_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.
+
+_Example:_
+ #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.
+
+
+##### `UNITY_INCLUDE_FLOAT`
+
+##### `UNITY_EXCLUDE_FLOAT`
+
+##### `UNITY_INCLUDE_DOUBLE`
+
+##### `UNITY_EXCLUDE_DOUBLE`
+
+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, either, or both, as
+suits your needs. For features that are enabled, the following floating point
+options also become available.
+
+_Example:_
+
+ //what manner of strange processor is this?
+ #define UNITY_EXCLUDE_FLOAT
+ #define UNITY_INCLUDE_DOUBLE
+
+
+##### `UNITY_EXCLUDE_FLOAT_PRINT`
+
+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.
+Therefore, the display of floating point values during a failure are optional.
+By default, Unity will print the actual results of floating point assertion
+failure (e.g. ”Expected 4.56 Was 4.68”). To not include this extra support, you
+can use this define to instead respond to a failed assertion with a message like
+”Values Not Within Delta”. If you would like verbose failure messages for floating
+point assertions, use these options to give more explicit failure messages.
+
+_Example:_
+ #define UNITY_EXCLUDE_FLOAT_PRINT
+
+
+##### `UNITY_FLOAT_TYPE`
+
+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
+
+
+##### `UNITY_DOUBLE_TYPE`
+
+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
+
+
+##### `UNITY_FLOAT_PRECISION`
+
+##### `UNITY_DOUBLE_PRECISION`
+
+If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as
+documented in the big daddy 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
+
+
+### 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.
+
+
+##### `UNITY_OUTPUT_CHAR(a)`
+
+##### `UNITY_OUTPUT_FLUSH()`
+
+##### `UNITY_OUTPUT_START()`
+
+##### `UNITY_OUTPUT_COMPLETE()`
+
+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_START() RS232_config(115200,1,8,0)
+ #define UNITY_OUTPUT_FLUSH() RS232_flush()
+ #define UNITY_OUTPUT_COMPLETE() RS232_close()
+
+_Note:_
+`UNITY_OUTPUT_FLUSH()` can be set to the standard out flush function simply by
+specifying `UNITY_USE_FLUSH_STDOUT`. No other defines are required. If you
+specify a custom flush function instead with `UNITY_OUTPUT_FLUSH` directly, it
+will declare an instance of your function by default. If you want to disable
+this behavior, add `UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION`.
+
+
+##### `UNITY_WEAK_ATTRIBUTE`
+
+##### `UNITY_WEAK_PRAGMA`
+
+##### `UNITY_NO_WEAK`
+
+For some targets, Unity can make the otherwise required setUp() and tearDown()
+functions optional. This is a nice convenience for test writers since setUp and
+tearDown don’t often actually do anything. If you’re using gcc or clang, this
+option is automatically defined for you. Other compilers can also support this
+behavior, if they support a C feature called weak functions. A weak function is
+a function that is compiled into your executable unless a non-weak version of
+the same function is defined elsewhere. If a non-weak version is found, the weak
+version is ignored as if it never existed. If your compiler supports this feature,
+you can let Unity know by defining UNITY_WEAK_ATTRIBUTE or UNITY_WEAK_PRAGMA as
+the function attributes that would need to be applied to identify a function as
+weak. If your compiler lacks support for weak functions, you will always need to
+define setUp and tearDown functions (though they can be and often will be just
+empty). You can also force Unity to NOT use weak functions by defining
+UNITY_NO_WEAK. The most common options for this feature are:
+
+_Example:_
+ #define UNITY_WEAK_ATTRIBUTE weak
+ #define UNITY_WEAK_ATTRIBUTE __attribute__((weak))
+ #define UNITY_WEAK_PRAGMA
+ #define UNITY_NO_WEAK
+
+
+##### `UNITY_PTR_ATTRIBUTE`
+
+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
+
+
+##### `UNITY_PRINT_EOL`
+
+By default, Unity outputs \n at the end of each line of output. This is easy
+to parse by the scripts, by Ceedling, etc, but it might not be ideal for YOUR
+system. Feel free to override this and to make it whatever you wish.
+
+_Example:_
+ #define UNITY_PRINT_EOL { UNITY_OUTPUT_CHAR('\r'); UNITY_OUTPUT_CHAR('\n') }
+
+
+
+##### `UNITY_EXCLUDE_DETAILS`
+
+This is an option for if you absolutely must squeeze every byte of memory out of
+your system. Unity stores a set of internal scratchpads which are used to pass
+extra detail information around. It's used by systems like CMock in order to
+report which function or argument flagged an error. If you're not using CMock and
+you're not using these details for other things, then you can exclude them.
+
+_Example:_
+ #define UNITY_EXCLUDE_DETAILS
+
+
+
+##### `UNITY_EXCLUDE_SETJMP`
+
+If your embedded system doesn't support the standard library setjmp, you can
+exclude Unity's reliance on this by using this define. This dropped dependence
+comes at a price, though. You will be unable to use custom helper functions for
+your tests, and you will be unable to use tools like CMock. Very likely, if your
+compiler doesn't support setjmp, you wouldn't have had the memory space for those
+things anyway, though... so this option exists for those situations.
+
+_Example:_
+ #define UNITY_EXCLUDE_SETJMP
+
+##### `UNITY_OUTPUT_COLOR`
+
+If you want to add color using ANSI escape codes you can use this define.
+t
+_Example:_
+ #define UNITY_OUTPUT_COLOR
+
+
+
+## Getting Into The Guts
+
+There will be cases where the options above aren't quite going to get everything
+perfect. They are likely sufficient for any situation where you are compiling
+and executing your tests with a native toolchain (e.g. clang on Mac). These
+options may even get you through the majority of cases encountered in working
+with a target simulator run from your local command line. But especially if you
+must run your test suite on your target hardware, your Unity configuration will
+require special help. This special help will usually reside in one of two
+places: the `main()` function or the `RUN_TEST` macro. Let's look at how these
+work.
+
+
+##### `main()`
+
+Each test module is compiled and run on its own, separate from the other test
+files in your project. Each test file, therefore, has a `main` function. This
+`main` function will need to contain whatever code is necessary to initialize
+your system to a workable state. This is particularly true for situations where
+you must set up a memory map or initialize a communication channel for the
+output of your test results.
+
+A simple main function looks something like this:
+
+ int main(void) {
+ UNITY_BEGIN();
+ RUN_TEST(test_TheFirst);
+ RUN_TEST(test_TheSecond);
+ RUN_TEST(test_TheThird);
+ return UNITY_END();
+ }
+
+You can see that our main function doesn't bother taking any arguments. For our
+most barebones case, we'll never have arguments because we just run all the
+tests each time. Instead, we start by calling `UNITY_BEGIN`. We run each test
+(in whatever order we wish). Finally, we call `UNITY_END`, returning its return
+value (which is the total number of failures).
+
+It should be easy to see that you can add code before any test cases are run or
+after all the test cases have completed. This allows you to do any needed
+system-wide setup or teardown that might be required for your special
+circumstances.
+
+
+##### `RUN_TEST`
+
+The `RUN_TEST` macro is called with each test case function. Its job is to
+perform whatever setup and teardown is necessary for executing a single test
+case function. This includes catching failures, calling the test module's
+`setUp()` and `tearDown()` functions, and calling `UnityConcludeTest()`. If
+using CMock or test coverage, there will be additional stubs in use here. A
+simple minimalist RUN_TEST macro looks something like this:
+
+ #define RUN_TEST(testfunc) \
+ UNITY_NEW_TEST(#testfunc) \
+ if (TEST_PROTECT()) { \
+ setUp(); \
+ testfunc(); \
+ } \
+ if (TEST_PROTECT() && (!TEST_IS_IGNORED)) \
+ tearDown(); \
+ UnityConcludeTest();
+
+So that's quite a macro, huh? It gives you a glimpse of what kind of stuff Unity
+has to deal with for every single test case. For each test case, we declare that
+it is a new test. Then we run `setUp` and our test function. These are run
+within a `TEST_PROTECT` block, the function of which is to handle failures that
+occur during the test. Then, assuming our test is still running and hasn't been
+ignored, we run `tearDown`. No matter what, our last step is to conclude this
+test before moving on to the next.
+
+Let's say you need to add a call to `fsync` to force all of your output data to
+flush to a file after each test. You could easily insert this after your
+`UnityConcludeTest` call. Maybe you want to write an xml tag before and after
+each result set. Again, you could do this by adding lines to this macro. Updates
+to this macro are for the occasions when you need an action before or after
+every single test case throughout your entire suite of tests.
+
+
+## Happy Porting
+
+The defines and macros in this guide should help you port Unity to just about
+any C target we can imagine. If you run into a snag or two, don't be afraid of
+asking for help on the forums. We love a good challenge!
+
+
+*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)*
diff --git a/support/cJSON-master/tests/unity/docs/UnityGettingStartedGuide.md b/support/cJSON-master/tests/unity/docs/UnityGettingStartedGuide.md
new file mode 100644
index 0000000..50fc91c
--- /dev/null
+++ b/support/cJSON-master/tests/unity/docs/UnityGettingStartedGuide.md
@@ -0,0 +1,191 @@
+# Unity - Getting Started
+
+## Welcome
+
+Congratulations. You're now the proud owner of your very own pile of bits! What
+are you going to do with all these ones and zeros? This document should be able
+to help you decide just that.
+
+Unity is a unit test framework. The goal has been to keep it small and
+functional. The core Unity test framework is three files: a single C file and a
+couple header files. These team up to provide functions and macros to make
+testing easier.
+
+Unity was designed to be cross platform. It works hard to stick with C standards
+while still providing support for the many embedded C compilers that bend the
+rules. Unity has been used with many compilers, including GCC, IAR, Clang,
+Green Hills, Microchip, and MS Visual Studio. It's not much work to get it to
+work with a new target.
+
+
+### Overview of the Documents
+
+#### Unity Assertions reference
+
+This document will guide you through all the assertion options provided by
+Unity. This is going to be your unit testing bread and butter. You'll spend more
+time with assertions than any other part of Unity.
+
+
+#### Unity Assertions Cheat Sheet
+
+This document contains an abridged summary of the assertions described in the
+previous document. It's perfect for printing and referencing while you
+familiarize yourself with Unity's options.
+
+
+#### Unity Configuration Guide
+
+This document is the one to reference when you are going to use Unity with a new
+target or compiler. It'll guide you through the configuration options and will
+help you customize your testing experience to meet your needs.
+
+
+#### Unity Helper Scripts
+
+This document describes the helper scripts that are available for simplifying
+your testing workflow. It describes the collection of optional Ruby scripts
+included in the auto directory of your Unity installation. Neither Ruby nor
+these scripts are necessary for using Unity. They are provided as a convenience
+for those who wish to use them.
+
+
+#### Unity License
+
+What's an open source project without a license file? This brief document
+describes the terms you're agreeing to when you use this software. Basically, we
+want it to be useful to you in whatever context you want to use it, but please
+don't blame us if you run into problems.
+
+
+### Overview of the Folders
+
+If you have obtained Unity through Github or something similar, you might be
+surprised by just how much stuff you suddenly have staring you in the face.
+Don't worry, Unity itself is very small. The rest of it is just there to make
+your life easier. You can ignore it or use it at your convenience. Here's an
+overview of everything in the project.
+
+- `src` - This is the code you care about! This folder contains a C file and two
+header files. These three files _are_ Unity.
+- `docs` - You're reading this document, so it's possible you have found your way
+into this folder already. This is where all the handy documentation can be
+found.
+- `examples` - This contains a few examples of using Unity.
+- `extras` - These are optional add ons to Unity that are not part of the core
+project. If you've reached us through James Grenning's book, you're going to
+want to look here.
+- `test` - This is how Unity and its scripts are all tested. If you're just using
+Unity, you'll likely never need to go in here. If you are the lucky team member
+who gets to port Unity to a new toolchain, this is a good place to verify
+everything is configured properly.
+- `auto` - Here you will find helpful Ruby scripts for simplifying your test
+workflow. They are purely optional and are not required to make use of Unity.
+
+
+## How to Create A Test File
+
+Test files are C files. Most often you will create a single test file for each C
+module that you want to test. The test file should include unity.h and the
+header for your C module to be tested.
+
+Next, a test file will include a `setUp()` and `tearDown()` function. The setUp
+function can contain anything you would like to run before each test. The
+tearDown function can contain anything you would like to run after each test.
+Both functions accept no arguments and return nothing. You may leave either or
+both of these blank if you have no need for them. If you're using a compiler
+that is configured to make these functions optional, you may leave them off
+completely. Not sure? Give it a try. If you compiler complains that it can't
+find setUp or tearDown when it links, you'll know you need to at least include
+an empty function for these.
+
+The majority of the file will be a series of test functions. Test functions
+follow the convention of starting with the word "test" or "spec". You don't HAVE
+to name them this way, but it makes it clear what functions are tests for other
+developers. Test functions take no arguments and return nothing. All test
+accounting is handled internally in Unity.
+
+Finally, at the bottom of your test file, you will write a `main()` function.
+This function will call `UNITY_BEGIN()`, then `RUN_TEST` for each test, and
+finally `UNITY_END()`.This is what will actually trigger each of those test
+functions to run, so it is important that each function gets its own `RUN_TEST`
+call.
+
+Remembering to add each test to the main function can get to be tedious. If you
+enjoy using helper scripts in your build process, you might consider making use
+of our handy generate_test_runner.rb script. This will create the main function
+and all the calls for you, assuming that you have followed the suggested naming
+conventions. In this case, there is no need for you to include the main function
+in your test file at all.
+
+When you're done, your test file will look something like this:
+
+```C
+#include "unity.h"
+#include "file_to_test.h"
+
+void setUp(void) {
+ // set stuff up here
+}
+
+void tearDown(void) {
+ // clean stuff up here
+}
+
+void test_function_should_doBlahAndBlah(void) {
+ //test stuff
+}
+
+void test_function_should_doAlsoDoBlah(void) {
+ //more test stuff
+}
+
+int main(void) {
+ UNITY_BEGIN();
+ RUN_TEST(test_function_should_doBlahAndBlah);
+ RUN_TEST(test_function_should_doAlsoDoBlah);
+ return UNITY_END();
+}
+```
+
+It's possible that you will require more customization than this, eventually.
+For that sort of thing, you're going to want to look at the configuration guide.
+This should be enough to get you going, though.
+
+
+## How to Build and Run A Test File
+
+This is the single biggest challenge to picking up a new unit testing framework,
+at least in a language like C or C++. These languages are REALLY good at getting
+you "close to the metal" (why is the phrase metal? Wouldn't it be more accurate
+to say "close to the silicon"?). While this feature is usually a good thing, it
+can make testing more challenging.
+
+You have two really good options for toolchains. Depending on where you're
+coming from, it might surprise you that neither of these options is running the
+unit tests on your hardware.
+There are many reasons for this, but here's a short version:
+- On hardware, you have too many constraints (processing power, memory, etc),
+- On hardware, you don't have complete control over all registers,
+- On hardware, unit testing is more challenging,
+- Unit testing isn't System testing. Keep them separate.
+
+Instead of running your tests on your actual hardware, most developers choose to
+develop them as native applications (using gcc or MSVC for example) or as
+applications running on a simulator. Either is a good option. Native apps have
+the advantages of being faster and easier to set up. Simulator apps have the
+advantage of working with the same compiler as your target application. The
+options for configuring these are discussed in the configuration guide.
+
+To get either to work, you might need to make a few changes to the file
+containing your register set (discussed later).
+
+In either case, a test is built by linking unity, the test file, and the C
+file(s) being tested. These files create an executable which can be run as the
+test set for that module. Then, this process is repeated for the next test file.
+This flexibility of separating tests into individual executables allows us to
+much more thoroughly unit test our system and it keeps all the test code out of
+our final release!
+
+
+*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)*
diff --git a/support/cJSON-master/tests/unity/docs/UnityHelperScriptsGuide.md b/support/cJSON-master/tests/unity/docs/UnityHelperScriptsGuide.md
new file mode 100644
index 0000000..4242990
--- /dev/null
+++ b/support/cJSON-master/tests/unity/docs/UnityHelperScriptsGuide.md
@@ -0,0 +1,254 @@
+# Unity Helper Scripts
+
+## With a Little Help From Our Friends
+
+Sometimes what it takes to be a really efficient C programmer is a little non-C.
+The Unity project includes a couple Ruby scripts for making your life just a tad
+easier. They are completely optional. If you choose to use them, you'll need a
+copy of Ruby, of course. Just install whatever the latest version is, and it is
+likely to work. You can find Ruby at [ruby-lang.org](https://ruby-labg.org/).
+
+
+### `generate_test_runner.rb`
+
+Are you tired of creating your own `main` function in your test file? Do you
+keep forgetting to add a `RUN_TEST` call when you add a new test case to your
+suite? Do you want to use CMock or other fancy add-ons but don't want to figure
+out how to create your own `RUN_TEST` macro?
+
+Well then we have the perfect script for you!
+
+The `generate_test_runner` script processes a given test file and automatically
+creates a separate test runner file that includes ?main?to execute the test
+cases within the scanned test file. All you do then is add the generated runner
+to your list of files to be compiled and linked, and presto you're done!
+
+This script searches your test file for void function signatures having a
+function name beginning with "test" or "spec". It treats each of these
+functions as a test case and builds up a test suite of them. For example, the
+following includes three test cases:
+
+```C
+void testVerifyThatUnityIsAwesomeAndWillMakeYourLifeEasier(void)
+{
+ ASSERT_TRUE(1);
+}
+void test_FunctionName_should_WorkProperlyAndReturn8(void) {
+ ASSERT_EQUAL_INT(8, FunctionName());
+}
+void spec_Function_should_DoWhatItIsSupposedToDo(void) {
+ ASSERT_NOT_NULL(Function(5));
+}
+```
+
+You can run this script a couple of ways. The first is from the command line:
+
+```Shell
+ruby generate_test_runner.rb TestFile.c NameOfRunner.c
+```
+
+Alternatively, if you include only the test file parameter, the script will copy
+the name of the test file and automatically append "_Runner" to the name of the
+generated file. The example immediately below will create TestFile_Runner.c.
+
+```Shell
+ruby generate_test_runner.rb TestFile.c
+```
+
+You can also add a [YAML](http://www.yaml.org/) file to configure extra options.
+Conveniently, this YAML file is of the same format as that used by Unity and
+CMock. So if you are using YAML files already, you can simply pass the very same
+file into the generator script.
+
+```Shell
+ruby generate_test_runner.rb TestFile.c my_config.yml
+```
+
+The contents of the YAML file `my_config.yml` could look something like the
+example below. If you're wondering what some of these options do, you're going
+to love the next section of this document.
+
+```YAML
+:unity:
+ :includes:
+ - stdio.h
+ - microdefs.h
+ :cexception: 1
+ :suit_setup: "blah = malloc(1024);"
+ :suite_teardown: "free(blah);"
+```
+
+If you would like to force your generated test runner to include one or more
+header files, you can just include those at the command line too. Just make sure
+these are _after_ the YAML file, if you are using one:
+
+```Shell
+ruby generate_test_runner.rb TestFile.c my_config.yml extras.h
+```
+
+Another option, particularly if you are already using Ruby to orchestrate your
+builds - or more likely the Ruby-based build tool Rake - is requiring this
+script directly. Anything that you would have specified in a YAML file can be
+passed to the script as part of a hash. Let's push the exact same requirement
+set as we did above but this time through Ruby code directly:
+
+```Ruby
+require "generate_test_runner.rb"
+options = {
+ :includes => ["stdio.h", "microdefs.h"],
+ :cexception => 1,
+ :suite_setup => "blah = malloc(1024);",
+ :suite_teardown => "free(blah);"
+}
+UnityTestRunnerGenerator.new.run(testfile, runner_name, options)
+```
+
+If you have multiple files to generate in a build script (such as a Rakefile),
+you might want to instantiate a generator object with your options and call it
+to generate each runner thereafter. Like thus:
+
+```Ruby
+gen = UnityTestRunnerGenerator.new(options)
+test_files.each do |f|
+ gen.run(f, File.basename(f,'.c')+"Runner.c"
+end
+```
+
+#### Options accepted by generate_test_runner.rb:
+
+The following options are available when executing `generate_test_runner`. You
+may pass these as a Ruby hash directly or specify them in a YAML file, both of
+which are described above. In the `examples` directory, Example 3's Rakefile
+demonstrates using a Ruby hash.
+
+
+##### `:includes`
+
+This option specifies an array of file names to be `#include`'d at the top of
+your runner C file. You might use it to reference custom types or anything else
+universally needed in your generated runners.
+
+
+##### `:suite_setup`
+
+Define this option with C code to be executed _before any_ test cases are run.
+
+Alternatively, if your C compiler supports weak symbols, you can leave this
+option unset and instead provide a `void suiteSetUp(void)` function in your test
+suite. The linker will look for this symbol and fall back to a Unity-provided
+stub if it is not found.
+
+
+##### `:suite_teardown`
+
+Define this option with C code to be executed _after all_ test cases have
+finished. An integer variable `num_failures` is available for diagnostics.
+The code should end with a `return` statement; the value returned will become
+the exit code of `main`. You can normally just return `num_failures`.
+
+Alternatively, if your C compiler supports weak symbols, you can leave this
+option unset and instead provide a `int suiteTearDown(int num_failures)`
+function in your test suite. The linker will look for this symbol and fall
+back to a Unity-provided stub if it is not found.
+
+
+##### `:enforce_strict_ordering`
+
+This option should be defined if you have the strict order feature enabled in
+CMock (see CMock documentation). This generates extra variables required for
+everything to run smoothly. If you provide the same YAML to the generator as
+used in CMock's configuration, you've already configured the generator properly.
+
+
+##### `:plugins`
+
+This option specifies an array of plugins to be used (of course, the array can
+contain only a single plugin). This is your opportunity to enable support for
+CException support, which will add a check for unhandled exceptions in each
+test, reporting a failure if one is detected. To enable this feature using Ruby:
+
+```Ruby
+:plugins => [ :cexception ]
+```
+
+Or as a yaml file:
+
+```YAML
+:plugins:
+ -:cexception
+```
+
+If you are using CMock, it is very likely that you are already passing an array
+of plugins to CMock. You can just use the same array here. This script will just
+ignore the plugins that don't require additional support.
+
+
+### `unity_test_summary.rb`
+
+A Unity test file contains one or more test case functions. Each test case can
+pass, fail, or be ignored. Each test file is run individually producing results
+for its collection of test cases. A given project will almost certainly be
+composed of multiple test files. Therefore, the suite of tests is comprised of
+one or more test cases spread across one or more test files. This script
+aggregates individual test file results to generate a summary of all executed
+test cases. The output includes how many tests were run, how many were ignored,
+and how many failed. In addition, the output includes a listing of which
+specific tests were ignored and failed. A good example of the breadth and
+details of these results can be found in the `examples` directory. Intentionally
+ignored and failing tests in this project generate corresponding entries in the
+summary report.
+
+If you're interested in other (prettier?) output formats, check into the
+Ceedling build tool project (ceedling.sourceforge.net) that works with Unity and
+CMock and supports xunit-style xml as well as other goodies.
+
+This script assumes the existence of files ending with the extensions
+`.testpass` and `.testfail`.The contents of these files includes the test
+results summary corresponding to each test file executed with the extension set
+according to the presence or absence of failures for that test file. The script
+searches a specified path for these files, opens each one it finds, parses the
+results, and aggregates and prints a summary. Calling it from the command line
+looks like this:
+
+```Shell
+ruby unity_test_summary.rb build/test/
+```
+
+You can optionally specify a root path as well. This is really helpful when you
+are using relative paths in your tools' setup, but you want to pull the summary
+into an IDE like Eclipse for clickable shortcuts.
+
+```Shell
+ruby unity_test_summary.rb build/test/ ~/projects/myproject/
+```
+
+Or, if you're more of a Windows sort of person:
+
+```Shell
+ruby unity_test_summary.rb build\teat\ C:\projects\myproject\
+```
+
+When configured correctly, you'll see a final summary, like so:
+
+```Shell
+--------------------------
+UNITY IGNORED TEST SUMMARY
+--------------------------
+blah.c:22:test_sandwiches_should_HaveBreadOnTwoSides:IGNORE
+
+-------------------------
+UNITY FAILED TEST SUMMARY
+-------------------------
+blah.c:87:test_sandwiches_should_HaveCondiments:FAIL:Expected 1 was 0
+meh.c:38:test_soda_should_BeCalledPop:FAIL:Expected "pop" was "coke"
+
+--------------------------
+OVERALL UNITY TEST SUMMARY
+--------------------------
+45 TOTAL TESTS 2 TOTAL FAILURES 1 IGNORED
+```
+
+How convenient is that?
+
+
+*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)*
diff --git a/support/cJSON-master/tests/unity/docs/license.txt b/support/cJSON-master/tests/unity/docs/license.txt
new file mode 100644
index 0000000..d66fba5
--- /dev/null
+++ b/support/cJSON-master/tests/unity/docs/license.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) <year> 2007-14 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.
diff --git a/support/cJSON-master/tests/unity/examples/example_1/makefile b/support/cJSON-master/tests/unity/examples/example_1/makefile
new file mode 100644
index 0000000..cca79b4
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_1/makefile
@@ -0,0 +1,71 @@
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+# [Released under MIT License. Please refer to license.txt for details]
+# ==========================================
+
+#We try to detect the OS we are running on, and adjust commands as needed
+ifeq ($(OS),Windows_NT)
+ ifeq ($(shell uname -s),) # not in a bash-like shell
+ CLEANUP = del /F /Q
+ MKDIR = mkdir
+ else # in a bash-like shell, like msys
+ CLEANUP = rm -f
+ MKDIR = mkdir -p
+ endif
+ TARGET_EXTENSION=.exe
+else
+ CLEANUP = rm -f
+ MKDIR = mkdir -p
+ TARGET_EXTENSION=.out
+endif
+
+C_COMPILER=gcc
+ifeq ($(shell uname -s), Darwin)
+C_COMPILER=clang
+endif
+
+UNITY_ROOT=../..
+
+CFLAGS=-std=c89
+CFLAGS += -Wall
+CFLAGS += -Wextra
+CFLAGS += -Wpointer-arith
+CFLAGS += -Wcast-align
+CFLAGS += -Wwrite-strings
+CFLAGS += -Wswitch-default
+CFLAGS += -Wunreachable-code
+CFLAGS += -Winit-self
+CFLAGS += -Wmissing-field-initializers
+CFLAGS += -Wno-unknown-pragmas
+CFLAGS += -Wstrict-prototypes
+CFLAGS += -Wundef
+CFLAGS += -Wold-style-definition
+
+TARGET_BASE1=test1
+TARGET_BASE2=test2
+TARGET1 = $(TARGET_BASE1)$(TARGET_EXTENSION)
+TARGET2 = $(TARGET_BASE2)$(TARGET_EXTENSION)
+SRC_FILES1=$(UNITY_ROOT)/src/unity.c src/ProductionCode.c test/TestProductionCode.c test/test_runners/TestProductionCode_Runner.c
+SRC_FILES2=$(UNITY_ROOT)/src/unity.c src/ProductionCode2.c test/TestProductionCode2.c test/test_runners/TestProductionCode2_Runner.c
+INC_DIRS=-Isrc -I$(UNITY_ROOT)/src
+SYMBOLS=
+
+all: clean default
+
+default: $(SRC_FILES1) $(SRC_FILES2)
+ $(C_COMPILER) $(CFLAGS) $(INC_DIRS) $(SYMBOLS) $(SRC_FILES1) -o $(TARGET1)
+ $(C_COMPILER) $(CFLAGS) $(INC_DIRS) $(SYMBOLS) $(SRC_FILES2) -o $(TARGET2)
+ - ./$(TARGET1)
+ ./$(TARGET2)
+
+test/test_runners/TestProductionCode_Runner.c: test/TestProductionCode.c
+ ruby $(UNITY_ROOT)/auto/generate_test_runner.rb test/TestProductionCode.c test/test_runners/TestProductionCode_Runner.c
+test/test_runners/TestProductionCode2_Runner.c: test/TestProductionCode2.c
+ ruby $(UNITY_ROOT)/auto/generate_test_runner.rb test/TestProductionCode2.c test/test_runners/TestProductionCode2_Runner.c
+
+clean:
+ $(CLEANUP) $(TARGET1) $(TARGET2)
+
+ci: CFLAGS += -Werror
+ci: default
diff --git a/support/cJSON-master/tests/unity/examples/example_1/readme.txt b/support/cJSON-master/tests/unity/examples/example_1/readme.txt
new file mode 100644
index 0000000..dfed815
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_1/readme.txt
@@ -0,0 +1,5 @@
+Example 1
+=========
+
+Close to the simplest possible example of Unity, using only basic features.
+Run make to build & run the example tests. \ No newline at end of file
diff --git a/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode.c b/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode.c
new file mode 100644
index 0000000..d039c3e
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode.c
@@ -0,0 +1,24 @@
+
+#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;
+}
diff --git a/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode.h b/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode.h
new file mode 100644
index 0000000..250ca0d
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode.h
@@ -0,0 +1,3 @@
+
+int FindFunction_WhichIsBroken(int NumberToFind);
+int FunctionWhichReturnsLocalVariable(void);
diff --git a/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode2.c b/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode2.c
new file mode 100644
index 0000000..98ee7ee
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode2.c
@@ -0,0 +1,11 @@
+
+#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;
+}
diff --git a/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode2.h b/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode2.h
new file mode 100644
index 0000000..34ae980
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_1/src/ProductionCode2.h
@@ -0,0 +1,2 @@
+
+char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction);
diff --git a/support/cJSON-master/tests/unity/examples/example_2/makefile b/support/cJSON-master/tests/unity/examples/example_2/makefile
new file mode 100644
index 0000000..99d8d96
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_2/makefile
@@ -0,0 +1,70 @@
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+# [Released under MIT License. Please refer to license.txt for details]
+# ==========================================
+
+#We try to detect the OS we are running on, and adjust commands as needed
+ifeq ($(OS),Windows_NT)
+ ifeq ($(shell uname -s),) # not in a bash-like shell
+ CLEANUP = del /F /Q
+ MKDIR = mkdir
+ else # in a bash-like shell, like msys
+ CLEANUP = rm -f
+ MKDIR = mkdir -p
+ endif
+ TARGET_EXTENSION=.exe
+else
+ CLEANUP = rm -f
+ MKDIR = mkdir -p
+ TARGET_EXTENSION=.out
+endif
+
+C_COMPILER=gcc
+ifeq ($(shell uname -s), Darwin)
+C_COMPILER=clang
+endif
+
+UNITY_ROOT=../..
+
+CFLAGS=-std=c99
+CFLAGS += -Wall
+CFLAGS += -Wextra
+CFLAGS += -Wpointer-arith
+CFLAGS += -Wcast-align
+CFLAGS += -Wwrite-strings
+CFLAGS += -Wswitch-default
+CFLAGS += -Wunreachable-code
+CFLAGS += -Winit-self
+CFLAGS += -Wmissing-field-initializers
+CFLAGS += -Wno-unknown-pragmas
+CFLAGS += -Wstrict-prototypes
+CFLAGS += -Wundef
+CFLAGS += -Wold-style-definition
+
+TARGET_BASE1=all_tests
+TARGET1 = $(TARGET_BASE1)$(TARGET_EXTENSION)
+SRC_FILES1=\
+ $(UNITY_ROOT)/src/unity.c \
+ $(UNITY_ROOT)/extras/fixture/src/unity_fixture.c \
+ src/ProductionCode.c \
+ src/ProductionCode2.c \
+ test/TestProductionCode.c \
+ test/TestProductionCode2.c \
+ test/test_runners/TestProductionCode_Runner.c \
+ test/test_runners/TestProductionCode2_Runner.c \
+ test/test_runners/all_tests.c
+INC_DIRS=-Isrc -I$(UNITY_ROOT)/src -I$(UNITY_ROOT)/extras/fixture/src
+SYMBOLS=
+
+all: clean default
+
+default:
+ $(C_COMPILER) $(CFLAGS) $(INC_DIRS) $(SYMBOLS) $(SRC_FILES1) -o $(TARGET1)
+ - ./$(TARGET1) -v
+
+clean:
+ $(CLEANUP) $(TARGET1)
+
+ci: CFLAGS += -Werror
+ci: default
diff --git a/support/cJSON-master/tests/unity/examples/example_2/readme.txt b/support/cJSON-master/tests/unity/examples/example_2/readme.txt
new file mode 100644
index 0000000..f0fce65
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_2/readme.txt
@@ -0,0 +1,5 @@
+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. \ No newline at end of file
diff --git a/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode.c b/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode.c
new file mode 100644
index 0000000..500b44b
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode.c
@@ -0,0 +1,24 @@
+
+#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;
+}
diff --git a/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode.h b/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode.h
new file mode 100644
index 0000000..250ca0d
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode.h
@@ -0,0 +1,3 @@
+
+int FindFunction_WhichIsBroken(int NumberToFind);
+int FunctionWhichReturnsLocalVariable(void);
diff --git a/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode2.c b/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode2.c
new file mode 100644
index 0000000..77c969f
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode2.c
@@ -0,0 +1,11 @@
+
+#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;
+}
diff --git a/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode2.h b/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode2.h
new file mode 100644
index 0000000..34ae980
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_2/src/ProductionCode2.h
@@ -0,0 +1,2 @@
+
+char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction);
diff --git a/support/cJSON-master/tests/unity/examples/example_3/helper/UnityHelper.c b/support/cJSON-master/tests/unity/examples/example_3/helper/UnityHelper.c
new file mode 100644
index 0000000..9cf42c6
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_3/helper/UnityHelper.c
@@ -0,0 +1,10 @@
+#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");
+}
diff --git a/support/cJSON-master/tests/unity/examples/example_3/helper/UnityHelper.h b/support/cJSON-master/tests/unity/examples/example_3/helper/UnityHelper.h
new file mode 100644
index 0000000..1516111
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_3/helper/UnityHelper.h
@@ -0,0 +1,12 @@
+#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
diff --git a/support/cJSON-master/tests/unity/examples/example_3/rakefile.rb b/support/cJSON-master/tests/unity/examples/example_3/rakefile.rb
new file mode 100644
index 0000000..bf9f42b
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_3/rakefile.rb
@@ -0,0 +1,43 @@
+HERE = File.expand_path(File.dirname(__FILE__)) + '/'
+UNITY_ROOT = File.expand_path(File.dirname(__FILE__)) + '/../..'
+
+require 'rake'
+require 'rake/clean'
+require HERE + 'rakefile_helper'
+
+TEMP_DIRS = [
+ File.join(HERE, 'build')
+].freeze
+
+TEMP_DIRS.each do |dir|
+ directory(dir)
+ CLOBBER.include(dir)
+end
+
+task prepare_for_tests: TEMP_DIRS
+
+include RakefileHelpers
+
+# 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
diff --git a/support/cJSON-master/tests/unity/examples/example_3/rakefile_helper.rb b/support/cJSON-master/tests/unity/examples/example_3/rakefile_helper.rb
new file mode 100644
index 0000000..a186cf0
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_3/rakefile_helper.rb
@@ -0,0 +1,249 @@
+require 'yaml'
+require 'fileutils'
+require UNITY_ROOT + '/auto/unity_test_summary'
+require UNITY_ROOT + '/auto/generate_test_runner'
+require UNITY_ROOT + '/auto/colour_reporter'
+
+module RakefileHelpers
+ C_EXTENSION = '.c'.freeze
+
+ def load_configuration(config_file)
+ $cfg_file = config_file
+ $cfg = YAML.load(File.read($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)
+ result = if strings.is_a?(Array)
+ "\"#{strings.join}\""
+ else
+ strings
+ end
+ result
+ 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]} " +
+ (obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj} " }).join +
+ $cfg['linker']['bin_files']['prefix'] + ' ' +
+ $cfg['linker']['bin_files']['destination'] +
+ 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 !$?.exitstatus.zero? && raise_on_fail
+ raise "Command failed. (Returned #{$?.exitstatus})"
+ end
+ output
+ end
+
+ def report_summary
+ summary = UnityTestSummary.new
+ summary.root = HERE
+ 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
+end
diff --git a/support/cJSON-master/tests/unity/examples/example_3/readme.txt b/support/cJSON-master/tests/unity/examples/example_3/readme.txt
new file mode 100644
index 0000000..7371fea
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_3/readme.txt
@@ -0,0 +1,13 @@
+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.
diff --git a/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode.c b/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode.c
new file mode 100644
index 0000000..500b44b
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode.c
@@ -0,0 +1,24 @@
+
+#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;
+}
diff --git a/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode.h b/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode.h
new file mode 100644
index 0000000..250ca0d
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode.h
@@ -0,0 +1,3 @@
+
+int FindFunction_WhichIsBroken(int NumberToFind);
+int FunctionWhichReturnsLocalVariable(void);
diff --git a/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode2.c b/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode2.c
new file mode 100644
index 0000000..77c969f
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode2.c
@@ -0,0 +1,11 @@
+
+#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;
+}
diff --git a/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode2.h b/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode2.h
new file mode 100644
index 0000000..34ae980
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_3/src/ProductionCode2.h
@@ -0,0 +1,2 @@
+
+char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction);
diff --git a/support/cJSON-master/tests/unity/examples/example_3/target_gcc_32.yml b/support/cJSON-master/tests/unity/examples/example_3/target_gcc_32.yml
new file mode 100644
index 0000000..f155508
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/example_3/target_gcc_32.yml
@@ -0,0 +1,46 @@
+# Copied from ~Unity/targets/gcc_32.yml
+unity_root: &unity_root '../..'
+compiler:
+ path: gcc
+ 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:
+ - 'src/'
+ - '../../src/'
+ - *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: []
diff --git a/support/cJSON-master/tests/unity/examples/unity_config.h b/support/cJSON-master/tests/unity/examples/unity_config.h
new file mode 100644
index 0000000..a2f161a
--- /dev/null
+++ b/support/cJSON-master/tests/unity/examples/unity_config.h
@@ -0,0 +1,239 @@
+/* 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_INCLUDE_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 */
+
+
+/* *************************** 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() */
+
+/* For some targets, Unity can make the otherwise required `setUp()` and
+ * `tearDown()` functions optional. This is a nice convenience for test writers
+ * since `setUp` and `tearDown` don't often actually _do_ anything. If you're
+ * using gcc or clang, this option is automatically defined for you. Other
+ * compilers can also support this behavior, if they support a C feature called
+ * weak functions. A weak function is a function that is compiled into your
+ * executable _unless_ a non-weak version of the same function is defined
+ * elsewhere. If a non-weak version is found, the weak version is ignored as if
+ * it never existed. If your compiler supports this feature, you can let Unity
+ * know by defining `UNITY_SUPPORT_WEAK` as the function attributes that would
+ * need to be applied to identify a function as weak. If your compiler lacks
+ * support for weak functions, you will always need to define `setUp` and
+ * `tearDown` functions (though they can be and often will be just empty). The
+ * most common options for this feature are:
+ */
+/* #define UNITY_SUPPORT_WEAK weak */
+/* #define UNITY_SUPPORT_WEAK __attribute__((weak)) */
+/* #define UNITY_NO_WEAK */
+
+/* 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 */
+
+#endif /* UNITY_CONFIG_H */
diff --git a/support/cJSON-master/tests/unity/extras/eclipse/error_parsers.txt b/support/cJSON-master/tests/unity/extras/eclipse/error_parsers.txt
new file mode 100644
index 0000000..94e34ff
--- /dev/null
+++ b/support/cJSON-master/tests/unity/extras/eclipse/error_parsers.txt
@@ -0,0 +1,26 @@
+Eclipse error parsers
+=====================
+
+These are a godsend for extracting & quickly navigating to
+warnings & error messages from console output. Unforunately
+I don't know how to write an Eclipse plugin so you'll have
+to add them manually.
+
+To add a console parser to Eclipse, go to Window --> Preferences
+--> C/C++ --> Build --> Settings. Click on the 'Error Parsers'
+tab and then click the 'Add...' button. See the table below for
+the parser fields to add.
+
+Eclipse will only parse the console output during a build, so
+running your unit tests must be part of your build process.
+Either add this to your make/rakefile, or add it as a post-
+build step in your Eclipse project settings.
+
+
+Unity unit test error parsers
+-----------------------------
+Severity Pattern File Line Description
+-------------------------------------------------------------------------------
+Error (\.+)(.*?):(\d+):(.*?):FAIL: (.*) $2 $3 $5
+Warning (\.+)(.*?):(\d+):(.*?):IGNORE: (.*) $2 $3 $5
+Warning (\.+)(.*?):(\d+):(.*?):IGNORE\s*$ $2 $3 Ignored test
diff --git a/support/cJSON-master/tests/unity/extras/fixture/rakefile.rb b/support/cJSON-master/tests/unity/extras/fixture/rakefile.rb
new file mode 100644
index 0000000..7603e57
--- /dev/null
+++ b/support/cJSON-master/tests/unity/extras/fixture/rakefile.rb
@@ -0,0 +1,48 @@
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+# [Released under MIT License. Please refer to license.txt for details]
+# ==========================================
+
+HERE = File.expand_path(File.dirname(__FILE__)) + '/'
+
+require 'rake'
+require 'rake/clean'
+require 'rake/testtask'
+require HERE + 'rakefile_helper'
+
+TEMP_DIRS = [
+ File.join(HERE, 'build')
+].freeze
+
+TEMP_DIRS.each do |dir|
+ directory(dir)
+ CLOBBER.include(dir)
+end
+
+task prepare_for_tests: TEMP_DIRS
+
+include RakefileHelpers
+
+# Load default configuration, for now
+DEFAULT_CONFIG_FILE = 'gcc_auto_stdint.yml'.freeze
+configure_toolchain(DEFAULT_CONFIG_FILE)
+
+task unit: [:prepare_for_tests] do
+ run_tests
+end
+
+desc 'Build and test Unity Framework'
+task all: %i(clean unit)
+task default: %i(clobber all)
+task ci: %i(no_color default)
+task cruise: %i(no_color default)
+
+desc 'Load configuration'
+task :config, :config_file do |_t, args|
+ configure_toolchain(args[:config_file])
+end
+
+task :no_color do
+ $colour_output = false
+end
diff --git a/support/cJSON-master/tests/unity/extras/fixture/rakefile_helper.rb b/support/cJSON-master/tests/unity/extras/fixture/rakefile_helper.rb
new file mode 100644
index 0000000..c45b239
--- /dev/null
+++ b/support/cJSON-master/tests/unity/extras/fixture/rakefile_helper.rb
@@ -0,0 +1,178 @@
+# ==========================================
+# Unity Project - A Test Framework for C
+# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+# [Released under MIT License. Please refer to license.txt for details]
+# ==========================================
+
+require 'yaml'
+require 'fileutils'
+require HERE + '../../auto/unity_test_summary'
+require HERE + '../../auto/generate_test_runner'
+require HERE + '../../auto/colour_reporter'
+
+module RakefileHelpers
+ C_EXTENSION = '.c'.freeze
+
+ def load_configuration(config_file)
+ return if $configured
+
+ $cfg_file = HERE + "../../test/targets/#{config_file}" unless config_file =~ /[\\|\/]/
+ $cfg = YAML.load(File.read($cfg_file))
+ $colour_output = false unless $cfg['colour']
+ $configured = true if config_file != DEFAULT_CONFIG_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$/
+ config_file = config_file unless config_file =~ /[\\|\/]/
+ load_configuration(config_file)
+ configure_clean
+ end
+
+ def tackit(strings)
+ result = if strings.is_a?(Array)
+ "\"#{strings.join}\""
+ else
+ strings
+ end
+ result
+ 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'] + ['UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar'] + ['UNITY_OUTPUT_CHAR_HEADER_DECLARATION=UnityOutputCharSpy_OutputChar\(int\)'])
+ 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
+ unity_include = $cfg['compiler']['includes']['prefix'] + '../../src'
+ cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{unity_include} #{file} " \
+ "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" \
+ "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}"
+
+ execute(cmd_str)
+ 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]} " +
+ (obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj} " }).join +
+ $cfg['linker']['bin_files']['prefix'] + ' ' +
+ $cfg['linker']['bin_files']['destination'] +
+ 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)
+ report command_string
+ output = `#{command_string}`.chomp
+ report(output) if verbose && !output.nil? && !output.empty?
+ raise "Command failed. (Returned #{$?.exitstatus})" if $?.exitstatus != 0
+ output
+ end
+
+ def report_summary
+ summary = UnityTestSummary.new
+ summary.root = HERE
+ results_glob = "#{$cfg['compiler']['build_path']}*.test*"
+ results_glob.tr!('\\', '/')
+ results = Dir[results_glob]
+ summary.targets = results
+ summary.run
+ end
+
+ def run_tests
+ report 'Running Unity 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?
+
+ # Get a list of all source files needed
+ src_files = Dir[HERE + 'src/*.c']
+ src_files += Dir[HERE + 'test/*.c']
+ src_files += Dir[HERE + 'test/main/*.c']
+ src_files << '../../src/unity.c'
+
+ # Build object files
+ src_files.each { |f| compile(f, test_defines) }
+ obj_list = src_files.map { |f| File.basename(f.ext($cfg['compiler']['object_files']['extension'])) }
+
+ # Link the test executable
+ test_base = 'framework_test'
+ 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 + ' -v -r'
+ else
+ "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}"
+ end
+ output = execute(cmd_str)
+ 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
diff --git a/support/cJSON-master/tests/unity/extras/fixture/readme.txt b/support/cJSON-master/tests/unity/extras/fixture/readme.txt
new file mode 100644
index 0000000..6b9a78c
--- /dev/null
+++ b/support/cJSON-master/tests/unity/extras/fixture/readme.txt
@@ -0,0 +1,9 @@
+Copyright (c) 2010 James Grenning and Contributed to Unity Project
+
+Unity Project - A Test Framework for C
+Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+[Released under MIT License. Please refer to license.txt for details]
+
+This Framework is an optional add-on to Unity. By including unity_framework.h in place of unity.h,
+you may now work with Unity in a manner similar to CppUTest. This framework adds the concepts of
+test groups and gives finer control of your tests over the command line. \ No newline at end of file
diff --git a/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture.c b/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture.c
new file mode 100644
index 0000000..3872bd8
--- /dev/null
+++ b/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture.c
@@ -0,0 +1,432 @@
+/* Copyright (c) 2010 James Grenning and Contributed to Unity Project
+ * ==========================================
+ * Unity Project - A Test Framework for C
+ * Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+ * [Released under MIT License. Please refer to license.txt for details]
+ * ========================================== */
+
+#include "unity_fixture.h"
+#include "unity_internals.h"
+#include <string.h>
+
+struct UNITY_FIXTURE_T UnityFixture;
+
+/* If you decide to use the function pointer approach.
+ * Build with -D UNITY_OUTPUT_CHAR=outputChar and include <stdio.h>
+ * int (*outputChar)(int) = putchar; */
+
+#if !defined(UNITY_WEAK_ATTRIBUTE) && !defined(UNITY_WEAK_PRAGMA)
+void setUp(void) { /*does nothing*/ }
+void tearDown(void) { /*does nothing*/ }
+#endif
+
+static void announceTestRun(unsigned int runNumber)
+{
+ UnityPrint("Unity test run ");
+ UnityPrintNumberUnsigned(runNumber+1);
+ UnityPrint(" of ");
+ UnityPrintNumberUnsigned(UnityFixture.RepeatCount);
+ UNITY_PRINT_EOL();
+}
+
+int UnityMain(int argc, const char* argv[], void (*runAllTests)(void))
+{
+ int result = UnityGetCommandLineOptions(argc, argv);
+ unsigned int r;
+ if (result != 0)
+ return result;
+
+ for (r = 0; r < UnityFixture.RepeatCount; r++)
+ {
+ UnityBegin(argv[0]);
+ announceTestRun(r);
+ runAllTests();
+ if (!UnityFixture.Verbose) UNITY_PRINT_EOL();
+ UnityEnd();
+ }
+
+ return (int)Unity.TestFailures;
+}
+
+static int selected(const char* filter, const char* name)
+{
+ if (filter == 0)
+ return 1;
+ return strstr(name, filter) ? 1 : 0;
+}
+
+static int testSelected(const char* test)
+{
+ return selected(UnityFixture.NameFilter, test);
+}
+
+static int groupSelected(const char* group)
+{
+ return selected(UnityFixture.GroupFilter, group);
+}
+
+void UnityTestRunner(unityfunction* setup,
+ unityfunction* testBody,
+ unityfunction* teardown,
+ const char* printableName,
+ const char* group,
+ const char* name,
+ const char* file,
+ unsigned int line)
+{
+ if (testSelected(name) && groupSelected(group))
+ {
+ Unity.TestFile = file;
+ Unity.CurrentTestName = printableName;
+ Unity.CurrentTestLineNumber = line;
+ if (!UnityFixture.Verbose)
+ UNITY_OUTPUT_CHAR('.');
+ else
+ {
+ UnityPrint(printableName);
+ #ifndef UNITY_REPEAT_TEST_NAME
+ Unity.CurrentTestName = NULL;
+ #endif
+ }
+
+ Unity.NumberOfTests++;
+ UnityMalloc_StartTest();
+ UnityPointer_Init();
+
+ if (TEST_PROTECT())
+ {
+ setup();
+ testBody();
+ }
+ if (TEST_PROTECT())
+ {
+ teardown();
+ }
+ if (TEST_PROTECT())
+ {
+ UnityPointer_UndoAllSets();
+ if (!Unity.CurrentTestFailed)
+ UnityMalloc_EndTest();
+ }
+ UnityConcludeFixtureTest();
+ }
+}
+
+void UnityIgnoreTest(const char* printableName, const char* group, const char* name)
+{
+ if (testSelected(name) && groupSelected(group))
+ {
+ Unity.NumberOfTests++;
+ Unity.TestIgnores++;
+ if (!UnityFixture.Verbose)
+ UNITY_OUTPUT_CHAR('!');
+ else
+ {
+ UnityPrint(printableName);
+ UNITY_PRINT_EOL();
+ }
+ }
+}
+
+
+/*------------------------------------------------- */
+/* Malloc and free stuff */
+#define MALLOC_DONT_FAIL -1
+static int malloc_count;
+static int malloc_fail_countdown = MALLOC_DONT_FAIL;
+
+void UnityMalloc_StartTest(void)
+{
+ malloc_count = 0;
+ malloc_fail_countdown = MALLOC_DONT_FAIL;
+}
+
+void UnityMalloc_EndTest(void)
+{
+ malloc_fail_countdown = MALLOC_DONT_FAIL;
+ if (malloc_count != 0)
+ {
+ UNITY_TEST_FAIL(Unity.CurrentTestLineNumber, "This test leaks!");
+ }
+}
+
+void UnityMalloc_MakeMallocFailAfterCount(int countdown)
+{
+ malloc_fail_countdown = countdown;
+}
+
+/* These definitions are always included from unity_fixture_malloc_overrides.h */
+/* We undef to use them or avoid conflict with <stdlib.h> per the C standard */
+#undef malloc
+#undef free
+#undef calloc
+#undef realloc
+
+#ifdef UNITY_EXCLUDE_STDLIB_MALLOC
+static unsigned char unity_heap[UNITY_INTERNAL_HEAP_SIZE_BYTES];
+static size_t heap_index;
+#else
+#include <stdlib.h>
+#endif
+
+typedef struct GuardBytes
+{
+ size_t size;
+ size_t guard_space;
+} Guard;
+
+
+static const char end[] = "END";
+
+void* unity_malloc(size_t size)
+{
+ char* mem;
+ Guard* guard;
+ size_t total_size = size + sizeof(Guard) + sizeof(end);
+
+ if (malloc_fail_countdown != MALLOC_DONT_FAIL)
+ {
+ if (malloc_fail_countdown == 0)
+ return NULL;
+ malloc_fail_countdown--;
+ }
+
+ if (size == 0) return NULL;
+#ifdef UNITY_EXCLUDE_STDLIB_MALLOC
+ if (heap_index + total_size > UNITY_INTERNAL_HEAP_SIZE_BYTES)
+ {
+ guard = NULL;
+ }
+ else
+ {
+ guard = (Guard*)&unity_heap[heap_index];
+ heap_index += total_size;
+ }
+#else
+ guard = (Guard*)UNITY_FIXTURE_MALLOC(total_size);
+#endif
+ if (guard == NULL) return NULL;
+ malloc_count++;
+ guard->size = size;
+ guard->guard_space = 0;
+ mem = (char*)&(guard[1]);
+ memcpy(&mem[size], end, sizeof(end));
+
+ return (void*)mem;
+}
+
+static int isOverrun(void* mem)
+{
+ Guard* guard = (Guard*)mem;
+ char* memAsChar = (char*)mem;
+ guard--;
+
+ return guard->guard_space != 0 || strcmp(&memAsChar[guard->size], end) != 0;
+}
+
+static void release_memory(void* mem)
+{
+ Guard* guard = (Guard*)mem;
+ guard--;
+
+ malloc_count--;
+#ifdef UNITY_EXCLUDE_STDLIB_MALLOC
+ if (mem == unity_heap + heap_index - guard->size - sizeof(end))
+ {
+ heap_index -= (guard->size + sizeof(Guard) + sizeof(end));
+ }
+#else
+ UNITY_FIXTURE_FREE(guard);
+#endif
+}
+
+void unity_free(void* mem)
+{
+ int overrun;
+
+ if (mem == NULL)
+ {
+ return;
+ }
+
+ overrun = isOverrun(mem);
+ release_memory(mem);
+ if (overrun)
+ {
+ UNITY_TEST_FAIL(Unity.CurrentTestLineNumber, "Buffer overrun detected during free()");
+ }
+}
+
+void* unity_calloc(size_t num, size_t size)
+{
+ void* mem = unity_malloc(num * size);
+ if (mem == NULL) return NULL;
+ memset(mem, 0, num * size);
+ return mem;
+}
+
+void* unity_realloc(void* oldMem, size_t size)
+{
+ Guard* guard = (Guard*)oldMem;
+ void* newMem;
+
+ if (oldMem == NULL) return unity_malloc(size);
+
+ guard--;
+ if (isOverrun(oldMem))
+ {
+ release_memory(oldMem);
+ UNITY_TEST_FAIL(Unity.CurrentTestLineNumber, "Buffer overrun detected during realloc()");
+ }
+
+ if (size == 0)
+ {
+ release_memory(oldMem);
+ return NULL;
+ }
+
+ if (guard->size >= size) return oldMem;
+
+#ifdef UNITY_EXCLUDE_STDLIB_MALLOC /* Optimization if memory is expandable */
+ if (oldMem == unity_heap + heap_index - guard->size - sizeof(end) &&
+ heap_index + size - guard->size <= UNITY_INTERNAL_HEAP_SIZE_BYTES)
+ {
+ release_memory(oldMem); /* Not thread-safe, like unity_heap generally */
+ return unity_malloc(size); /* No memcpy since data is in place */
+ }
+#endif
+ newMem = unity_malloc(size);
+ if (newMem == NULL) return NULL; /* Do not release old memory */
+ memcpy(newMem, oldMem, guard->size);
+ release_memory(oldMem);
+ return newMem;
+}
+
+
+/*-------------------------------------------------------- */
+/*Automatic pointer restoration functions */
+struct PointerPair
+{
+ void** pointer;
+ void* old_value;
+};
+
+static struct PointerPair pointer_store[UNITY_MAX_POINTERS];
+static int pointer_index = 0;
+
+void UnityPointer_Init(void)
+{
+ pointer_index = 0;
+}
+
+void UnityPointer_Set(void** pointer, void* newValue, UNITY_LINE_TYPE line)
+{
+ if (pointer_index >= UNITY_MAX_POINTERS)
+ {
+ UNITY_TEST_FAIL(line, "Too many pointers set");
+ }
+ else
+ {
+ pointer_store[pointer_index].pointer = pointer;
+ pointer_store[pointer_index].old_value = *pointer;
+ *pointer = newValue;
+ pointer_index++;
+ }
+}
+
+void UnityPointer_UndoAllSets(void)
+{
+ while (pointer_index > 0)
+ {
+ pointer_index--;
+ *(pointer_store[pointer_index].pointer) =
+ pointer_store[pointer_index].old_value;
+ }
+}
+
+int UnityGetCommandLineOptions(int argc, const char* argv[])
+{
+ int i;
+ UnityFixture.Verbose = 0;
+ UnityFixture.GroupFilter = 0;
+ UnityFixture.NameFilter = 0;
+ UnityFixture.RepeatCount = 1;
+
+ if (argc == 1)
+ return 0;
+
+ for (i = 1; i < argc; )
+ {
+ if (strcmp(argv[i], "-v") == 0)
+ {
+ UnityFixture.Verbose = 1;
+ i++;
+ }
+ else if (strcmp(argv[i], "-g") == 0)
+ {
+ i++;
+ if (i >= argc)
+ return 1;
+ UnityFixture.GroupFilter = argv[i];
+ i++;
+ }
+ else if (strcmp(argv[i], "-n") == 0)
+ {
+ i++;
+ if (i >= argc)
+ return 1;
+ UnityFixture.NameFilter = argv[i];
+ i++;
+ }
+ else if (strcmp(argv[i], "-r") == 0)
+ {
+ UnityFixture.RepeatCount = 2;
+ i++;
+ if (i < argc)
+ {
+ if (*(argv[i]) >= '0' && *(argv[i]) <= '9')
+ {
+ unsigned int digit = 0;
+ UnityFixture.RepeatCount = 0;
+ while (argv[i][digit] >= '0' && argv[i][digit] <= '9')
+ {
+ UnityFixture.RepeatCount *= 10;
+ UnityFixture.RepeatCount += (unsigned int)argv[i][digit++] - '0';
+ }
+ i++;
+ }
+ }
+ }
+ else
+ {
+ /* ignore unknown parameter */
+ i++;
+ }
+ }
+ return 0;
+}
+
+void UnityConcludeFixtureTest(void)
+{
+ if (Unity.CurrentTestIgnored)
+ {
+ Unity.TestIgnores++;
+ UNITY_PRINT_EOL();
+ }
+ else if (!Unity.CurrentTestFailed)
+ {
+ if (UnityFixture.Verbose)
+ {
+ UnityPrint(" PASS");
+ UNITY_PRINT_EOL();
+ }
+ }
+ else /* Unity.CurrentTestFailed */
+ {
+ Unity.TestFailures++;
+ UNITY_PRINT_EOL();
+ }
+
+ Unity.CurrentTestFailed = 0;
+ Unity.CurrentTestIgnored = 0;
+}
diff --git a/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture.h b/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture.h
new file mode 100644
index 0000000..6f8d623
--- /dev/null
+++ b/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture.h
@@ -0,0 +1,83 @@
+/* Copyright (c) 2010 James Grenning and Contributed to Unity Project
+ * ==========================================
+ * Unity Project - A Test Framework for C
+ * Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+ * [Released under MIT License. Please refer to license.txt for details]
+ * ========================================== */
+
+#ifndef UNITY_FIXTURE_H_
+#define UNITY_FIXTURE_H_
+
+#include "unity.h"
+#include "unity_internals.h"
+#include "unity_fixture_malloc_overrides.h"
+#include "unity_fixture_internals.h"
+
+int UnityMain(int argc, const char* argv[], void (*runAllTests)(void));
+
+
+#define TEST_GROUP(group)\
+ static const char* TEST_GROUP_##group = #group
+
+#define TEST_SETUP(group) void TEST_##group##_SETUP(void);\
+ void TEST_##group##_SETUP(void)
+
+#define TEST_TEAR_DOWN(group) void TEST_##group##_TEAR_DOWN(void);\
+ void TEST_##group##_TEAR_DOWN(void)
+
+
+#define TEST(group, name) \
+ void TEST_##group##_##name##_(void);\
+ void TEST_##group##_##name##_run(void);\
+ void TEST_##group##_##name##_run(void)\
+ {\
+ UnityTestRunner(TEST_##group##_SETUP,\
+ TEST_##group##_##name##_,\
+ TEST_##group##_TEAR_DOWN,\
+ "TEST(" #group ", " #name ")",\
+ TEST_GROUP_##group, #name,\
+ __FILE__, __LINE__);\
+ }\
+ void TEST_##group##_##name##_(void)
+
+#define IGNORE_TEST(group, name) \
+ void TEST_##group##_##name##_(void);\
+ void TEST_##group##_##name##_run(void);\
+ void TEST_##group##_##name##_run(void)\
+ {\
+ UnityIgnoreTest("IGNORE_TEST(" #group ", " #name ")", TEST_GROUP_##group, #name);\
+ }\
+ void TEST_##group##_##name##_(void)
+
+/* Call this for each test, insider the group runner */
+#define RUN_TEST_CASE(group, name) \
+ { void TEST_##group##_##name##_run(void);\
+ TEST_##group##_##name##_run(); }
+
+/* This goes at the bottom of each test file or in a separate c file */
+#define TEST_GROUP_RUNNER(group)\
+ void TEST_##group##_GROUP_RUNNER(void);\
+ void TEST_##group##_GROUP_RUNNER(void)
+
+/* Call this from main */
+#define RUN_TEST_GROUP(group)\
+ { void TEST_##group##_GROUP_RUNNER(void);\
+ TEST_##group##_GROUP_RUNNER(); }
+
+/* CppUTest Compatibility Macros */
+#ifndef UNITY_EXCLUDE_CPPUTEST_ASSERTS
+/* Sets a pointer and automatically restores it to its old value after teardown */
+#define UT_PTR_SET(ptr, newPointerValue) UnityPointer_Set((void**)&(ptr), (void*)(newPointerValue), __LINE__)
+#define TEST_ASSERT_POINTERS_EQUAL(expected, actual) TEST_ASSERT_EQUAL_PTR((expected), (actual))
+#define TEST_ASSERT_BYTES_EQUAL(expected, actual) TEST_ASSERT_EQUAL_HEX8(0xff & (expected), 0xff & (actual))
+#define FAIL(message) TEST_FAIL_MESSAGE((message))
+#define CHECK(condition) TEST_ASSERT_TRUE((condition))
+#define LONGS_EQUAL(expected, actual) TEST_ASSERT_EQUAL_INT((expected), (actual))
+#define STRCMP_EQUAL(expected, actual) TEST_ASSERT_EQUAL_STRING((expected), (actual))
+#define DOUBLES_EQUAL(expected, actual, delta) TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual))
+#endif
+
+/* You must compile with malloc replacement, as defined in unity_fixture_malloc_overrides.h */
+void UnityMalloc_MakeMallocFailAfterCount(int count);
+
+#endif /* UNITY_FIXTURE_H_ */
diff --git a/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture_internals.h b/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture_internals.h
new file mode 100644
index 0000000..aa0d9e7
--- /dev/null
+++ b/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture_internals.h
@@ -0,0 +1,51 @@
+/* Copyright (c) 2010 James Grenning and Contributed to Unity Project
+ * ==========================================
+ * Unity Project - A Test Framework for C
+ * Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+ * [Released under MIT License. Please refer to license.txt for details]
+ * ========================================== */
+
+#ifndef UNITY_FIXTURE_INTERNALS_H_
+#define UNITY_FIXTURE_INTERNALS_H_
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+struct UNITY_FIXTURE_T
+{
+ int Verbose;
+ unsigned int RepeatCount;
+ const char* NameFilter;
+ const char* GroupFilter;
+};
+extern struct UNITY_FIXTURE_T UnityFixture;
+
+typedef void unityfunction(void);
+void UnityTestRunner(unityfunction* setup,
+ unityfunction* body,
+ unityfunction* teardown,
+ const char* printableName,
+ const char* group,
+ const char* name,
+ const char* file, unsigned int line);
+
+void UnityIgnoreTest(const char* printableName, const char* group, const char* name);
+void UnityMalloc_StartTest(void);
+void UnityMalloc_EndTest(void);
+int UnityGetCommandLineOptions(int argc, const char* argv[]);
+void UnityConcludeFixtureTest(void);
+
+void UnityPointer_Set(void** ptr, void* newValue, UNITY_LINE_TYPE line);
+void UnityPointer_UndoAllSets(void);
+void UnityPointer_Init(void);
+#ifndef UNITY_MAX_POINTERS
+#define UNITY_MAX_POINTERS 5
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* UNITY_FIXTURE_INTERNALS_H_ */
diff --git a/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture_malloc_overrides.h b/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture_malloc_overrides.h
new file mode 100644
index 0000000..7daba50
--- /dev/null
+++ b/support/cJSON-master/tests/unity/extras/fixture/src/unity_fixture_malloc_overrides.h
@@ -0,0 +1,47 @@
+/* Copyright (c) 2010 James Grenning and Contributed to Unity Project
+ * ==========================================
+ * Unity Project - A Test Framework for C
+ * Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
+ * [Released under MIT License. Please refer to license.txt for details]
+ * ========================================== */
+
+#ifndef UNITY_FIXTURE_MALLOC_OVERRIDES_H_
+#define UNITY_FIXTURE_MALLOC_OVERRIDES_H_
+
+#include <stddef.h>
+
+#ifdef UNITY_EXCLUDE_STDLIB_MALLOC
+/* Define this macro to remove the use of stdlib.h, malloc, and free.
+ * Many embedded systems do not have a heap or malloc/free by default.
+ * This internal unity_malloc() provides allocated memory deterministically from
+ * the end of an array only, unity_free() only releases from end-of-array,
+ * blocks are not coalesced, and memory not freed in LIFO order is stranded. */
+ #ifndef UNITY_INTERNAL_HEAP_SIZE_BYTES
+ #define UNITY_INTERNAL_HEAP_SIZE_BYTES 256
+ #endif
+#endif
+
+/* These functions are used by the Unity Fixture to allocate and release memory
+ * on the heap and can be overridden with platform-specific implementations.
+ * For example, when using FreeRTOS UNITY_FIXTURE_MALLOC becomes pvPortMalloc()
+ * and UNITY_FIXTURE_FREE becomes vPortFree(). */
+#if !defined(UNITY_FIXTURE_MALLOC) || !defined(UNITY_FIXTURE_FREE)
+ #include <stdlib.h>
+ #define UNITY_FIXTURE_MALLOC(size) malloc(size)
+ #define UNITY_FIXTURE_FREE(ptr) free(ptr)
+#else
+ extern void* UNITY_FIXTURE_MALLOC(size_t size);
+ extern void UNITY_FIXTURE_FREE(void* ptr);
+#endif
+
+#define malloc unity_malloc
+#define calloc unity_calloc
+#define realloc unity_realloc
+#define free unity_free
+
+void* unity_malloc(size_t size);
+void* unity_calloc(size_t num, size_t size);
+void* unity_realloc(void * oldMem, size_t size);
+void unity_free(void * mem);
+
+#endif /* UNITY_FIXTURE_MALLOC_OVERRIDES_H_ */
diff --git a/support/cJSON-master/tests/unity/release/build.info b/support/cJSON-master/tests/unity/release/build.info
new file mode 100644
index 0000000..56d5912
--- /dev/null
+++ b/support/cJSON-master/tests/unity/release/build.info
@@ -0,0 +1,2 @@
+122
+
diff --git a/support/cJSON-master/tests/unity/release/version.info b/support/cJSON-master/tests/unity/release/version.info
new file mode 100644
index 0000000..cf12b30
--- /dev/null
+++ b/support/cJSON-master/tests/unity/release/version.info
@@ -0,0 +1,2 @@
+2.4.3
+
diff --git a/support/cJSON-master/tests/unity/src/unity.c b/support/cJSON-master/tests/unity/src/unity.c
new file mode 100644
index 0000000..0f2d2de
--- /dev/null
+++ b/support/cJSON-master/tests/unity/src/unity.c
@@ -0,0 +1,1570 @@
+/* =========================================================================
+ Unity Project - A Test Framework for C
+ Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams
+ [Released under MIT License. Please refer to license.txt for details]
+============================================================================ */
+
+#define UNITY_INCLUDE_SETUP_STUBS
+#include "unity.h"
+#include <stddef.h>
+
+/* If omitted from header, declare overrideable prototypes here so they're ready for use */
+#ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION
+void UNITY_OUTPUT_CHAR(int);
+#endif
+
+/* Helpful macros for us to use here in Assert functions */
+#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; TEST_ABORT(); }
+#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; TEST_ABORT(); }
+#define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return
+
+struct UNITY_STORAGE_T Unity;
+
+#ifdef UNITY_OUTPUT_COLOR
+static const char UnityStrOk[] = "\033[42mOK\033[00m";
+static const char UnityStrPass[] = "\033[42mPASS\033[00m";
+static const char UnityStrFail[] = "\033[41mFAIL\033[00m";
+static const char UnityStrIgnore[] = "\033[43mIGNORE\033[00m";
+#else
+static const char UnityStrOk[] = "OK";
+static const char UnityStrPass[] = "PASS";
+static const char UnityStrFail[] = "FAIL";
+static const char UnityStrIgnore[] = "IGNORE";
+#endif
+static const char UnityStrNull[] = "NULL";
+static const char UnityStrSpacer[] = ". ";
+static const char UnityStrExpected[] = " Expected ";
+static const char UnityStrWas[] = " Was ";
+static const char UnityStrGt[] = " to be greater than ";
+static const char UnityStrLt[] = " to be less than ";
+static const char UnityStrOrEqual[] = "or equal to ";
+static const char UnityStrElement[] = " Element ";
+static const char UnityStrByte[] = " Byte ";
+static const char UnityStrMemory[] = " Memory Mismatch.";
+static const char UnityStrDelta[] = " Values Not Within Delta ";
+static const char UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless.";
+static const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL";
+static const char UnityStrNullPointerForActual[] = " Actual pointer was NULL";
+#ifndef UNITY_EXCLUDE_FLOAT
+static const char UnityStrNot[] = "Not ";
+static const char UnityStrInf[] = "Infinity";
+static const char UnityStrNegInf[] = "Negative Infinity";
+static const char UnityStrNaN[] = "NaN";
+static const char UnityStrDet[] = "Determinate";
+static const char UnityStrInvalidFloatTrait[] = "Invalid Float Trait";
+#endif
+const char UnityStrErrFloat[] = "Unity Floating Point Disabled";
+const char UnityStrErrDouble[] = "Unity Double Precision Disabled";
+const char UnityStrErr64[] = "Unity 64-bit Support Disabled";
+static const char UnityStrBreaker[] = "-----------------------";
+static const char UnityStrResultsTests[] = " Tests ";
+static const char UnityStrResultsFailures[] = " Failures ";
+static const char UnityStrResultsIgnored[] = " Ignored ";
+static const char UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " ";
+static const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " ";
+
+/*-----------------------------------------------
+ * Pretty Printers & Test Result Output Handlers
+ *-----------------------------------------------*/
+
+void UnityPrint(const char* string)
+{
+ const char* pch = string;
+
+ if (pch != NULL)
+ {
+ while (*pch)
+ {
+ /* printable characters plus CR & LF are printed */
+ if ((*pch <= 126) && (*pch >= 32))
+ {
+ UNITY_OUTPUT_CHAR(*pch);
+ }
+ /* write escaped carriage returns */
+ else if (*pch == 13)
+ {
+ UNITY_OUTPUT_CHAR('\\');
+ UNITY_OUTPUT_CHAR('r');
+ }
+ /* write escaped line feeds */
+ else if (*pch == 10)
+ {
+ UNITY_OUTPUT_CHAR('\\');
+ UNITY_OUTPUT_CHAR('n');
+ }
+#ifdef UNITY_OUTPUT_COLOR
+ /* print ANSI escape code */
+ else if (*pch == 27 && *(pch + 1) == '[')
+ {
+ while (*pch && *pch != 'm')
+ {
+ UNITY_OUTPUT_CHAR(*pch);
+ pch++;
+ }
+ UNITY_OUTPUT_CHAR('m');
+ }
+#endif
+ /* unprintable characters are shown as codes */
+ else
+ {
+ UNITY_OUTPUT_CHAR('\\');
+ UNITY_OUTPUT_CHAR('x');
+ UnityPrintNumberHex((UNITY_UINT)*pch, 2);
+ }
+ pch++;
+ }
+ }
+}
+
+void UnityPrintLen(const char* string, const UNITY_UINT32 length)
+{
+ const char* pch = string;
+
+ if (pch != NULL)
+ {
+ while (*pch && (UNITY_UINT32)(pch - string) < length)
+ {
+ /* printable characters plus CR & LF are printed */
+ if ((*pch <= 126) && (*pch >= 32))
+ {
+ UNITY_OUTPUT_CHAR(*pch);
+ }
+ /* write escaped carriage returns */
+ else if (*pch == 13)
+ {
+ UNITY_OUTPUT_CHAR('\\');
+ UNITY_OUTPUT_CHAR('r');
+ }
+ /* write escaped line feeds */
+ else if (*pch == 10)
+ {
+ UNITY_OUTPUT_CHAR('\\');
+ UNITY_OUTPUT_CHAR('n');
+ }
+ /* unprintable characters are shown as codes */
+ else
+ {
+ UNITY_OUTPUT_CHAR('\\');
+ UNITY_OUTPUT_CHAR('x');
+ UnityPrintNumberHex((UNITY_UINT)*pch, 2);
+ }
+ pch++;
+ }
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style)
+{
+ if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
+ {
+ UnityPrintNumber(number);
+ }
+ else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT)
+ {
+ UnityPrintNumberUnsigned((UNITY_UINT)number);
+ }
+ else
+ {
+ UNITY_OUTPUT_CHAR('0');
+ UNITY_OUTPUT_CHAR('x');
+ UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2));
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityPrintNumber(const UNITY_INT number_to_print)
+{
+ UNITY_UINT number = (UNITY_UINT)number_to_print;
+
+ if (number_to_print < 0)
+ {
+ /* A negative number, including MIN negative */
+ UNITY_OUTPUT_CHAR('-');
+ number = (UNITY_UINT)(-number_to_print);
+ }
+ UnityPrintNumberUnsigned(number);
+}
+
+/*-----------------------------------------------
+ * basically do an itoa using as little ram as possible */
+void UnityPrintNumberUnsigned(const UNITY_UINT number)
+{
+ UNITY_UINT divisor = 1;
+
+ /* figure out initial divisor */
+ while (number / divisor > 9)
+ {
+ divisor *= 10;
+ }
+
+ /* now mod and print, then divide divisor */
+ do
+ {
+ UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10)));
+ divisor /= 10;
+ } while (divisor > 0);
+}
+
+/*-----------------------------------------------*/
+void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print)
+{
+ int nibble;
+ char nibbles = nibbles_to_print;
+ if ((unsigned)nibbles > (2 * sizeof(number)))
+ nibbles = 2 * sizeof(number);
+
+ while (nibbles > 0)
+ {
+ nibbles--;
+ nibble = (int)(number >> (nibbles * 4)) & 0x0F;
+ if (nibble <= 9)
+ {
+ UNITY_OUTPUT_CHAR((char)('0' + nibble));
+ }
+ else
+ {
+ UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble));
+ }
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number)
+{
+ UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1);
+ UNITY_INT32 i;
+
+ for (i = 0; i < UNITY_INT_WIDTH; i++)
+ {
+ if (current_bit & mask)
+ {
+ if (current_bit & number)
+ {
+ UNITY_OUTPUT_CHAR('1');
+ }
+ else
+ {
+ UNITY_OUTPUT_CHAR('0');
+ }
+ }
+ else
+ {
+ UNITY_OUTPUT_CHAR('X');
+ }
+ current_bit = current_bit >> 1;
+ }
+}
+
+/*-----------------------------------------------*/
+#ifndef UNITY_EXCLUDE_FLOAT_PRINT
+/* This function prints a floating-point value in a format similar to
+ * printf("%.6g"). It can work with either single- or double-precision,
+ * but for simplicity, it prints only 6 significant digits in either case.
+ * Printing more than 6 digits accurately is hard (at least in the single-
+ * precision case) and isn't attempted here. */
+void UnityPrintFloat(const UNITY_DOUBLE input_number)
+{
+ UNITY_DOUBLE number = input_number;
+
+ /* print minus sign (including for negative zero) */
+ if (number < 0.0f || (number == 0.0f && 1.0f / number < 0.0f))
+ {
+ UNITY_OUTPUT_CHAR('-');
+ number = -number;
+ }
+
+ /* handle zero, NaN, and +/- infinity */
+ if (number == 0.0f) UnityPrint("0");
+ else if (isnan(number)) UnityPrint("nan");
+ else if (isinf(number)) UnityPrint("inf");
+ else
+ {
+ int exponent = 0;
+ int decimals, digits;
+ UNITY_INT32 n;
+ char buf[16];
+
+ /* scale up or down by powers of 10 */
+ while (number < 100000.0f / 1e6f) { number *= 1e6f; exponent -= 6; }
+ while (number < 100000.0f) { number *= 10.0f; exponent--; }
+ while (number > 1000000.0f * 1e6f) { number /= 1e6f; exponent += 6; }
+ while (number > 1000000.0f) { number /= 10.0f; exponent++; }
+
+ /* round to nearest integer */
+ n = ((UNITY_INT32)(number + number) + 1) / 2;
+ if (n > 999999)
+ {
+ n = 100000;
+ exponent++;
+ }
+
+ /* determine where to place decimal point */
+ decimals = (exponent <= 0 && exponent >= -9) ? -exponent : 5;
+ exponent += decimals;
+
+ /* truncate trailing zeroes after decimal point */
+ while (decimals > 0 && n % 10 == 0)
+ {
+ n /= 10;
+ decimals--;
+ }
+
+ /* build up buffer in reverse order */
+ digits = 0;
+ while (n != 0 || digits < decimals + 1)
+ {
+ buf[digits++] = (char)('0' + n % 10);
+ n /= 10;
+ }
+ while (digits > 0)
+ {
+ if(digits == decimals) UNITY_OUTPUT_CHAR('.');
+ UNITY_OUTPUT_CHAR(buf[--digits]);
+ }
+
+ /* print exponent if needed */
+ if (exponent != 0)
+ {
+ UNITY_OUTPUT_CHAR('e');
+
+ if(exponent < 0)
+ {
+ UNITY_OUTPUT_CHAR('-');
+ exponent = -exponent;
+ }
+ else
+ {
+ UNITY_OUTPUT_CHAR('+');
+ }
+
+ digits = 0;
+ while (exponent != 0 || digits < 2)
+ {
+ buf[digits++] = (char)('0' + exponent % 10);
+ exponent /= 10;
+ }
+ while (digits > 0)
+ {
+ UNITY_OUTPUT_CHAR(buf[--digits]);
+ }
+ }
+ }
+}
+#endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */
+
+/*-----------------------------------------------*/
+static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line)
+{
+ UnityPrint(file);
+ UNITY_OUTPUT_CHAR(':');
+ UnityPrintNumber((UNITY_INT)line);
+ UNITY_OUTPUT_CHAR(':');
+ UnityPrint(Unity.CurrentTestName);
+ UNITY_OUTPUT_CHAR(':');
+}
+
+/*-----------------------------------------------*/
+static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line)
+{
+ UnityTestResultsBegin(Unity.TestFile, line);
+ UnityPrint(UnityStrFail);
+ UNITY_OUTPUT_CHAR(':');
+}
+
+/*-----------------------------------------------*/
+void UnityConcludeTest(void)
+{
+ if (Unity.CurrentTestIgnored)
+ {
+ Unity.TestIgnores++;
+ }
+ else if (!Unity.CurrentTestFailed)
+ {
+ UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber);
+ UnityPrint(UnityStrPass);
+ }
+ else
+ {
+ Unity.TestFailures++;
+ }
+
+ Unity.CurrentTestFailed = 0;
+ Unity.CurrentTestIgnored = 0;
+ UNITY_PRINT_EOL();
+ UNITY_FLUSH_CALL();
+}
+
+/*-----------------------------------------------*/
+static void UnityAddMsgIfSpecified(const char* msg)
+{
+ if (msg)
+ {
+ UnityPrint(UnityStrSpacer);
+#ifndef UNITY_EXCLUDE_DETAILS
+ if (Unity.CurrentDetail1)
+ {
+ UnityPrint(UnityStrDetail1Name);
+ UnityPrint(Unity.CurrentDetail1);
+ if (Unity.CurrentDetail2)
+ {
+ UnityPrint(UnityStrDetail2Name);
+ UnityPrint(Unity.CurrentDetail2);
+ }
+ UnityPrint(UnityStrSpacer);
+ }
+#endif
+ UnityPrint(msg);
+ }
+}
+
+/*-----------------------------------------------*/
+static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual)
+{
+ UnityPrint(UnityStrExpected);
+ if (expected != NULL)
+ {
+ UNITY_OUTPUT_CHAR('\'');
+ UnityPrint(expected);
+ UNITY_OUTPUT_CHAR('\'');
+ }
+ else
+ {
+ UnityPrint(UnityStrNull);
+ }
+ UnityPrint(UnityStrWas);
+ if (actual != NULL)
+ {
+ UNITY_OUTPUT_CHAR('\'');
+ UnityPrint(actual);
+ UNITY_OUTPUT_CHAR('\'');
+ }
+ else
+ {
+ UnityPrint(UnityStrNull);
+ }
+}
+
+/*-----------------------------------------------*/
+static void UnityPrintExpectedAndActualStringsLen(const char* expected,
+ const char* actual,
+ const UNITY_UINT32 length)
+{
+ UnityPrint(UnityStrExpected);
+ if (expected != NULL)
+ {
+ UNITY_OUTPUT_CHAR('\'');
+ UnityPrintLen(expected, length);
+ UNITY_OUTPUT_CHAR('\'');
+ }
+ else
+ {
+ UnityPrint(UnityStrNull);
+ }
+ UnityPrint(UnityStrWas);
+ if (actual != NULL)
+ {
+ UNITY_OUTPUT_CHAR('\'');
+ UnityPrintLen(actual, length);
+ UNITY_OUTPUT_CHAR('\'');
+ }
+ else
+ {
+ UnityPrint(UnityStrNull);
+ }
+}
+
+/*-----------------------------------------------
+ * Assertion & Control Helpers
+ *-----------------------------------------------*/
+
+static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected,
+ UNITY_INTERNAL_PTR actual,
+ const UNITY_LINE_TYPE lineNumber,
+ const char* msg)
+{
+ if (expected == actual) return 0; /* Both are NULL or same pointer */
+
+ /* print and return true if just expected is NULL */
+ if (expected == NULL)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrNullPointerForExpected);
+ UnityAddMsgIfSpecified(msg);
+ return 1;
+ }
+
+ /* print and return true if just actual is NULL */
+ if (actual == NULL)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrNullPointerForActual);
+ UnityAddMsgIfSpecified(msg);
+ return 1;
+ }
+
+ return 0; /* return false if neither is NULL */
+}
+
+/*-----------------------------------------------
+ * Assertion Functions
+ *-----------------------------------------------*/
+
+void UnityAssertBits(const UNITY_INT mask,
+ const UNITY_INT expected,
+ const UNITY_INT actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber)
+{
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ if ((mask & expected) != (mask & actual))
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrExpected);
+ UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected);
+ UnityPrint(UnityStrWas);
+ UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityAssertEqualNumber(const UNITY_INT expected,
+ const UNITY_INT actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_DISPLAY_STYLE_T style)
+{
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ if (expected != actual)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrExpected);
+ UnityPrintNumberByStyle(expected, style);
+ UnityPrint(UnityStrWas);
+ UnityPrintNumberByStyle(actual, style);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold,
+ const UNITY_INT actual,
+ const UNITY_COMPARISON_T compare,
+ const char *msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_DISPLAY_STYLE_T style)
+{
+ int failed = 0;
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ if (threshold == actual && compare & UNITY_EQUAL_TO) return;
+ if (threshold == actual) failed = 1;
+
+ if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
+ {
+ if (actual > threshold && compare & UNITY_SMALLER_THAN) failed = 1;
+ if (actual < threshold && compare & UNITY_GREATER_THAN) failed = 1;
+ }
+ else /* UINT or HEX */
+ {
+ if ((UNITY_UINT)actual > (UNITY_UINT)threshold && compare & UNITY_SMALLER_THAN) failed = 1;
+ if ((UNITY_UINT)actual < (UNITY_UINT)threshold && compare & UNITY_GREATER_THAN) failed = 1;
+ }
+
+ if (failed)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrExpected);
+ UnityPrintNumberByStyle(actual, style);
+ if (compare & UNITY_GREATER_THAN) UnityPrint(UnityStrGt);
+ if (compare & UNITY_SMALLER_THAN) UnityPrint(UnityStrLt);
+ if (compare & UNITY_EQUAL_TO) UnityPrint(UnityStrOrEqual);
+ UnityPrintNumberByStyle(threshold, style);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+}
+
+#define UnityPrintPointlessAndBail() \
+{ \
+ UnityTestResultsFailBegin(lineNumber); \
+ UnityPrint(UnityStrPointless); \
+ UnityAddMsgIfSpecified(msg); \
+ UNITY_FAIL_AND_BAIL; }
+
+/*-----------------------------------------------*/
+void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
+ UNITY_INTERNAL_PTR actual,
+ const UNITY_UINT32 num_elements,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_DISPLAY_STYLE_T style,
+ const UNITY_FLAGS_T flags)
+{
+ UNITY_UINT32 elements = num_elements;
+ unsigned int length = style & 0xF;
+
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ if (num_elements == 0)
+ {
+ UnityPrintPointlessAndBail();
+ }
+
+ if (expected == actual) return; /* Both are NULL or same pointer */
+ if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
+ UNITY_FAIL_AND_BAIL;
+
+ while (elements--)
+ {
+ UNITY_INT expect_val;
+ UNITY_INT actual_val;
+ switch (length)
+ {
+ case 1:
+ expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected;
+ actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual;
+ break;
+ case 2:
+ expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected;
+ actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual;
+ break;
+#ifdef UNITY_SUPPORT_64
+ case 8:
+ expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected;
+ actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual;
+ break;
+#endif
+ default: /* length 4 bytes */
+ expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected;
+ actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual;
+ length = 4;
+ break;
+ }
+
+ if (expect_val != actual_val)
+ {
+ if (style & UNITY_DISPLAY_RANGE_UINT && length < sizeof(expect_val))
+ { /* For UINT, remove sign extension (padding 1's) from signed type casts above */
+ UNITY_INT mask = 1;
+ mask = (mask << 8 * length) - 1;
+ expect_val &= mask;
+ actual_val &= mask;
+ }
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrElement);
+ UnityPrintNumberUnsigned(num_elements - elements - 1);
+ UnityPrint(UnityStrExpected);
+ UnityPrintNumberByStyle(expect_val, style);
+ UnityPrint(UnityStrWas);
+ UnityPrintNumberByStyle(actual_val, style);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+ if (flags == UNITY_ARRAY_TO_ARRAY)
+ {
+ expected = (UNITY_INTERNAL_PTR)(length + (const char*)expected);
+ }
+ actual = (UNITY_INTERNAL_PTR)(length + (const char*)actual);
+ }
+}
+
+/*-----------------------------------------------*/
+#ifndef UNITY_EXCLUDE_FLOAT
+/* Wrap this define in a function with variable types as float or double */
+#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \
+ if (isinf(expected) && isinf(actual) && ((expected < 0) == (actual < 0))) return 1; \
+ if (UNITY_NAN_CHECK) return 1; \
+ diff = actual - expected; \
+ if (diff < 0) diff = -diff; \
+ if (delta < 0) delta = -delta; \
+ return !(isnan(diff) || isinf(diff) || (diff > delta))
+ /* This first part of this condition will catch any NaN or Infinite values */
+#ifndef UNITY_NAN_NOT_EQUAL_NAN
+ #define UNITY_NAN_CHECK isnan(expected) && isnan(actual)
+#else
+ #define UNITY_NAN_CHECK 0
+#endif
+
+#ifndef UNITY_EXCLUDE_FLOAT_PRINT
+ #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \
+ { \
+ UnityPrint(UnityStrExpected); \
+ UnityPrintFloat(expected); \
+ UnityPrint(UnityStrWas); \
+ UnityPrintFloat(actual); }
+#else
+ #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \
+ UnityPrint(UnityStrDelta)
+#endif /* UNITY_EXCLUDE_FLOAT_PRINT */
+
+static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual)
+{
+ UNITY_FLOAT diff;
+ UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff);
+}
+
+void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected,
+ UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual,
+ const UNITY_UINT32 num_elements,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLAGS_T flags)
+{
+ UNITY_UINT32 elements = num_elements;
+ UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected;
+ UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual;
+
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ if (elements == 0)
+ {
+ UnityPrintPointlessAndBail();
+ }
+
+ if (expected == actual) return; /* Both are NULL or same pointer */
+ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
+ UNITY_FAIL_AND_BAIL;
+
+ while (elements--)
+ {
+ if (!UnityFloatsWithin(*ptr_expected * UNITY_FLOAT_PRECISION, *ptr_expected, *ptr_actual))
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrElement);
+ UnityPrintNumberUnsigned(num_elements - elements - 1);
+ UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+ if (flags == UNITY_ARRAY_TO_ARRAY)
+ {
+ ptr_expected++;
+ }
+ ptr_actual++;
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityAssertFloatsWithin(const UNITY_FLOAT delta,
+ const UNITY_FLOAT expected,
+ const UNITY_FLOAT actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber)
+{
+ RETURN_IF_FAIL_OR_IGNORE;
+
+
+ if (!UnityFloatsWithin(delta, expected, actual))
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityAssertFloatSpecial(const UNITY_FLOAT actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLOAT_TRAIT_T style)
+{
+ const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet};
+ UNITY_INT should_be_trait = ((UNITY_INT)style & 1);
+ UNITY_INT is_trait = !should_be_trait;
+ UNITY_INT trait_index = (UNITY_INT)(style >> 1);
+
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ switch (style)
+ {
+ case UNITY_FLOAT_IS_INF:
+ case UNITY_FLOAT_IS_NOT_INF:
+ is_trait = isinf(actual) && (actual > 0);
+ break;
+ case UNITY_FLOAT_IS_NEG_INF:
+ case UNITY_FLOAT_IS_NOT_NEG_INF:
+ is_trait = isinf(actual) && (actual < 0);
+ break;
+
+ case UNITY_FLOAT_IS_NAN:
+ case UNITY_FLOAT_IS_NOT_NAN:
+ is_trait = isnan(actual) ? 1 : 0;
+ break;
+
+ case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */
+ case UNITY_FLOAT_IS_NOT_DET:
+ is_trait = !isinf(actual) && !isnan(actual);
+ break;
+
+ default:
+ trait_index = 0;
+ trait_names[0] = UnityStrInvalidFloatTrait;
+ break;
+ }
+
+ if (is_trait != should_be_trait)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrExpected);
+ if (!should_be_trait)
+ UnityPrint(UnityStrNot);
+ UnityPrint(trait_names[trait_index]);
+ UnityPrint(UnityStrWas);
+#ifndef UNITY_EXCLUDE_FLOAT_PRINT
+ UnityPrintFloat((UNITY_DOUBLE)actual);
+#else
+ if (should_be_trait)
+ UnityPrint(UnityStrNot);
+ UnityPrint(trait_names[trait_index]);
+#endif
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+}
+
+#endif /* not UNITY_EXCLUDE_FLOAT */
+
+/*-----------------------------------------------*/
+#ifndef UNITY_EXCLUDE_DOUBLE
+static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual)
+{
+ UNITY_DOUBLE diff;
+ UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff);
+}
+
+void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected,
+ UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual,
+ const UNITY_UINT32 num_elements,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLAGS_T flags)
+{
+ UNITY_UINT32 elements = num_elements;
+ UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected;
+ UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual;
+
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ if (elements == 0)
+ {
+ UnityPrintPointlessAndBail();
+ }
+
+ if (expected == actual) return; /* Both are NULL or same pointer */
+ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
+ UNITY_FAIL_AND_BAIL;
+
+ while (elements--)
+ {
+ if (!UnityDoublesWithin(*ptr_expected * UNITY_DOUBLE_PRECISION, *ptr_expected, *ptr_actual))
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrElement);
+ UnityPrintNumberUnsigned(num_elements - elements - 1);
+ UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+ if (flags == UNITY_ARRAY_TO_ARRAY)
+ {
+ ptr_expected++;
+ }
+ ptr_actual++;
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityAssertDoublesWithin(const UNITY_DOUBLE delta,
+ const UNITY_DOUBLE expected,
+ const UNITY_DOUBLE actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber)
+{
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ if (!UnityDoublesWithin(delta, expected, actual))
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+}
+
+/*-----------------------------------------------*/
+
+void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLOAT_TRAIT_T style)
+{
+ const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet};
+ UNITY_INT should_be_trait = ((UNITY_INT)style & 1);
+ UNITY_INT is_trait = !should_be_trait;
+ UNITY_INT trait_index = (UNITY_INT)(style >> 1);
+
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ switch (style)
+ {
+ case UNITY_FLOAT_IS_INF:
+ case UNITY_FLOAT_IS_NOT_INF:
+ is_trait = isinf(actual) && (actual > 0);
+ break;
+ case UNITY_FLOAT_IS_NEG_INF:
+ case UNITY_FLOAT_IS_NOT_NEG_INF:
+ is_trait = isinf(actual) && (actual < 0);
+ break;
+
+ case UNITY_FLOAT_IS_NAN:
+ case UNITY_FLOAT_IS_NOT_NAN:
+ is_trait = isnan(actual) ? 1 : 0;
+ break;
+
+ case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */
+ case UNITY_FLOAT_IS_NOT_DET:
+ is_trait = !isinf(actual) && !isnan(actual);
+ break;
+
+ default:
+ trait_index = 0;
+ trait_names[0] = UnityStrInvalidFloatTrait;
+ break;
+ }
+
+ if (is_trait != should_be_trait)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrExpected);
+ if (!should_be_trait)
+ UnityPrint(UnityStrNot);
+ UnityPrint(trait_names[trait_index]);
+ UnityPrint(UnityStrWas);
+#ifndef UNITY_EXCLUDE_FLOAT_PRINT
+ UnityPrintFloat(actual);
+#else
+ if (should_be_trait)
+ UnityPrint(UnityStrNot);
+ UnityPrint(trait_names[trait_index]);
+#endif
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+}
+
+#endif /* not UNITY_EXCLUDE_DOUBLE */
+
+/*-----------------------------------------------*/
+void UnityAssertNumbersWithin(const UNITY_UINT delta,
+ const UNITY_INT expected,
+ const UNITY_INT actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_DISPLAY_STYLE_T style)
+{
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
+ {
+ if (actual > expected)
+ Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta);
+ else
+ Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta);
+ }
+ else
+ {
+ if ((UNITY_UINT)actual > (UNITY_UINT)expected)
+ Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta);
+ else
+ Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta);
+ }
+
+ if (Unity.CurrentTestFailed)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrDelta);
+ UnityPrintNumberByStyle((UNITY_INT)delta, style);
+ UnityPrint(UnityStrExpected);
+ UnityPrintNumberByStyle(expected, style);
+ UnityPrint(UnityStrWas);
+ UnityPrintNumberByStyle(actual, style);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityAssertEqualString(const char* expected,
+ const char* actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber)
+{
+ UNITY_UINT32 i;
+
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ /* if both pointers not null compare the strings */
+ if (expected && actual)
+ {
+ for (i = 0; expected[i] || actual[i]; i++)
+ {
+ if (expected[i] != actual[i])
+ {
+ Unity.CurrentTestFailed = 1;
+ break;
+ }
+ }
+ }
+ else
+ { /* handle case of one pointers being null (if both null, test should pass) */
+ if (expected != actual)
+ {
+ Unity.CurrentTestFailed = 1;
+ }
+ }
+
+ if (Unity.CurrentTestFailed)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrintExpectedAndActualStrings(expected, actual);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityAssertEqualStringLen(const char* expected,
+ const char* actual,
+ const UNITY_UINT32 length,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber)
+{
+ UNITY_UINT32 i;
+
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ /* if both pointers not null compare the strings */
+ if (expected && actual)
+ {
+ for (i = 0; (i < length) && (expected[i] || actual[i]); i++)
+ {
+ if (expected[i] != actual[i])
+ {
+ Unity.CurrentTestFailed = 1;
+ break;
+ }
+ }
+ }
+ else
+ { /* handle case of one pointers being null (if both null, test should pass) */
+ if (expected != actual)
+ {
+ Unity.CurrentTestFailed = 1;
+ }
+ }
+
+ if (Unity.CurrentTestFailed)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrintExpectedAndActualStringsLen(expected, actual, length);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+}
+
+/*-----------------------------------------------*/
+void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected,
+ const char** actual,
+ const UNITY_UINT32 num_elements,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLAGS_T flags)
+{
+ UNITY_UINT32 i = 0;
+ UNITY_UINT32 j = 0;
+ const char* expd = NULL;
+ const char* act = NULL;
+
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ /* if no elements, it's an error */
+ if (num_elements == 0)
+ {
+ UnityPrintPointlessAndBail();
+ }
+
+ if ((const void*)expected == (const void*)actual)
+ {
+ return; /* Both are NULL or same pointer */
+ }
+
+ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
+ {
+ UNITY_FAIL_AND_BAIL;
+ }
+
+ if (flags != UNITY_ARRAY_TO_ARRAY)
+ {
+ expd = (const char*)expected;
+ }
+
+ do
+ {
+ act = actual[j];
+ if (flags == UNITY_ARRAY_TO_ARRAY)
+ {
+ expd = ((const char* const*)expected)[j];
+ }
+
+ /* if both pointers not null compare the strings */
+ if (expd && act)
+ {
+ for (i = 0; expd[i] || act[i]; i++)
+ {
+ if (expd[i] != act[i])
+ {
+ Unity.CurrentTestFailed = 1;
+ break;
+ }
+ }
+ }
+ else
+ { /* handle case of one pointers being null (if both null, test should pass) */
+ if (expd != act)
+ {
+ Unity.CurrentTestFailed = 1;
+ }
+ }
+
+ if (Unity.CurrentTestFailed)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ if (num_elements > 1)
+ {
+ UnityPrint(UnityStrElement);
+ UnityPrintNumberUnsigned(j);
+ }
+ UnityPrintExpectedAndActualStrings(expd, act);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+ } while (++j < num_elements);
+}
+
+/*-----------------------------------------------*/
+void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected,
+ UNITY_INTERNAL_PTR actual,
+ const UNITY_UINT32 length,
+ const UNITY_UINT32 num_elements,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLAGS_T flags)
+{
+ UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected;
+ UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual;
+ UNITY_UINT32 elements = num_elements;
+ UNITY_UINT32 bytes;
+
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ if ((elements == 0) || (length == 0))
+ {
+ UnityPrintPointlessAndBail();
+ }
+
+ if (expected == actual) return; /* Both are NULL or same pointer */
+ if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
+ UNITY_FAIL_AND_BAIL;
+
+ while (elements--)
+ {
+ bytes = length;
+ while (bytes--)
+ {
+ if (*ptr_exp != *ptr_act)
+ {
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrMemory);
+ if (num_elements > 1)
+ {
+ UnityPrint(UnityStrElement);
+ UnityPrintNumberUnsigned(num_elements - elements - 1);
+ }
+ UnityPrint(UnityStrByte);
+ UnityPrintNumberUnsigned(length - bytes - 1);
+ UnityPrint(UnityStrExpected);
+ UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8);
+ UnityPrint(UnityStrWas);
+ UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+ ptr_exp++;
+ ptr_act++;
+ }
+ if (flags == UNITY_ARRAY_TO_VAL)
+ {
+ ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected;
+ }
+ }
+}
+
+/*-----------------------------------------------*/
+
+static union
+{
+ UNITY_INT8 i8;
+ UNITY_INT16 i16;
+ UNITY_INT32 i32;
+#ifdef UNITY_SUPPORT_64
+ UNITY_INT64 i64;
+#endif
+#ifndef UNITY_EXCLUDE_FLOAT
+ float f;
+#endif
+#ifndef UNITY_EXCLUDE_DOUBLE
+ double d;
+#endif
+} UnityQuickCompare;
+
+UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size)
+{
+ switch(size)
+ {
+ case 1:
+ UnityQuickCompare.i8 = (UNITY_INT8)num;
+ return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8);
+
+ case 2:
+ UnityQuickCompare.i16 = (UNITY_INT16)num;
+ return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16);
+
+#ifdef UNITY_SUPPORT_64
+ case 8:
+ UnityQuickCompare.i64 = (UNITY_INT64)num;
+ return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64);
+#endif
+ default: /* 4 bytes */
+ UnityQuickCompare.i32 = (UNITY_INT32)num;
+ return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32);
+ }
+}
+
+#ifndef UNITY_EXCLUDE_FLOAT
+UNITY_INTERNAL_PTR UnityFloatToPtr(const float num)
+{
+ UnityQuickCompare.f = num;
+ return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f);
+}
+#endif
+
+#ifndef UNITY_EXCLUDE_DOUBLE
+UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num)
+{
+ UnityQuickCompare.d = num;
+ return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d);
+}
+#endif
+
+/*-----------------------------------------------
+ * Control Functions
+ *-----------------------------------------------*/
+
+void UnityFail(const char* msg, const UNITY_LINE_TYPE line)
+{
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ UnityTestResultsBegin(Unity.TestFile, line);
+ UnityPrint(UnityStrFail);
+ if (msg != NULL)
+ {
+ UNITY_OUTPUT_CHAR(':');
+
+#ifndef UNITY_EXCLUDE_DETAILS
+ if (Unity.CurrentDetail1)
+ {
+ UnityPrint(UnityStrDetail1Name);
+ UnityPrint(Unity.CurrentDetail1);
+ if (Unity.CurrentDetail2)
+ {
+ UnityPrint(UnityStrDetail2Name);
+ UnityPrint(Unity.CurrentDetail2);
+ }
+ UnityPrint(UnityStrSpacer);
+ }
+#endif
+ if (msg[0] != ' ')
+ {
+ UNITY_OUTPUT_CHAR(' ');
+ }
+ UnityPrint(msg);
+ }
+
+ UNITY_FAIL_AND_BAIL;
+}
+
+/*-----------------------------------------------*/
+void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line)
+{
+ RETURN_IF_FAIL_OR_IGNORE;
+
+ UnityTestResultsBegin(Unity.TestFile, line);
+ UnityPrint(UnityStrIgnore);
+ if (msg != NULL)
+ {
+ UNITY_OUTPUT_CHAR(':');
+ UNITY_OUTPUT_CHAR(' ');
+ UnityPrint(msg);
+ }
+ UNITY_IGNORE_AND_BAIL;
+}
+
+/*-----------------------------------------------*/
+void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum)
+{
+ Unity.CurrentTestName = FuncName;
+ Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum;
+ Unity.NumberOfTests++;
+ UNITY_CLR_DETAILS();
+ if (TEST_PROTECT())
+ {
+ setUp();
+ Func();
+ }
+ if (TEST_PROTECT())
+ {
+ tearDown();
+ }
+ UnityConcludeTest();
+}
+
+/*-----------------------------------------------*/
+void UnityBegin(const char* filename)
+{
+ Unity.TestFile = filename;
+ Unity.CurrentTestName = NULL;
+ Unity.CurrentTestLineNumber = 0;
+ Unity.NumberOfTests = 0;
+ Unity.TestFailures = 0;
+ Unity.TestIgnores = 0;
+ Unity.CurrentTestFailed = 0;
+ Unity.CurrentTestIgnored = 0;
+
+ UNITY_CLR_DETAILS();
+ UNITY_OUTPUT_START();
+}
+
+/*-----------------------------------------------*/
+int UnityEnd(void)
+{
+ UNITY_PRINT_EOL();
+ UnityPrint(UnityStrBreaker);
+ UNITY_PRINT_EOL();
+ UnityPrintNumber((UNITY_INT)(Unity.NumberOfTests));
+ UnityPrint(UnityStrResultsTests);
+ UnityPrintNumber((UNITY_INT)(Unity.TestFailures));
+ UnityPrint(UnityStrResultsFailures);
+ UnityPrintNumber((UNITY_INT)(Unity.TestIgnores));
+ UnityPrint(UnityStrResultsIgnored);
+ UNITY_PRINT_EOL();
+ if (Unity.TestFailures == 0U)
+ {
+ UnityPrint(UnityStrOk);
+ }
+ else
+ {
+ UnityPrint(UnityStrFail);
+#ifdef UNITY_DIFFERENTIATE_FINAL_FAIL
+ UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D');
+#endif
+ }
+ UNITY_PRINT_EOL();
+ UNITY_FLUSH_CALL();
+ UNITY_OUTPUT_COMPLETE();
+ return (int)(Unity.TestFailures);
+}
+
+/*-----------------------------------------------
+ * Command Line Argument Support
+ *-----------------------------------------------*/
+#ifdef UNITY_USE_COMMAND_LINE_ARGS
+
+char* UnityOptionIncludeNamed = NULL;
+char* UnityOptionExcludeNamed = NULL;
+int UnityVerbosity = 1;
+
+int UnityParseOptions(int argc, char** argv)
+{
+ UnityOptionIncludeNamed = NULL;
+ UnityOptionExcludeNamed = NULL;
+
+ for (int i = 1; i < argc; i++)
+ {
+ if (argv[i][0] == '-')
+ {
+ switch (argv[i][1])
+ {
+ case 'l': /* list tests */
+ return -1;
+ case 'n': /* include tests with name including this string */
+ case 'f': /* an alias for -n */
+ if (argv[i][2] == '=')
+ UnityOptionIncludeNamed = &argv[i][3];
+ else if (++i < argc)
+ UnityOptionIncludeNamed = argv[i];
+ else
+ {
+ UnityPrint("ERROR: No Test String to Include Matches For");
+ UNITY_PRINT_EOL();
+ return 1;
+ }
+ break;
+ case 'q': /* quiet */
+ UnityVerbosity = 0;
+ break;
+ case 'v': /* verbose */
+ UnityVerbosity = 2;
+ break;
+ case 'x': /* exclude tests with name including this string */
+ if (argv[i][2] == '=')
+ UnityOptionExcludeNamed = &argv[i][3];
+ else if (++i < argc)
+ UnityOptionExcludeNamed = argv[i];
+ else
+ {
+ UnityPrint("ERROR: No Test String to Exclude Matches For");
+ UNITY_PRINT_EOL();
+ return 1;
+ }
+ break;
+ default:
+ UnityPrint("ERROR: Unknown Option ");
+ UNITY_OUTPUT_CHAR(argv[i][1]);
+ UNITY_PRINT_EOL();
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+int IsStringInBiggerString(const char* longstring, const char* shortstring)
+{
+ const char* lptr = longstring;
+ const char* sptr = shortstring;
+ const char* lnext = lptr;
+
+ if (*sptr == '*')
+ return 1;
+
+ while (*lptr)
+ {
+ lnext = lptr + 1;
+
+ /* If they current bytes match, go on to the next bytes */
+ while (*lptr && *sptr && (*lptr == *sptr))
+ {
+ lptr++;
+ sptr++;
+
+ /* We're done if we match the entire string or up to a wildcard */
+ if (*sptr == '*')
+ return 1;
+ if (*sptr == ',')
+ return 1;
+ if (*sptr == '"')
+ return 1;
+ if (*sptr == '\'')
+ return 1;
+ if (*sptr == ':')
+ return 2;
+ if (*sptr == 0)
+ return 1;
+ }
+
+ /* Otherwise we start in the long pointer 1 character further and try again */
+ lptr = lnext;
+ sptr = shortstring;
+ }
+ return 0;
+}
+
+int UnityStringArgumentMatches(const char* str)
+{
+ int retval;
+ const char* ptr1;
+ const char* ptr2;
+ const char* ptrf;
+
+ /* Go through the options and get the substrings for matching one at a time */
+ ptr1 = str;
+ while (ptr1[0] != 0)
+ {
+ if ((ptr1[0] == '"') || (ptr1[0] == '\''))
+ ptr1++;
+
+ /* look for the start of the next partial */
+ ptr2 = ptr1;
+ ptrf = 0;
+ do
+ {
+ ptr2++;
+ if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ','))
+ ptrf = &ptr2[1];
+ } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ','));
+ while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ',')))
+ ptr2++;
+
+ /* done if complete filename match */
+ retval = IsStringInBiggerString(Unity.TestFile, ptr1);
+ if (retval == 1)
+ return retval;
+
+ /* done if testname match after filename partial match */
+ if ((retval == 2) && (ptrf != 0))
+ {
+ if (IsStringInBiggerString(Unity.CurrentTestName, ptrf))
+ return 1;
+ }
+
+ /* done if complete testname match */
+ if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1)
+ return 1;
+
+ ptr1 = ptr2;
+ }
+
+ /* we couldn't find a match for any substrings */
+ return 0;
+}
+
+int UnityTestMatches(void)
+{
+ /* Check if this test name matches the included test pattern */
+ int retval;
+ if (UnityOptionIncludeNamed)
+ {
+ retval = UnityStringArgumentMatches(UnityOptionIncludeNamed);
+ }
+ else
+ retval = 1;
+
+ /* Check if this test name matches the excluded test pattern */
+ if (UnityOptionExcludeNamed)
+ {
+ if (UnityStringArgumentMatches(UnityOptionExcludeNamed))
+ retval = 0;
+ }
+ return retval;
+}
+
+#endif /* UNITY_USE_COMMAND_LINE_ARGS */
+/*-----------------------------------------------*/
diff --git a/support/cJSON-master/tests/unity/src/unity.h b/support/cJSON-master/tests/unity/src/unity.h
new file mode 100644
index 0000000..32ff0e6
--- /dev/null
+++ b/support/cJSON-master/tests/unity/src/unity.h
@@ -0,0 +1,503 @@
+/* ==========================================
+ Unity Project - A Test Framework for C
+ Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams
+ [Released under MIT License. Please refer to license.txt for details]
+========================================== */
+
+#ifndef UNITY_FRAMEWORK_H
+#define UNITY_FRAMEWORK_H
+#define UNITY
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "unity_internals.h"
+
+/*-------------------------------------------------------
+ * Test Setup / Teardown
+ *-------------------------------------------------------*/
+
+/* These functions are intended to be called before and after each test. */
+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(). */
+void suiteSetUp(void);
+int suiteTearDown(int num_failures);
+
+/* If the compiler supports it, the following block provides stub
+ * implementations of the above functions as weak symbols. Note that on
+ * some platforms (MinGW for example), weak function implementations need
+ * to be in the same translation unit they are called from. This can be
+ * achieved by defining UNITY_INCLUDE_SETUP_STUBS before including unity.h. */
+#ifdef UNITY_INCLUDE_SETUP_STUBS
+ #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
+#endif
+
+/*-------------------------------------------------------
+ * 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(...) 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_ONLY()
+
+/* 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()
+
+/* This macro does nothing, but it is useful for build tools (like Ceedling) to make use of this to figure out
+ * which files should be linked to in order to perform a test. Use it like TEST_FILE("sandwiches.c") */
+#define TEST_FILE(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")
+
+/* 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(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")
+#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_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_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_UINT32)(-1), (actual), __LINE__, NULL)
+#define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(0), (actual), __LINE__, NULL)
+#define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(-1), (actual), __LINE__, NULL)
+#define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(0), (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_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_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_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_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_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_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_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)
+
+/* 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_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)
+
+/* 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_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)
+
+/* 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_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)
+
+/* 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_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __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_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_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __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_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)
+
+/*-------------------------------------------------------
+ * 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))
+
+/* 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_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))
+#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_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))
+
+/* 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_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_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_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_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_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_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_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_THAN_HEX32((threshold), (actual), __LINE__, (message))
+#define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((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_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))
+
+/* 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_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))
+
+/* 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_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))
+
+/* 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_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_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_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_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))
+
+/* end of UNITY_FRAMEWORK_H */
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/support/cJSON-master/tests/unity/src/unity_internals.h b/support/cJSON-master/tests/unity/src/unity_internals.h
new file mode 100644
index 0000000..f78ceba
--- /dev/null
+++ b/support/cJSON-master/tests/unity/src/unity_internals.h
@@ -0,0 +1,870 @@
+/* ==========================================
+ Unity Project - A Test Framework for C
+ Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams
+ [Released under MIT License. Please refer to license.txt for details]
+========================================== */
+
+#ifndef UNITY_INTERNALS_H
+#define UNITY_INTERNALS_H
+
+#include "../examples/unity_config.h"
+
+#ifndef UNITY_EXCLUDE_SETJMP_H
+#include <setjmp.h>
+#endif
+
+#ifndef UNITY_EXCLUDE_MATH_H
+#include <math.h>
+#endif
+
+/* Unity Attempts to Auto-Detect Integer Types
+ * Attempt 1: UINT_MAX, ULONG_MAX in <limits.h>, or default to 32 bits
+ * Attempt 2: UINTPTR_MAX in <stdint.h>, or default to same size as long
+ * The user may override any of these derived constants:
+ * UNITY_INT_WIDTH, UNITY_LONG_WIDTH, UNITY_POINTER_WIDTH */
+#ifndef UNITY_EXCLUDE_STDINT_H
+#include <stdint.h>
+#endif
+
+#ifndef UNITY_EXCLUDE_LIMITS_H
+#include <limits.h>
+#endif
+
+/*-------------------------------------------------------
+ * Guess Widths If Not Specified
+ *-------------------------------------------------------*/
+
+/* Determine the size of an int, if not already specified.
+ * We cannot use sizeof(int), because it is not yet defined
+ * at this stage in the translation of the C program.
+ * Therefore, infer it from UINT_MAX if possible. */
+#ifndef UNITY_INT_WIDTH
+ #ifdef UINT_MAX
+ #if (UINT_MAX == 0xFFFF)
+ #define UNITY_INT_WIDTH (16)
+ #elif (UINT_MAX == 0xFFFFFFFF)
+ #define UNITY_INT_WIDTH (32)
+ #elif (UINT_MAX == 0xFFFFFFFFFFFFFFFF)
+ #define UNITY_INT_WIDTH (64)
+ #endif
+ #else /* Set to default */
+ #define UNITY_INT_WIDTH (32)
+ #endif /* UINT_MAX */
+#endif
+
+/* Determine the size of a long, if not already specified. */
+#ifndef UNITY_LONG_WIDTH
+ #ifdef ULONG_MAX
+ #if (ULONG_MAX == 0xFFFF)
+ #define UNITY_LONG_WIDTH (16)
+ #elif (ULONG_MAX == 0xFFFFFFFF)
+ #define UNITY_LONG_WIDTH (32)
+ #elif (ULONG_MAX == 0xFFFFFFFFFFFFFFFF)
+ #define UNITY_LONG_WIDTH (64)
+ #endif
+ #else /* Set to default */
+ #define UNITY_LONG_WIDTH (32)
+ #endif /* ULONG_MAX */
+#endif
+
+/* Determine the size of a pointer, if not already specified. */
+#ifndef UNITY_POINTER_WIDTH
+ #ifdef UINTPTR_MAX
+ #if (UINTPTR_MAX <= 0xFFFF)
+ #define UNITY_POINTER_WIDTH (16)
+ #elif (UINTPTR_MAX <= 0xFFFFFFFF)
+ #define UNITY_POINTER_WIDTH (32)
+ #elif (UINTPTR_MAX <= 0xFFFFFFFFFFFFFFFF)
+ #define UNITY_POINTER_WIDTH (64)
+ #endif
+ #else /* Set to default */
+ #define UNITY_POINTER_WIDTH UNITY_LONG_WIDTH
+ #endif /* UINTPTR_MAX */
+#endif
+
+/*-------------------------------------------------------
+ * Int Support (Define types based on detected sizes)
+ *-------------------------------------------------------*/
+
+#if (UNITY_INT_WIDTH == 32)
+ typedef unsigned char UNITY_UINT8;
+ typedef unsigned short UNITY_UINT16;
+ typedef unsigned int UNITY_UINT32;
+ typedef signed char UNITY_INT8;
+ typedef signed short UNITY_INT16;
+ typedef signed int UNITY_INT32;
+#elif (UNITY_INT_WIDTH == 16)
+ typedef unsigned char UNITY_UINT8;
+ typedef unsigned int UNITY_UINT16;
+ typedef unsigned long UNITY_UINT32;
+ typedef signed char UNITY_INT8;
+ typedef signed int UNITY_INT16;
+ typedef signed long UNITY_INT32;
+#else
+ #error Invalid UNITY_INT_WIDTH specified! (16 or 32 are supported)
+#endif
+
+/*-------------------------------------------------------
+ * 64-bit Support
+ *-------------------------------------------------------*/
+
+#ifndef UNITY_SUPPORT_64
+ #if UNITY_LONG_WIDTH == 64 || UNITY_POINTER_WIDTH == 64
+ #define UNITY_SUPPORT_64
+ #endif
+#endif
+
+#ifndef UNITY_SUPPORT_64
+ /* No 64-bit Support */
+ typedef UNITY_UINT32 UNITY_UINT;
+ typedef UNITY_INT32 UNITY_INT;
+#else
+
+ /* 64-bit Support */
+ #if (UNITY_LONG_WIDTH == 32)
+ typedef unsigned long long UNITY_UINT64;
+ typedef signed long long UNITY_INT64;
+ #elif (UNITY_LONG_WIDTH == 64)
+ typedef unsigned long UNITY_UINT64;
+ typedef signed long UNITY_INT64;
+ #else
+ #error Invalid UNITY_LONG_WIDTH specified! (32 or 64 are supported)
+ #endif
+ typedef UNITY_UINT64 UNITY_UINT;
+ typedef UNITY_INT64 UNITY_INT;
+
+#endif
+
+/*-------------------------------------------------------
+ * Pointer Support
+ *-------------------------------------------------------*/
+
+#if (UNITY_POINTER_WIDTH == 32)
+#define UNITY_PTR_TO_INT UNITY_INT32
+#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32
+#elif (UNITY_POINTER_WIDTH == 64)
+#define UNITY_PTR_TO_INT UNITY_INT64
+#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64
+#elif (UNITY_POINTER_WIDTH == 16)
+#define UNITY_PTR_TO_INT UNITY_INT16
+#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16
+#else
+ #error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported)
+#endif
+
+#ifndef UNITY_PTR_ATTRIBUTE
+#define UNITY_PTR_ATTRIBUTE
+#endif
+
+#ifndef UNITY_INTERNAL_PTR
+#define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const void*
+#endif
+
+/*-------------------------------------------------------
+ * Float Support
+ *-------------------------------------------------------*/
+
+#ifdef UNITY_EXCLUDE_FLOAT
+
+/* No Floating Point Support */
+#ifndef UNITY_EXCLUDE_DOUBLE
+#define UNITY_EXCLUDE_DOUBLE /* Remove double when excluding float support */
+#endif
+#ifndef UNITY_EXCLUDE_FLOAT_PRINT
+#define UNITY_EXCLUDE_FLOAT_PRINT
+#endif
+
+#else
+
+/* Floating Point Support */
+#ifndef UNITY_FLOAT_PRECISION
+#define UNITY_FLOAT_PRECISION (0.00001f)
+#endif
+#ifndef UNITY_FLOAT_TYPE
+#define UNITY_FLOAT_TYPE float
+#endif
+typedef UNITY_FLOAT_TYPE UNITY_FLOAT;
+
+/* isinf & isnan macros should be provided by math.h */
+#ifndef isinf
+/* The value of Inf - Inf is NaN */
+#define isinf(n) (isnan((n) - (n)) && !isnan(n))
+#endif
+
+#ifndef isnan
+/* NaN is the only floating point value that does NOT equal itself.
+ * Therefore if n != n, then it is NaN. */
+#define isnan(n) ((n != n) ? 1 : 0)
+#endif
+
+#endif
+
+/*-------------------------------------------------------
+ * Double Float Support
+ *-------------------------------------------------------*/
+
+/* unlike float, we DON'T include by default */
+#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(UNITY_INCLUDE_DOUBLE)
+
+ /* No Floating Point Support */
+ #ifndef UNITY_EXCLUDE_DOUBLE
+ #define UNITY_EXCLUDE_DOUBLE
+ #else
+ #undef UNITY_INCLUDE_DOUBLE
+ #endif
+
+ #ifndef UNITY_EXCLUDE_FLOAT
+ #ifndef UNITY_DOUBLE_TYPE
+ #define UNITY_DOUBLE_TYPE double
+ #endif
+ typedef UNITY_FLOAT UNITY_DOUBLE;
+ /* For parameter in UnityPrintFloat(UNITY_DOUBLE), which aliases to double or float */
+ #endif
+
+#else
+
+ /* Double Floating Point Support */
+ #ifndef UNITY_DOUBLE_PRECISION
+ #define UNITY_DOUBLE_PRECISION (1e-12)
+ #endif
+
+ #ifndef UNITY_DOUBLE_TYPE
+ #define UNITY_DOUBLE_TYPE double
+ #endif
+ typedef UNITY_DOUBLE_TYPE UNITY_DOUBLE;
+
+#endif
+
+/*-------------------------------------------------------
+ * Output Method: stdout (DEFAULT)
+ *-------------------------------------------------------*/
+#ifndef UNITY_OUTPUT_CHAR
+/* Default to using putchar, which is defined in stdio.h */
+#include <stdio.h>
+#define UNITY_OUTPUT_CHAR(a) (void)putchar(a)
+#else
+ /* If defined as something else, make sure we declare it here so it's ready for use */
+ #ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION
+extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION;
+ #endif
+#endif
+
+#ifndef UNITY_OUTPUT_FLUSH
+#ifdef UNITY_USE_FLUSH_STDOUT
+/* We want to use the stdout flush utility */
+#include <stdio.h>
+#define UNITY_OUTPUT_FLUSH() (void)fflush(stdout)
+#else
+/* We've specified nothing, therefore flush should just be ignored */
+#define UNITY_OUTPUT_FLUSH()
+#endif
+#else
+/* We've defined flush as something else, so make sure we declare it here so it's ready for use */
+#ifdef UNITY_OUTPUT_FLUSH_HEADER_DECLARATION
+extern void UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION;
+#endif
+#endif
+
+#ifndef UNITY_OUTPUT_FLUSH
+#define UNITY_FLUSH_CALL()
+#else
+#define UNITY_FLUSH_CALL() UNITY_OUTPUT_FLUSH()
+#endif
+
+#ifndef UNITY_PRINT_EOL
+#define UNITY_PRINT_EOL() UNITY_OUTPUT_CHAR('\n')
+#endif
+
+#ifndef UNITY_OUTPUT_START
+#define UNITY_OUTPUT_START()
+#endif
+
+#ifndef UNITY_OUTPUT_COMPLETE
+#define UNITY_OUTPUT_COMPLETE()
+#endif
+
+/*-------------------------------------------------------
+ * Footprint
+ *-------------------------------------------------------*/
+
+#ifndef UNITY_LINE_TYPE
+#define UNITY_LINE_TYPE UNITY_UINT
+#endif
+
+#ifndef UNITY_COUNTER_TYPE
+#define UNITY_COUNTER_TYPE UNITY_UINT
+#endif
+
+/*-------------------------------------------------------
+ * Language Features Available
+ *-------------------------------------------------------*/
+#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 UNITY_NO_WEAK
+# undef UNITY_WEAK_ATTRIBUTE
+# undef UNITY_WEAK_PRAGMA
+#endif
+
+
+/*-------------------------------------------------------
+ * Internal Structs Needed
+ *-------------------------------------------------------*/
+
+typedef void (*UnityTestFunction)(void);
+
+#define UNITY_DISPLAY_RANGE_INT (0x10)
+#define UNITY_DISPLAY_RANGE_UINT (0x20)
+#define UNITY_DISPLAY_RANGE_HEX (0x40)
+
+typedef enum
+{
+UNITY_DISPLAY_STYLE_INT = sizeof(int)+ UNITY_DISPLAY_RANGE_INT,
+ UNITY_DISPLAY_STYLE_INT8 = 1 + UNITY_DISPLAY_RANGE_INT,
+ UNITY_DISPLAY_STYLE_INT16 = 2 + UNITY_DISPLAY_RANGE_INT,
+ UNITY_DISPLAY_STYLE_INT32 = 4 + UNITY_DISPLAY_RANGE_INT,
+#ifdef UNITY_SUPPORT_64
+ UNITY_DISPLAY_STYLE_INT64 = 8 + UNITY_DISPLAY_RANGE_INT,
+#endif
+
+UNITY_DISPLAY_STYLE_UINT = sizeof(unsigned) + UNITY_DISPLAY_RANGE_UINT,
+ UNITY_DISPLAY_STYLE_UINT8 = 1 + UNITY_DISPLAY_RANGE_UINT,
+ UNITY_DISPLAY_STYLE_UINT16 = 2 + UNITY_DISPLAY_RANGE_UINT,
+ UNITY_DISPLAY_STYLE_UINT32 = 4 + UNITY_DISPLAY_RANGE_UINT,
+#ifdef UNITY_SUPPORT_64
+ UNITY_DISPLAY_STYLE_UINT64 = 8 + UNITY_DISPLAY_RANGE_UINT,
+#endif
+
+ UNITY_DISPLAY_STYLE_HEX8 = 1 + UNITY_DISPLAY_RANGE_HEX,
+ UNITY_DISPLAY_STYLE_HEX16 = 2 + UNITY_DISPLAY_RANGE_HEX,
+ UNITY_DISPLAY_STYLE_HEX32 = 4 + UNITY_DISPLAY_RANGE_HEX,
+#ifdef UNITY_SUPPORT_64
+ UNITY_DISPLAY_STYLE_HEX64 = 8 + UNITY_DISPLAY_RANGE_HEX,
+#endif
+
+ UNITY_DISPLAY_STYLE_UNKNOWN
+} UNITY_DISPLAY_STYLE_T;
+
+typedef enum
+{
+ UNITY_EQUAL_TO = 1,
+ UNITY_GREATER_THAN = 2,
+ UNITY_GREATER_OR_EQUAL = 2 + UNITY_EQUAL_TO,
+ UNITY_SMALLER_THAN = 4,
+ UNITY_SMALLER_OR_EQUAL = 4 + UNITY_EQUAL_TO
+} UNITY_COMPARISON_T;
+
+#ifndef UNITY_EXCLUDE_FLOAT
+typedef enum UNITY_FLOAT_TRAIT
+{
+ UNITY_FLOAT_IS_NOT_INF = 0,
+ UNITY_FLOAT_IS_INF,
+ UNITY_FLOAT_IS_NOT_NEG_INF,
+ UNITY_FLOAT_IS_NEG_INF,
+ UNITY_FLOAT_IS_NOT_NAN,
+ UNITY_FLOAT_IS_NAN,
+ UNITY_FLOAT_IS_NOT_DET,
+ UNITY_FLOAT_IS_DET,
+ UNITY_FLOAT_INVALID_TRAIT
+} UNITY_FLOAT_TRAIT_T;
+#endif
+
+typedef enum
+{
+ UNITY_ARRAY_TO_VAL = 0,
+ UNITY_ARRAY_TO_ARRAY
+} UNITY_FLAGS_T;
+
+struct UNITY_STORAGE_T
+{
+ const char* TestFile;
+ const char* CurrentTestName;
+#ifndef UNITY_EXCLUDE_DETAILS
+ const char* CurrentDetail1;
+ const char* CurrentDetail2;
+#endif
+ UNITY_LINE_TYPE CurrentTestLineNumber;
+ UNITY_COUNTER_TYPE NumberOfTests;
+ UNITY_COUNTER_TYPE TestFailures;
+ UNITY_COUNTER_TYPE TestIgnores;
+ UNITY_COUNTER_TYPE CurrentTestFailed;
+ UNITY_COUNTER_TYPE CurrentTestIgnored;
+#ifndef UNITY_EXCLUDE_SETJMP_H
+ jmp_buf AbortFrame;
+#endif
+};
+
+extern struct UNITY_STORAGE_T Unity;
+
+/*-------------------------------------------------------
+ * Test Suite Management
+ *-------------------------------------------------------*/
+
+void UnityBegin(const char* filename);
+int UnityEnd(void);
+void UnityConcludeTest(void);
+void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum);
+
+/*-------------------------------------------------------
+ * Details Support
+ *-------------------------------------------------------*/
+
+#ifdef UNITY_EXCLUDE_DETAILS
+#define UNITY_CLR_DETAILS()
+#define UNITY_SET_DETAIL(d1)
+#define UNITY_SET_DETAILS(d1,d2)
+#else
+#define UNITY_CLR_DETAILS() { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; }
+#define UNITY_SET_DETAIL(d1) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = 0; }
+#define UNITY_SET_DETAILS(d1,d2) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = d2; }
+
+#ifndef UNITY_DETAIL1_NAME
+#define UNITY_DETAIL1_NAME "Function"
+#endif
+
+#ifndef UNITY_DETAIL2_NAME
+#define UNITY_DETAIL2_NAME "Argument"
+#endif
+#endif
+
+/*-------------------------------------------------------
+ * Test Output
+ *-------------------------------------------------------*/
+
+void UnityPrint(const char* string);
+void UnityPrintLen(const char* string, const UNITY_UINT32 length);
+void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number);
+void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style);
+void UnityPrintNumber(const UNITY_INT number);
+void UnityPrintNumberUnsigned(const UNITY_UINT number);
+void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles);
+
+#ifndef UNITY_EXCLUDE_FLOAT_PRINT
+void UnityPrintFloat(const UNITY_DOUBLE input_number);
+#endif
+
+/*-------------------------------------------------------
+ * Test Assertion Functions
+ *-------------------------------------------------------
+ * Use the macros below this section instead of calling
+ * these directly. The macros have a consistent naming
+ * convention and will pull in file and line information
+ * for you. */
+
+void UnityAssertEqualNumber(const UNITY_INT expected,
+ const UNITY_INT actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_DISPLAY_STYLE_T style);
+
+void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold,
+ const UNITY_INT actual,
+ const UNITY_COMPARISON_T compare,
+ const char *msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_DISPLAY_STYLE_T style);
+
+void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
+ UNITY_INTERNAL_PTR actual,
+ const UNITY_UINT32 num_elements,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_DISPLAY_STYLE_T style,
+ const UNITY_FLAGS_T flags);
+
+void UnityAssertBits(const UNITY_INT mask,
+ const UNITY_INT expected,
+ const UNITY_INT actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber);
+
+void UnityAssertEqualString(const char* expected,
+ const char* actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber);
+
+void UnityAssertEqualStringLen(const char* expected,
+ const char* actual,
+ const UNITY_UINT32 length,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber);
+
+void UnityAssertEqualStringArray( UNITY_INTERNAL_PTR expected,
+ const char** actual,
+ const UNITY_UINT32 num_elements,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLAGS_T flags);
+
+void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected,
+ UNITY_INTERNAL_PTR actual,
+ const UNITY_UINT32 length,
+ const UNITY_UINT32 num_elements,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLAGS_T flags);
+
+void UnityAssertNumbersWithin(const UNITY_UINT delta,
+ const UNITY_INT expected,
+ const UNITY_INT actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_DISPLAY_STYLE_T style);
+
+void UnityFail(const char* message, const UNITY_LINE_TYPE line);
+
+void UnityIgnore(const char* message, const UNITY_LINE_TYPE line);
+
+#ifndef UNITY_EXCLUDE_FLOAT
+void UnityAssertFloatsWithin(const UNITY_FLOAT delta,
+ const UNITY_FLOAT expected,
+ const UNITY_FLOAT actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber);
+
+void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected,
+ UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual,
+ const UNITY_UINT32 num_elements,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLAGS_T flags);
+
+void UnityAssertFloatSpecial(const UNITY_FLOAT actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLOAT_TRAIT_T style);
+#endif
+
+#ifndef UNITY_EXCLUDE_DOUBLE
+void UnityAssertDoublesWithin(const UNITY_DOUBLE delta,
+ const UNITY_DOUBLE expected,
+ const UNITY_DOUBLE actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber);
+
+void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected,
+ UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual,
+ const UNITY_UINT32 num_elements,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLAGS_T flags);
+
+void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber,
+ const UNITY_FLOAT_TRAIT_T style);
+#endif
+
+/*-------------------------------------------------------
+ * Helpers
+ *-------------------------------------------------------*/
+
+UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size);
+#ifndef UNITY_EXCLUDE_FLOAT
+UNITY_INTERNAL_PTR UnityFloatToPtr(const float num);
+#endif
+#ifndef UNITY_EXCLUDE_DOUBLE
+UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num);
+#endif
+
+/*-------------------------------------------------------
+ * Error Strings We Might Need
+ *-------------------------------------------------------*/
+
+extern const char UnityStrErrFloat[];
+extern const char UnityStrErrDouble[];
+extern const char UnityStrErr64[];
+
+/*-------------------------------------------------------
+ * Test Running Macros
+ *-------------------------------------------------------*/
+
+#ifndef UNITY_EXCLUDE_SETJMP_H
+#define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0)
+#define TEST_ABORT() longjmp(Unity.AbortFrame, 1)
+#else
+#define TEST_PROTECT() 1
+#define TEST_ABORT() return
+#endif
+
+/* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */
+#ifndef RUN_TEST
+#ifdef __STDC_VERSION__
+#if __STDC_VERSION__ >= 199901L
+#define RUN_TEST(...) UnityDefaultTestRun(RUN_TEST_FIRST(__VA_ARGS__), RUN_TEST_SECOND(__VA_ARGS__))
+#define RUN_TEST_FIRST(...) RUN_TEST_FIRST_HELPER(__VA_ARGS__, throwaway)
+#define RUN_TEST_FIRST_HELPER(first, ...) (first), #first
+#define RUN_TEST_SECOND(...) RUN_TEST_SECOND_HELPER(__VA_ARGS__, __LINE__, throwaway)
+#define RUN_TEST_SECOND_HELPER(first, second, ...) (second)
+#endif
+#endif
+#endif
+
+/* If we can't do the tricky version, we'll just have to require them to always include the line number */
+#ifndef RUN_TEST
+#ifdef CMOCK
+#define RUN_TEST(func, num) UnityDefaultTestRun(func, #func, num)
+#else
+#define RUN_TEST(func) UnityDefaultTestRun(func, #func, __LINE__)
+#endif
+#endif
+
+#define TEST_LINE_NUM (Unity.CurrentTestLineNumber)
+#define TEST_IS_IGNORED (Unity.CurrentTestIgnored)
+#define UNITY_NEW_TEST(a) \
+ Unity.CurrentTestName = (a); \
+ Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)(__LINE__); \
+ Unity.NumberOfTests++;
+
+#ifndef UNITY_BEGIN
+#define UNITY_BEGIN() UnityBegin(__FILE__)
+#endif
+
+#ifndef UNITY_END
+#define UNITY_END() UnityEnd()
+#endif
+
+/*-----------------------------------------------
+ * Command Line Argument Support
+ *-----------------------------------------------*/
+
+#ifdef UNITY_USE_COMMAND_LINE_ARGS
+int UnityParseOptions(int argc, char** argv);
+int UnityTestMatches(void);
+#endif
+
+/*-------------------------------------------------------
+ * Basic Fail and Ignore
+ *-------------------------------------------------------*/
+
+#define UNITY_TEST_FAIL(line, message) UnityFail( (message), (UNITY_LINE_TYPE)(line))
+#define UNITY_TEST_IGNORE(line, message) UnityIgnore( (message), (UNITY_LINE_TYPE)(line))
+
+/*-------------------------------------------------------
+ * Test Asserts
+ *-------------------------------------------------------*/
+
+#define UNITY_TEST_ASSERT(condition, line, message) if (condition) {} else {UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), (message));}
+#define UNITY_TEST_ASSERT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) == NULL), (UNITY_LINE_TYPE)(line), (message))
+#define UNITY_TEST_ASSERT_NOT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) != NULL), (UNITY_LINE_TYPE)(line), (message))
+
+#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT)
+#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8)
+#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16)
+#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32)
+#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT)
+#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8)
+#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16)
+#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32)
+#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8)
+#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16)
+#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32)
+#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((UNITY_INT)(mask), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line))
+
+#define UNITY_TEST_ASSERT_GREATER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT)
+#define UNITY_TEST_ASSERT_GREATER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8)
+#define UNITY_TEST_ASSERT_GREATER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16)
+#define UNITY_TEST_ASSERT_GREATER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32)
+#define UNITY_TEST_ASSERT_GREATER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT)
+#define UNITY_TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8)
+#define UNITY_TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16)
+#define UNITY_TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32)
+#define UNITY_TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8)
+#define UNITY_TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16)
+#define UNITY_TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32)
+
+#define UNITY_TEST_ASSERT_SMALLER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32)
+
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32)
+
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32)
+
+#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT)
+#define UNITY_TEST_ASSERT_INT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8)
+#define UNITY_TEST_ASSERT_INT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16)
+#define UNITY_TEST_ASSERT_INT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32)
+#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT)
+#define UNITY_TEST_ASSERT_UINT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8)
+#define UNITY_TEST_ASSERT_UINT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16)
+#define UNITY_TEST_ASSERT_UINT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32)
+#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8)
+#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16)
+#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32)
+
+#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_PTR_TO_INT)(expected), (UNITY_PTR_TO_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER)
+#define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line))
+#define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (UNITY_UINT32)(len), (message), (UNITY_LINE_TYPE)(line))
+#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), 1, (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY)
+
+#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY)
+
+#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(unsigned int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT) expected, sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL)
+
+#ifdef UNITY_SUPPORT_64
+#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64)
+#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64)
+#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64)
+#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64)
+#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64)
+#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64)
+#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64)
+#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64)
+#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64)
+#else
+#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64)
+#endif
+
+#ifdef UNITY_EXCLUDE_FLOAT
+#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat)
+#else
+#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line))
+#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message))
+#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray((UNITY_FLOAT*)(expected), (UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray(UnityFloatToPtr(expected), (UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN)
+#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN)
+#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET)
+#endif
+
+#ifdef UNITY_EXCLUDE_DOUBLE
+#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
+#else
+#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)line)
+#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual, (UNITY_LINE_TYPE)(line), message)
+#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((UNITY_DOUBLE*)(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_ARRAY_TO_ARRAY)
+#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray(UnityDoubleToPtr(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_ARRAY_TO_VAL)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN)
+#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET)
+#endif
+
+/* End of UNITY_INTERNALS_H */
+#endif
diff --git a/support/cJSON-master/tests/unity_setup.c b/support/cJSON-master/tests/unity_setup.c
new file mode 100644
index 0000000..1d828b0
--- /dev/null
+++ b/support/cJSON-master/tests/unity_setup.c
@@ -0,0 +1,3 @@
+// msvc doesn't support weak-linking, so we need to define these functions.
+void setUp(void) { }
+void tearDown(void) { }