##############################################################################
# @file  CMakeLists.txt
# @brief Build configuration of tests of command-line tools.
#
# Copyright (c) University of Pennsylvania. All rights reserved.
# See https://www.rad.upenn.edu/sbia/software/license.html or COPYING file.
#
# Contact: SBIA Group <sbia-software at uphs.upenn.edu>
##############################################################################

# ----------------------------------------------------------------------------
# ConvertImage
basis_add_test(
  ReadWriteByteNiftiImage
  COMMAND
    basis.testdriver
      --intensity-tolerance 0
      --compare "002_ds_byte.nii.gz"
                "${INPUT_DIR}/002_ds_byte.nii.gz"
      --
      $<TARGET_FILE:ConvertImage>
        "${INPUT_DIR}/002_ds_byte.nii.gz"
        "002_ds_byte.nii.gz"
)

basis_add_test(
  ReadWriteSignedShortNiftiImage
  COMMAND
    basis.testdriver
      --intensity-tolerance 0
      --compare "002_ds_short.nii.gz"
                "${INPUT_DIR}/002_ds_short.nii.gz"
      --
      $<TARGET_FILE:ConvertImage>
        "${INPUT_DIR}/002_ds_short.nii.gz"
        "002_ds_short.nii.gz"
)

basis_add_test(
  ReadWriteFloatNiftiImage
  COMMAND
    basis.testdriver
      --intensity-tolerance 0
      --compare "002_ds_float.nii.gz"
                "${INPUT_DIR}/002_ds_float.nii.gz"
      --
      $<TARGET_FILE:ConvertImage>
        "${INPUT_DIR}/002_ds_float.nii.gz"
        "002_ds_float.nii.gz"
)

basis_add_test(
  ReadWriteByteMetaImage
  COMMAND
    basis.testdriver
      --intensity-tolerance 0
      --compare "002_ds_byte.mhd"
            "${INPUT_DIR}/002_ds_byte_meta.mhd"
      --
      $<TARGET_FILE:ConvertImage>
        "${INPUT_DIR}/002_ds_byte_meta.mhd"
        "002_ds_byte.mhd"
)

basis_add_test(
  ReadWriteSignedShortMetaImage
  COMMAND
    basis.testdriver
      --intensity-tolerance 0
      --compare "002_ds_short.mhd"
            "${INPUT_DIR}/002_ds_short_meta.mhd"
      --
      $<TARGET_FILE:ConvertImage>
        "${INPUT_DIR}/002_ds_short_meta.mhd"
        "002_ds_short.mhd"
)

basis_add_test(
  ReadWriteFloatMetaImage
  COMMAND
    basis.testdriver
      --intensity-tolerance 0
      --compare "002_ds_float.mhd"
            "${INPUT_DIR}/002_ds_float_meta.mhd"
      --
      $<TARGET_FILE:ConvertImage>
        "${INPUT_DIR}/002_ds_float_meta.mhd"
        "002_ds_float.mhd"
)

basis_add_test(
  ConvertMetaImageToNifti
  COMMAND
    basis.testdriver
      --intensity-tolerance 0
      --compare "002_ds_short.nii.gz"
            "${INPUT_DIR}/002_ds_short.nii.gz"
      --
      $<TARGET_FILE:ConvertImage>
        "${INPUT_DIR}/002_ds_short_meta.mhd"
        "002_ds_short.nii.gz"
)

basis_add_test(
  ConvertImageFromByteToFloat
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.001
      --compare "002_ds_float.nii.gz"
                "${INPUT_DIR}/002_ds_byte.nii.gz"
      --
      $<TARGET_FILE:ConvertImage>
        -t DT_FLOAT
        "${INPUT_DIR}/002_ds_byte.nii.gz"
        "002_ds_float.nii.gz"

)

basis_add_test(
  ConvertImageFromFloatToByte
  COMMAND
    basis.testdriver
      --intensity-tolerance 0
      --compare "002_ds_byte.nii.gz"
            "${BASELINE_DIR}/002_ds_byte_scaled.nii.gz"
      --
      $<TARGET_FILE:ConvertImage>
        -t DT_UNSIGNED_CHAR --scale --reset-scaling
        "${INPUT_DIR}/002_ds_float.nii.gz"
        "002_ds_byte.nii.gz"
)


basis_set_tests_properties(
  ReadWriteByteNiftiImage
  ReadWriteSignedShortNiftiImage
  ReadWriteFloatNiftiImage
  ReadWriteByteMetaImage
  ReadWriteSignedShortMetaImage
  ReadWriteFloatMetaImage
  ConvertMetaImageToNifti
  ConvertImageFromByteToFloat
  ConvertImageFromFloatToByte
  PROPERTIES
    LABELS ConvertImage
)


# ----------------------------------------------------------------------------
# intensities scaling
basis_add_test(
  ScaleIntensities
  COMMAND
    basis.testdriver -v
      # regression tests
      --compare "na01_ds_scaled.nii.gz"
                "${BASELINE_DIR}/na01_ds_scaled.nii.gz"
      # test command
      -- $<TARGET_FILE:ConvertImage> -v
        --scale --type uchar --min 0 --max 255 --reset-scaling
        "${INPUT_DIR}/na01_ds.nii.gz"
        "na01_ds_scaled.nii.gz"
)

basis_add_test(
  ScaleIntensitiesGroup
  COMMAND
    basis.testdriver -v
      # regression tests
      --compare "na01_ds_scaled.nii.gz"
                "${BASELINE_DIR}/na01_ds_scaled_group.nii.gz"
      # test command
      -- $<TARGET_FILE:ConvertImage> -v
        --scale --type uchar --min 0 --max 255 --effective --reset-scaling
        "${INPUT_DIR}/na01_ds.nii.gz"
        "na01_ds_scaled.nii.gz"
)

basis_add_test(
  ScaleIntensitiesSmooth
  COMMAND
    basis.testdriver -v
      # regression tests
      --compare "na01_ds_scaled.nii.gz"
                "${BASELINE_DIR}/na01_ds_scaled_smooth.nii.gz"
      # test command
      -- $<TARGET_FILE:ConvertImage> -v
        --scale --type uchar --min 0 --max 255 --smooth --reset-scaling
        "${INPUT_DIR}/na01_ds.nii.gz"
        "na01_ds_scaled.nii.gz"
)

basis_add_test(
  ScaleIntensitiesSmoothGroup
  COMMAND
    basis.testdriver -v
      # regression tests
      --compare "na01_ds_scaled.nii.gz"
                "${BASELINE_DIR}/na01_ds_scaled_smooth_group.nii.gz"
      # test command
      -- $<TARGET_FILE:ConvertImage> -v
        --scale --type uchar --min 0 --max 255 --smooth --effective --reset-scaling
        "${INPUT_DIR}/na01_ds.nii.gz"
        "na01_ds_scaled.nii.gz"
)

basis_add_test(
  ScaleIntensitiesSmoothGroup2
  COMMAND
    basis.testdriver -v
      # regression tests
      --compare "A_byte_scaled_group.nii.gz"
                "${BASELINE_DIR}/A_byte_scaled_group.nii.gz"
      # test command
      -- $<TARGET_FILE:ConvertImage> -v
        --scale --type uchar --min 0 --max 255 --smooth --effective --reset-scaling
        "${INPUT_DIR}/A_byte.nii.gz"
        "A_byte_scaled_group.nii.gz"
)


basis_set_tests_properties(
  ScaleIntensities
  ScaleIntensitiesGroup
  ScaleIntensitiesSmooth
  ScaleIntensitiesSmoothGroup
  ScaleIntensitiesSmoothGroup2
  PROPERTIES
    LABELS ScaleIntensity
)


# ----------------------------------------------------------------------------
# WarpImage
basis_add_test(
  ApplyDeformationOnByteImageUsingNN # nearest neighbor interpolation
  COMMAND
    basis.testdriver -v
      # regression tests
      --compare "H01_cropped_warped.nii.gz"
                "${BASELINE_DIR}/H01_cropped_warped_nn.nii.gz"
      # test command
      -- $<TARGET_FILE:ApplyTransform> -vv -n 
        "${INPUT_DIR}/H01_cropped.nii.gz"
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        "H01_cropped_warped.nii.gz"
)

basis_add_test(
  ApplyDeformationOnByteImage # linear interpolation, the default
  COMMAND
    basis.testdriver -v
      # regression tests
      --compare "H01_cropped_warped.nii.gz"
                "${BASELINE_DIR}/H01_cropped_warped.nii.gz"
      # test command
      -- $<TARGET_FILE:ApplyTransform> -vv
        "${INPUT_DIR}/H01_cropped.nii.gz"
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        "H01_cropped_warped.nii.gz"
)


basis_add_test(
  ApplyDeformationOnFloatImage # linear interpolation, the default
  COMMAND
    basis.testdriver -v
      # regression tests
      --compare "y-vol_00001-to-jakob-linear-interpolated.nii.gz"
                "${BASELINE_DIR}/y-vol_00001-to-jakob-linear-interpolated.nii.gz"
      # test command
      -- $<TARGET_FILE:ApplyTransform> -vv
        "${INPUT_DIR}/y-vol_00001.nii.gz"
        "${INPUT_DIR}/y-vol_00001-to-jakob-deformation.nii.gz"
        "y-vol_00001-to-jakob-linear-interpolated.nii.gz"
)


basis_add_test(
  Apply3DDeformationOn4DImage # nn interpolation
  COMMAND
    basis.testdriver -v
      # regression tests
      --compare "na01_RAI_combo_warpedto_002_LPS.nii.gz"
                "${BASELINE_DIR}/na01_RAI_combo_warpedto_002_LPS.nii.gz"
      # test command
      -- $<TARGET_FILE:ApplyTransform> -vv
        "${INPUT_DIR}/na01_ds_RAI_combo.nii.gz"
        "${INPUT_DIR}/def_na01_RAI_to_002_LPS.nii.gz"
        "na01_RAI_combo_warpedto_002_LPS.nii.gz"
)


basis_set_tests_properties(
  ApplyDeformationOnByteImageUsingNN
  ApplyDeformationOnByteImage
  ApplyDeformationOnFloatImage
  Apply3DDeformationOn4DImage
  PROPERTIES
    LABEL ApplyTransform
)


# ----------------------------------------------------------------------------
# CalculateImageSimilarity
basis_add_test(
  CalculateImageSimilarity_CC
  COMMAND
    CalculateImageSimilarity 
      -C
      "${INPUT_DIR}/Gabor_H08c_3dVert_F_imag.1_0.nii.gz"
      "${INPUT_DIR}/Gabor_H09c_3dVert_F_imag.1_0.nii.gz"
)

basis_set_tests_properties (
  CalculateImageSimilarity_CC
  PROPERTIES
    PASS_REGULAR_EXPRESSION
      "CC = 0\\.896107"
)


basis_add_test(
  CalculateImageSimilarity_MI
  COMMAND
    CalculateImageSimilarity 
      -M
      "${INPUT_DIR}/Gabor_H08c_3dVert_F_imag.1_0.nii.gz"
      "${INPUT_DIR}/Gabor_H09c_3dVert_F_imag.1_0.nii.gz"
)

basis_set_tests_properties (
  CalculateImageSimilarity_MI
  PROPERTIES
    PASS_REGULAR_EXPRESSION
      "MI_unnormalized = 0\\.696725"
)


basis_add_test(
  CalculateImageSimilarity_SSD
  COMMAND
    CalculateImageSimilarity 
      -D
      "${INPUT_DIR}/Gabor_H08c_3dVert_F_imag.1_0.nii.gz"
      "${INPUT_DIR}/Gabor_H09c_3dVert_F_imag.1_0.nii.gz"
)

basis_set_tests_properties (
  CalculateImageSimilarity_SSD
  PROPERTIES
    PASS_REGULAR_EXPRESSION
      "SSD = 64534160\\.000000"
)


basis_set_tests_properties(
  CalculateImageSimilarity_CC
  CalculateImageSimilarity_MI
  CalculateImageSimilarity_SSD
  PROPERTIES
    LABELS CalculateImageSimilarity
)


# ----------------------------------------------------------------------------
# CalculateJacobianMap
basis_add_test(
  CalculateJacobianMap_default
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "jac_H01_cropped_to_H02_cropped.nii.gz"
                "${BASELINE_DIR}/jac_H01_cropped_to_H02_cropped.nii.gz"
      --
      $<TARGET_FILE:CalculateJacobianMap> -v -v
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
	"jac_H01_cropped_to_H02_cropped.nii.gz"
	"-f ${INPUT_DIR}/H01_cropped.nii.gz"
        "-t ${INPUT_DIR}/H02_cropped_makeup.nii.gz"
)

basis_add_test(
  CalculateJacobianMap_logjac
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "jac_H01_cropped_to_H02_cropped.nii.gz"
                "${BASELINE_DIR}/jac_H01_cropped_to_H02_cropped_logjac.nii.gz"
      --
      $<TARGET_FILE:CalculateJacobianMap> -v -v -L
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        "jac_H01_cropped_to_H02_cropped.nii.gz"
	"-f ${INPUT_DIR}/H01_cropped.nii.gz"
	"-t ${INPUT_DIR}/H02_cropped_makeup.nii.gz"
)

basis_add_test(
  CalculateJacobianMap_smoothdef
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "jac_H01_cropped_to_H02_cropped.nii.gz"
                "${BASELINE_DIR}/jac_H01_cropped_to_H02_cropped_smoothdef.nii.gz"
      --
      $<TARGET_FILE:CalculateJacobianMap> -v -v -s
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        "jac_H01_cropped_to_H02_cropped.nii.gz"
	"-f ${INPUT_DIR}/H01_cropped.nii.gz"
	"-t ${INPUT_DIR}/H02_cropped_makeup.nii.gz"
)

basis_add_test(
  CalculateJacobianMap_smoothjac
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "jac_H01_cropped_to_H02_cropped.nii.gz"
                "${BASELINE_DIR}/jac_H01_cropped_to_H02_cropped_smoothjac.nii.gz"
      --
      $<TARGET_FILE:CalculateJacobianMap> -v -v -S
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        "jac_H01_cropped_to_H02_cropped.nii.gz"
	"-f ${INPUT_DIR}/H01_cropped.nii.gz"
	"-t ${INPUT_DIR}/H02_cropped_makeup.nii.gz"
)

basis_add_test(
  CalculateJacobianMap_xyswitchoff
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "jac_H01_cropped_to_H02_cropped.nii.gz"
                "${BASELINE_DIR}/jac_H01_cropped_to_H02_cropped_xyswitchoff.nii.gz"
      --
      $<TARGET_FILE:CalculateJacobianMap> -v -v -W
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        "jac_H01_cropped_to_H02_cropped.nii.gz"
	"-f ${INPUT_DIR}/H01_cropped.nii.gz"
	"-t ${INPUT_DIR}/H02_cropped_makeup.nii.gz"
)


basis_set_tests_properties(
  CalculateJacobianMap_default
  CalculateJacobianMap_logjac
  CalculateJacobianMap_smoothdef
  CalculateJacobianMap_smoothjac
  CalculateJacobianMap_xyswitchoff
  PROPERTIES
    LABELS CalculateJacobianMap
)


# ----------------------------------------------------------------------------
# CalculateRavensMaps
basis_add_test(
  CalculateRavensMaps
  COMMAND
    basis.testdriver -v
      # regression tests
      --intensity-tolerance 0.01
      --compare "ravens_50.nii.gz"
                "${BASELINE_DIR}/ravens_50.nii.gz"
      # test command
      -- $<TARGET_FILE:CalculateRavensMaps>
        -m50
        "${INPUT_DIR}/H03_label.nii.gz"
        "${INPUT_DIR}/H02.nii.gz"
        "${INPUT_DIR}/def_H03_to_H02.nii.gz"
        "ravens_50.nii.gz"
)


basis_set_tests_properties(CalculateRavensMaps PROPERTIES LABEL CalculateRavensMaps)


# ----------------------------------------------------------------------------
# CalculateGaborTextures
basis_add_test(
  CalculateGaborTexturesIsotropic
  COMMAND
    basis.testdriver -v
      # regression tests
      --intensity-tolerance 0.01
      --compare "na01_ds_Gabor_3dHori_F_imag.0_0.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_imag.0_0.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_imag.0_1.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_imag.0_1.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_imag.0_2.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_imag.0_2.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_imag.1_0.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_imag.1_0.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_imag.1_1.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_imag.1_1.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_imag.1_2.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_imag.1_2.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.0_0.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.0_0.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.0_1.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.0_1.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.0_2.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.0_2.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.1_0.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.1_0.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.1_1.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.1_1.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.1_2.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.1_2.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.0_0.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.0_0.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.0_1.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.0_1.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.0_2.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.0_2.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.1_0.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.1_0.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.1_1.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.1_1.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.1_2.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.1_2.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.0_0.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.0_0.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.0_1.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.0_1.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.0_2.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.0_2.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.1_0.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.1_0.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.1_1.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.1_1.nii.gz"
      --compare "na01_ds_Gabor_3dHori_F_real.1_2.nii.gz"
                "${BASELINE_DIR}/na01_ds_Gabor_3dHori_F_real.1_2.nii.gz"
      # test command
      -- $<TARGET_FILE:CalculateGaborTextures>
        -s2
        -o3
        "${INPUT_DIR}/na01_ds.nii.gz"
        na01_ds_Gabor
)

basis_add_test(
  CalculateGaborTexturesAnisotropic
  COMMAND
    basis.testdriver -v
      # regression tests
      --intensity-tolerance 0.01
      --compare "H02_Gabor_3dHori_F_imag.0_0.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_imag.0_0.nii.gz"
      --compare "H02_Gabor_3dHori_F_imag.0_1.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_imag.0_1.nii.gz"
      --compare "H02_Gabor_3dHori_F_imag.0_2.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_imag.0_2.nii.gz"
      --compare "H02_Gabor_3dHori_F_imag.1_0.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_imag.1_0.nii.gz"
      --compare "H02_Gabor_3dHori_F_imag.1_1.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_imag.1_1.nii.gz"
      --compare "H02_Gabor_3dHori_F_imag.1_2.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_imag.1_2.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.0_0.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.0_0.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.0_1.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.0_1.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.0_2.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.0_2.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.1_0.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.1_0.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.1_1.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.1_1.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.1_2.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.1_2.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.0_0.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.0_0.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.0_1.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.0_1.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.0_2.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.0_2.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.1_0.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.1_0.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.1_1.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.1_1.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.1_2.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.1_2.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.0_0.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.0_0.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.0_1.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.0_1.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.0_2.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.0_2.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.1_0.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.1_0.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.1_1.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.1_1.nii.gz"
      --compare "H02_Gabor_3dHori_F_real.1_2.nii.gz"
                "${BASELINE_DIR}/H02_Gabor_3dHori_F_real.1_2.nii.gz"
      # test command
      -- $<TARGET_FILE:CalculateGaborTextures>
        -s2
        -o3
        "${INPUT_DIR}/H02.nii.gz"
        H02_Gabor
)


basis_set_tests_properties(
  CalculateGaborTexturesIsotropic
  CalculateGaborTexturesAnisotropic
  PROPERTIES
    LABEL CalculateGaborTextures
)


# ----------------------------------------------------------------------------
# MatchHistograms
basis_add_executable(test_MatchHistograms.sh)

basis_add_test(
  MatchHistograms
  COMMAND
    basis.testdriver
      --compare "na01_ds.nii.gz"
                "${BASELINE_DIR}/na01_ds_HM.img"
      --
      $<TARGET_FILE:test_MatchHistograms>
        "${INPUT_DIR}/H02.nii.gz"
        "${INPUT_DIR}/na01_ds.nii.gz"
)


basis_set_tests_properties(
  MatchHistograms
  PROPERTIES
    LABELS MatchHistograms
)


# ----------------------------------------------------------------------------
# ConvertDeformation
basis_add_test(
  ConvertDeformationDRAMMSToITK
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_H01_cropped_to_H02_cropped_itk.nii.gz"
                "${BASELINE_DIR}/def_H01_cropped_to_H02_cropped_itk.nii.gz"
      --compare "def_H01_cropped_to_H02_cropped_ITK2_x.nii.gz"
                "${BASELINE_DIR}/def_H01_cropped_to_H02_cropped_itk_x.nii.gz"
      --compare "def_H01_cropped_to_H02_cropped_ITK2_y.nii.gz"
                "${BASELINE_DIR}/def_H01_cropped_to_H02_cropped_itk_y.nii.gz"
      --compare "def_H01_cropped_to_H02_cropped_ITK2_z.nii.gz"
                "${BASELINE_DIR}/def_H01_cropped_to_H02_cropped_itk_z.nii.gz"
      --
      $<TARGET_FILE:ConvertDeformation> -v
        -f DRAMMS
        -i "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        -F ITK
        -o def_H01_cropped_to_H02_cropped_itk
        -x def_H01_cropped_to_H02_cropped_ITK2_x
        -y def_H01_cropped_to_H02_cropped_ITK2_y
        -z def_H01_cropped_to_H02_cropped_ITK2_z
)


basis_add_test(
  ConvertDeformationFSLtoDRAMMS
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_fsl2dramms.nii.gz"
                "${BASELINE_DIR}/def_fsl2dramms_na01_to_002.nii.gz"
      --
      $<TARGET_FILE:ConvertDeformation> -v
        -f FSL
        -i "${INPUT_DIR}/def_na01_to_002.hdr"
        -F DRAMMS
        -o def_fsl2dramms.nii.gz
)


basis_set_tests_properties(
  ConvertDeformationDRAMMSToITK
  ConvertDeformationFSLtoDRAMMS
  PROPERTIES
    LABELS ConvertDeformation
)


# ----------------------------------------------------------------------------
# CombineTransforms
basis_add_test(
  ConcatenateAffineAndDeformableTransformation
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_H01_cropped_to_H02_cropped_concatenated.nii.gz"
                "${BASELINE_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
      --
      $<TARGET_FILE:CombineTransforms>
        -v -c --affine_from "${INPUT_DIR}/H01_cropped.nii.gz"
        "${INPUT_DIR}/H01_cropped_to_H02_cropped_affine.mat"
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped_deformablePart.nii.gz"
        "def_H01_cropped_to_H02_cropped_concatenated.nii.gz"
)

basis_add_test(
  ConcatenateDeformationFields
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_composition.nii.gz"
                "${BASELINE_DIR}/def_composition.nii.gz"
      --
      $<TARGET_FILE:CombineTransforms>
        -v -c
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        "${INPUT_DIR}/def_H02_cropped_to_H03.nii.gz"
        def_composition.nii.gz
)

basis_add_test(
  AddDeformationFields
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_addition.nii.gz"
                "${BASELINE_DIR}/def_addition.nii.gz"
      --
      $<TARGET_FILE:CombineTransforms>
        -v -a
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped_deformablePart.nii.gz"
        def_addition.nii.gz
)

basis_add_test(
  SubtractDeformationFields
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_difference.nii.gz"
                "${BASELINE_DIR}/def_difference.nii.gz"
      --
      $<TARGET_FILE:CombineTransforms>
        -v -s
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped_deformablePart.nii.gz"
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        def_difference.nii.gz
)

basis_add_test(
  ComputeMeanDeformationField
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_mean.nii.gz"
                "${BASELINE_DIR}/def_mean.nii.gz"
      --
      $<TARGET_FILE:CombineTransforms>
        -v -m
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped_deformablePart.nii.gz"
        def_mean.nii.gz
)


basis_set_tests_properties(
  ConcatenateAffineAndDeformableTransformation
  ConcatenateDeformationFields
  AddDeformationFields
  SubtractDeformationFields
  ComputeMeanDeformationField
  PROPERTIES
    LABELS CombineTransforms
)


# ----------------------------------------------------------------------------
# ImageOperation - intensity image
basis_add_test(
  DownsampleImage2DByte
  COMMAND
    basis.testdriver -v
      --compare "aaa2D_ds.hdr"
                "${BASELINE_DIR}/aaa2D_ds.nii.gz"
      -- $<TARGET_FILE:ImageOperation> -v
        -r 2
        "${INPUT_DIR}/aaa2D.nii.gz"
        "aaa2D_ds.hdr"
)

basis_add_test(
  DownsampleImage2DByteSmooth
  COMMAND
    basis.testdriver -v
      --compare "aaa2D_smooth_ds.nii.gz"
                "${BASELINE_DIR}/aaa2D_smooth_ds.nii.gz"
      -- $<TARGET_FILE:ImageOperation> -v
        -s auto -r 2
        "${INPUT_DIR}/aaa2D.nii.gz"
        "aaa2D_smooth_ds.nii.gz"
)

basis_add_test(
  DownsampleImage3DByte
  COMMAND
    basis.testdriver -v
      --compare "jakob_skull_ds.nii.gz"
                "${BASELINE_DIR}/jakob_skull_ds.nii.gz"
      -- $<TARGET_FILE:ImageOperation> -v
        -r 2
        "${INPUT_DIR}/jakob_skull_float.nii.gz"
        "jakob_skull_ds.nii.gz"
)

basis_add_test(
  DownsampleImage3DByteBy4
  COMMAND
    basis.testdriver -v
      --compare "a_ds4.nii.gz"
                "${BASELINE_DIR}/a_ds4.nii.gz"
      -- $<TARGET_FILE:ImageOperation> -v
        -s auto -r 4
        "${INPUT_DIR}/a.nii.gz"
        "a_ds4.nii.gz"
)


basis_set_tests_properties(
  DownsampleImage2DByte
  DownsampleImage2DByteSmooth
  DownsampleImage3DByte
  DownsampleImage3DByteBy4
  PROPERTIES
    LABELS ImageOperation
)


# ----------------------------------------------------------------------------
# ImageOperation - vector field
basis_add_test(
  ExtractSubfieldFromDeformationField
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_H01_cropped_to_H02_cropped_extractslices3to6.nii.gz"
                "${BASELINE_DIR}/def_H01_cropped_to_H02_cropped_extractslices3to6.nii.gz"
      --
      $<TARGET_FILE:ImageOperation> -v
        -z 3,6
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        def_H01_cropped_to_H02_cropped_extractslices3to6.nii.gz
)

basis_add_test(
  EraseDisplacementsOnSlice
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_H01_cropped_to_H02_cropped_removeslice2.nii.gz"
                "${BASELINE_DIR}/def_H01_cropped_to_H02_cropped_removeslice2.nii.gz"
      --
      $<TARGET_FILE:ImageOperation> -v
        -Z 2
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        def_H01_cropped_to_H02_cropped_removeslice2.nii.gz
)

basis_add_test(
  SmoothDeformationField
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_H01_cropped_to_H02_cropped_smoothed.nii.gz"
                "${BASELINE_DIR}/def_H01_cropped_to_H02_cropped_smoothed.nii.gz"
      --
      $<TARGET_FILE:ImageOperation> -v
        -s 3,2,0.5,0.5
        -s 3,2,0.5,0.5 # smooth twice
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        def_H01_cropped_to_H02_cropped_smoothed.nii.gz
)

#basis_add_test(
#  ClampDisplacementsOfDeformationField
#  COMMAND
#    basis.testdriver
#      --intensity-tolerance 0.01
#      --compare "def_H01_cropped_to_H02_cropped_threshold.nii.gz"
#                #"${BASELINE_DIR}/def_H01_cropped_to_H02_cropped_threshold.nii.gz"
#      --
#      $<TARGET_FILE:ImageOperation> -v
#        -c 4.0,10.0,1.0
#        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
#        def_H01_cropped_to_H02_cropped_threshold.nii.gz
#)


basis_set_tests_properties(
  ExtractSubfieldFromDeformationField
  EraseDisplacementsOnSlice
  SmoothDeformationField
  #ClampDisplacementsOfDeformationField
  PROPERTIES
    LABELS ImageOperation
)


# ----------------------------------------------------------------------------
# TransformOperation
basis_add_test(
  PrintVoxelDisplacement
  COMMAND
    TransformOperation -v
      -c 50,70,5
      "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
)

basis_set_tests_properties (
  PrintVoxelDisplacement
  PROPERTIES
    PASS_REGULAR_EXPRESSION
      "The voxel \\(50\\.000, 70\\.000, 5\\.000\\) is displaced by \\(-13\\.422, 6\\.477, -0\\.259\\)"
)

basis_add_test(
  EstimateInverseDeformationField
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.01
      --compare "def_H01_cropped_to_H02_cropped_reverted.nii.gz"
                "${BASELINE_DIR}/def_H01_cropped_to_H02_cropped_reverted.nii.gz"
      --
      $<TARGET_FILE:TransformOperation> -v
        -i
        "${INPUT_DIR}/def_H01_cropped_to_H02_cropped.nii.gz"
        def_H01_cropped_to_H02_cropped_reverted.nii.gz
)


basis_set_tests_properties(
  PrintVoxelDisplacement
  EstimateInverseDeformationField
  PROPERTIES
    LABELS TransformOperation
)


# ----------------------------------------------------------------------------
# Deform2D
basis_add_test(
  Deform2D
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.5
      --compare "aaa2bbb.nii.gz"
                "${BASELINE_DIR}/aaa2bbb.nii.gz"
          --
      $<TARGET_FILE:Deform2D>
        -r 1
        -b 4
        "${INPUT_DIR}/aaa2D.nii.gz"
        "${INPUT_DIR}/bbb2D.nii.gz"
        "${INPUT_DIR}/feature_"
        aaa2bbb.nii.gz
        def_aaa2bbb.nii.gz
)


basis_set_tests_properties(
  Deform2D
  PROPERTIES
    LABELS Deform2D
)


# ----------------------------------------------------------------------------
# Deform3D
basis_add_test(
  Deform3D_1
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.5
      --compare "H08c_to_H09c.nii.gz"
                "${BASELINE_DIR}/H08c_to_H09c_1.nii.gz"
      --
      $<TARGET_FILE:Deform3D> -v -v
        -r 2
        -b 3,3,2
        "${PROJECT_TESTING_DIR}/input/H08c.nii.gz"
        "${PROJECT_TESTING_DIR}/input/H09c.nii.gz"
        "${INPUT_DIR}/Gabor_"
        H08c_to_H09c.nii.gz
        def_H08c_to_H09c.nii.gz
)

basis_add_test(
  Deform3D_2
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.5
      --compare "H08c_to_H09c.nii.gz"
                "${BASELINE_DIR}/H08c_to_H09c_2.nii.gz"
      --
      $<TARGET_FILE:Deform3D> -v -v
        -r 2
        -b 4,4,3
        -k 3
        -C 0
        -n 8
        -s 0.45
        -g 0.25
        "${PROJECT_TESTING_DIR}/input/H08c.nii.gz"
        "${PROJECT_TESTING_DIR}/input/H09c.nii.gz"
        "${INPUT_DIR}/Gabor_"
        H08c_to_H09c.nii.gz
        def_H08c_to_H09c.nii.gz
)


basis_add_test(
  Deform3D_p
  COMMAND
    basis.testdriver
      --intensity-tolerance 0.5
      --compare "H08c_to_H09c.nii.gz"
                "${BASELINE_DIR}/H08c_to_H09c_p.nii.gz"
      --
      $<TARGET_FILE:Deform3D> -v -v
        -r 2
        -b 4,4,2
        -k 3
        -C 0
        -n 8
        -s 0.45
        -g 0.25
        -p
        -I .
        "${PROJECT_TESTING_DIR}/input/H08c.nii.gz"
        "${PROJECT_TESTING_DIR}/input/H09c.nii.gz"
        "${INPUT_DIR}/Gabor_"
        H08c_to_H09c.nii.gz
        def_H08c_to_H09c.nii.gz
)


basis_set_tests_properties(
  Deform3D_1
  Deform3D_2
  Deform3D_p
  PROPERTIES
    LABELS Deform3D
)



