ADD_TEST(CLEAN-TESTS ${CMAKE_COMMAND} -P ${OpenMEEG_SOURCE_DIR}/tests/clean_tests.cmake)

FUNCTION(TESTHEAD HEADNUM)
    SET(SUBJECT "Head${HEADNUM}")

    SET(ASSEMBLE  ${CMAKE_CURRENT_BINARY_DIR}/om_assemble)
    SET(INVERSER  ${CMAKE_CURRENT_BINARY_DIR}/om_minverser)
    SET(PRESMOOTH ${CMAKE_CURRENT_BINARY_DIR}/om_presmooth)
    SET(GAIN      ${CMAKE_CURRENT_BINARY_DIR}/om_gain)
    SET(FORWARD   ${CMAKE_CURRENT_BINARY_DIR}/om_forward)
    SET(INVERSE   ${CMAKE_CURRENT_BINARY_DIR}/om_inverse)

    SET(MODELBASE     ${OpenMEEG_SOURCE_DIR}/data/Models/${SUBJECT}/${SUBJECT})
    SET(GENERATEDBASE ${OpenMEEG_BINARY_DIR}/tests/${SUBJECT})
    SET(COMPBASE      ${OpenMEEG_SOURCE_DIR}/data/Computations/${SUBJECT}/${SUBJECT})
    SET(ANABASE       ${OpenMEEG_SOURCE_DIR}/tests/analytic)

    SET(GEOM                ${MODELBASE}.geom)
    SET(COND                ${MODELBASE}.cond)
    SET(SRCMESH             ${MODELBASE}.tri)
    SET(POINTS              ${ANABASE}/eeg_internal_points.txt)
    SET(DIPPOS              ${COMPBASE}.dip)
    SET(PATCHES             ${COMPBASE}.patches)
    SET(SQUIDS              ${COMPBASE}.squids)
    SET(SQUIDS-TANGENTIAL   ${COMPBASE}-tangential.squids)
    SET(SQUIDS-NORADIAL     ${COMPBASE}-noradial.squids)
    SET(SURFSOURCES         ${COMPBASE}.src)
    SET(DIPSOURCES          ${COMPBASE}.srcdip)

    SET(SMOOTH              ${GENERATEDBASE}.smooth)
    SET(AREAS               ${GENERATEDBASE}.ai)
    SET(HMMAT               ${GENERATEDBASE}.hm)
    SET(HMINVMAT            ${GENERATEDBASE}.hm_inv)
    SET(SSMMAT              ${GENERATEDBASE}.ssm)
    SET(H2EMMAT             ${GENERATEDBASE}.h2em)
    SET(SGEMMAT             ${GENERATEDBASE}.sgem)
    SET(H2IPMAT             ${GENERATEDBASE}.h2ip)
    SET(H2MMMAT             ${GENERATEDBASE}.h2mm)
    SET(H2MMMAT-TANGENTIAL  ${GENERATEDBASE}-tangential.h2mm)
    SET(H2MMMAT-NORADIAL    ${GENERATEDBASE}-noradial.h2mm)
    SET(SS2MMMAT            ${GENERATEDBASE}.ss2mm)
    SET(SGMMMAT             ${GENERATEDBASE}.sgmm)
    SET(DS2IPMAT            ${GENERATEDBASE}.ds2ip)
    SET(DSMMAT              ${GENERATEDBASE}.dsm)
    SET(DS2MMMAT            ${GENERATEDBASE}.ds2mm)
    SET(DS2MMMAT-TANGENTIAL ${GENERATEDBASE}-tangential.ds2mm)
    SET(DS2MMMAT-NORADIAL   ${GENERATEDBASE}-noradial.ds2mm)
    SET(DGIPMAT             ${GENERATEDBASE}.dgip)
    SET(DGEMMAT             ${GENERATEDBASE}.dgem)
    SET(DGMMMAT             ${GENERATEDBASE}.dgmm)
    SET(DGMMMAT-TANGENTIAL  ${GENERATEDBASE}-tangential.dgmm)
    SET(DGMMMAT-NORADIAL    ${GENERATEDBASE}-noradial.dgmm)

    SET(ESTEEG             ${GENERATEDBASE}.est_eeg)
    SET(ESTMEG             ${GENERATEDBASE}.est_meg)
    SET(EEGINVBASE         ${GENERATEDBASE}-eeg)
    SET(MEGINVBASE         ${GENERATEDBASE}-meg)
    SET(ESTDIPBASE         ${GENERATEDBASE}-dip)

    ############ ASSEMBLE TEST ##############

    ADD_TEST(HM-${SUBJECT} ${ASSEMBLE} -HM ${GEOM} ${COND} ${HMMAT})

    SET_TESTS_PROPERTIES(HM-${SUBJECT} PROPERTIES DEPENDS CLEAN-TESTS)

    ADD_TEST(HMINV-${SUBJECT} ${INVERSER} ${HMMAT} ${HMINVMAT})

    SET_TESTS_PROPERTIES(HMINV-${SUBJECT} PROPERTIES DEPENDS HM-${SUBJECT})

    IF (${HEADNUM} EQUAL 1)
        ADD_TEST(SSM-${SUBJECT} ${ASSEMBLE} -SSM ${GEOM} ${COND} ${SRCMESH} ${SSMMAT})
        ADD_TEST(AI-${SUBJECT} ${PRESMOOTH} ${SRCMESH} ${SMOOTH} ${AREAS})
    ENDIF()

    ############ EEG TEST ##############

    ADD_TEST(H2EM-${SUBJECT} ${ASSEMBLE} -H2EM ${GEOM} ${COND} ${PATCHES} ${H2EMMAT})

    IF (${HEADNUM} EQUAL 1)

        ############ EEG TEST ##############

        ADD_TEST(SurfGainEEG-${SUBJECT} ${GAIN} -EEG ${HMINVMAT} ${SSMMAT} ${H2EMMAT} ${SGEMMAT})

        SET_TESTS_PROPERTIES(SurfGainEEG-${SUBJECT} PROPERTIES DEPENDS HMINV-${SUBJECT})
        SET_PROPERTY(TEST SurfGainEEG-${SUBJECT} APPEND PROPERTY DEPENDS SSM-${SUBJECT})
        SET_PROPERTY(TEST SurfGainEEG-${SUBJECT} APPEND PROPERTY DEPENDS H2EM-${SUBJECT})

        #------ FORWARD -----#

        ADD_TEST(ESTEEG-${SUBJECT} ${FORWARD} ${SGEMMAT} ${SURFSOURCES} ${ESTEEG} 0.0)
        SET_TESTS_PROPERTIES(ESTEEG-${SUBJECT} PROPERTIES DEPENDS SurfGainEEG-${SUBJECT})

        #------ INVERSE -----#

        ADD_TEST(EEG-HEAT-${SUBJECT} ${INVERSE} ${SGEMMAT} ${SMOOTH} ${AREAS} ${ESTEEG} ${EEGINVBASE}-heat.est_src 1e-4 HEAT)
        ADD_TEST(EEG-MN-${SUBJECT}   ${INVERSE} ${SGEMMAT} ${SMOOTH} ${AREAS} ${ESTEEG} ${EEGINVBASE}-mn.est_src 1e-4 MN)
        ADD_TEST(EEG-TV-${SUBJECT}   ${INVERSE} ${SGEMMAT} ${SMOOTH} ${AREAS} ${ESTEEG} ${EEGINVBASE}-tv.est_src 1e-4 TV 10000 0.0)

        SET_TESTS_PROPERTIES(EEG-HEAT-${SUBJECT} PROPERTIES DEPENDS AI-${SUBJECT})
        SET_PROPERTY(TEST EEG-HEAT-${SUBJECT} APPEND PROPERTY DEPENDS ESTEEG-${SUBJECT})
        SET_TESTS_PROPERTIES(EEG-MN-${SUBJECT} PROPERTIES DEPENDS AI-${SUBJECT})
        SET_PROPERTY(TEST EEG-MN-${SUBJECT} APPEND PROPERTY DEPENDS ESTEEG-${SUBJECT})
        SET_TESTS_PROPERTIES(EEG-TV-${SUBJECT} PROPERTIES DEPENDS AI-${SUBJECT})
        SET_PROPERTY(TEST EEG-TV-${SUBJECT} APPEND PROPERTY DEPENDS ESTEEG-${SUBJECT})

    ENDIF()

    ############ MEG TEST ##############

    ADD_TEST(H2MM-${SUBJECT} ${ASSEMBLE} -H2MM ${GEOM} ${COND} ${SQUIDS} ${H2MMMAT})

    ADD_TEST(H2MM-${SUBJECT}-tangential ${ASSEMBLE} -H2MM ${GEOM} ${COND} ${SQUIDS-TANGENTIAL} ${H2MMMAT-TANGENTIAL})

    ADD_TEST(H2MM-${SUBJECT}-noradial ${ASSEMBLE} -H2MM ${GEOM} ${COND} ${SQUIDS-NORADIAL} ${H2MMMAT-NORADIAL})

    IF (${HEADNUM} EQUAL 1)
        ############ MEG TEST ##############

        ADD_TEST(SS2MM-${SUBJECT} ${ASSEMBLE} -SS2MM ${SRCMESH} ${SQUIDS} ${SS2MMMAT})

        ADD_TEST(SurfGainMEG-${SUBJECT} ${GAIN} -MEG ${HMINVMAT} ${SSMMAT} ${H2MMMAT} ${SS2MMMAT} ${SGMMMAT})

        SET_TESTS_PROPERTIES(SurfGainMEG-${SUBJECT} PROPERTIES DEPENDS HMINV-${SUBJECT})
        SET_PROPERTY(TEST SurfGainMEG-${SUBJECT} APPEND PROPERTY DEPENDS SSM-${SUBJECT})
        SET_PROPERTY(TEST SurfGainMEG-${SUBJECT} APPEND PROPERTY DEPENDS H2MM-${SUBJECT})
        SET_PROPERTY(TEST SurfGainMEG-${SUBJECT} APPEND PROPERTY DEPENDS SS2MM-${SUBJECT})

        #------ FORWARD ----#

        ADD_TEST(ESTMEG-${SUBJECT} ${FORWARD} ${SGMMMAT} ${SURFSOURCES} ${ESTMEG} 0.0)

        SET_TESTS_PROPERTIES(ESTMEG-${SUBJECT} PROPERTIES DEPENDS SurfGainMEG-${SUBJECT})

        #------ INVERSE -----#
        #
        ADD_TEST(MEG-HEAT-${SUBJECT} ${INVERSE} ${SGMMMAT} ${SMOOTH} ${AREAS} ${ESTMEG} ${MEGINVBASE}-heat.est_src 1e-4 HEAT)
        ADD_TEST(MEG-MN-${SUBJECT}   ${INVERSE} ${SGMMMAT} ${SMOOTH} ${AREAS} ${ESTMEG} ${MEGINVBASE}-mn.est_src 1e-4 MN)
        ADD_TEST(MEG-TV-${SUBJECT}   ${INVERSE} ${SGMMMAT} ${SMOOTH} ${AREAS} ${ESTMEG} ${MEGINVBASE}-tv.est_src 1e-4 TV 10000 0.0)

        SET_TESTS_PROPERTIES(MEG-HEAT-${SUBJECT} PROPERTIES DEPENDS AI-${SUBJECT})
        SET_PROPERTY(TEST MEG-HEAT-${SUBJECT} APPEND PROPERTY DEPENDS ESTMEG-${SUBJECT})
        SET_TESTS_PROPERTIES(MEG-MN-${SUBJECT} PROPERTIES DEPENDS AI-${SUBJECT})
        SET_PROPERTY(TEST MEG-MN-${SUBJECT} APPEND PROPERTY DEPENDS ESTMEG-${SUBJECT})
        SET_TESTS_PROPERTIES(MEG-TV-${SUBJECT} PROPERTIES DEPENDS AI-${SUBJECT})
        SET_PROPERTY(TEST MEG-TV-${SUBJECT} APPEND PROPERTY DEPENDS ESTMEG-${SUBJECT})

    ENDIF()

    ############ TEST DIPOLE FORWARD RESULTS (Regression test) ##############

    # om_assemble -DSM geometry.geom conductivity.cond dipoles.dip dsm.bin

    ADD_TEST(DSM-${SUBJECT} ${ASSEMBLE} -DSM ${GEOM} ${COND} ${DIPPOS} ${DSMMAT})

    # om_assemble -DS2MM dipoles.dip squidscoord.squids sToMEGmat.bin

    ADD_TEST(DS2MM-${SUBJECT} ${ASSEMBLE} -DS2MM ${DIPPOS} ${SQUIDS} ${DS2MMMAT})

    ADD_TEST(DS2MM-${SUBJECT}-tangential ${ASSEMBLE} -DS2MM ${DIPPOS} ${SQUIDS-TANGENTIAL} ${DS2MMMAT-TANGENTIAL})

    ADD_TEST(DS2MM-${SUBJECT}-noradial ${ASSEMBLE} -DS2MM ${DIPPOS} ${SQUIDS-NORADIAL} ${DS2MMMAT-NORADIAL})

    # om_assemble -H2IPM geometry.geom conductivity.cond internalpoints.txt h2ip.bin

    ADD_TEST(H2IPM-${SUBJECT} ${ASSEMBLE} -H2IPM ${GEOM} ${COND} ${POINTS} ${H2IPMAT})

    # om_assemble -DS2IPM geometry.geom conductivity.cond dipoles.dip internalpoints.txt ds2ip.bin

    ADD_TEST(S2IPM-${SUBJECT} ${ASSEMBLE} -DS2IPM ${GEOM} ${COND} ${DIPPOS} ${POINTS} ${DS2IPMAT})

    ADD_TEST(DipGainEEG-${SUBJECT} ${GAIN} -EEG ${HMINVMAT} ${DSMMAT} ${H2EMMAT} ${DGEMMAT})

    SET_TESTS_PROPERTIES(DipGainEEG-${SUBJECT} PROPERTIES DEPENDS HMINV-${SUBJECT})
    SET_PROPERTY(TEST DipGainEEG-${SUBJECT} APPEND PROPERTY DEPENDS DSM-${SUBJECT})
    SET_PROPERTY(TEST DipGainEEG-${SUBJECT} APPEND PROPERTY DEPENDS H2EM-${SUBJECT})

    ADD_TEST(DipGainMEG-${SUBJECT} ${GAIN} -MEG ${HMINVMAT} ${DSMMAT} ${H2MMMAT} ${DS2MMMAT} ${DGMMMAT})

    SET_TESTS_PROPERTIES(DipGainMEG-${SUBJECT} PROPERTIES DEPENDS HMINV-${SUBJECT})
    SET_PROPERTY(TEST DipGainMEG-${SUBJECT} APPEND PROPERTY DEPENDS DSM-${SUBJECT})
    SET_PROPERTY(TEST DipGainMEG-${SUBJECT} APPEND PROPERTY DEPENDS H2MM-${SUBJECT})
    SET_PROPERTY(TEST DipGainMEG-${SUBJECT} APPEND PROPERTY DEPENDS DS2MM-${SUBJECT})

    ADD_TEST(DipGainMEG-${SUBJECT}-tangential ${GAIN} -MEG ${HMINVMAT} ${DSMMAT} ${H2MMMAT-TANGENTIAL} ${DS2MMMAT-TANGENTIAL} ${DGMMMAT-TANGENTIAL})

    SET_TESTS_PROPERTIES(DipGainMEG-${SUBJECT}-tangential PROPERTIES DEPENDS HMINV-${SUBJECT})
    SET_PROPERTY(TEST DipGainMEG-${SUBJECT}-tangential APPEND PROPERTY DEPENDS DSM-${SUBJECT})
    SET_PROPERTY(TEST DipGainMEG-${SUBJECT}-tangential APPEND PROPERTY DEPENDS H2MM-${SUBJECT}-tangential)
    SET_PROPERTY(TEST DipGainMEG-${SUBJECT}-tangential APPEND PROPERTY DEPENDS DS2MM-${SUBJECT}-tangential)

    ADD_TEST(DipGainMEG-${SUBJECT}-noradial ${GAIN} -MEG ${HMINVMAT} ${DSMMAT} ${H2MMMAT-NORADIAL} ${DS2MMMAT-NORADIAL} ${DGMMMAT-NORADIAL})

    SET_TESTS_PROPERTIES(DipGainMEG-${SUBJECT}-noradial PROPERTIES DEPENDS HMINV-${SUBJECT})
    SET_PROPERTY(TEST DipGainMEG-${SUBJECT}-noradial APPEND PROPERTY DEPENDS DSM-${SUBJECT})
    SET_PROPERTY(TEST DipGainMEG-${SUBJECT}-noradial APPEND PROPERTY DEPENDS H2MM-${SUBJECT}-noradial)
    SET_PROPERTY(TEST DipGainMEG-${SUBJECT}-noradial APPEND PROPERTY DEPENDS DS2MM-${SUBJECT}-noradial)

    ADD_TEST(DipGainInternalPot-${SUBJECT} ${GAIN} -IP ${HMINVMAT} ${DSMMAT} ${H2IPMAT} ${DS2IPMAT} ${DGIPMAT})

    SET_TESTS_PROPERTIES(DipGainInternalPot-${SUBJECT} PROPERTIES DEPENDS HMINV-${SUBJECT})
    SET_PROPERTY(TEST DipGainInternalPot-${SUBJECT} APPEND PROPERTY DEPENDS DSM-${SUBJECT})
    SET_PROPERTY(TEST DipGainInternalPot-${SUBJECT} APPEND PROPERTY DEPENDS H2IPM-${SUBJECT})
    SET_PROPERTY(TEST DipGainInternalPot-${SUBJECT} APPEND PROPERTY DEPENDS S2IPM-${SUBJECT})

    # forward gainmatrix.bin dipoleActivation.src estimatedeegdata.txt noiselevel

    ADD_TEST(EEG-dipoles-${SUBJECT} ${FORWARD} ${DGEMMAT} ${DIPSOURCES} ${ESTDIPBASE}.est_eeg 0.0)

    SET_TESTS_PROPERTIES(EEG-dipoles-${SUBJECT} PROPERTIES DEPENDS DipGainEEG-${SUBJECT})

    ADD_TEST(MEG-dipoles-${SUBJECT} ${FORWARD} ${DGMMMAT} ${DIPSOURCES} ${ESTDIPBASE}.est_meg 0.0)

    SET_TESTS_PROPERTIES(MEG-dipoles-${SUBJECT} PROPERTIES DEPENDS DipGainMEG-${SUBJECT})

    ADD_TEST(MEG-dipoles-${SUBJECT}-tangential ${FORWARD} ${DGMMMAT-TANGENTIAL} ${DIPSOURCES} ${ESTDIPBASE}-tangential.est_meg 0.0)

    SET_TESTS_PROPERTIES(MEG-dipoles-${SUBJECT}-tangential PROPERTIES DEPENDS DipGainMEG-${SUBJECT}-tangential)

    ADD_TEST(MEG-dipoles-${SUBJECT}-noradial ${FORWARD} ${DGMMMAT-NORADIAL} ${DIPSOURCES} ${ESTDIPBASE}-noradial.est_meg 0.0)

    SET_TESTS_PROPERTIES(MEG-dipoles-${SUBJECT}-noradial PROPERTIES DEPENDS DipGainMEG-${SUBJECT}-noradial)

    ADD_TEST(InternalPot-dipoles-${SUBJECT} ${FORWARD} ${DGIPMAT} ${DIPSOURCES} ${ESTDIPBASE}.est_eeginternal 0.0)

    SET_TESTS_PROPERTIES(InternalPot-dipoles-${SUBJECT} PROPERTIES DEPENDS DipGainInternalPot-${SUBJECT})

ENDFUNCTION()
