enable_testing()

# Example with Google Test (optional)
# find_package(GTest REQUIRED)

# Placeholder tests
add_executable(test_parser test_parser.cpp)
target_link_libraries(test_parser rnba_sim)
add_custom_command(TARGET test_parser POST_BUILD
	COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:test_parser>/data
	COMMAND ${CMAKE_COMMAND} -E copy_if_different
			${CMAKE_SOURCE_DIR}/../tests/RNBA_SGall_SNB15_Bindings_Sentence_3NVN.txt
			$<TARGET_FILE_DIR:test_parser>/data/RNBA_SGall_SNB15_Bindings_Sentence_3NVN.txt
)
add_test(NAME ParserTests COMMAND $<TARGET_FILE:test_parser>)

add_executable(test_simulator test_simulator.cpp)
target_link_libraries(test_simulator rnba_sim)
add_custom_command(TARGET test_simulator POST_BUILD
	COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:test_simulator>/data
	COMMAND ${CMAKE_COMMAND} -E copy_if_different
			${CMAKE_CURRENT_SOURCE_DIR}/data/model_smoke_contract.json
			$<TARGET_FILE_DIR:test_simulator>/data/model_smoke_contract.json
)
add_test(NAME SimulatorTests COMMAND $<TARGET_FILE:test_simulator>)

add_executable(test_golden test_golden.cpp)
target_link_libraries(test_golden rnba_sim)
add_custom_command(TARGET test_golden POST_BUILD
	COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:test_golden>/data
	COMMAND ${CMAKE_COMMAND} -E copy_if_different
			${CMAKE_CURRENT_SOURCE_DIR}/data/model_smoke_contract.json
			$<TARGET_FILE_DIR:test_golden>/data/model_smoke_contract.json
)
add_test(NAME GoldenTests COMMAND $<TARGET_FILE:test_golden>)

# CLI tests for rnba-sim argument handling and smoke execution.
set(RNBA_SIM_EXE $<TARGET_FILE:rnba-sim>)
set(CLI_MODEL_FIXTURE ${CMAKE_CURRENT_SOURCE_DIR}/data/model_smoke_contract.json)
set(CLI_OUTPUT_OK ${CMAKE_CURRENT_BINARY_DIR}/cli_smoke_ok.csv)
set(CLI_OUTPUT_MISSING ${CMAKE_CURRENT_BINARY_DIR}/cli_missing_tend.csv)
set(CLI_OUTPUT_BAD_ALIGN ${CMAKE_CURRENT_BINARY_DIR}/cli_bad_align.csv)

add_test(NAME CliHelp COMMAND ${RNBA_SIM_EXE} --help)
set_tests_properties(CliHelp PROPERTIES
	PASS_REGULAR_EXPRESSION "--t-end MS"
)

add_test(NAME CliMissingTEnd COMMAND
	${RNBA_SIM_EXE}
	--model ${CLI_MODEL_FIXTURE}
	--output ${CLI_OUTPUT_MISSING}
)
set_tests_properties(CliMissingTEnd PROPERTIES
	WILL_FAIL TRUE
)

add_test(NAME CliSmokeRun COMMAND
	${RNBA_SIM_EXE}
	--model ${CLI_MODEL_FIXTURE}
	--t-end 1.0
	--output ${CLI_OUTPUT_OK}
)

add_test(NAME CliBadTEndAlignment COMMAND
	${RNBA_SIM_EXE}
	--model ${CLI_MODEL_FIXTURE}
	--t-end 1.05
	--output ${CLI_OUTPUT_BAD_ALIGN}
)
set_tests_properties(CliBadTEndAlignment PROPERTIES
	WILL_FAIL TRUE
)

# ── nCV end-to-end test ──────────────────────────────────────────────────────
# Runs the full SNB20 network with the 2CV sentence instruction file and
# verifies the binary exits cleanly and produces a CSV output.
# Sentence_2CV.txt lives in tests/ (tracked) so all repo clones have it.
set(NCV_MODEL   ${CMAKE_CURRENT_SOURCE_DIR}/data/snb20_contract.json)
set(NCV_INSTR   ${CMAKE_SOURCE_DIR}/../tests/Sentence_2CV.txt)
set(NCV_SOL_CSV ${CMAKE_CURRENT_BINARY_DIR}/cpp_2cv_sol.csv)
set(NCV_INP_CSV ${CMAKE_CURRENT_BINARY_DIR}/cpp_2cv_inputs.csv)
set(NCV_MAP_CSV ${CMAKE_CURRENT_BINARY_DIR}/cpp_2cv_row_map.csv)

add_test(NAME CppNcvRun COMMAND
	${RNBA_SIM_EXE}
	--model         ${NCV_MODEL}
	--instructions  ${NCV_INSTR}
	--t-end         120.0
	--output        ${NCV_SOL_CSV}
	--output-inputs ${NCV_INP_CSV}
	--output-row-map ${NCV_MAP_CSV}
)
set_tests_properties(CppNcvRun PROPERTIES
	PASS_REGULAR_EXPRESSION "Writing output"
	TIMEOUT 120
)
