// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <cstring>

#include "starboard/cpu_features.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace starboard {
namespace nplb {
namespace {

#if SB_API_VERSION >= 11

constexpr int kFeatureValueInvalid = -1;

void ExpectArmInvalid(const SbCPUFeatures& features) {
  EXPECT_EQ(kFeatureValueInvalid, features.arm.implementer);
  EXPECT_EQ(kFeatureValueInvalid, features.arm.variant);
  EXPECT_EQ(kFeatureValueInvalid, features.arm.revision);
  EXPECT_EQ(kFeatureValueInvalid, features.arm.architecture_generation);
  EXPECT_EQ(kFeatureValueInvalid, features.arm.part);

  EXPECT_EQ(false, features.arm.has_neon);
  EXPECT_EQ(false, features.arm.has_thumb2);
  EXPECT_EQ(false, features.arm.has_vfp);
  EXPECT_EQ(false, features.arm.has_vfp3);
  EXPECT_EQ(false, features.arm.has_vfp3_d32);
  EXPECT_EQ(false, features.arm.has_idiva);
  EXPECT_EQ(false, features.arm.has_aes);
  EXPECT_EQ(false, features.arm.has_crc32);
  EXPECT_EQ(false, features.arm.has_sha1);
  EXPECT_EQ(false, features.arm.has_sha2);
  EXPECT_EQ(false, features.arm.has_pmull);
}

void ExpectMipsInvalid(const SbCPUFeatures& features) {
  EXPECT_EQ(false, features.mips_arch.has_msa);
}

void ExpectX86Invalid(const SbCPUFeatures& features) {
  EXPECT_NE(nullptr, features.x86.vendor);
  EXPECT_EQ(0, strlen(features.x86.vendor));
  EXPECT_EQ(kFeatureValueInvalid, features.x86.family);
  EXPECT_EQ(kFeatureValueInvalid, features.x86.ext_family);
  EXPECT_EQ(kFeatureValueInvalid, features.x86.model);
  EXPECT_EQ(kFeatureValueInvalid, features.x86.ext_model);
  EXPECT_EQ(kFeatureValueInvalid, features.x86.stepping);
  EXPECT_EQ(kFeatureValueInvalid, features.x86.type);
  EXPECT_EQ(kFeatureValueInvalid, features.x86.signature);

  EXPECT_EQ(false, features.x86.has_cmov);
  EXPECT_EQ(false, features.x86.has_mmx);
  EXPECT_EQ(false, features.x86.has_sse);
  EXPECT_EQ(false, features.x86.has_sse2);
  EXPECT_EQ(false, features.x86.has_tsc);
  EXPECT_EQ(false, features.x86.has_sse3);
#if SB_API_VERSION >= 12
  EXPECT_EQ(false, features.x86.has_pclmulqdq);
#endif  // SB_API_VERSION >= 12
  EXPECT_EQ(false, features.x86.has_ssse3);
  EXPECT_EQ(false, features.x86.has_sse41);
  EXPECT_EQ(false, features.x86.has_sse42);
  EXPECT_EQ(false, features.x86.has_movbe);
  EXPECT_EQ(false, features.x86.has_popcnt);
  EXPECT_EQ(false, features.x86.has_osxsave);
  EXPECT_EQ(false, features.x86.has_avx);
  EXPECT_EQ(false, features.x86.has_f16c);
  EXPECT_EQ(false, features.x86.has_fma3);
  EXPECT_EQ(false, features.x86.has_aesni);
  EXPECT_EQ(false, features.x86.has_avx2);
  EXPECT_EQ(false, features.x86.has_avx512f);
  EXPECT_EQ(false, features.x86.has_avx512dq);
  EXPECT_EQ(false, features.x86.has_avx512ifma);
  EXPECT_EQ(false, features.x86.has_avx512pf);
  EXPECT_EQ(false, features.x86.has_avx512er);
  EXPECT_EQ(false, features.x86.has_avx512cd);
  EXPECT_EQ(false, features.x86.has_avx512bw);
  EXPECT_EQ(false, features.x86.has_avx512vl);
  EXPECT_EQ(false, features.x86.has_bmi1);
  EXPECT_EQ(false, features.x86.has_bmi2);
  EXPECT_EQ(false, features.x86.has_lzcnt);
  EXPECT_EQ(false, features.x86.has_sahf);
}

TEST(SbCPUFeaturesGetTest, SunnyDay) {
  SbCPUFeatures features;

  bool result = SbCPUFeaturesGet(&features);
  if (!result) {
    EXPECT_EQ(kSbCPUFeaturesArchitectureUnknown, features.architecture);
    EXPECT_NE(nullptr, features.brand);
    EXPECT_EQ(0, strlen(features.brand));
    EXPECT_EQ(kFeatureValueInvalid, features.icache_line_size);
    EXPECT_EQ(kFeatureValueInvalid, features.dcache_line_size);
    EXPECT_FALSE(features.has_fpu);
    EXPECT_EQ(0, features.hwcap);
    EXPECT_EQ(0, features.hwcap2);
    ExpectArmInvalid(features);
    ExpectMipsInvalid(features);
    ExpectX86Invalid(features);
    return;
  } else {
    // If the architecture is unknown, SbCPUFeaturesGet() must return
    // false.
    EXPECT_NE(kSbCPUFeaturesArchitectureUnknown, features.architecture);

#if SB_IS(ARCH_ARM) || SB_IS(ARCH_ARM64)
    EXPECT_TRUE(features.architecture == kSbCPUFeaturesArchitectureArm ||
                features.architecture == kSbCPUFeaturesArchitectureArm64);
#else   // !SB_IS(ARCH_ARM) && !SB_IS(ARCH_ARM64)
    ExpectArmInvalid(features);
#endif  // SB_IS(ARCH_ARM) || SB_IS(ARCH_ARM64)

#if SB_IS(ARCH_X86) || SB_IS(ARCH_X64)
    EXPECT_TRUE(features.architecture == kSbCPUFeaturesArchitectureX86 ||
                features.architecture == kSbCPUFeaturesArchitectureX86_64);
#else   // !SB_IS(ARCH_X86) && !SB_IS(ARCH_X64)
    ExpectX86Invalid(features);
#endif  // SB_IS(ARCH_X86) || SB_IS(ARCH_X64)

    ExpectMipsInvalid(features);
  }
}

#endif  // SB_API_VERSION >= 11

}  // namespace
}  // namespace nplb
}  // namespace starboard
