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

#include "gtest/gtest.h"

namespace tint::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{"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{"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 tint::sem
