]> granicus.if.org Git - esp-idf/commitdiff
unity: don't use stdio in runner, fix code style
authorIvan Grokhotkov <ivan@espressif.com>
Thu, 25 Oct 2018 07:44:50 +0000 (15:44 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Mon, 19 Nov 2018 04:36:31 +0000 (12:36 +0800)
components/unity/include/unity_config.h
components/unity/include/unity_test_runner.h [moved from components/unity/include/unity_test_case.h with 92% similarity]
components/unity/unity_runner.c

index 6267b56f44b3119075ffd72886a44d870219e1ed..b23a5fe129812b8c0d8c0b54f09038cf8a697374 100644 (file)
@@ -40,19 +40,11 @@ uint32_t unity_exec_time_get_ms(void);
 #define UNITY_EXEC_TIME_STOP()  unity_exec_time_stop()
 #define UNITY_EXEC_TIME_MS()    unity_exec_time_get_ms()
 
-#ifdef CONFIG_UNITY_ENABLE_TEST_RUNNER
+#ifdef CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER
 
-#include "unity_test_case.h"
+#include "unity_test_runner.h"
 
-void unity_run_menu() __attribute__((noreturn));
-
-void unity_run_tests_with_filter(const char* filter);
-
-void unity_run_all_tests();
-
-void unity_run_single_test_by_name(const char* name);
-
-#endif //CONFIG_UNITY_ENABLE_TEST_RUNNER
+#endif //CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER
 
 // shorthand to check esp_err_t return code
 #define TEST_ESP_OK(rc) TEST_ASSERT_EQUAL_HEX32(ESP_OK, rc)
similarity index 92%
rename from components/unity/include/unity_test_case.h
rename to components/unity/include/unity_test_runner.h
index ac6ab0f805de57d1b1d8dbcb9cd6ec7e7bea4a2a..8f41eb83d7a21b006cfef64f6bbb6ebc071a367c 100644 (file)
@@ -14,6 +14,7 @@
 #pragma once
 
 #include <stdint.h>
+#include <stdbool.h>
 
 // This file gets included from unity.h via unity_internals.h via unity_config.h
 // It is inside #ifdef __cplusplus / extern "C" block, so we can
@@ -54,7 +55,7 @@
 
 typedef void (* test_func)(void);
 
-struct test_desc_t
+typedef struct test_desc_t
 {
     const char* name;
     const char* desc;
@@ -64,9 +65,9 @@ struct test_desc_t
     uint8_t test_fn_count;
     const char ** test_fn_name;
     struct test_desc_t* next;
-};
+} test_desc_t;
 
-void unity_testcase_register(struct test_desc_t* desc);
+void unity_testcase_register(test_desc_t* desc);
 
 
 /*  Test case macro, a-la CATCH framework.
@@ -86,7 +87,7 @@ void unity_testcase_register(struct test_desc_t* desc);
     static void __attribute__((constructor)) UNITY_TEST_UID(test_reg_helper_) () \
     { \
         static test_func test_fn_[] = {&UNITY_TEST_UID(test_func_)}; \
-        static struct test_desc_t UNITY_TEST_UID(test_desc_) = { \
+        static test_desc_t UNITY_TEST_UID(test_desc_) = { \
             .name = name_, \
             .desc = desc_, \
             .fn = test_fn_, \
@@ -116,7 +117,7 @@ void unity_testcase_register(struct test_desc_t* desc);
     UNITY_TEST_FN_SET(__VA_ARGS__); \
     static void __attribute__((constructor)) UNITY_TEST_UID(test_reg_helper_) () \
     { \
-        static struct test_desc_t UNITY_TEST_UID(test_desc_) = { \
+        static test_desc_t UNITY_TEST_UID(test_desc_) = { \
             .name = name_, \
             .desc = desc_"[multi_stage]", \
             .fn = UNITY_TEST_UID(test_functions), \
@@ -141,7 +142,7 @@ void unity_testcase_register(struct test_desc_t* desc);
     UNITY_TEST_FN_SET(__VA_ARGS__); \
     static void __attribute__((constructor)) UNITY_TEST_UID(test_reg_helper_) () \
     { \
-        static struct test_desc_t UNITY_TEST_UID(test_desc_) = { \
+        static test_desc_t UNITY_TEST_UID(test_desc_) = { \
             .name = name_, \
             .desc = desc_"[multi_device]", \
             .fn = UNITY_TEST_UID(test_functions), \
@@ -162,3 +163,12 @@ void unity_testcase_register(struct test_desc_t* desc);
  * field names are treated as annotations and don't affect initialization
  * order. Also make sure all the fields are initialized.
  */
+
+void unity_run_test_by_name(const char *name);
+
+void unity_run_tests_by_tag(const char *tag, bool invert);
+
+void unity_run_all_tests();
+
+void unity_run_menu();
+
index 4969aed722bda87e181836db891b53791be45be0..a205400d0ffec49208650d6c8727b6683c8513fd 100644 (file)
 
 #include <stdlib.h>
 #include <string.h>
+#include <stdbool.h>
 #include <ctype.h>
 #include <stdio.h>
-#include "esp_clk.h"
-#include "soc/cpu.h"
 #include "unity.h"
 
+/* similar to UNITY_PRINT_EOL */
+#define UNITY_PRINT_TAB() UNITY_OUTPUT_CHAR('\t')
 
 // Pointers to the head and tail of linked list of test description structs:
-static struct test_desc_t* s_unity_tests_first = NULL;
-static struct test_desc_t* s_unity_tests_last = NULL;
+static test_desc_t *s_unity_tests_first = NULL;
+static test_desc_t *s_unity_tests_last = NULL;
 
-// Inverse of the filter
-static bool s_invert = false;
-
-void unity_testcase_register(struct test_desc_t* desc)
+void unity_testcase_register(test_desc_t *desc)
 {
-    if (!s_unity_tests_first)
-    {
+    if (!s_unity_tests_first) {
         s_unity_tests_first = desc;
         s_unity_tests_last = desc;
-    }
-    else
-    {
-        struct test_desc_t* temp = s_unity_tests_first;
+    } else {
+        test_desc_t *temp = s_unity_tests_first;
         s_unity_tests_first = desc;
         s_unity_tests_first->next = temp;
     }
@@ -49,47 +44,58 @@ void unity_testcase_register(struct test_desc_t* desc)
  *       (1)master case
  *       (2)slave case
  * */
-static void print_multiple_function_test_menu(const struct test_desc_t* test_ms)
- {
-    printf("%s\n", test_ms->name);
-    for (int i = 0; i < test_ms->test_fn_count; i++)
-    {
-        printf("\t(%d)\t\"%s\"\n", i+1, test_ms->test_fn_name[i]);
+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();
     }
- }
+}
 
-void multiple_function_option(const struct test_desc_t* test_ms)
+static void multiple_function_option(const test_desc_t *test_ms)
 {
     int selection;
     char cmdline[256] = {0};
 
     print_multiple_function_test_menu(test_ms);
-    while(strlen(cmdline) == 0)
-    {
+    while (strlen(cmdline) == 0) {
         unity_gets(cmdline, sizeof(cmdline));
-        if(strlen(cmdline) == 0) {
+        if (strlen(cmdline) == 0) {
             /* if input was newline, print a new menu */
             print_multiple_function_test_menu(test_ms);
         }
     }
     selection = atoi((const char *) cmdline) - 1;
-    if(selection >= 0 && selection < test_ms->test_fn_count) {
+    if (selection >= 0 && selection < test_ms->test_fn_count) {
         UnityDefaultTestRun(test_ms->fn[selection], test_ms->name, test_ms->line);
     } else {
-        printf("Invalid selection, your should input number 1-%d!", test_ms->test_fn_count);
+        UnityPrint("Invalid selection, your should input number 1-");
+        UnityPrintNumber(test_ms->test_fn_count);
+        UNITY_PRINT_EOL();
     }
 }
 
-static void unity_run_single_test(const struct test_desc_t* test)
+static void unity_run_single_test(const test_desc_t *test)
 {
-    printf("Running %s...\n", test->name);
+    UnityPrint("Running ");
+    UnityPrint(test->name);
+    UnityPrint("...");
+    UNITY_PRINT_EOL();
     // Unit test runner expects to see test name before the test starts
-    fflush(stdout);
-    unity_flush();
+    UNITY_OUTPUT_FLUSH();
 
     Unity.TestFile = test->file;
     Unity.CurrentDetail1 = test->desc;
-    if(test->test_fn_count == 1) {
+    if (test->test_fn_count == 1) {
         UnityDefaultTestRun(test->fn[0], test->name, test->line);
     } else {
         multiple_function_option(test);
@@ -98,51 +104,34 @@ static void unity_run_single_test(const struct test_desc_t* test)
 
 static void unity_run_single_test_by_index(int index)
 {
-    const struct test_desc_t* test;
-    for (test = s_unity_tests_first; test != NULL && index != 0; test = test->next, --index)
-    {
-
+    const test_desc_t *test;
+    for (test = s_unity_tests_first; test != NULL && index != 0; test = test->next, --index) {
+        ;
     }
-    if (test != NULL)
-    {
+    if (test != NULL) {
         unity_run_single_test(test);
     }
 }
 
-static void unity_run_single_test_by_index_parse(const charfilter, int index_max)
+static void unity_run_single_test_by_index_parse(const char *filter, int index_max)
 {
-    if (s_invert)
-    {
-        printf("Inverse is not supported for that kind of filter\n");
-        return;
-    }
     int test_index = strtol(filter, NULL, 10);
-    if (test_index >= 1 && test_index <= index_max)
-    {
-        uint32_t start;
-        RSR(CCOUNT, start);
+    if (test_index >= 1 && test_index <= index_max) {
+        UNITY_EXEC_TIME_START();
         unity_run_single_test_by_index(test_index - 1);
-        uint32_t end;
-        RSR(CCOUNT, end);
-        uint32_t ms = (end - start) / (esp_clk_cpu_freq() / 1000);
-        printf("Test ran in %dms\n", ms);
+        UNITY_EXEC_TIME_STOP();
+        UnityPrint("Test ran in ");
+        UnityPrintNumberUnsigned(UNITY_EXEC_TIME_MS());
+        UnityPrint("ms");
+        UNITY_PRINT_EOL();
+        UNITY_OUTPUT_FLUSH();
     }
 }
 
-void unity_run_single_test_by_name(const char* filter)
+void unity_run_test_by_name(const char *name)
 {
-    if (s_invert)
-    {
-        printf("Inverse is not supported for that kind of filter\n");
-        return;
-    }
-    char tmp[256];
-    strncpy(tmp, filter + 1, sizeof(tmp) - 1);
-    tmp[strlen(filter) - 2] = 0;
-    for (const struct test_desc_t* test = s_unity_tests_first; test != NULL; test = test->next)
-    {
-        if (strcmp(test->name, tmp) == 0)
-        {
+    for (const test_desc_t *test = s_unity_tests_first; test != NULL; test = test->next) {
+        if (strcmp(test->name, name) == 0) {
             unity_run_single_test(test);
         }
     }
@@ -150,39 +139,33 @@ void unity_run_single_test_by_name(const char* filter)
 
 void unity_run_all_tests()
 {
-    if (s_invert)
-    {
-        printf("Inverse is not supported for that kind of filter\n");
-        return;
-    }
-    for (const struct test_desc_t* test = s_unity_tests_first; test != NULL; test = test->next)
-    {
+    for (const test_desc_t *test = s_unity_tests_first; test != NULL; test = test->next) {
         unity_run_single_test(test);
     }
 }
 
-void unity_run_tests_with_filter(const char* filter)
+void unity_run_tests_by_tag(const char *tag, bool invert)
 {
-    if (s_invert)
-    {
-        ++filter;
+    UnityPrint("Running tests ");
+    if (invert) {
+        UnityPrint("NOT ");
     }
-    printf("Running tests %smatching '%s'...\n", s_invert ? "NOT " : "", filter);
+    UnityPrint("matching '");
+    UnityPrint(tag);
+    UnityPrint("'...");
+    UNITY_PRINT_EOL();
 
-    for (const struct test_desc_t* test = s_unity_tests_first; test != NULL; test = test->next)
-    {
-        if ((strstr(test->desc, filter) != NULL) == !s_invert)
-        {
+    for (const test_desc_t *test = s_unity_tests_first; test != NULL; test = test->next) {
+        if ((strstr(test->desc, tag) != NULL) == !invert) {
             unity_run_single_test(test);
         }
     }
 }
 
-static void trim_trailing_space(charstr)
+static void trim_trailing_space(char *str)
 {
-    char* end = str + strlen(str) - 1;
-    while (end >= str && isspace((int) *end))
-    {
+    char *end = str + strlen(str) - 1;
+    while (end >= str && isspace((int) *end)) {
         *end = 0;
         --end;
     }
@@ -191,31 +174,51 @@ static void trim_trailing_space(char* str)
 static int print_test_menu(void)
 {
     int test_counter = 0;
-    printf("\n\nHere's the test menu, pick your combo:\n");
-    for (const struct test_desc_t* test = s_unity_tests_first;
-         test != NULL;
-         test = test->next, ++test_counter)
-    {
-        printf("(%d)\t\"%s\" %s\n", test_counter + 1, test->name, test->desc);
-        if(test->test_fn_count > 1)
-        {
-            for (int i = 0; i < test->test_fn_count; i++)
-            {
-                printf("\t(%d)\t\"%s\"\n", i+1, test->test_fn_name[i]);
+    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();
             }
-         }
-     }
-     printf("\nEnter test for running.\n"); /* unit_test.py needs it for finding the end of test menu */
-     return test_counter;
+        }
+    }
+    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;
 }
 
 static int get_test_count(void)
 {
     int test_counter = 0;
-    for (const struct test_desc_t* test = s_unity_tests_first;
-         test != NULL;
-         test = test->next)
-    {
+    for (const test_desc_t *test = s_unity_tests_first;
+            test != NULL;
+            test = test->next) {
         ++test_counter;
     }
     return test_counter;
@@ -223,23 +226,23 @@ static int get_test_count(void)
 
 void unity_run_menu()
 {
-    printf("\n\nPress ENTER to see the list of tests.\n");
+    UNITY_PRINT_EOL();
+    UNITY_PRINT_EOL();
+    UnityPrint("Press ENTER to see the list of tests.");
+    UNITY_PRINT_EOL();
     int test_count = get_test_count();
-    while (true)
-    {
+    while (true) {
         char cmdline[256] = { 0 };
-        while(strlen(cmdline) == 0)
-        {
+        while (strlen(cmdline) == 0) {
             unity_gets(cmdline, sizeof(cmdline));
             trim_trailing_space(cmdline);
-            if(strlen(cmdline) == 0) {
+            if (strlen(cmdline) == 0) {
                 /* if input was newline, print a new menu */
                 print_test_menu();
             }
         }
         /*use '-' to show test history. Need to do it before UNITY_BEGIN cleanup history */
-        if (cmdline[0] == '-')
-        {
+        if (cmdline[0] == '-') {
             UNITY_END();
             continue;
         }
@@ -247,35 +250,30 @@ void unity_run_menu()
         UNITY_BEGIN();
 
         size_t idx = 0;
-        if (cmdline[idx] == '!')
-        {
-            s_invert = true;
+        bool invert = false;
+        if (cmdline[idx] == '!') {
+            invert = true;
             ++idx;
         }
-        else
-        {
-            s_invert = false;
-        }
 
-        if (cmdline[idx] == '*')
-        {
+        if (cmdline[idx] == '*') {
             unity_run_all_tests();
-        }
-        else if (cmdline[idx] =='[')
-        {
-            unity_run_tests_with_filter(cmdline + idx);
-        }
-        else if (cmdline[idx] =='"')
-        {
-            unity_run_single_test_by_name(cmdline + idx);
-        }
-        else if (isdigit((unsigned char)cmdline[idx]))
-        {
+        } 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])) {
             unity_run_single_test_by_index_parse(cmdline + idx, test_count);
         }
 
         UNITY_END();
 
-        printf("Enter next test, or 'enter' to see menu\n");
+        UnityPrint("Enter next test, or 'enter' to see menu");
+        UNITY_PRINT_EOL();
+        UNITY_OUTPUT_FLUSH();
     }
 }