| 
									
										
										
										
											2022-06-21 20:29:01 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: Apache-2.0 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-10-25 12:52:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | #include <stdbool.h>
 | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | #include <ctype.h>
 | 
					
						
							| 
									
										
										
										
											2016-11-25 19:29:58 +11:00
										 |  |  | #include <stdio.h>
 | 
					
						
							| 
									
										
										
										
											2018-10-25 12:52:32 +08:00
										 |  |  | #include "unity.h"
 | 
					
						
							| 
									
										
										
										
											2019-04-12 09:31:23 +08:00
										 |  |  | #include "esp_system.h"
 | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | /* similar to UNITY_PRINT_EOL */ | 
					
						
							|  |  |  | #define UNITY_PRINT_TAB() UNITY_OUTPUT_CHAR('\t')
 | 
					
						
							| 
									
										
										
										
											2017-10-18 21:09:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | // Pointers to the head and tail of linked list of test description structs:
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | static test_desc_t *s_unity_tests_first = NULL; | 
					
						
							|  |  |  | static test_desc_t *s_unity_tests_last = NULL; | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | void unity_testcase_register(test_desc_t *desc) | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     if (!s_unity_tests_first) { | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |         s_unity_tests_first = desc; | 
					
						
							| 
									
										
										
										
											2017-01-23 12:54:35 +08:00
										 |  |  |         s_unity_tests_last = desc; | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         test_desc_t *temp = s_unity_tests_first; | 
					
						
							| 
									
										
										
										
											2017-01-23 12:54:35 +08:00
										 |  |  |         s_unity_tests_first = desc; | 
					
						
							|  |  |  |         s_unity_tests_first->next = temp; | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 14:50:34 +08:00
										 |  |  | /* print the multiple function case name and its sub-menu
 | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  |  * e.g: | 
					
						
							|  |  |  |  * (1) spi master/slave case | 
					
						
							|  |  |  |  *       (1)master case | 
					
						
							|  |  |  |  *       (2)slave case | 
					
						
							|  |  |  |  * */ | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | static void print_multiple_function_test_menu(const test_desc_t *test_ms) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     UnityPrint(test_ms->name); | 
					
						
							|  |  |  |     UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |     for (int i = 0; i < test_ms->test_fn_count; i++) { | 
					
						
							|  |  |  |         UNITY_PRINT_TAB(); | 
					
						
							|  |  |  |         UnityPrint("("); | 
					
						
							|  |  |  |         UnityPrintNumberUnsigned(i + 1); | 
					
						
							|  |  |  |         UnityPrint(")"); | 
					
						
							|  |  |  |         UNITY_PRINT_TAB(); | 
					
						
							|  |  |  |         UnityPrint("\""); | 
					
						
							|  |  |  |         UnityPrint(test_ms->test_fn_name[i]); | 
					
						
							|  |  |  |         UnityPrint("\""); | 
					
						
							|  |  |  |         UNITY_PRINT_EOL(); | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-12 09:31:23 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * This function looks like UnityDefaultTestRun function only without UNITY_CLR_DETAILS. | 
					
						
							|  |  |  |  * void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) | 
					
						
							|  |  |  |  * was moved from `components/unity/unity/src/unity.c` to here. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | static void unity_default_test_run(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Unity.CurrentTestName = FuncName; | 
					
						
							|  |  |  |     Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; | 
					
						
							|  |  |  |     Unity.NumberOfTests++; | 
					
						
							|  |  |  |     if (TEST_PROTECT()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         setUp(); | 
					
						
							|  |  |  |         Func(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (TEST_PROTECT()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         tearDown(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     UnityConcludeTest(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int multiple_function_option(const test_desc_t *test_ms) | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     int selection; | 
					
						
							|  |  |  |     char cmdline[256] = {0}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 14:50:34 +08:00
										 |  |  |     print_multiple_function_test_menu(test_ms); | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     while (strlen(cmdline) == 0) { | 
					
						
							| 
									
										
										
										
											2018-10-25 12:52:32 +08:00
										 |  |  |         unity_gets(cmdline, sizeof(cmdline)); | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |         if (strlen(cmdline) == 0) { | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  |             /* if input was newline, print a new menu */ | 
					
						
							| 
									
										
										
										
											2018-03-09 14:50:34 +08:00
										 |  |  |             print_multiple_function_test_menu(test_ms); | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     selection = atoi((const char *) cmdline) - 1; | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     if (selection >= 0 && selection < test_ms->test_fn_count) { | 
					
						
							| 
									
										
										
										
											2019-04-12 09:31:23 +08:00
										 |  |  |         unity_default_test_run(test_ms->fn[selection], test_ms->name, test_ms->line); | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |         UnityPrint("Invalid selection, your should input number 1-"); | 
					
						
							|  |  |  |         UnityPrintNumber(test_ms->test_fn_count); | 
					
						
							|  |  |  |         UNITY_PRINT_EOL(); | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-04-12 09:31:23 +08:00
										 |  |  |     return selection; | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | static void unity_run_single_test(const test_desc_t *test) | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     UnityPrint("Running "); | 
					
						
							|  |  |  |     UnityPrint(test->name); | 
					
						
							|  |  |  |     UnityPrint("..."); | 
					
						
							|  |  |  |     UNITY_PRINT_EOL(); | 
					
						
							| 
									
										
										
										
											2018-04-26 16:47:35 +08:00
										 |  |  |     // Unit test runner expects to see test name before the test starts
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     UNITY_OUTPUT_FLUSH(); | 
					
						
							| 
									
										
										
										
											2018-04-26 16:47:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |     Unity.TestFile = test->file; | 
					
						
							|  |  |  |     Unity.CurrentDetail1 = test->desc; | 
					
						
							| 
									
										
										
										
											2019-04-12 09:31:23 +08:00
										 |  |  |     bool reset_after_test = strstr(Unity.CurrentDetail1, "[leaks") != NULL; | 
					
						
							|  |  |  |     bool multi_device = strstr(Unity.CurrentDetail1, "[multi_device]") != NULL; | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     if (test->test_fn_count == 1) { | 
					
						
							| 
									
										
										
										
											2019-04-12 09:31:23 +08:00
										 |  |  |         unity_default_test_run(test->fn[0], test->name, test->line); | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2019-04-12 09:31:23 +08:00
										 |  |  |         int selection = multiple_function_option(test); | 
					
						
							|  |  |  |         if (reset_after_test && multi_device == false) { | 
					
						
							|  |  |  |             if (selection != (test->test_fn_count - 1)) { | 
					
						
							|  |  |  |                 // to do a reset for all stages except the last stage.
 | 
					
						
							|  |  |  |                 esp_restart(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (reset_after_test) { | 
					
						
							|  |  |  |         // print a result of test before to do reset for the last stage.
 | 
					
						
							|  |  |  |         UNITY_END(); | 
					
						
							|  |  |  |         UnityPrint("Enter next test, or 'enter' to see menu"); | 
					
						
							|  |  |  |         UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |         UNITY_OUTPUT_FLUSH(); | 
					
						
							|  |  |  |         esp_restart(); | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-21 20:29:01 +02:00
										 |  |  | void unity_run_test_by_index(int index) | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     const test_desc_t *test; | 
					
						
							|  |  |  |     for (test = s_unity_tests_first; test != NULL && index != 0; test = test->next, --index) { | 
					
						
							|  |  |  |         ; | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     if (test != NULL) { | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |         unity_run_single_test(test); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | static void unity_run_single_test_by_index_parse(const char *filter, int index_max) | 
					
						
							| 
									
										
										
										
											2017-06-01 12:11:45 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     int test_index = strtol(filter, NULL, 10); | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     if (test_index >= 1 && test_index <= index_max) { | 
					
						
							|  |  |  |         UNITY_EXEC_TIME_START(); | 
					
						
							| 
									
										
										
										
											2022-06-21 20:29:01 +02:00
										 |  |  |         unity_run_test_by_index(test_index - 1); | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |         UNITY_EXEC_TIME_STOP(); | 
					
						
							|  |  |  |         UnityPrint("Test ran in "); | 
					
						
							|  |  |  |         UnityPrintNumberUnsigned(UNITY_EXEC_TIME_MS()); | 
					
						
							|  |  |  |         UnityPrint("ms"); | 
					
						
							|  |  |  |         UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |         UNITY_OUTPUT_FLUSH(); | 
					
						
							| 
									
										
										
										
											2017-06-01 12:11:45 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | void unity_run_test_by_name(const char *name) | 
					
						
							| 
									
										
										
										
											2017-06-01 12:11:45 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     for (const test_desc_t *test = s_unity_tests_first; test != NULL; test = test->next) { | 
					
						
							|  |  |  |         if (strcmp(test->name, name) == 0) { | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |             unity_run_single_test(test); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-16 16:33:30 +07:00
										 |  |  | void unity_run_all_tests(void) | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     for (const test_desc_t *test = s_unity_tests_first; test != NULL; test = test->next) { | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |         unity_run_single_test(test); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | void unity_run_tests_by_tag(const char *tag, bool invert) | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     UnityPrint("Running tests "); | 
					
						
							|  |  |  |     if (invert) { | 
					
						
							|  |  |  |         UnityPrint("NOT "); | 
					
						
							| 
									
										
										
										
											2017-05-10 17:22:30 +10:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     UnityPrint("matching '"); | 
					
						
							|  |  |  |     UnityPrint(tag); | 
					
						
							|  |  |  |     UnityPrint("'..."); | 
					
						
							|  |  |  |     UNITY_PRINT_EOL(); | 
					
						
							| 
									
										
										
										
											2017-06-01 12:11:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     for (const test_desc_t *test = s_unity_tests_first; test != NULL; test = test->next) { | 
					
						
							|  |  |  |         if ((strstr(test->desc, tag) != NULL) == !invert) { | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |             unity_run_single_test(test); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  | static void trim_trailing_space(char *str) | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     char *end = str + strlen(str) - 1; | 
					
						
							|  |  |  |     while (end >= str && isspace((int) *end)) { | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |         *end = 0; | 
					
						
							|  |  |  |         --end; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-25 19:29:58 +11:00
										 |  |  | static int print_test_menu(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int test_counter = 0; | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |     UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |     UnityPrint("Here's the test menu, pick your combo:"); | 
					
						
							|  |  |  |     UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |     for (const test_desc_t *test = s_unity_tests_first; | 
					
						
							|  |  |  |             test != NULL; | 
					
						
							|  |  |  |             test = test->next, ++test_counter) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         UnityPrint("("); | 
					
						
							|  |  |  |         UnityPrintNumber(test_counter + 1); | 
					
						
							|  |  |  |         UnityPrint(")"); | 
					
						
							|  |  |  |         UNITY_PRINT_TAB(); | 
					
						
							|  |  |  |         UnityPrint("\""); | 
					
						
							|  |  |  |         UnityPrint(test->name); | 
					
						
							|  |  |  |         UnityPrint("\" "); | 
					
						
							|  |  |  |         UnityPrint(test->desc); | 
					
						
							|  |  |  |         UNITY_PRINT_EOL(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (test->test_fn_count > 1) { | 
					
						
							|  |  |  |             for (int i = 0; i < test->test_fn_count; i++) { | 
					
						
							|  |  |  |                 UNITY_PRINT_TAB(); | 
					
						
							|  |  |  |                 UnityPrint("("); | 
					
						
							|  |  |  |                 UnityPrintNumber(i + 1); | 
					
						
							|  |  |  |                 UnityPrint(")"); | 
					
						
							|  |  |  |                 UNITY_PRINT_TAB(); | 
					
						
							|  |  |  |                 UnityPrint("\""); | 
					
						
							|  |  |  |                 UnityPrint(test->test_fn_name[i]); | 
					
						
							|  |  |  |                 UnityPrint("\""); | 
					
						
							|  |  |  |                 UNITY_PRINT_EOL(); | 
					
						
							| 
									
										
										
										
											2017-11-30 19:31:51 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |     UnityPrint("Enter test for running."); /* unit_test.py needs it for finding the end of test menu */ | 
					
						
							|  |  |  |     UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |     UNITY_OUTPUT_FLUSH(); | 
					
						
							|  |  |  |     return test_counter; | 
					
						
							| 
									
										
										
										
											2016-11-25 19:29:58 +11:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-21 20:29:01 +02:00
										 |  |  | int unity_get_test_count(void) | 
					
						
							| 
									
										
										
										
											2017-11-09 14:45:08 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     int test_counter = 0; | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     for (const test_desc_t *test = s_unity_tests_first; | 
					
						
							|  |  |  |             test != NULL; | 
					
						
							|  |  |  |             test = test->next) { | 
					
						
							| 
									
										
										
										
											2017-11-09 14:45:08 +08:00
										 |  |  |         ++test_counter; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return test_counter; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-16 16:33:30 +07:00
										 |  |  | void unity_run_menu(void) | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |     UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |     UnityPrint("Press ENTER to see the list of tests."); | 
					
						
							|  |  |  |     UNITY_PRINT_EOL(); | 
					
						
							| 
									
										
										
										
											2022-06-21 20:29:01 +02:00
										 |  |  |     int test_count = unity_get_test_count(); | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |     while (true) { | 
					
						
							| 
									
										
										
										
											2016-11-25 19:29:58 +11:00
										 |  |  |         char cmdline[256] = { 0 }; | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |         while (strlen(cmdline) == 0) { | 
					
						
							| 
									
										
										
										
											2018-10-25 12:52:32 +08:00
										 |  |  |             unity_gets(cmdline, sizeof(cmdline)); | 
					
						
							| 
									
										
										
										
											2016-11-25 19:29:58 +11:00
										 |  |  |             trim_trailing_space(cmdline); | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |             if (strlen(cmdline) == 0) { | 
					
						
							| 
									
										
										
										
											2016-11-25 19:29:58 +11:00
										 |  |  |                 /* if input was newline, print a new menu */ | 
					
						
							|  |  |  |                 print_test_menu(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-01-31 16:58:27 +08:00
										 |  |  |         /*use '-' to show test history. Need to do it before UNITY_BEGIN cleanup history */ | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |         if (cmdline[0] == '-') { | 
					
						
							| 
									
										
										
										
											2018-01-31 16:58:27 +08:00
										 |  |  |             UNITY_END(); | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         UNITY_BEGIN(); | 
					
						
							| 
									
										
										
										
											2016-11-25 19:29:58 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-01 12:11:45 +08:00
										 |  |  |         size_t idx = 0; | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |         bool invert = false; | 
					
						
							|  |  |  |         if (cmdline[idx] == '!') { | 
					
						
							|  |  |  |             invert = true; | 
					
						
							| 
									
										
										
										
											2017-06-01 12:11:45 +08:00
										 |  |  |             ++idx; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |         if (cmdline[idx] == '*') { | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |             unity_run_all_tests(); | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |         } else if (cmdline[idx] == '[') { | 
					
						
							|  |  |  |             unity_run_tests_by_tag(cmdline + idx, invert); | 
					
						
							|  |  |  |         } else if (cmdline[idx] == '"') { | 
					
						
							|  |  |  |             char* end = strrchr(cmdline, '"'); | 
					
						
							|  |  |  |             if (end > &cmdline[idx]) { | 
					
						
							|  |  |  |                 *end = 0; | 
					
						
							|  |  |  |                 unity_run_test_by_name(cmdline + idx + 1); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } else if (isdigit((unsigned char)cmdline[idx])) { | 
					
						
							| 
									
										
										
										
											2017-06-01 12:11:45 +08:00
										 |  |  |             unity_run_single_test_by_index_parse(cmdline + idx, test_count); | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         UNITY_END(); | 
					
						
							| 
									
										
										
										
											2016-11-25 19:29:58 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 15:44:50 +08:00
										 |  |  |         UnityPrint("Enter next test, or 'enter' to see menu"); | 
					
						
							|  |  |  |         UNITY_PRINT_EOL(); | 
					
						
							|  |  |  |         UNITY_OUTPUT_FLUSH(); | 
					
						
							| 
									
										
										
										
											2016-11-17 16:36:10 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-06-21 20:29:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | bool unity_get_test_info(int test_index, test_desc_t* out_info) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (test_index < 0) { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     const test_desc_t *test; | 
					
						
							|  |  |  |     for (test = s_unity_tests_first; test != NULL && test_index != 0; test = test->next, --test_index) { | 
					
						
							|  |  |  |         ; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (test == NULL) { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     *out_info = *test; | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } |