# -*- conding: utf-8; cmake-tab-width: 4; indent-tabs-mode: nil; -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
if ( ENABLE_SWIG_OCTAVE )

    function(mock_server_test name command)
        add_test(
            NAME ${name}
            COMMAND
                "${PROG_NDS_TESTER}" ${NDS_TESTER_FLAGS}
                --octave=${OCTAVE_EXECUTABLE}
                --nds1-mock-server
                "${CMAKE_CURRENT_SOURCE_DIR}/${command}" )
        set_tests_properties( ${name}
            PROPERTIES
                FAIL_REGULAR_EXPRESSION "-- FAIL:"
                SKIP_RETURN_CODE 77 )
        set( NDS_CUSTOM_MEMCHECK_IGNORE
            ${NDS_CUSTOM_MEMCHECK_IGNORE} ${name}
                CACHE INTERNAL "" )
    endfunction(mock_server_test)

    function(replay_server_test name command json)
        if ( REPLAY_BLOB_CACHE_DIR )
            set_nds_protocols(protocols ${name})
            set( env "REPLAY_BLOB_REMOTE_CACHE=${REPLAY_BLOB_CACHE_DIR}" )

            foreach ( proto ${protocols} )
                set(test_name "${name}${proto}_")
                add_test(
                    NAME ${test_name}
                    COMMAND
                        "${PROG_NDS_TESTER}" ${NDS_TESTER_FLAGS}
                        --octave=${OCTAVE_EXECUTABLE}
                        --replay-server
                        --replay-json-filename ${json}
                        --replay-protocol ${proto}
                        "${CMAKE_CURRENT_SOURCE_DIR}/${command}" ${ARGN} )
                set_tests_properties( ${test_name}
                    PROPERTIES
                      ENVIRONMENT "${env}"
                      )
                if( CTEST_MEMORYCHECK_COMMAND )
                    add_test(
                        NAME _memcheck-manual_${test_name}
                        COMMAND
                            "${PROG_NDS_TESTER}" ${NDS_TESTER_FLAGS}
                            --octave=${OCTAVE_EXECUTABLE}
                            --replay-server
                            --replay-json-filename ${json}
                            --replay-protocol ${proto}
                            --command-prefix "${CTEST_MEMORYCHECK_COMMAND} ${CTEST_MEMORYCHECK_COMMAND_OPTIONS}"
                            "${CMAKE_CURRENT_SOURCE_DIR}/${command}" ${ARGN} )
                    set_tests_properties( _memcheck-manual_${test_name}
                        PROPERTIES
                            FAIL_REGULAR_EXPRESSION "-- FAIL:"
                            SKIP_RETURN_CODE 77
                            ENVIRONMENT "${env}"
                            )
                    set( NDS_CUSTOM_MEMCHECK_IGNORE
                        ${NDS_CUSTOM_MEMCHECK_IGNORE} _memcheck-manual_${test_name}
                        CACHE INTERNAL "" )
                    set( NDS_CUSTOM_TESTS_IGNORE
                        ${NDS_CUSTOM_TESTS_IGNORE} _memcheck-manual_${test_name}
                        CACHE INTERNAL "" )
                endif( CTEST_MEMORYCHECK_COMMAND )
                set_tests_properties( ${test_name}
                    PROPERTIES
                        FAIL_REGULAR_EXPRESSION "-- FAIL:"
                        SKIP_RETURN_CODE 77 )
                set( NDS_CUSTOM_MEMCHECK_IGNORE
                    ${NDS_CUSTOM_MEMCHECK_IGNORE} ${test_name}
                    CACHE INTERNAL "" )
            endforeach ( proto )
        endif ( REPLAY_BLOB_CACHE_DIR )
    endfunction(replay_server_test)

    function(ADD_OCTAVE_TEST target)
        if ( OCTAVE_EXECUTABLE )
            list( APPEND script
                "addpath(\"${CMAKE_CURRENT_SOURCE_DIR}\");"
                "addpath(\"${CMAKE_BINARY_DIR}/swig/common/module\");"
                "if ( isdir( \"${CMAKE_BINARY_DIR}/swig/common/module/.libs\" ) );"
                "  addpath(\"${CMAKE_BINARY_DIR}/swig/common/module/.libs\");"
                "endif;"
                "addpath(\"${CMAKE_CURRENT_BINARY_DIR}/../module/\");"
                "if ( isdir( \"${CMAKE_CURRENT_BINARY_DIR}/../module/.libs\" ) );"
                "  addpath(\"${CMAKE_CURRENT_BINARY_DIR}/../module/.libs\");"
                "endif;"
                "try;"
                "  run(\"${ARGN}\");"
                "  ret = 0;"
                "catch ex;"
                "  ret = 1;"
                "  msg = strcat( \"FAILED: \", ex.message );"
                "  disp( msg );"
                "end;"
                "exit(ret);"
                )
            set(OCTAVE_FLAGS --no-init-file --no-site-file --no-window-system --verbose)
            add_test( ${target} ${OCTAVE_EXECUTABLE} ${OCTAVE_FLAGS}
               --eval "${script}" )
            set_tests_properties( ${target} PROPERTIES 
                TIMEOUT 120 )
        endif ( OCTAVE_EXECUTABLE )
    endfunction(ADD_OCTAVE_TEST)

    configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/UnitTest.m
        ${CMAKE_CURRENT_BINARY_DIR}/UnitTest.m
        COPYONLY )

    if( PYTHON_DFLT_EXECUTABLE )
message( STATUS "DEBUG: Setting up Octave tests" )
        #================================================================
        # These tests require a minimum of Python
        #================================================================
        # Final variable substitution before use
        #----------------------------------------------------------------
        string(CONFIGURE "${NDS_TESTER_FLAGS}" NDS_TESTER_FLAGS )
        #================================================================
        # General Tests
        #----------------------------------------------------------------
        mock_server_test( _octave_mockup_ test_mockup.m )
        #================================================================
        # Timeout Tests
        #----------------------------------------------------------------
        replay_server_test( _octave_nds1_timeout_
            test_nds1_timeout.m
            nds1-timeout.json )
        #================================================================
        # Test point listing tests
        #----------------------------------------------------------------
        replay_server_test(
                _octave_nds1_list_testpoint_
                test_nds1_list_testpoint.m
                nds1-list-testpoint.json)
        #================================================================
        # Iteration Tests
        #----------------------------------------------------------------
        replay_server_test(
            _octave_nds1_iterate-with-gaps_
            test_iterate_with_gaps.m
            nds1-iterate_with_leading_gap.json
            -proto-1 )
        replay_server_test(
            _octave_nds2_iterate-with-gaps_
            test_iterate_with_gaps.m
            nds2-iterate_with_leading_gap.json
            -proto-2 )
        #----------------------------------------------------------------
        replay_server_test(
            _octave_nds2_iterate-all-data_
            test_iterate_all_data.m
            nds2-iterate-all-data-synthetic.json
            -proto-2
            )
        replay_server_test(
            _octave_nds1_iterate-all-data_
            test_iterate_all_data.m
            nds1-iterate-all-data-synthetic.json
            -proto-1
            )
        replay_server_test(
            _octave_nds2_iterate-all-data-nogaphandler_
            test_iterate_all_data.m
            nds2-iterate-all-data-synthetic.json
            -proto-2 -no-gap
            )
        replay_server_test(
            _octave_nds1_iterate-all-data-nogaphandler_
            test_iterate_all_data.m
            nds1-iterate-all-data-synthetic.json
            -proto-1 -no-gap
            )
        #----------------------------------------------------------------
        replay_server_test(
            _octave_nds1_iterate-with-synth-gaps_
            test_iterate_with_synth_gaps.m
            nds1-iterate-with-gaps-synthetic.json
            -proto-1
            )
        replay_server_test(
            _octave_nds1_iterate-with-synth-gaps-nogaphandler_
            test_iterate_with_synth_gaps.m
            nds1-iterate-with-gaps-synthetic.json
            -proto-1 -no-gap
            )
        replay_server_test(
            _octave_nds1_iterate-with-synth-gaps-defaultgaphandler_
            test_iterate_with_synth_gaps.m
            nds1-iterate-with-gaps-synthetic.json
            -proto-1 -default-gap-handling
            )
        #----------------------------------------------------------------
        replay_server_test(
            _octave_nds2_iterate-live-data_
            test_iterate_live_data.m
            nds2-iterate-live-data-synthetic.json
            -proto-2
            )
        replay_server_test(
            _octave_nds1_iterate-live-data_
            test_iterate_live_data.m
            nds1-iterate-live-data-synthetic.json
            -proto-1
            )
        #----------------------------------------------------------------
        replay_server_test(
            _octave_nds2_iterate-live-data-bounded_
            test_iterate_live_data_bounded.m
            nds2-iterate-live-data-bounded-synthetic.json
            -proto-2
            )
        replay_server_test(
            _octave_nds1_iterate-live-data-bounded_
            test_iterate_live_data_bounded.m
            nds1-iterate-live-data-bounded-synthetic-multiconn.json
            -proto-1
            )
        #----------------------------------------------------------------
        replay_server_test(
            _octave_nds2_test_ticket-288_
            test_ticket_288.m
            nds2-ticket-288.json
            )
        #----------------------------------------------------------------
        replay_server_test(
            _octave_nds2_test_ticket-289_
            test_ticket_289.m
            nds2-ticket-289.json
            )

    endif( PYTHON_DFLT_EXECUTABLE )
endif ( ENABLE_SWIG_OCTAVE )
