From 8dba3f7f3591f4271522835cb2057acf4ae56f53 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Tue, 18 Nov 2014 18:37:56 +0100 Subject: Start with tests for the C API The C API tests can be run individually via build/api_test/api_test Or together with the spec tests via cmake --build build --target test --- api_test/CMakeLists.txt | 11 ++++++ api_test/harness.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++ api_test/harness.h | 34 ++++++++++++++++ api_test/main.c | 57 +++++++++++++++++++++++++++ 4 files changed, 204 insertions(+) create mode 100644 api_test/CMakeLists.txt create mode 100644 api_test/harness.c create mode 100644 api_test/harness.h create mode 100644 api_test/main.c (limited to 'api_test') diff --git a/api_test/CMakeLists.txt b/api_test/CMakeLists.txt new file mode 100644 index 0000000..7b6c3d6 --- /dev/null +++ b/api_test/CMakeLists.txt @@ -0,0 +1,11 @@ +add_executable(api_test + harness.c + main.c +) +target_include_directories(api_test + PRIVATE + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_BINARY_DIR}/src +) +target_link_libraries(api_test libcmark) + diff --git a/api_test/harness.c b/api_test/harness.c new file mode 100644 index 0000000..6b38d41 --- /dev/null +++ b/api_test/harness.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include + +#include "harness.h" + +test_batch_runner* +test_batch_runner_new() +{ + return (test_batch_runner *)calloc(1, sizeof(test_batch_runner)); +} + +static void +test_result(test_batch_runner *runner, int cond, const char *msg, va_list ap) +{ + ++runner->test_num; + + if (cond) { + ++runner->num_passed; + } + else { + fprintf(stderr, "FAILED test %d: ", runner->test_num); + vfprintf(stderr, msg, ap); + fprintf(stderr, "\n"); + ++runner->num_failed; + } +} + +void +SKIP(test_batch_runner *runner, int num_tests) +{ + runner->test_num += num_tests; + runner->num_skipped += num_tests; +} + +void +OK(test_batch_runner *runner, int cond, const char *msg, ...) +{ + va_list ap; + va_start(ap, msg); + test_result(runner, cond, msg, ap); + va_end(ap); +} + +void +INT_EQ(test_batch_runner *runner, int got, int expected, const char *msg, ...) +{ + int cond = got == expected; + + va_list ap; + va_start(ap, msg); + test_result(runner, cond, msg, ap); + va_end(ap); + + if (!cond) { + fprintf(stderr, " Got: %d\n", got); + fprintf(stderr, " Expected: %d\n", expected); + } +} + +void +STR_EQ(test_batch_runner *runner, const char *got, const char *expected, + const char *msg, ...) +{ + int cond = strcmp(got, expected) == 0; + + va_list ap; + va_start(ap, msg); + test_result(runner, cond, msg, ap); + va_end(ap); + + if (!cond) { + fprintf(stderr, " Got: \"%s\"\n", got); + fprintf(stderr, " Expected: \"%s\"\n", expected); + } +} + +int +test_ok(test_batch_runner *runner) +{ + return runner->num_failed == 0; +} + +void +test_print_summary(test_batch_runner *runner) +{ + int num_passed = runner->num_passed; + int num_skipped = runner->num_skipped; + int num_failed = runner->num_failed; + + fprintf(stderr, "%d tests passed, %d failed, %d skipped\n", + num_passed, num_skipped, num_failed); + + if (test_ok(runner)) { + fprintf(stderr, "PASS\n"); + } + else { + fprintf(stderr, "FAIL\n"); + } +} + diff --git a/api_test/harness.h b/api_test/harness.h new file mode 100644 index 0000000..5fdc7ae --- /dev/null +++ b/api_test/harness.h @@ -0,0 +1,34 @@ +#ifndef CMARK_API_TEST_HARNESS_H +#define CMARK_API_TEST_HARNESS_H + +typedef struct { + int test_num; + int num_passed; + int num_failed; + int num_skipped; +} test_batch_runner; + +test_batch_runner* +test_batch_runner_new(); + +void +SKIP(test_batch_runner *runner, int num_tests); + +void +OK(test_batch_runner *runner, int cond, const char *msg, ...); + +void +INT_EQ(test_batch_runner *runner, int got, int expected, const char *msg, ...); + +void +STR_EQ(test_batch_runner *runner, const char *got, const char *expected, + const char *msg, ...); + +int +test_ok(test_batch_runner *runner); + +void +test_print_summary(test_batch_runner *runner); + +#endif + diff --git a/api_test/main.c b/api_test/main.c new file mode 100644 index 0000000..051d32b --- /dev/null +++ b/api_test/main.c @@ -0,0 +1,57 @@ +#include +#include +#include + +#include + +#include "harness.h" + +static void +create_tree(test_batch_runner *runner) +{ + cmark_node *doc = cmark_node_new(CMARK_NODE_DOCUMENT); + + cmark_node *p = cmark_node_new(CMARK_NODE_PARAGRAPH); + OK(runner, cmark_node_append_child(doc, p), "append1"); + INT_EQ(runner, cmark_node_check(doc), 0, "append1 consistent"); + + cmark_node *emph = cmark_node_new(CMARK_NODE_EMPH); + OK(runner, cmark_node_prepend_child(p, emph), "prepend1"); + INT_EQ(runner, cmark_node_check(doc), 0, "prepend1 consistent"); + + cmark_node *str1 = cmark_node_new(CMARK_NODE_STRING); + cmark_node_set_content(str1, "Hello, "); + OK(runner, cmark_node_prepend_child(p, str1), "prepend2"); + INT_EQ(runner, cmark_node_check(doc), 0, "prepend2 consistent"); + + cmark_node *str3 = cmark_node_new(CMARK_NODE_STRING); + cmark_node_set_content(str3, "!"); + OK(runner, cmark_node_append_child(p, str3), "append2"); + INT_EQ(runner, cmark_node_check(doc), 0, "append2 consistent"); + + cmark_node *str2 = cmark_node_new(CMARK_NODE_STRING); + cmark_node_set_content(str2, "world"); + OK(runner, cmark_node_append_child(emph, str2), "append3"); + INT_EQ(runner, cmark_node_check(doc), 0, "append3 consistent"); + + char *html = cmark_render_html(doc); + STR_EQ(runner, html, "

Hello, world!

\n", + "render_html"); + free(html); + + cmark_node_destroy(doc); +} + +int main() { + int retval; + test_batch_runner *runner = test_batch_runner_new(); + + create_tree(runner); + + test_print_summary(runner); + retval = test_ok(runner) ? 0 : 1; + free(runner); + + return retval; +} + -- cgit v1.2.3 From 2c45e45627ec0a705e9580ff299be0465f5bdced Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Tue, 18 Nov 2014 21:03:18 +0100 Subject: Try to support older CMake versions --- api_test/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'api_test') diff --git a/api_test/CMakeLists.txt b/api_test/CMakeLists.txt index 7b6c3d6..31f1980 100644 --- a/api_test/CMakeLists.txt +++ b/api_test/CMakeLists.txt @@ -2,8 +2,7 @@ add_executable(api_test harness.c main.c ) -target_include_directories(api_test - PRIVATE +include_directories( ${PROJECT_SOURCE_DIR}/src ${PROJECT_BINARY_DIR}/src ) -- cgit v1.2.3 From 00a48356ee002a63362496ca62c1fa8f6c05ad58 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Tue, 18 Nov 2014 21:08:38 +0100 Subject: Add header file to CMake api_test sources --- api_test/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) (limited to 'api_test') diff --git a/api_test/CMakeLists.txt b/api_test/CMakeLists.txt index 31f1980..66629d8 100644 --- a/api_test/CMakeLists.txt +++ b/api_test/CMakeLists.txt @@ -1,5 +1,6 @@ add_executable(api_test harness.c + harness.h main.c ) include_directories( -- cgit v1.2.3 From fc46123f0a527a364f9a0fb1e7b8b7448fd84b89 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Tue, 18 Nov 2014 21:34:29 +0100 Subject: Set compiler flags for api_test --- api_test/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'api_test') diff --git a/api_test/CMakeLists.txt b/api_test/CMakeLists.txt index 66629d8..b2ab2c8 100644 --- a/api_test/CMakeLists.txt +++ b/api_test/CMakeLists.txt @@ -9,3 +9,11 @@ include_directories( ) target_link_libraries(api_test libcmark) +# Compiler flags +if(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") + set_target_properties(api_test PROPERTIES COMPILE_FLAGS + "-std=c99 -Wall -Wextra" + ) +elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") + set_target_properties(api_test PROPERTIES COMPILE_FLAGS "/TP /W4") +endif() -- cgit v1.2.3 From 1d39b50d8889155de11df40f7e89bec09e0c4681 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Tue, 18 Nov 2014 21:34:54 +0100 Subject: Fix api_test warnings --- api_test/main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'api_test') diff --git a/api_test/main.c b/api_test/main.c index 051d32b..1ff606b 100644 --- a/api_test/main.c +++ b/api_test/main.c @@ -2,7 +2,8 @@ #include #include -#include +#include "cmark.h" +#include "node.h" #include "harness.h" @@ -34,7 +35,7 @@ create_tree(test_batch_runner *runner) OK(runner, cmark_node_append_child(emph, str2), "append3"); INT_EQ(runner, cmark_node_check(doc), 0, "append3 consistent"); - char *html = cmark_render_html(doc); + char *html = (char *)cmark_render_html(doc); STR_EQ(runner, html, "

Hello, world!

\n", "render_html"); free(html); -- cgit v1.2.3