# Tests for contrib/schemagen

if(NOT Python3_Interpreter_FOUND)
  return()
endif()

add_test(
  NAME schemagen_python_tests
  COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_schemagen.py
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})

set(SCHEMAGEN_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/weaseljson_schemagen.py)
set(EXAMPLE_SCHEMA ${CMAKE_CURRENT_SOURCE_DIR}/example.schema.json)
set(GEN_H ${CMAKE_CURRENT_BINARY_DIR}/gen.h)
set(BIG_SCHEMA ${CMAKE_CURRENT_SOURCE_DIR}/big.schema.json)
set(BIG_H ${CMAKE_CURRENT_BINARY_DIR}/big.h)

add_custom_command(
  OUTPUT ${GEN_H}
  COMMAND ${Python3_EXECUTABLE} ${SCHEMAGEN_SCRIPT} ${EXAMPLE_SCHEMA} -o
          ${GEN_H} --namespace weasel_schema
  DEPENDS ${SCHEMAGEN_SCRIPT} ${EXAMPLE_SCHEMA}
  COMMENT "Generating gen.h from example.schema.json")

add_custom_command(
  OUTPUT ${BIG_H}
  COMMAND ${Python3_EXECUTABLE} ${SCHEMAGEN_SCRIPT} ${BIG_SCHEMA} -o ${BIG_H}
          --namespace big_schema
  DEPENDS ${SCHEMAGEN_SCRIPT} ${BIG_SCHEMA}
  COMMENT "Generating big.h from big.schema.json")

add_custom_target(schemagen_gen_h DEPENDS ${GEN_H})
add_custom_target(schemagen_big_h DEPENDS ${BIG_H})

add_executable(schemagen_example ${CMAKE_CURRENT_SOURCE_DIR}/test_gen.cpp)
target_include_directories(schemagen_example
                           PRIVATE include ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(schemagen_example PRIVATE ${PROJECT_NAME})
target_compile_options(schemagen_example PRIVATE -Wno-switch-enum)
add_dependencies(schemagen_example schemagen_gen_h)

add_executable(schemagen_big ${CMAKE_CURRENT_SOURCE_DIR}/test_big.cpp)
target_include_directories(schemagen_big PRIVATE include
                                                 ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(schemagen_big PRIVATE ${PROJECT_NAME})
target_compile_options(schemagen_big PRIVATE -Wno-switch-enum)
add_dependencies(schemagen_big schemagen_big_h)

set(NULLABLE_OBJECT_SCHEMA
    ${CMAKE_CURRENT_SOURCE_DIR}/nullable_object.schema.json)
set(NULLABLE_STRING_SCHEMA
    ${CMAKE_CURRENT_SOURCE_DIR}/nullable_string.schema.json)
set(NULLABLE_ARRAY_SCHEMA
    ${CMAKE_CURRENT_SOURCE_DIR}/nullable_array.schema.json)
set(NULLABLE_OBJECT_H ${CMAKE_CURRENT_BINARY_DIR}/nullable_object.h)
set(NULLABLE_STRING_H ${CMAKE_CURRENT_BINARY_DIR}/nullable_string.h)
set(NULLABLE_ARRAY_H ${CMAKE_CURRENT_BINARY_DIR}/nullable_array.h)

add_custom_command(
  OUTPUT ${NULLABLE_OBJECT_H}
  COMMAND ${Python3_EXECUTABLE} ${SCHEMAGEN_SCRIPT} ${NULLABLE_OBJECT_SCHEMA} -o
          ${NULLABLE_OBJECT_H} --namespace nullable_object
  DEPENDS ${SCHEMAGEN_SCRIPT} ${NULLABLE_OBJECT_SCHEMA}
  COMMENT "Generating nullable_object.h")

add_custom_command(
  OUTPUT ${NULLABLE_STRING_H}
  COMMAND ${Python3_EXECUTABLE} ${SCHEMAGEN_SCRIPT} ${NULLABLE_STRING_SCHEMA} -o
          ${NULLABLE_STRING_H} --namespace nullable_string
  DEPENDS ${SCHEMAGEN_SCRIPT} ${NULLABLE_STRING_SCHEMA}
  COMMENT "Generating nullable_string.h")

add_custom_command(
  OUTPUT ${NULLABLE_ARRAY_H}
  COMMAND ${Python3_EXECUTABLE} ${SCHEMAGEN_SCRIPT} ${NULLABLE_ARRAY_SCHEMA} -o
          ${NULLABLE_ARRAY_H} --namespace nullable_array
  DEPENDS ${SCHEMAGEN_SCRIPT} ${NULLABLE_ARRAY_SCHEMA}
  COMMENT "Generating nullable_array.h")

add_custom_target(
  schemagen_nullable_h DEPENDS ${NULLABLE_OBJECT_H} ${NULLABLE_STRING_H}
                               ${NULLABLE_ARRAY_H})

add_executable(schemagen_nullable_root
               ${CMAKE_CURRENT_SOURCE_DIR}/test_nullable_root.cpp)
target_include_directories(schemagen_nullable_root
                           PRIVATE include ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(schemagen_nullable_root PRIVATE ${PROJECT_NAME})
target_compile_options(schemagen_nullable_root PRIVATE -Wno-switch-enum)
add_dependencies(schemagen_nullable_root schemagen_nullable_h)

add_test(
  NAME schemagen_example
  COMMAND schemagen_example
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

add_test(
  NAME schemagen_big
  COMMAND schemagen_big
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

add_test(
  NAME schemagen_nullable_root
  COMMAND schemagen_nullable_root
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
