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

#include "gmock/gmock.h"
#include "src/program_builder.h"
#include "src/sem/depth_texture_type.h"
#include "src/sem/external_texture_type.h"
#include "src/sem/multisampled_texture_type.h"
#include "src/sem/sampled_texture_type.h"
#include "src/sem/storage_texture_type.h"

namespace tint {
namespace {

using ::testing::ElementsAre;
using ::testing::HasSubstr;

using IntrinsicType = sem::IntrinsicType;
using Parameter = sem::Parameter;

class IntrinsicTableTest : public testing::Test, public ProgramBuilder {
 public:
  std::unique_ptr<IntrinsicTable> table = IntrinsicTable::Create();
};

TEST_F(IntrinsicTableTest, MatchF32) {
  auto result = table->Lookup(*this, IntrinsicType::kCos, {ty.f32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kCos);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.f32());
  EXPECT_THAT(result.intrinsic->Parameters(), ElementsAre(Parameter{ty.f32()}));
}

TEST_F(IntrinsicTableTest, MismatchF32) {
  auto result = table->Lookup(*this, IntrinsicType::kCos, {ty.i32()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchU32) {
  auto result = table->Lookup(*this, IntrinsicType::kUnpack2x16Float,
                              {ty.u32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kUnpack2x16Float);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.vec2<f32>());
  EXPECT_THAT(result.intrinsic->Parameters(), ElementsAre(Parameter{ty.u32()}));
}

TEST_F(IntrinsicTableTest, MismatchU32) {
  auto result = table->Lookup(*this, IntrinsicType::kUnpack2x16Float,
                              {ty.f32()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchI32) {
  auto tex = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
  auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                              {tex, ty.i32(), ty.i32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kTextureLoad);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.vec4<f32>());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{tex, Parameter::Usage::kTexture},
                          Parameter{ty.i32(), Parameter::Usage::kCoords},
                          Parameter{ty.i32(), Parameter::Usage::kLevel}));
}

TEST_F(IntrinsicTableTest, MismatchI32) {
  auto tex = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
  auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                              {tex, ty.f32()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchIU32AsI32) {
  auto result =
      table->Lookup(*this, IntrinsicType::kCountOneBits, {ty.i32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kCountOneBits);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.i32());
  EXPECT_THAT(result.intrinsic->Parameters(), ElementsAre(Parameter{ty.i32()}));
}

TEST_F(IntrinsicTableTest, MatchIU32AsU32) {
  auto result =
      table->Lookup(*this, IntrinsicType::kCountOneBits, {ty.u32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kCountOneBits);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.u32());
  EXPECT_THAT(result.intrinsic->Parameters(), ElementsAre(Parameter{ty.u32()}));
}

TEST_F(IntrinsicTableTest, MismatchIU32) {
  auto result =
      table->Lookup(*this, IntrinsicType::kCountOneBits, {ty.f32()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchFIU32AsI32) {
  auto result = table->Lookup(*this, IntrinsicType::kClamp,
                              {ty.i32(), ty.i32(), ty.i32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kClamp);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.i32());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{ty.i32()}, Parameter{ty.i32()},
                          Parameter{ty.i32()}));
}

TEST_F(IntrinsicTableTest, MatchFIU32AsU32) {
  auto result = table->Lookup(*this, IntrinsicType::kClamp,
                              {ty.u32(), ty.u32(), ty.u32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kClamp);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.u32());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{ty.u32()}, Parameter{ty.u32()},
                          Parameter{ty.u32()}));
}

TEST_F(IntrinsicTableTest, MatchFIU32AsF32) {
  auto result = table->Lookup(*this, IntrinsicType::kClamp,
                              {ty.f32(), ty.f32(), ty.f32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kClamp);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.f32());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{ty.f32()}, Parameter{ty.f32()},
                          Parameter{ty.f32()}));
}

TEST_F(IntrinsicTableTest, MismatchFIU32) {
  auto result = table->Lookup(*this, IntrinsicType::kClamp,
                              {ty.bool_(), ty.bool_(), ty.bool_()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchBool) {
  auto result = table->Lookup(*this, IntrinsicType::kSelect,
                              {ty.f32(), ty.f32(), ty.bool_()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kSelect);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.f32());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{ty.f32()}, Parameter{ty.f32()},
                          Parameter{ty.bool_()}));
}

TEST_F(IntrinsicTableTest, MismatchBool) {
  auto result = table->Lookup(*this, IntrinsicType::kSelect,
                              {ty.f32(), ty.f32(), ty.f32()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchPointer) {
  auto result = table->Lookup(
      *this, IntrinsicType::kModf,
      {ty.f32(), ty.pointer<f32>(ast::StorageClass::kNone)}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kModf);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.f32());
  EXPECT_THAT(
      result.intrinsic->Parameters(),
      ElementsAre(Parameter{ty.f32()},
                  Parameter{ty.pointer<f32>(ast::StorageClass::kNone)}));
}

TEST_F(IntrinsicTableTest, MismatchPointer) {
  auto result = table->Lookup(*this, IntrinsicType::kModf, {ty.f32(), ty.f32()},
                              Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchArray) {
  auto* arr = create<sem::Array>(create<sem::U32>(), 0, 4, 4, 4, true);
  auto result =
      table->Lookup(*this, IntrinsicType::kArrayLength, {arr}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kArrayLength);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.u32());
  ASSERT_EQ(result.intrinsic->Parameters().size(), 1u);
  EXPECT_TRUE(result.intrinsic->Parameters()[0].type->Is<sem::Array>());
}

TEST_F(IntrinsicTableTest, MismatchArray) {
  auto result =
      table->Lookup(*this, IntrinsicType::kArrayLength, {ty.f32()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchSampler) {
  auto tex = ty.sampled_texture(ast::TextureDimension::k2d, ty.f32());
  auto sampler = ty.sampler(ast::SamplerKind::kSampler);
  auto result = table->Lookup(*this, IntrinsicType::kTextureSample,
                              {tex, sampler, ty.vec2<f32>()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kTextureSample);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.vec4<f32>());
  EXPECT_THAT(
      result.intrinsic->Parameters(),
      ElementsAre(Parameter{tex, Parameter::Usage::kTexture},
                  Parameter{sampler, Parameter::Usage::kSampler},
                  Parameter{ty.vec2<f32>(), Parameter::Usage::kCoords}));
}

TEST_F(IntrinsicTableTest, MismatchSampler) {
  auto tex = ty.sampled_texture(ast::TextureDimension::k2d, ty.f32());
  auto result = table->Lookup(*this, IntrinsicType::kTextureSample,
                              {tex, ty.f32(), ty.vec2<f32>()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchSampledTexture) {
  auto tex = ty.sampled_texture(ast::TextureDimension::k2d, ty.f32());
  auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                              {tex, ty.vec2<i32>(), ty.i32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kTextureLoad);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.vec4<f32>());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{tex, Parameter::Usage::kTexture},
                          Parameter{ty.vec2<i32>(), Parameter::Usage::kCoords},
                          Parameter{ty.i32(), Parameter::Usage::kLevel}));
}

TEST_F(IntrinsicTableTest, MatchMultisampledTexture) {
  auto* tex =
      create<sem::MultisampledTexture>(ast::TextureDimension::k2d, ty.f32());
  auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                              {tex, ty.vec2<i32>(), ty.i32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kTextureLoad);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.vec4<f32>());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{tex, Parameter::Usage::kTexture},
                          Parameter{ty.vec2<i32>(), Parameter::Usage::kCoords},
                          Parameter{ty.i32(), Parameter::Usage::kSampleIndex}));
}

TEST_F(IntrinsicTableTest, MatchDepthTexture) {
  auto tex = ty.depth_texture(ast::TextureDimension::k2d);
  auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                              {tex, ty.vec2<i32>(), ty.i32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kTextureLoad);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.f32());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{tex, Parameter::Usage::kTexture},
                          Parameter{ty.vec2<i32>(), Parameter::Usage::kCoords},
                          Parameter{ty.i32(), Parameter::Usage::kLevel}));
}

TEST_F(IntrinsicTableTest, MatchExternalTexture) {
  auto* tex = create<sem::ExternalTexture>();
  auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                              {tex, ty.vec2<i32>()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kTextureLoad);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.vec4<f32>());
  EXPECT_THAT(
      result.intrinsic->Parameters(),
      ElementsAre(Parameter{tex, Parameter::Usage::kTexture},
                  Parameter{ty.vec2<i32>(), Parameter::Usage::kCoords}));
}

TEST_F(IntrinsicTableTest, MatchROStorageTexture) {
  auto* subtype =
      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR16Float, Types());
  auto* tex = create<sem::StorageTexture>(
      ast::TextureDimension::k2d, ast::ImageFormat::kR16Float,
      ast::AccessControl::kReadOnly, subtype);

  auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                              {tex, ty.vec2<i32>()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kTextureLoad);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.vec4<f32>());
  EXPECT_THAT(
      result.intrinsic->Parameters(),
      ElementsAre(Parameter{tex, Parameter::Usage::kTexture},
                  Parameter{ty.vec2<i32>(), Parameter::Usage::kCoords}));
}

TEST_F(IntrinsicTableTest, MatchWOStorageTexture) {
  auto* subtype =
      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR16Float, Types());
  auto* tex = create<sem::StorageTexture>(
      ast::TextureDimension::k2d, ast::ImageFormat::kR16Float,
      ast::AccessControl::kWriteOnly, subtype);

  auto result = table->Lookup(*this, IntrinsicType::kTextureStore,
                              {tex, ty.vec2<i32>(), ty.vec4<f32>()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kTextureStore);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.void_());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{tex, Parameter::Usage::kTexture},
                          Parameter{ty.vec2<i32>(), Parameter::Usage::kCoords},
                          Parameter{ty.vec4<f32>(), Parameter::Usage::kValue}));
}

TEST_F(IntrinsicTableTest, MismatchTexture) {
  auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                              {ty.f32(), ty.vec2<i32>()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchAutoPointerDereference) {
  auto result =
      table->Lookup(*this, IntrinsicType::kCos,
                    {ty.pointer<f32>(ast::StorageClass::kNone)}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kCos);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.f32());
  EXPECT_THAT(result.intrinsic->Parameters(), ElementsAre(Parameter{ty.f32()}));
}

TEST_F(IntrinsicTableTest, MatchOpenType) {
  auto result = table->Lookup(*this, IntrinsicType::kClamp,
                              {ty.f32(), ty.f32(), ty.f32()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kClamp);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.f32());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{ty.f32()}, Parameter{ty.f32()},
                          Parameter{ty.f32()}));
}

TEST_F(IntrinsicTableTest, MismatchOpenType) {
  auto result = table->Lookup(*this, IntrinsicType::kClamp,
                              {ty.f32(), ty.u32(), ty.f32()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchOpenSizeVector) {
  auto result =
      table->Lookup(*this, IntrinsicType::kClamp,
                    {ty.vec2<f32>(), ty.vec2<f32>(), ty.vec2<f32>()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kClamp);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.vec2<f32>());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{ty.vec2<f32>()}, Parameter{ty.vec2<f32>()},
                          Parameter{ty.vec2<f32>()}));
}

TEST_F(IntrinsicTableTest, MismatchOpenSizeVector) {
  auto result =
      table->Lookup(*this, IntrinsicType::kClamp,
                    {ty.vec2<f32>(), ty.vec2<u32>(), ty.vec2<f32>()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, MatchOpenSizeMatrix) {
  auto result = table->Lookup(*this, IntrinsicType::kDeterminant,
                              {ty.mat3x3<f32>()}, Source{});
  ASSERT_NE(result.intrinsic, nullptr);
  ASSERT_EQ(result.diagnostics.str(), "");
  EXPECT_THAT(result.intrinsic->Type(), IntrinsicType::kDeterminant);
  EXPECT_THAT(result.intrinsic->ReturnType(), ty.f32());
  EXPECT_THAT(result.intrinsic->Parameters(),
              ElementsAre(Parameter{ty.mat3x3<f32>()}));
}

TEST_F(IntrinsicTableTest, MismatchOpenSizeMatrix) {
  auto result = table->Lookup(*this, IntrinsicType::kDeterminant,
                              {ty.mat3x2<f32>()}, Source{});
  ASSERT_EQ(result.intrinsic, nullptr);
  ASSERT_THAT(result.diagnostics.str(), HasSubstr("no matching call"));
}

TEST_F(IntrinsicTableTest, OverloadOrderByNumberOfParameters) {
  // None of the arguments match, so expect the overloads with 2 parameters to
  // come first
  auto result = table->Lookup(*this, IntrinsicType::kTextureDimensions,
                              {ty.bool_(), ty.bool_()}, Source{});
  ASSERT_EQ(result.diagnostics.str(),
            R"(error: no matching call to textureDimensions(bool, bool)

26 candidate functions:
  textureDimensions(texture : texture_2d<T>, level : i32) -> vec2<i32>
  textureDimensions(texture : texture_2d_array<T>, level : i32) -> vec2<i32>
  textureDimensions(texture : texture_3d<T>, level : i32) -> vec3<i32>
  textureDimensions(texture : texture_cube<T>, level : i32) -> vec3<i32>
  textureDimensions(texture : texture_cube_array<T>, level : i32) -> vec3<i32>
  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) -> vec3<i32>
  textureDimensions(texture : texture_depth_cube_array, level : i32) -> vec3<i32>
  textureDimensions(texture : texture_1d<T>) -> i32
  textureDimensions(texture : texture_2d<T>) -> vec2<i32>
  textureDimensions(texture : texture_2d_array<T>) -> vec2<i32>
  textureDimensions(texture : texture_3d<T>) -> vec3<i32>
  textureDimensions(texture : texture_cube<T>) -> vec3<i32>
  textureDimensions(texture : texture_cube_array<T>) -> vec3<i32>
  textureDimensions(texture : texture_multisampled_2d<T>) -> vec2<i32>
  textureDimensions(texture : texture_multisampled_2d_array<T>) -> vec2<i32>
  textureDimensions(texture : texture_depth_2d) -> vec2<i32>
  textureDimensions(texture : texture_depth_2d_array) -> vec2<i32>
  textureDimensions(texture : texture_depth_cube) -> vec3<i32>
  textureDimensions(texture : texture_depth_cube_array) -> vec3<i32>
  textureDimensions(texture : texture_storage_1d<F, A>) -> i32
  textureDimensions(texture : texture_storage_2d<F, A>) -> vec2<i32>
  textureDimensions(texture : texture_storage_2d_array<F, A>) -> vec2<i32>
  textureDimensions(texture : texture_storage_3d<F, A>) -> vec3<i32>
  textureDimensions(texture : texture_external) -> vec2<i32>
)");
}

TEST_F(IntrinsicTableTest, OverloadOrderByMatchingParameter) {
  auto tex = ty.depth_texture(ast::TextureDimension::k2d);
  auto result = table->Lookup(*this, IntrinsicType::kTextureDimensions,
                              {tex, ty.bool_()}, Source{});
  ASSERT_EQ(
      result.diagnostics.str(),
      R"(error: no matching call to textureDimensions(texture_depth_2d, bool)

26 candidate functions:
  textureDimensions(texture : texture_depth_2d, level : i32) -> vec2<i32>
  textureDimensions(texture : texture_depth_2d) -> vec2<i32>
  textureDimensions(texture : texture_2d<T>, level : i32) -> vec2<i32>
  textureDimensions(texture : texture_2d_array<T>, level : i32) -> vec2<i32>
  textureDimensions(texture : texture_3d<T>, level : i32) -> vec3<i32>
  textureDimensions(texture : texture_cube<T>, level : i32) -> vec3<i32>
  textureDimensions(texture : texture_cube_array<T>, level : i32) -> vec3<i32>
  textureDimensions(texture : texture_depth_2d_array, level : i32) -> vec2<i32>
  textureDimensions(texture : texture_depth_cube, level : i32) -> vec3<i32>
  textureDimensions(texture : texture_depth_cube_array, level : i32) -> vec3<i32>
  textureDimensions(texture : texture_1d<T>) -> i32
  textureDimensions(texture : texture_2d<T>) -> vec2<i32>
  textureDimensions(texture : texture_2d_array<T>) -> vec2<i32>
  textureDimensions(texture : texture_3d<T>) -> vec3<i32>
  textureDimensions(texture : texture_cube<T>) -> vec3<i32>
  textureDimensions(texture : texture_cube_array<T>) -> vec3<i32>
  textureDimensions(texture : texture_multisampled_2d<T>) -> vec2<i32>
  textureDimensions(texture : texture_multisampled_2d_array<T>) -> vec2<i32>
  textureDimensions(texture : texture_depth_2d_array) -> vec2<i32>
  textureDimensions(texture : texture_depth_cube) -> vec3<i32>
  textureDimensions(texture : texture_depth_cube_array) -> vec3<i32>
  textureDimensions(texture : texture_storage_1d<F, A>) -> i32
  textureDimensions(texture : texture_storage_2d<F, A>) -> vec2<i32>
  textureDimensions(texture : texture_storage_2d_array<F, A>) -> vec2<i32>
  textureDimensions(texture : texture_storage_3d<F, A>) -> vec3<i32>
  textureDimensions(texture : texture_external) -> vec2<i32>
)");
}

}  // namespace
}  // namespace tint
