diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e13c35..c66923c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,8 +30,20 @@ foreach(TEST_SOURCE ${SOURCES_TEST}) get_filename_component(TEST_NAME ${TEST_SOURCE} NAME_WE) add_executable(${TEST_NAME} ${TEST_SOURCE} ${SOURCES_SRC} ${SOURCES_SRC_REGULAR} ${SOURCES_TEST_SHARED}) target_include_directories(${TEST_NAME} PUBLIC include src src/regular) + list(APPEND TEST_TARGETS ${TEST_NAME}) + list(APPEND TEST_OUTPUTS $) endforeach(TEST_SOURCE ${SOURCES_TEST}) +set(TEST_ALL_STAMP "test-all.stamp") +set(TEST_RUNNER "tools/run-tests.js") +add_custom_command( + OUTPUT ${TEST_ALL_STAMP} + COMMAND node ${TEST_RUNNER} ${TEST_OUTPUTS} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${TEST_RUNNER} ${TEST_TARGETS} +) +add_custom_target(test-all DEPENDS ${TEST_ALL_STAMP}) + foreach(HEADER_SOURCE ${SOURCES_INCLUDE}) get_filename_component(HEADER_NAME ${HEADER_SOURCE} NAME_WE) string(TOUPPER ${HEADER_NAME} HEADER_NAME_UC) diff --git a/tools/run-tests.js b/tools/run-tests.js new file mode 100644 index 0000000..3aa9652 --- /dev/null +++ b/tools/run-tests.js @@ -0,0 +1,41 @@ + +const spawn = require('child_process').spawn; +const basename = require('path').basename; + +const test_exes = process.argv.slice(2); +run_tests(test_exes); + +function run_tests(test_exes, num = 0, fail_count = 0) { + if (test_exes.length <= num) + return done(test_exes, fail_count); + + const test_exe = test_exes[num]; + const test_name = basename(test_exe, '.exe'); + + console.log('(%d/%d) %s...', (num + 1), test_exes.length, test_name); + + const child = spawn(test_exe, [], { encoding: 'utf8' }); + + let out = ''; + child.stdout.on('data', (data) => out += data); + child.stderr.on('data', (data) => out += data); + + child.on('exit', (code) => { + if (code === 0) { + console.log(' PASS') + } else { + console.log(' FAIL\n' + out); + fail_count++; + } + + run_tests(test_exes, num + 1, fail_count); + }); +} + +function done(test_exes, fail_count) { + let pass_count = test_exes.length - fail_count; + console.log(' DONE - %d PASSED, %d FAILED', pass_count, fail_count); + + process.exit(fail_count == 0 ? 0 : 1); +} +