#include <gtest/gtest.h>

#include <torch/torch.h>
#include <ATen/native/Pow.h>
#include <torch/types.h>
#include <torch/utils.h>
#include <test/cpp/api/support.h>
#include <iostream>
#include <vector>
#include <type_traits>
#include <cstdlib>


struct DispatchTest : torch::test::SeedingFixture {};

TEST_F(DispatchTest, TestAVX2) {
  const std::vector<int> ints {1, 2, 3, 4};
  const std::vector<int> result {1, 4, 27, 256};
  const auto vals_tensor = torch::tensor(ints);
  const auto pows_tensor = torch::tensor(ints);
#ifdef _WIN32
  _putenv("ATEN_CPU_CAPABILITY=avx2");
#else
  setenv("ATEN_CPU_CAPABILITY", "avx2", 1);
#endif
  const auto actual_pow_avx2 = vals_tensor.pow(pows_tensor);
  for (int i = 0; i < 4; i++) {
    ASSERT_EQ(result[i], actual_pow_avx2[i].item<int>());
  }
}

TEST_F(DispatchTest, TestAVX) {
  const std::vector<int> ints {1, 2, 3, 4};
  const std::vector<int> result {1, 4, 27, 256};
  const auto vals_tensor = torch::tensor(ints);
  const auto pows_tensor = torch::tensor(ints);
#ifdef _WIN32
  _putenv("ATEN_CPU_CAPABILITY=avx");
#else
  setenv("ATEN_CPU_CAPABILITY", "avx", 1);
#endif
  const auto actual_pow_avx = vals_tensor.pow(pows_tensor);
  for (int i = 0; i < 4; i++) {
    ASSERT_EQ(result[i], actual_pow_avx[i].item<int>());
  }
}

TEST_F(DispatchTest, TestDefault) {
  const std::vector<int> ints {1, 2, 3, 4};
  const std::vector<int> result {1, 4, 27, 256};
  const auto vals_tensor = torch::tensor(ints);
  const auto pows_tensor = torch::tensor(ints);
#ifdef _WIN32
  _putenv("ATEN_CPU_CAPABILITY=default");
#else
  setenv("ATEN_CPU_CAPABILITY", "default", 1);
#endif
  const auto actual_pow_default = vals_tensor.pow(pows_tensor);
  for (int i = 0; i < 4; i++) {
    ASSERT_EQ(result[i], actual_pow_default[i].item<int>());
  }
}
