// 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/builtin.h"

#include "gtest/gtest.h"

namespace tint {
namespace sem {
namespace {

struct BuiltinData {
  const char* name;
  BuiltinType builtin;
};

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

using BuiltinTypeTest = testing::TestWithParam<BuiltinData>;

TEST_P(BuiltinTypeTest, Parse) {
  auto param = GetParam();
  EXPECT_EQ(ParseBuiltinType(param.name), param.builtin);
}

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

TEST_F(BuiltinTypeTest, ParseNoMatch) {
  EXPECT_EQ(ParseBuiltinType("not_builtin"), BuiltinType::kNone);
}

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