// Copyright 2021 The Tint Authors.
//
// 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 "src/sem/intrinsic.h"

#include "gtest/gtest.h"

namespace tint {
namespace sem {
namespace {

struct IntrinsicData {
  const char* name;
  IntrinsicType intrinsic;
};

inline std::ostream& operator<<(std::ostream& out, IntrinsicData data) {
  out << data.name;
  return out;
}

using IntrinsicTypeTest = testing::TestWithParam<IntrinsicData>;

TEST_P(IntrinsicTypeTest, Parse) {
  auto param = GetParam();
  EXPECT_EQ(ParseIntrinsicType(param.name), param.intrinsic);
}

INSTANTIATE_TEST_SUITE_P(
    IntrinsicTypeTest,
    IntrinsicTypeTest,
    testing::Values(
        IntrinsicData{"abs", IntrinsicType::kAbs},
        IntrinsicData{"acos", IntrinsicType::kAcos},
        IntrinsicData{"all", IntrinsicType::kAll},
        IntrinsicData{"any", IntrinsicType::kAny},
        IntrinsicData{"arrayLength", IntrinsicType::kArrayLength},
        IntrinsicData{"asin", IntrinsicType::kAsin},
        IntrinsicData{"atan", IntrinsicType::kAtan},
        IntrinsicData{"atan2", IntrinsicType::kAtan2},
        IntrinsicData{"ceil", IntrinsicType::kCeil},
        IntrinsicData{"clamp", IntrinsicType::kClamp},
        IntrinsicData{"cos", IntrinsicType::kCos},
        IntrinsicData{"cosh", IntrinsicType::kCosh},
        IntrinsicData{"countOneBits", IntrinsicType::kCountOneBits},
        IntrinsicData{"cross", IntrinsicType::kCross},
        IntrinsicData{"determinant", IntrinsicType::kDeterminant},
        IntrinsicData{"distance", IntrinsicType::kDistance},
        IntrinsicData{"dot", IntrinsicType::kDot},
        IntrinsicData{"dpdx", IntrinsicType::kDpdx},
        IntrinsicData{"dpdxCoarse", IntrinsicType::kDpdxCoarse},
        IntrinsicData{"dpdxFine", IntrinsicType::kDpdxFine},
        IntrinsicData{"dpdy", IntrinsicType::kDpdy},
        IntrinsicData{"dpdyCoarse", IntrinsicType::kDpdyCoarse},
        IntrinsicData{"dpdyFine", IntrinsicType::kDpdyFine},
        IntrinsicData{"exp", IntrinsicType::kExp},
        IntrinsicData{"exp2", IntrinsicType::kExp2},
        IntrinsicData{"faceForward", IntrinsicType::kFaceForward},
        IntrinsicData{"floor", IntrinsicType::kFloor},
        IntrinsicData{"fma", IntrinsicType::kFma},
        IntrinsicData{"fract", IntrinsicType::kFract},
        IntrinsicData{"frexp", IntrinsicType::kFrexp},
        IntrinsicData{"fwidth", IntrinsicType::kFwidth},
        IntrinsicData{"fwidthCoarse", IntrinsicType::kFwidthCoarse},
        IntrinsicData{"fwidthFine", IntrinsicType::kFwidthFine},
        IntrinsicData{"inverseSqrt", IntrinsicType::kInverseSqrt},
        IntrinsicData{"isFinite", IntrinsicType::kIsFinite},
        IntrinsicData{"isInf", IntrinsicType::kIsInf},
        IntrinsicData{"isNan", IntrinsicType::kIsNan},
        IntrinsicData{"isNormal", IntrinsicType::kIsNormal},
        IntrinsicData{"ldexp", IntrinsicType::kLdexp},
        IntrinsicData{"length", IntrinsicType::kLength},
        IntrinsicData{"log", IntrinsicType::kLog},
        IntrinsicData{"log2", IntrinsicType::kLog2},
        IntrinsicData{"max", IntrinsicType::kMax},
        IntrinsicData{"min", IntrinsicType::kMin},
        IntrinsicData{"mix", IntrinsicType::kMix},
        IntrinsicData{"modf", IntrinsicType::kModf},
        IntrinsicData{"normalize", IntrinsicType::kNormalize},
        IntrinsicData{"pow", IntrinsicType::kPow},
        IntrinsicData{"reflect", IntrinsicType::kReflect},
        IntrinsicData{"reverseBits", IntrinsicType::kReverseBits},
        IntrinsicData{"round", IntrinsicType::kRound},
        IntrinsicData{"select", IntrinsicType::kSelect},
        IntrinsicData{"sign", IntrinsicType::kSign},
        IntrinsicData{"sin", IntrinsicType::kSin},
        IntrinsicData{"sinh", IntrinsicType::kSinh},
        IntrinsicData{"smoothStep", IntrinsicType::kSmoothStep},
        IntrinsicData{"sqrt", IntrinsicType::kSqrt},
        IntrinsicData{"step", IntrinsicType::kStep},
        IntrinsicData{"storageBarrier", IntrinsicType::kStorageBarrier},
        IntrinsicData{"tan", IntrinsicType::kTan},
        IntrinsicData{"tanh", IntrinsicType::kTanh},
        IntrinsicData{"textureDimensions", IntrinsicType::kTextureDimensions},
        IntrinsicData{"textureLoad", IntrinsicType::kTextureLoad},
        IntrinsicData{"textureNumLayers", IntrinsicType::kTextureNumLayers},
        IntrinsicData{"textureNumLevels", IntrinsicType::kTextureNumLevels},
        IntrinsicData{"textureNumSamples", IntrinsicType::kTextureNumSamples},
        IntrinsicData{"textureSample", IntrinsicType::kTextureSample},
        IntrinsicData{"textureSampleBias", IntrinsicType::kTextureSampleBias},
        IntrinsicData{"textureSampleCompare",
                      IntrinsicType::kTextureSampleCompare},
        IntrinsicData{"textureSampleCompareLevel",
                      IntrinsicType::kTextureSampleCompareLevel},
        IntrinsicData{"textureSampleGrad", IntrinsicType::kTextureSampleGrad},
        IntrinsicData{"textureSampleLevel", IntrinsicType::kTextureSampleLevel},
        IntrinsicData{"trunc", IntrinsicType::kTrunc},
        IntrinsicData{"unpack2x16float", IntrinsicType::kUnpack2x16float},
        IntrinsicData{"unpack2x16snorm", IntrinsicType::kUnpack2x16snorm},
        IntrinsicData{"unpack2x16unorm", IntrinsicType::kUnpack2x16unorm},
        IntrinsicData{"unpack4x8snorm", IntrinsicType::kUnpack4x8snorm},
        IntrinsicData{"unpack4x8unorm", IntrinsicType::kUnpack4x8unorm},
        IntrinsicData{"workgroupBarrier", IntrinsicType::kWorkgroupBarrier}));

TEST_F(IntrinsicTypeTest, ParseNoMatch) {
  EXPECT_EQ(ParseIntrinsicType("not_intrinsic"), IntrinsicType::kNone);
}

}  // namespace
}  // namespace sem
}  // namespace tint
