#!/bin/bash
set -efu

PYS=${PYS:-"$(py3versions -s 2>/dev/null)"}
TESTMODE=${TESTMODE:-full}
TESTPKG=${TESTPKG:-}
export HOME=$AUTOPKGTEST_TMP
export TMPDIR=$AUTOPKGTEST_TMP

SUBMODULE=
if [ "x${TESTPKG}" != "x" ]; then
    SUBMODULE="-s ${TESTPKG}";
fi

MODE=
if [ "x${TESTMODE}" != "xfull" ]; then
    MODE="-m full";
fi

# some tests are expected to fail
# so list tests to skip in array variable SKIP_TEST_LIST
declare -a SKIP_TEST_LIST

# some arches fail some tests with specific BLAS implementations
# Bug#1003880: skip test_hermitian_modes with blis on i386 (sparse.linalg._eigen.arpack)
arch=$(dpkg-architecture -qDEB_HOST_ARCH)
ma=$(dpkg-architecture -qDEB_HOST_MULTIARCH)
DEB_HOST_ARCH_BITS=$(dpkg-architecture -q DEB_HOST_ARCH_BITS)
if [ "$arch" = "arm64" ] && update-alternatives --query libblas.so.3-$ma | sed -n "/^Value:/p" | grep -q blis ; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_atol[cgs])
fi
if [ "$arch" = "i386" ] && update-alternatives --query libblas.so.3-$ma | sed -n "/^Value:/p" | grep -q blis ; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_hermitian_modes test_complex_nonsymmetric_modes test_standard_nonsymmetric_starting_vector test_general_nonsymmetric_starting_vector test_svd_linop test_complex)
fi
if [ "$arch" = "armhf" ] && update-alternatives --query libblas.so.3-$ma | sed -n "/^Value:/p" | grep -q openblas ; then
    # test_large_rank_deficient in scipy/optimize/tests/test_lsq_linear.py times out or segfaults with openblas on armhf
    # and other TestTRF tests time out
    # test_disp in optimize/tests/test_linprog.py times out with openblas on armhf
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_large_rank_deficient TestTRF test_disp test_m_eq_n_sparse test_magic_square2 test_numerical_jac test_with_bounds test_bvp test_solver_selection)
fi
if [ "$arch" = "armhf" ] && update-alternatives --query libblas.so.3-$ma | sed -n "/^Value:/p" | grep -q atlas ; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_aligned_mem)
fi
# segfaults in test_lsq_linear.py::TestBVLS
# see https://ci.debian.net/data/autopkgtest/testing/armhf/s/scipy/25114019/log.gz
if [ "$arch" = "armhf" ] && update-alternatives --query libblas.so.3-$ma | sed -n "/^Value:/p" | grep -q blis ; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_large_rank_deficient)
fi

if [ "$arch" = "armel" ]; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_aligned_mem test_decomp)
fi

# Bug#1017864 test_kolmogorov.py segfaults on i386 (including hurd)
if [ "$arch" = "i386" ] || [ "$arch" = "hurd-i386" ]; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} TestSmirnovp)
fi

# integrate/_ivp/tests/test_ivp.py fail on mips64el
# see https://github.com/scipy/scipy/issues/16883
if [ "$arch" = "mips64el" ]; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_first_step test_classes)
fi

if [ "$arch" = "ppc64el" ]; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_cossin test_cossin_separate testInitialization)
fi

if [ "$arch" = "s390x" ]; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_aligned_mem)
fi

if [ "$arch" = "ppc64el" ] || [ "$arch" = "arm64" ]; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_svds_parameter_tol)
fi

if [ "$arch" = "ppc64el" ] && update-alternatives --query libblas.so.3-$ma | sed -n "/^Value:/p" | grep -q atlas ; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_bug_6139 test_svd_v0 test_svd_random_state test_svd_random_state_2)
fi
if [ "$arch" = "s390x" ] && update-alternatives --query libblas.so.3-$ma | sed -n "/^Value:/p" | grep -q atlas ; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_bug_6139 test_solver_select)
fi

# avoid segfaults and other failures on riscv64
if [ "$arch" = "riscv64" ]; then
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_kmeans2_high_dim test_krandinit test_kmeans2_kpp_high_dim)
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_banded_ode_solvers test_singular_term test_vode test_zvode test_odeint_banded_jacobian test_odeint_banded_jac)
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_vector test_iterative_refinements_dense)
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_sine_weighted_finite test_sine_weighted_infinite test_cosine_weighted_infinite)
    SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_scalar test_integrate_ppoly test_compare_dense_and_sparse)
fi


# stats/tests/test_continuous_basic.py::test_cont_basic[500-200-ncf-arg74] test fails with IntegrationWarning
# https://github.com/scipy/scipy/issues/14519
SKIP_TEST_LIST=(${SKIP_TEST_LIST[@]} test_cont_basic[500-200-ncf-arg74])

SKIP_TESTS=""
list_initialised=0
for t in ${SKIP_TEST_LIST[@]}; do
    if [ ${list_initialised} = 0 ]; then
	SKIP_TESTS=$t
	list_initialised=1
    else
	SKIP_TESTS="${SKIP_TESTS} or $t"
    fi
done
if [ "x${SKIP_TESTS}" != "x" ]; then
    SKIP_TESTS="not ( ${SKIP_TESTS} )"
fi
echo "skipping tests with SKIP_TEST_LIST=${SKIP_SKIP_TEST_LIST[@]}"

for py in $PYS; do
    echo "=== Testing: $py $TESTPKG ==="
    $py runtests.py -n -v ${MODE} ${SUBMODULE} -- -k "${SKIP_TESTS}" 2>&1
    echo "=== Done: $py $TESTPKG ==="
done
