add_libc_testsuite(libc_math_unittests)

add_fp_unittest(
  cosf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    cosf_test.cpp
  HDRS
    sdcomp26094.h
  DEPENDS
    libc.include.errno
    libc.src.math.cosf
    libc.utils.CPP.standalone_cpp
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  cos_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    cos_test.cpp
  DEPENDS
    libc.src.math.cos
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  sinf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    sinf_test.cpp
  HDRS
    sdcomp26094.h
  DEPENDS
    libc.include.errno
    libc.src.math.sinf
    libc.utils.CPP.standalone_cpp
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  sin_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    sin_test.cpp
  DEPENDS
    libc.src.math.sin
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  sincosf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    sincosf_test.cpp
  HDRS
    sdcomp26094.h
  DEPENDS
    libc.include.errno
    libc.src.math.sincosf
    libc.utils.CPP.standalone_cpp
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fabs_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    fabs_test.cpp
  HDRS
    FAbsTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fabs
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fabsf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    fabsf_test.cpp
  HDRS
    FAbsTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fabsf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fabsl_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    fabsl_test.cpp
  HDRS
    FAbsTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fabsl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  trunc_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    trunc_test.cpp
  HDRS
    TruncTest.h
  DEPENDS
    libc.include.math
    libc.src.math.trunc
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  truncf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    truncf_test.cpp
  HDRS
    TruncTest.h
  DEPENDS
    libc.include.math
    libc.src.math.truncf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  truncl_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    truncl_test.cpp
  HDRS
    TruncTest.h
  DEPENDS
    libc.include.math
    libc.src.math.truncl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  ceil_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    ceil_test.cpp
  HDRS
    CeilTest.h
  DEPENDS
    libc.include.math
    libc.src.math.ceil
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  ceilf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    ceilf_test.cpp
  HDRS
    CeilTest.h
  DEPENDS
    libc.include.math
    libc.src.math.ceilf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  ceill_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    ceill_test.cpp
  HDRS
    CeilTest.h
  DEPENDS
    libc.include.math
    libc.src.math.ceill
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  floor_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    floor_test.cpp
  HDRS
    FloorTest.h
  DEPENDS
    libc.include.math
    libc.src.math.floor
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  floorf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    floorf_test.cpp
  HDRS
    FloorTest.h
  DEPENDS
    libc.include.math
    libc.src.math.floorf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  floorl_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    floorl_test.cpp
  HDRS
    FloorTest.h
  DEPENDS
    libc.include.math
    libc.src.math.floorl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  round_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    round_test.cpp
  HDRS
    RoundTest.h
  DEPENDS
    libc.include.math
    libc.src.math.round
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  roundf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    roundf_test.cpp
  HDRS
    RoundTest.h
  DEPENDS
    libc.include.math
    libc.src.math.roundf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  roundl_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    roundl_test.cpp
  HDRS
    RoundTest.h
  DEPENDS
    libc.include.math
    libc.src.math.roundl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  lround_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    lround_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.errno
    libc.include.math
    libc.src.errno.__errno_location
    libc.src.fenv.feclearexcept
    libc.src.fenv.feraiseexcept
    libc.src.fenv.fetestexcept
    libc.src.math.lround
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  lroundf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    lroundf_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.errno
    libc.include.math
    libc.src.errno.__errno_location
    libc.src.fenv.feclearexcept
    libc.src.fenv.feraiseexcept
    libc.src.fenv.fetestexcept
    libc.src.math.lroundf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  lroundl_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    lroundl_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.errno
    libc.include.math
    libc.src.errno.__errno_location
    libc.src.fenv.feclearexcept
    libc.src.fenv.feraiseexcept
    libc.src.fenv.fetestexcept
    libc.src.math.lroundl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  llround_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    llround_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.errno
    libc.include.math
    libc.src.errno.__errno_location
    libc.src.fenv.feclearexcept
    libc.src.fenv.feraiseexcept
    libc.src.fenv.fetestexcept
    libc.src.math.llround
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  llroundf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    llroundf_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.errno
    libc.include.math
    libc.src.errno.__errno_location
    libc.src.fenv.feclearexcept
    libc.src.fenv.feraiseexcept
    libc.src.fenv.fetestexcept
    libc.src.math.llroundf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  llroundl_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    llroundl_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.errno
    libc.include.math
    libc.src.errno.__errno_location
    libc.src.fenv.feclearexcept
    libc.src.fenv.feraiseexcept
    libc.src.fenv.fetestexcept
    libc.src.math.llroundl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  rint_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    rint_test.cpp
  HDRS
    RIntTest.h
  DEPENDS
    libc.include.math
    libc.src.math.rint
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  rintf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    rintf_test.cpp
  HDRS
    RIntTest.h
  DEPENDS
    libc.include.math
    libc.src.math.rintf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  rintl_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    rintl_test.cpp
  HDRS
    RIntTest.h
  DEPENDS
    libc.include.math
    libc.src.math.rintl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  lrint_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    lrint_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.math
    libc.src.math.lrint
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  lrintf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    lrintf_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.math
    libc.src.math.lrintf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  lrintl_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    lrintl_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.math
    libc.src.math.lrintl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  llrint_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    llrint_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.math
    libc.src.math.llrint
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  llrintf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    llrintf_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.math
    libc.src.math.llrintf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  llrintl_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    llrintl_test.cpp
  HDRS
    RoundToIntegerTest.h
  DEPENDS
    libc.include.math
    libc.src.math.llrintl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  expf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    expf_test.cpp
  DEPENDS
    libc.include.errno
    libc.include.math
    libc.src.math.expf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  exp2f_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    exp2f_test.cpp
  DEPENDS
    libc.include.errno
    libc.include.math
    libc.src.math.exp2f
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  copysign_test
  SUITE
    libc_math_unittests
  SRCS
    copysign_test.cpp
  HDRS
    CopySignTest.h
  DEPENDS
    libc.include.math
    libc.src.math.copysign
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  copysignf_test
  SUITE
    libc_math_unittests
  SRCS
    copysignf_test.cpp
  HDRS
    CopySignTest.h
  DEPENDS
    libc.include.math
    libc.src.math.copysignf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  copysignl_test
  SUITE
    libc_math_unittests
  SRCS
    copysignl_test.cpp
  HDRS
    CopySignTest.h
  DEPENDS
    libc.include.math
    libc.src.math.copysignl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  frexp_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    frexp_test.cpp
  HDRS
    FrexpTest.h
  DEPENDS
    libc.include.math
    libc.src.math.frexp
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  frexpf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    frexpf_test.cpp
  HDRS
    FrexpTest.h
  DEPENDS
    libc.include.math
    libc.src.math.frexpf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  frexpl_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    frexpl_test.cpp
  HDRS
    FrexpTest.h
  DEPENDS
    libc.include.math
    libc.src.math.frexpl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  ilogb_test
  SUITE
    libc_math_unittests
  SRCS
    ilogb_test.cpp
  HDRS
    ILogbTest.h
  DEPENDS
    libc.include.math
    libc.src.math.ilogb
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  ilogbf_test
  SUITE
    libc_math_unittests
  SRCS
    ilogbf_test.cpp
  HDRS
    ILogbTest.h
  DEPENDS
    libc.include.math
    libc.src.math.ilogbf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  ilogbl_test
  SUITE
    libc_math_unittests
  SRCS
    ilogbl_test.cpp
  HDRS
    ILogbTest.h
  DEPENDS
    libc.include.math
    libc.src.math.ilogbl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  ldexp_test
  SUITE
    libc_math_unittests
  SRCS
    ldexp_test.cpp
  HDRS
    LdExpTest.h
  DEPENDS
    libc.include.math
    libc.src.math.ldexp
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  ldexpf_test
  SUITE
    libc_math_unittests
  SRCS
    ldexpf_test.cpp
  HDRS
    LdExpTest.h
  DEPENDS
    libc.include.math
    libc.src.math.ldexpf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  ldexpl_test
  SUITE
    libc_math_unittests
  SRCS
    ldexpl_test.cpp
  HDRS
    LdExpTest.h
  DEPENDS
    libc.include.math
    libc.src.math.ldexpl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  logb_test
  SUITE
    libc_math_unittests
  SRCS
    logb_test.cpp
  DEPENDS
    libc.include.math
    libc.src.math.logb
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  logbf_test
  SUITE
    libc_math_unittests
  SRCS
    logbf_test.cpp
  DEPENDS
    libc.include.math
    libc.src.math.logbf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  logbl_test
  SUITE
    libc_math_unittests
  SRCS
    logbl_test.cpp
  HDRS
    LogbTest.h
  DEPENDS
    libc.include.math
    libc.src.math.logbl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  modf_test
  SUITE
    libc_math_unittests
  SRCS
    modf_test.cpp
  HDRS
    ModfTest.h
  DEPENDS
    libc.include.math
    libc.src.math.modf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  modff_test
  SUITE
    libc_math_unittests
  SRCS
    modff_test.cpp
  HDRS
    ModfTest.h
  DEPENDS
    libc.include.math
    libc.src.math.modff
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  modfl_test
  SUITE
    libc_math_unittests
  SRCS
    modfl_test.cpp
  HDRS
    ModfTest.h
  DEPENDS
    libc.include.math
    libc.src.math.modfl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fdimf_test
  SUITE
    libc_math_unittests
  SRCS
    fdimf_test.cpp
  HDRS
    FDimTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fdimf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fdim_test
  SUITE
    libc_math_unittests
  SRCS
    fdim_test.cpp
  HDRS
    FDimTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fdim
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fdiml_test
  SUITE
    libc_math_unittests
  SRCS
    fdiml_test.cpp
  HDRS
    FDimTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fdiml
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fminf_test
  SUITE
    libc_math_unittests
  SRCS
    fminf_test.cpp
  HDRS
    FMinTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fminf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fmin_test
  SUITE
    libc_math_unittests
  SRCS
    fmin_test.cpp
  HDRS
    FMinTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fmin
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fminl_test
  SUITE
    libc_math_unittests
  SRCS
    fminl_test.cpp
  HDRS
    FMinTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fminl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fmaxf_test
  SUITE
    libc_math_unittests
  SRCS
    fmaxf_test.cpp
  HDRS
    FMaxTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fmaxf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fmax_test
  SUITE
    libc_math_unittests
  SRCS
    fmax_test.cpp
  HDRS
    FMaxTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fmax
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fmaxl_test
  SUITE
    libc_math_unittests
  SRCS
    fmaxl_test.cpp
  HDRS
    FMaxTest.h
  DEPENDS
    libc.include.math
    libc.src.math.fmaxl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  sqrtf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    sqrtf_test.cpp
  DEPENDS
    libc.include.math
    libc.src.math.sqrtf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  sqrt_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    sqrt_test.cpp
  DEPENDS
    libc.include.math
    libc.src.math.sqrt
    libc.utils.FPUtil.fputil
)

# The quad precision test for sqrt against MPFR currently suffers
# from insufficient precision in MPFR calculations leading to
# https://hal.archives-ouvertes.fr/hal-01091186/document. We will
# renable after fixing the precision issue.
if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
  add_fp_unittest(
    sqrtl_test
    NEED_MPFR
    SUITE
      libc_math_unittests
    SRCS
      sqrtl_test.cpp
    DEPENDS
      libc.include.math
      libc.src.math.sqrtl
      libc.utils.FPUtil.fputil
  )
else()
  message(STATUS "Skipping sqrtl_test")
endif()

add_fp_unittest(
  remquof_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    remquof_test.cpp
  HDRS
    RemQuoTest.h
  DEPENDS
    libc.include.math
    libc.src.math.remquof
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  remquo_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    remquo_test.cpp
  HDRS
    RemQuoTest.h
  DEPENDS
    libc.include.math
    libc.src.math.remquo
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  remquol_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    remquol_test.cpp
  HDRS
    RemQuoTest.h
  DEPENDS
    libc.include.math
    libc.src.math.remquol
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  hypotf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    hypotf_test.cpp
  DEPENDS
    libc.include.math
    libc.src.math.hypotf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  hypot_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    hypot_test.cpp
  DEPENDS
    libc.include.math
    libc.src.math.hypot
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  nextafter_test
  SUITE
    libc_math_unittests
  SRCS
    nextafter_test.cpp
  HDRS
    NextAfterTest.h
  DEPENDS
    libc.include.math
    libc.src.math.nextafter
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  nextafterf_test
  SUITE
    libc_math_unittests
  SRCS
    nextafterf_test.cpp
  HDRS
    NextAfterTest.h
  DEPENDS
    libc.include.math
    libc.src.math.nextafterf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  nextafterl_test
  SUITE
    libc_math_unittests
  SRCS
    nextafterl_test.cpp
  HDRS
    NextAfterTest.h
  DEPENDS
    libc.include.math
    libc.src.math.nextafterl
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fmaf_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    fmaf_test.cpp
  DEPENDS
    libc.include.math
    libc.src.math.fmaf
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  fma_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    fma_test.cpp
  DEPENDS
    libc.include.math
    libc.src.math.fma
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  tan_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    tan_test.cpp
  DEPENDS
    libc.src.math.tan
    libc.utils.FPUtil.fputil
)

add_fp_unittest(
  expm1f_test
  NEED_MPFR
  SUITE
    libc_math_unittests
  SRCS
    expm1f_test.cpp
  DEPENDS
    libc.include.errno
    libc.include.math
    libc.src.math.expm1f
    libc.utils.FPUtil.fputil
)

add_subdirectory(generic)
add_subdirectory(exhaustive)
add_subdirectory(differential_testing)
