/*
 * Copyright (c) 2021, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 3-Clause Clear License
 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
 * License was not distributed with this source code in the LICENSE file, you
 * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  If the
 * Alliance for Open Media Patent License 1.0 was not distributed with this
 * source code in the PATENTS file, you can obtain it at
 * aomedia.org/license/patent-license/.
 */
#include <tuple>

#include "third_party/googletest/src/googletest/include/gtest/gtest.h"
#include "test/warp_filter_test_util.h"
using libaom_test::ACMRandom;
#if CONFIG_EXT_WARP_FILTER
using libaom_test::AV1ExtHighbdWarpFilter::AV1ExtHighbdWarpFilterTest;
#endif  // CONFIG_EXT_WARP_FILTER
using libaom_test::AV1HighbdWarpFilter::AV1HighbdWarpFilterTest;
#if CONFIG_AFFINE_REFINEMENT
using libaom_test::AV1HighbdWarpBilinearFilter::AV1HighbdWarpBilinearFilterTest;
#endif  // CONFIG_AFFINE_REFINEMENT
using std::make_tuple;
using std::tuple;

namespace {

#if HAVE_SSE4_1
TEST_P(AV1HighbdWarpFilterTest, CheckOutput) {
  RunCheckOutput(std::get<4>(GET_PARAM(0)));
}
TEST_P(AV1HighbdWarpFilterTest, DISABLED_Speed) {
  RunSpeedTest(std::get<4>(GET_PARAM(0)));
}

INSTANTIATE_TEST_SUITE_P(SSE4_1, AV1HighbdWarpFilterTest,
                         libaom_test::AV1HighbdWarpFilter::BuildParams(
                             av1_highbd_warp_affine_sse4_1));
#if CONFIG_EXT_WARP_FILTER
TEST_P(AV1ExtHighbdWarpFilterTest, CheckOutput) {
  RunCheckOutput(::testing::get<4>(GET_PARAM(0)));
}
TEST_P(AV1ExtHighbdWarpFilterTest, DISABLED_Speed) {
  RunSpeedTest(::testing::get<4>(GET_PARAM(0)));
}

INSTANTIATE_TEST_SUITE_P(SSE4_1, AV1ExtHighbdWarpFilterTest,
                         libaom_test::AV1ExtHighbdWarpFilter::BuildParams(
                             av1_ext_highbd_warp_affine_sse4_1));
#endif  // CONFIG_EXT_WARP_FILTER
#endif  // HAVE_SSE4_1

#if HAVE_AVX2
INSTANTIATE_TEST_SUITE_P(
    AVX2, AV1HighbdWarpFilterTest,
    libaom_test::AV1HighbdWarpFilter::BuildParams(av1_highbd_warp_affine_avx2));

#endif  // HAVE_AVX2

}  // namespace

#if CONFIG_AFFINE_REFINEMENT
#if AFFINE_FAST_WARP_METHOD == 3
TEST_P(AV1HighbdWarpBilinearFilterTest, DISABLED_Speed) {
  RunSpeedTest(std::get<4>(GET_PARAM(0)));
}

TEST_P(AV1HighbdWarpBilinearFilterTest, CheckOutput) {
  RunCheckOutput(std::get<4>(GET_PARAM(0)));
}
#if HAVE_AVX2
INSTANTIATE_TEST_SUITE_P(AVX2, AV1HighbdWarpBilinearFilterTest,
                         libaom_test::AV1HighbdWarpBilinearFilter::BuildParams(
                             av1_warp_plane_bilinear_avx2));
#endif  // HAVE_AVX2
#endif  // AFFINE_FAST_WARP_METHOD == 3
#endif  // CONFIG_AFFINE_REFINEMENT
