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

#include "gmock/gmock.h"
#include "src/tint/program_builder.h"
#include "src/tint/sem/atomic_type.h"
#include "src/tint/sem/depth_multisampled_texture_type.h"
#include "src/tint/sem/depth_texture_type.h"
#include "src/tint/sem/external_texture_type.h"
#include "src/tint/sem/multisampled_texture_type.h"
#include "src/tint/sem/reference_type.h"
#include "src/tint/sem/sampled_texture_type.h"
#include "src/tint/sem/storage_texture_type.h"

namespace tint {
namespace {

using ::testing::HasSubstr;

using BuiltinType = sem::BuiltinType;
using Parameter = sem::Parameter;
using ParameterUsage = sem::ParameterUsage;

class BuiltinTableTest : public testing::Test, public ProgramBuilder {
 public:
  std::unique_ptr<BuiltinTable> table = BuiltinTable::Create(*this);
};

TEST_F(BuiltinTableTest, MatchF32) {
  auto* f32 = create<sem::F32>();
  auto* result = table->Lookup(BuiltinType::kCos, {f32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kCos);
  EXPECT_EQ(result->ReturnType(), f32);
  ASSERT_EQ(result->Parameters().size(), 1u);
  EXPECT_EQ(result->Parameters()[0]->Type(), f32);
}

TEST_F(BuiltinTableTest, MismatchF32) {
  auto* i32 = create<sem::I32>();
  auto* result = table->Lookup(BuiltinType::kCos, {i32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchU32) {
  auto* f32 = create<sem::F32>();
  auto* u32 = create<sem::U32>();
  auto* vec2_f32 = create<sem::Vector>(f32, 2);
  auto* result = table->Lookup(BuiltinType::kUnpack2x16float, {u32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kUnpack2x16float);
  EXPECT_EQ(result->ReturnType(), vec2_f32);
  ASSERT_EQ(result->Parameters().size(), 1u);
  EXPECT_EQ(result->Parameters()[0]->Type(), u32);
}

TEST_F(BuiltinTableTest, MismatchU32) {
  auto* f32 = create<sem::F32>();
  auto* result = table->Lookup(BuiltinType::kUnpack2x16float, {f32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchI32) {
  auto* f32 = create<sem::F32>();
  auto* i32 = create<sem::I32>();
  auto* vec4_f32 = create<sem::Vector>(f32, 4);
  auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k1d, f32);
  auto* result =
      table->Lookup(BuiltinType::kTextureLoad, {tex, i32, i32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kTextureLoad);
  EXPECT_EQ(result->ReturnType(), vec4_f32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), tex);
  EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture);
  EXPECT_EQ(result->Parameters()[1]->Type(), i32);
  EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords);
  EXPECT_EQ(result->Parameters()[2]->Type(), i32);
  EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kLevel);
}

TEST_F(BuiltinTableTest, MismatchI32) {
  auto* f32 = create<sem::F32>();
  auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k1d, f32);
  auto* result = table->Lookup(BuiltinType::kTextureLoad, {tex, f32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchIU32AsI32) {
  auto* i32 = create<sem::I32>();
  auto* result = table->Lookup(BuiltinType::kCountOneBits, {i32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kCountOneBits);
  EXPECT_EQ(result->ReturnType(), i32);
  ASSERT_EQ(result->Parameters().size(), 1u);
  EXPECT_EQ(result->Parameters()[0]->Type(), i32);
}

TEST_F(BuiltinTableTest, MatchIU32AsU32) {
  auto* u32 = create<sem::U32>();
  auto* result = table->Lookup(BuiltinType::kCountOneBits, {u32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kCountOneBits);
  EXPECT_EQ(result->ReturnType(), u32);
  ASSERT_EQ(result->Parameters().size(), 1u);
  EXPECT_EQ(result->Parameters()[0]->Type(), u32);
}

TEST_F(BuiltinTableTest, MismatchIU32) {
  auto* f32 = create<sem::F32>();
  auto* result = table->Lookup(BuiltinType::kCountOneBits, {f32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchFIU32AsI32) {
  auto* i32 = create<sem::I32>();
  auto* result = table->Lookup(BuiltinType::kClamp, {i32, i32, i32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kClamp);
  EXPECT_EQ(result->ReturnType(), i32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), i32);
  EXPECT_EQ(result->Parameters()[1]->Type(), i32);
  EXPECT_EQ(result->Parameters()[2]->Type(), i32);
}

TEST_F(BuiltinTableTest, MatchFIU32AsU32) {
  auto* u32 = create<sem::U32>();
  auto* result = table->Lookup(BuiltinType::kClamp, {u32, u32, u32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kClamp);
  EXPECT_EQ(result->ReturnType(), u32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), u32);
  EXPECT_EQ(result->Parameters()[1]->Type(), u32);
  EXPECT_EQ(result->Parameters()[2]->Type(), u32);
}

TEST_F(BuiltinTableTest, MatchFIU32AsF32) {
  auto* f32 = create<sem::F32>();
  auto* result = table->Lookup(BuiltinType::kClamp, {f32, f32, f32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kClamp);
  EXPECT_EQ(result->ReturnType(), f32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), f32);
  EXPECT_EQ(result->Parameters()[1]->Type(), f32);
  EXPECT_EQ(result->Parameters()[2]->Type(), f32);
}

TEST_F(BuiltinTableTest, MismatchFIU32) {
  auto* bool_ = create<sem::Bool>();
  auto* result =
      table->Lookup(BuiltinType::kClamp, {bool_, bool_, bool_}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchBool) {
  auto* f32 = create<sem::F32>();
  auto* bool_ = create<sem::Bool>();
  auto* result =
      table->Lookup(BuiltinType::kSelect, {f32, f32, bool_}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kSelect);
  EXPECT_EQ(result->ReturnType(), f32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), f32);
  EXPECT_EQ(result->Parameters()[1]->Type(), f32);
  EXPECT_EQ(result->Parameters()[2]->Type(), bool_);
}

TEST_F(BuiltinTableTest, MismatchBool) {
  auto* f32 = create<sem::F32>();
  auto* result = table->Lookup(BuiltinType::kSelect, {f32, f32, f32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchPointer) {
  auto* i32 = create<sem::I32>();
  auto* atomicI32 = create<sem::Atomic>(i32);
  auto* ptr = create<sem::Pointer>(atomicI32, ast::StorageClass::kWorkgroup,
                                   ast::Access::kReadWrite);
  auto* result = table->Lookup(BuiltinType::kAtomicLoad, {ptr}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kAtomicLoad);
  EXPECT_EQ(result->ReturnType(), i32);
  ASSERT_EQ(result->Parameters().size(), 1u);
  EXPECT_EQ(result->Parameters()[0]->Type(), ptr);
}

TEST_F(BuiltinTableTest, MismatchPointer) {
  auto* i32 = create<sem::I32>();
  auto* atomicI32 = create<sem::Atomic>(i32);
  auto* result = table->Lookup(BuiltinType::kAtomicLoad, {atomicI32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchArray) {
  auto* arr = create<sem::Array>(create<sem::U32>(), 0, 4, 4, 4, 4);
  auto* arr_ptr = create<sem::Pointer>(arr, ast::StorageClass::kStorage,
                                       ast::Access::kReadWrite);
  auto* result = table->Lookup(BuiltinType::kArrayLength, {arr_ptr}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kArrayLength);
  EXPECT_TRUE(result->ReturnType()->Is<sem::U32>());
  ASSERT_EQ(result->Parameters().size(), 1u);
  auto* param_type = result->Parameters()[0]->Type();
  ASSERT_TRUE(param_type->Is<sem::Pointer>());
  EXPECT_TRUE(param_type->As<sem::Pointer>()->StoreType()->Is<sem::Array>());
}

TEST_F(BuiltinTableTest, MismatchArray) {
  auto* f32 = create<sem::F32>();
  auto* result = table->Lookup(BuiltinType::kArrayLength, {f32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchSampler) {
  auto* f32 = create<sem::F32>();
  auto* vec2_f32 = create<sem::Vector>(f32, 2);
  auto* vec4_f32 = create<sem::Vector>(f32, 4);
  auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32);
  auto* sampler = create<sem::Sampler>(ast::SamplerKind::kSampler);
  auto* result = table->Lookup(BuiltinType::kTextureSample,
                               {tex, sampler, vec2_f32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kTextureSample);
  EXPECT_EQ(result->ReturnType(), vec4_f32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), tex);
  EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture);
  EXPECT_EQ(result->Parameters()[1]->Type(), sampler);
  EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kSampler);
  EXPECT_EQ(result->Parameters()[2]->Type(), vec2_f32);
  EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kCoords);
}

TEST_F(BuiltinTableTest, MismatchSampler) {
  auto* f32 = create<sem::F32>();
  auto* vec2_f32 = create<sem::Vector>(f32, 2);
  auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32);
  auto* result = table->Lookup(BuiltinType::kTextureSample,
                               {tex, f32, vec2_f32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchSampledTexture) {
  auto* i32 = create<sem::I32>();
  auto* f32 = create<sem::F32>();
  auto* vec2_i32 = create<sem::Vector>(i32, 2);
  auto* vec4_f32 = create<sem::Vector>(f32, 4);
  auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32);
  auto* result =
      table->Lookup(BuiltinType::kTextureLoad, {tex, vec2_i32, i32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kTextureLoad);
  EXPECT_EQ(result->ReturnType(), vec4_f32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), tex);
  EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture);
  EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32);
  EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords);
  EXPECT_EQ(result->Parameters()[2]->Type(), i32);
  EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kLevel);
}

TEST_F(BuiltinTableTest, MatchMultisampledTexture) {
  auto* i32 = create<sem::I32>();
  auto* f32 = create<sem::F32>();
  auto* vec2_i32 = create<sem::Vector>(i32, 2);
  auto* vec4_f32 = create<sem::Vector>(f32, 4);
  auto* tex = create<sem::MultisampledTexture>(ast::TextureDimension::k2d, f32);
  auto* result =
      table->Lookup(BuiltinType::kTextureLoad, {tex, vec2_i32, i32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kTextureLoad);
  EXPECT_EQ(result->ReturnType(), vec4_f32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), tex);
  EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture);
  EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32);
  EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords);
  EXPECT_EQ(result->Parameters()[2]->Type(), i32);
  EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kSampleIndex);
}

TEST_F(BuiltinTableTest, MatchDepthTexture) {
  auto* f32 = create<sem::F32>();
  auto* i32 = create<sem::I32>();
  auto* vec2_i32 = create<sem::Vector>(i32, 2);
  auto* tex = create<sem::DepthTexture>(ast::TextureDimension::k2d);
  auto* result =
      table->Lookup(BuiltinType::kTextureLoad, {tex, vec2_i32, i32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kTextureLoad);
  EXPECT_EQ(result->ReturnType(), f32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), tex);
  EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture);
  EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32);
  EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords);
  EXPECT_EQ(result->Parameters()[2]->Type(), i32);
  EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kLevel);
}

TEST_F(BuiltinTableTest, MatchDepthMultisampledTexture) {
  auto* f32 = create<sem::F32>();
  auto* i32 = create<sem::I32>();
  auto* vec2_i32 = create<sem::Vector>(i32, 2);
  auto* tex = create<sem::DepthMultisampledTexture>(ast::TextureDimension::k2d);
  auto* result =
      table->Lookup(BuiltinType::kTextureLoad, {tex, vec2_i32, i32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kTextureLoad);
  EXPECT_EQ(result->ReturnType(), f32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), tex);
  EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture);
  EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32);
  EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords);
  EXPECT_EQ(result->Parameters()[2]->Type(), i32);
  EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kSampleIndex);
}

TEST_F(BuiltinTableTest, MatchExternalTexture) {
  auto* f32 = create<sem::F32>();
  auto* i32 = create<sem::I32>();
  auto* vec2_i32 = create<sem::Vector>(i32, 2);
  auto* vec4_f32 = create<sem::Vector>(f32, 4);
  auto* tex = create<sem::ExternalTexture>();
  auto* result =
      table->Lookup(BuiltinType::kTextureLoad, {tex, vec2_i32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kTextureLoad);
  EXPECT_EQ(result->ReturnType(), vec4_f32);
  ASSERT_EQ(result->Parameters().size(), 2u);
  EXPECT_EQ(result->Parameters()[0]->Type(), tex);
  EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture);
  EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32);
  EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords);
}

TEST_F(BuiltinTableTest, MatchWOStorageTexture) {
  auto* f32 = create<sem::F32>();
  auto* i32 = create<sem::I32>();
  auto* vec2_i32 = create<sem::Vector>(i32, 2);
  auto* vec4_f32 = create<sem::Vector>(f32, 4);
  auto* subtype =
      sem::StorageTexture::SubtypeFor(ast::TexelFormat::kR32Float, Types());
  auto* tex = create<sem::StorageTexture>(ast::TextureDimension::k2d,
                                          ast::TexelFormat::kR32Float,
                                          ast::Access::kWrite, subtype);

  auto* result = table->Lookup(BuiltinType::kTextureStore,
                               {tex, vec2_i32, vec4_f32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kTextureStore);
  EXPECT_TRUE(result->ReturnType()->Is<sem::Void>());
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), tex);
  EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture);
  EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32);
  EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords);
  EXPECT_EQ(result->Parameters()[2]->Type(), vec4_f32);
  EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kValue);
}

TEST_F(BuiltinTableTest, MismatchTexture) {
  auto* f32 = create<sem::F32>();
  auto* i32 = create<sem::I32>();
  auto* vec2_i32 = create<sem::Vector>(i32, 2);
  auto* result =
      table->Lookup(BuiltinType::kTextureLoad, {f32, vec2_i32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, ImplicitLoadOnReference) {
  auto* f32 = create<sem::F32>();
  auto* result =
      table->Lookup(BuiltinType::kCos,
                    {create<sem::Reference>(f32, ast::StorageClass::kFunction,
                                            ast::Access::kReadWrite)},
                    Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kCos);
  EXPECT_EQ(result->ReturnType(), f32);
  ASSERT_EQ(result->Parameters().size(), 1u);
  EXPECT_EQ(result->Parameters()[0]->Type(), f32);
}

TEST_F(BuiltinTableTest, MatchOpenType) {
  auto* f32 = create<sem::F32>();
  auto* result = table->Lookup(BuiltinType::kClamp, {f32, f32, f32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kClamp);
  EXPECT_EQ(result->ReturnType(), f32);
  EXPECT_EQ(result->Parameters()[0]->Type(), f32);
  EXPECT_EQ(result->Parameters()[1]->Type(), f32);
  EXPECT_EQ(result->Parameters()[2]->Type(), f32);
}

TEST_F(BuiltinTableTest, MismatchOpenType) {
  auto* f32 = create<sem::F32>();
  auto* u32 = create<sem::U32>();
  auto* result = table->Lookup(BuiltinType::kClamp, {f32, u32, f32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchOpenSizeVector) {
  auto* f32 = create<sem::F32>();
  auto* vec2_f32 = create<sem::Vector>(f32, 2);
  auto* result = table->Lookup(BuiltinType::kClamp,
                               {vec2_f32, vec2_f32, vec2_f32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kClamp);
  EXPECT_EQ(result->ReturnType(), vec2_f32);
  ASSERT_EQ(result->Parameters().size(), 3u);
  EXPECT_EQ(result->Parameters()[0]->Type(), vec2_f32);
  EXPECT_EQ(result->Parameters()[1]->Type(), vec2_f32);
  EXPECT_EQ(result->Parameters()[2]->Type(), vec2_f32);
}

TEST_F(BuiltinTableTest, MismatchOpenSizeVector) {
  auto* f32 = create<sem::F32>();
  auto* u32 = create<sem::U32>();
  auto* vec2_f32 = create<sem::Vector>(f32, 2);
  auto* result =
      table->Lookup(BuiltinType::kClamp, {vec2_f32, u32, vec2_f32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, MatchOpenSizeMatrix) {
  auto* f32 = create<sem::F32>();
  auto* vec3_f32 = create<sem::Vector>(f32, 3);
  auto* mat3_f32 = create<sem::Matrix>(vec3_f32, 3);
  auto* result = table->Lookup(BuiltinType::kDeterminant, {mat3_f32}, Source{});
  ASSERT_NE(result, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");
  EXPECT_EQ(result->Type(), BuiltinType::kDeterminant);
  EXPECT_EQ(result->ReturnType(), f32);
  ASSERT_EQ(result->Parameters().size(), 1u);
  EXPECT_EQ(result->Parameters()[0]->Type(), mat3_f32);
}

TEST_F(BuiltinTableTest, MismatchOpenSizeMatrix) {
  auto* f32 = create<sem::F32>();
  auto* vec2_f32 = create<sem::Vector>(f32, 2);
  auto* mat3x2_f32 = create<sem::Matrix>(vec2_f32, 3);
  auto* result =
      table->Lookup(BuiltinType::kDeterminant, {mat3x2_f32}, Source{});
  ASSERT_EQ(result, nullptr);
  ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
}

TEST_F(BuiltinTableTest, OverloadOrderByNumberOfParameters) {
  // None of the arguments match, so expect the overloads with 2 parameters to
  // come first
  auto* bool_ = create<sem::Bool>();
  table->Lookup(BuiltinType::kTextureDimensions, {bool_, bool_}, Source{});
  ASSERT_EQ(Diagnostics().str(),
            R"(error: no matching call to textureDimensions(bool, bool)

27 candidate functions:
  textureDimensions(texture: texture_1d<T>, level: i32) -> i32  where: T is f32, i32 or u32
  textureDimensions(texture: texture_2d<T>, level: i32) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_2d_array<T>, level: i32) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_3d<T>, level: i32) -> vec3<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_cube<T>, level: i32) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_cube_array<T>, level: i32) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
  textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
  textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32>
  textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32>
  textureDimensions(texture: texture_1d<T>) -> i32  where: T is f32, i32 or u32
  textureDimensions(texture: texture_2d<T>) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_2d_array<T>) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_3d<T>) -> vec3<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_cube<T>) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_cube_array<T>) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_depth_2d) -> vec2<i32>
  textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
  textureDimensions(texture: texture_depth_cube) -> vec2<i32>
  textureDimensions(texture: texture_depth_cube_array) -> vec2<i32>
  textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<i32>
  textureDimensions(texture: texture_storage_1d<F, A>) -> i32  where: A is write
  textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<i32>  where: A is write
  textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<i32>  where: A is write
  textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<i32>  where: A is write
  textureDimensions(texture: texture_external) -> vec2<i32>
)");
}

TEST_F(BuiltinTableTest, OverloadOrderByMatchingParameter) {
  auto* tex = create<sem::DepthTexture>(ast::TextureDimension::k2d);
  auto* bool_ = create<sem::Bool>();
  table->Lookup(BuiltinType::kTextureDimensions, {tex, bool_}, Source{});
  ASSERT_EQ(
      Diagnostics().str(),
      R"(error: no matching call to textureDimensions(texture_depth_2d, bool)

27 candidate functions:
  textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
  textureDimensions(texture: texture_depth_2d) -> vec2<i32>
  textureDimensions(texture: texture_1d<T>, level: i32) -> i32  where: T is f32, i32 or u32
  textureDimensions(texture: texture_2d<T>, level: i32) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_2d_array<T>, level: i32) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_3d<T>, level: i32) -> vec3<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_cube<T>, level: i32) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_cube_array<T>, level: i32) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
  textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32>
  textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32>
  textureDimensions(texture: texture_1d<T>) -> i32  where: T is f32, i32 or u32
  textureDimensions(texture: texture_2d<T>) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_2d_array<T>) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_3d<T>) -> vec3<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_cube<T>) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_cube_array<T>) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32>  where: T is f32, i32 or u32
  textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
  textureDimensions(texture: texture_depth_cube) -> vec2<i32>
  textureDimensions(texture: texture_depth_cube_array) -> vec2<i32>
  textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<i32>
  textureDimensions(texture: texture_storage_1d<F, A>) -> i32  where: A is write
  textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<i32>  where: A is write
  textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<i32>  where: A is write
  textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<i32>  where: A is write
  textureDimensions(texture: texture_external) -> vec2<i32>
)");
}

TEST_F(BuiltinTableTest, SameOverloadReturnsSameBuiltinPointer) {
  auto* f32 = create<sem::F32>();
  auto* vec2_f32 = create<sem::Vector>(create<sem::F32>(), 2);
  auto* bool_ = create<sem::Bool>();
  auto* a = table->Lookup(BuiltinType::kSelect, {f32, f32, bool_}, Source{});
  ASSERT_NE(a, nullptr) << Diagnostics().str();

  auto* b = table->Lookup(BuiltinType::kSelect, {f32, f32, bool_}, Source{});
  ASSERT_NE(b, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");

  auto* c = table->Lookup(BuiltinType::kSelect, {vec2_f32, vec2_f32, bool_},
                          Source{});
  ASSERT_NE(c, nullptr) << Diagnostics().str();
  ASSERT_EQ(Diagnostics().str(), "");

  EXPECT_EQ(a, b);
  EXPECT_NE(a, c);
  EXPECT_NE(b, c);
}

}  // namespace
}  // namespace tint
