Code View

mstring / mstring-1.3.1.2 / tests / CMakeLists.txt
# tests/ — mstring's own tests. Each one is a plain add_test() driven by
# run_and_diff.cmake (no GTest): the generated code is compiled with
# -Wall -Wextra -Werror and run, and the diagnostics of broken inputs are
# checked. A change to the generator is only proven by code that compiles.

set(RUN_AND_DIFF ${PROJECT_SOURCE_DIR}/cmake/run_and_diff.cmake)
set(MSTRING_TEST_WARNINGS -Wall -Wextra -Wpedantic -Werror)

# The features test: every generator feature, compiled and run.
# Deliberately incomplete translations: -w keeps the build log clean (the
# warnings have their own tests below).
mstring_generate(FEATURES_GENERATED ${CMAKE_CURRENT_SOURCE_DIR}/features/features.msg
                 OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/features
                 OPTIONS -w)
# Reporter (user.hh) has no user.cpp: its members are the generated MEMBER OF functions.
add_executable(mstring-test-features features/main.cpp ${FEATURES_GENERATED})
target_include_directories(mstring-test-features PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}/features ${CMAKE_CURRENT_SOURCE_DIR}/features)
target_compile_options(mstring-test-features PRIVATE ${MSTRING_TEST_WARNINGS})
add_test(NAME features
         COMMAND ${CMAKE_COMMAND}
                 -DEXE=$<TARGET_FILE:mstring-test-features>
                 -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/features/expected.txt
                 -P ${RUN_AND_DIFF})

# `$MESSAGE Just : STRING` generated the string function and nothing else.
add_test(NAME features.per-message-artefacts
         COMMAND ${CMAKE_COMMAND} -E cat ${CMAKE_CURRENT_BINARY_DIR}/features/features.hh)
set_tests_properties(features.per-message-artefacts PROPERTIES
    DEPENDS features
    PASS_REGULAR_EXPRESSION "std::string JustStr\\("
    FAIL_REGULAR_EXPRESSION "ThrowJust|JustException|JustStreamable")

# NOHEADER: the source carries the declarations and compiles on its own.
mstring_generate(SINGLE_GENERATED ${CMAKE_CURRENT_SOURCE_DIR}/single-file/single.msg
                 OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/single-file
                 NOHEADER)
add_executable(mstring-test-single single-file/main.cpp ${SINGLE_GENERATED})
target_compile_options(mstring-test-single PRIVATE ${MSTRING_TEST_WARNINGS})
add_test(NAME single-file
         COMMAND ${CMAKE_COMMAND}
                 -DEXE=$<TARGET_FILE:mstring-test-single>
                 -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/single-file/expected.txt
                 -P ${RUN_AND_DIFF})

# INLINE: header-only modules, two of them in one translation unit and in two
# translation units, next to an ordinary module.
foreach(module alpha beta)
    mstring_generate(INLINE_GENERATED ${CMAKE_CURRENT_SOURCE_DIR}/inline/${module}.msg
                     OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/inline
                     INLINE)
endforeach()
mstring_generate(INLINE_GENERATED ${CMAKE_CURRENT_SOURCE_DIR}/inline/gamma.msg
                 OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/inline)
add_executable(mstring-test-inline inline/main.cpp inline/other.cpp ${INLINE_GENERATED})
target_include_directories(mstring-test-inline PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/inline)
target_compile_options(mstring-test-inline PRIVATE ${MSTRING_TEST_WARNINGS})
add_test(NAME inline
         COMMAND ${CMAKE_COMMAND}
                 -DEXE=$<TARGET_FILE:mstring-test-inline>
                 -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/inline/expected.txt
                 -P ${RUN_AND_DIFF})

# $EXPORT + $EXCEPTION OVERRIDE (plugin's dsold shape): a shared library
# built with hidden visibility, used from a program.
mstring_generate(EXPORT_GENERATED ${CMAKE_CURRENT_SOURCE_DIR}/export/lib.msg
                 OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/export)
add_library(mstring-test-export-lib SHARED ${EXPORT_GENERATED})
target_include_directories(mstring-test-export-lib PUBLIC
    ${CMAKE_CURRENT_BINARY_DIR}/export ${CMAKE_CURRENT_SOURCE_DIR}/export)
set_target_properties(mstring-test-export-lib PROPERTIES
    CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN ON)
target_compile_options(mstring-test-export-lib PRIVATE ${MSTRING_TEST_WARNINGS})
add_executable(mstring-test-export export/main.cpp)
target_link_libraries(mstring-test-export PRIVATE mstring-test-export-lib)
target_compile_options(mstring-test-export PRIVATE ${MSTRING_TEST_WARNINGS})
add_test(NAME export-override
         COMMAND ${CMAKE_COMMAND}
                 -DEXE=$<TARGET_FILE:mstring-test-export>
                 -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/export/expected.txt
                 -P ${RUN_AND_DIFF})

# $IMPORT: next to the importing file, then -I; settings carry over.
mstring_generate(IMPORT_GENERATED ${CMAKE_CURRENT_SOURCE_DIR}/import/main.msg
                 MODULE imported
                 OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/import
                 IMPORT_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/import/lib
                 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/import/shared/settings.msg
                         ${CMAKE_CURRENT_SOURCE_DIR}/import/lib/common.msg)
add_executable(mstring-test-import import/main.cpp ${IMPORT_GENERATED})
target_include_directories(mstring-test-import PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/import)
target_compile_options(mstring-test-import PRIVATE ${MSTRING_TEST_WARNINGS})
add_test(NAME import
         COMMAND ${CMAKE_COMMAND}
                 -DEXE=$<TARGET_FILE:mstring-test-import>
                 -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/import/expected.txt
                 -P ${RUN_AND_DIFF})

# Standard input, and the command line.
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/stdin)
add_test(NAME stdin
         COMMAND ${CMAKE_COMMAND}
                 -DEXE=$<TARGET_FILE:mstring>
                 "-DARGS=-t|-O|${CMAKE_CURRENT_BINARY_DIR}/stdin"
                 -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/stdin/stdin.msg
                 -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/stdin/expected.txt
                 -DMATCH=1 -DRC=0
                 -P ${RUN_AND_DIFF})
add_test(NAME stdin.output
         COMMAND ${CMAKE_COMMAND} -E cat ${CMAKE_CURRENT_BINARY_DIR}/stdin/piped.hh)
set_tests_properties(stdin.output PROPERTIES DEPENDS stdin PASS_REGULAR_EXPRESSION "std::string HelloStr\\(")
# An empty input is valid (and writes an empty module).
add_test(NAME stdin.empty
         COMMAND ${CMAKE_COMMAND}
                 -DEXE=$<TARGET_FILE:mstring>
                 "-DARGS=-O|${CMAKE_CURRENT_BINARY_DIR}/stdin|-m|empty"
                 -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/stdin/empty.msg
                 -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/stdin/empty.expected
                 -DRC=0
                 -P ${RUN_AND_DIFF})
add_test(NAME version
         COMMAND ${CMAKE_COMMAND}
                 -DEXE=$<TARGET_FILE:mstring> -DARG=-v
                 -DEXPECTED=${CMAKE_CURRENT_BINARY_DIR}/version.expected
                 -P ${RUN_AND_DIFF})
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.expected
     "mstring ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}\n")
add_test(NAME unknown-option
         COMMAND ${CMAKE_COMMAND}
                 -DEXE=$<TARGET_FILE:mstring> -DARG=-q
                 -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/cli/unknown-option.expected
                 -DMATCH=1 -DRC=1
                 -P ${RUN_AND_DIFF})

# Warnings: warnings/<name>.msg must succeed (exit code 0) and print the text
# in warnings/<name>.expected.
file(GLOB WARNING_INPUTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/warnings
     ${CMAKE_CURRENT_SOURCE_DIR}/warnings/*.msg)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/warnings)

foreach(input IN LISTS WARNING_INPUTS)
    get_filename_component(name ${input} NAME_WE)
    add_test(NAME warning.${name}
             COMMAND ${CMAKE_COMMAND}
                     -DEXE=$<TARGET_FILE:mstring>
                     "-DARGS=-O|${CMAKE_CURRENT_BINARY_DIR}/warnings|${input}"
                     -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/warnings/${name}.expected
                     -DMATCH=1 -DRC=0
                     -P ${RUN_AND_DIFF}
             WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/warnings)
endforeach()

# -w silences them: no output at all.
add_test(NAME warning.silenced
         COMMAND ${CMAKE_COMMAND}
                 -DEXE=$<TARGET_FILE:mstring>
                 "-DARGS=-w|-O|${CMAKE_CURRENT_BINARY_DIR}/warnings|missing-translation.msg"
                 -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/cli/empty.expected
                 -DRC=0
                 -P ${RUN_AND_DIFF}
         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/warnings)

# Diagnostics: diagnostics/<name>.msg must fail (exit code 1) with the text
# in diagnostics/<name>.expected. The file name is given relative to the
# folder, so the expected text carries no machine-specific path.
file(GLOB DIAGNOSTIC_INPUTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/diagnostics
     ${CMAKE_CURRENT_SOURCE_DIR}/diagnostics/*.msg)
# recursive-b.msg is only imported by recursive.msg.
list(REMOVE_ITEM DIAGNOSTIC_INPUTS recursive-b.msg)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/diagnostics)

foreach(input IN LISTS DIAGNOSTIC_INPUTS)
    get_filename_component(name ${input} NAME_WE)
    add_test(NAME diagnostic.${name}
             COMMAND ${CMAKE_COMMAND}
                     -DEXE=$<TARGET_FILE:mstring>
                     "-DARGS=-O|${CMAKE_CURRENT_BINARY_DIR}/diagnostics|${input}"
                     -DEXPECTED=${CMAKE_CURRENT_SOURCE_DIR}/diagnostics/${name}.expected
                     -DMATCH=1 -DRC=1
                     -P ${RUN_AND_DIFF}
             WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/diagnostics)
endforeach()