// 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 "gmock/gmock.h"
#include "src/tint/resolver/resolver_test_helper.h"
#include "src/tint/sem/reference_type.h"
#include "src/tint/sem/type_constructor.h"
#include "src/tint/sem/type_conversion.h"

namespace tint {
namespace resolver {
namespace {

using ::testing::HasSubstr;

// Helpers and typedefs
using builder::alias;
using builder::alias1;
using builder::alias2;
using builder::alias3;
using builder::CreatePtrs;
using builder::CreatePtrsFor;
using builder::DataType;
using builder::f32;
using builder::i32;
using builder::mat2x2;
using builder::mat2x3;
using builder::mat3x2;
using builder::mat3x3;
using builder::mat4x4;
using builder::u32;
using builder::vec2;
using builder::vec3;
using builder::vec4;

class ResolverTypeConstructorValidationTest : public resolver::TestHelper,
                                              public testing::Test {};

namespace InferTypeTest {
struct Params {
  builder::ast_type_func_ptr create_rhs_ast_type;
  builder::ast_expr_func_ptr create_rhs_ast_value;
  builder::sem_type_func_ptr create_rhs_sem_type;
};

template <typename T>
constexpr Params ParamsFor() {
  return Params{DataType<T>::AST, DataType<T>::Expr, DataType<T>::Sem};
}

TEST_F(ResolverTypeConstructorValidationTest, InferTypeTest_Simple) {
  // var a = 1;
  // var b = a;
  auto* a = Var("a", nullptr, ast::StorageClass::kNone, Expr(1));
  auto* b = Var("b", nullptr, ast::StorageClass::kNone, Expr("a"));
  auto* a_ident = Expr("a");
  auto* b_ident = Expr("b");

  WrapInFunction(a, b, Assign(a_ident, "a"), Assign(b_ident, "b"));

  ASSERT_TRUE(r()->Resolve()) << r()->error();
  ASSERT_TRUE(TypeOf(a_ident)->Is<sem::Reference>());
  EXPECT_TRUE(
      TypeOf(a_ident)->As<sem::Reference>()->StoreType()->Is<sem::I32>());
  EXPECT_EQ(TypeOf(a_ident)->As<sem::Reference>()->StorageClass(),
            ast::StorageClass::kFunction);
  ASSERT_TRUE(TypeOf(b_ident)->Is<sem::Reference>());
  EXPECT_TRUE(
      TypeOf(b_ident)->As<sem::Reference>()->StoreType()->Is<sem::I32>());
  EXPECT_EQ(TypeOf(b_ident)->As<sem::Reference>()->StorageClass(),
            ast::StorageClass::kFunction);
}

using InferTypeTest_FromConstructorExpression = ResolverTestWithParam<Params>;
TEST_P(InferTypeTest_FromConstructorExpression, All) {
  // e.g. for vec3<f32>
  // {
  //   var a = vec3<f32>(0.0, 0.0, 0.0)
  // }
  auto& params = GetParam();

  auto* constructor_expr = params.create_rhs_ast_value(*this, 0);

  auto* a = Var("a", nullptr, ast::StorageClass::kNone, constructor_expr);
  // Self-assign 'a' to force the expression to be resolved so we can test its
  // type below
  auto* a_ident = Expr("a");
  WrapInFunction(Decl(a), Assign(a_ident, "a"));

  ASSERT_TRUE(r()->Resolve()) << r()->error();
  auto* got = TypeOf(a_ident);
  auto* expected = create<sem::Reference>(params.create_rhs_sem_type(*this),
                                          ast::StorageClass::kFunction,
                                          ast::Access::kReadWrite);
  ASSERT_EQ(got, expected) << "got:      " << FriendlyName(got) << "\n"
                           << "expected: " << FriendlyName(expected) << "\n";
}

static constexpr Params from_constructor_expression_cases[] = {
    ParamsFor<bool>(),
    ParamsFor<i32>(),
    ParamsFor<u32>(),
    ParamsFor<f32>(),
    ParamsFor<vec3<i32>>(),
    ParamsFor<vec3<u32>>(),
    ParamsFor<vec3<f32>>(),
    ParamsFor<mat3x3<f32>>(),
    ParamsFor<alias<bool>>(),
    ParamsFor<alias<i32>>(),
    ParamsFor<alias<u32>>(),
    ParamsFor<alias<f32>>(),
    ParamsFor<alias<vec3<i32>>>(),
    ParamsFor<alias<vec3<u32>>>(),
    ParamsFor<alias<vec3<f32>>>(),
    ParamsFor<alias<mat3x3<f32>>>(),
};
INSTANTIATE_TEST_SUITE_P(ResolverTypeConstructorValidationTest,
                         InferTypeTest_FromConstructorExpression,
                         testing::ValuesIn(from_constructor_expression_cases));

using InferTypeTest_FromArithmeticExpression = ResolverTestWithParam<Params>;
TEST_P(InferTypeTest_FromArithmeticExpression, All) {
  // e.g. for vec3<f32>
  // {
  //   var a = vec3<f32>(2.0, 2.0, 2.0) * 3.0;
  // }
  auto& params = GetParam();

  auto* arith_lhs_expr = params.create_rhs_ast_value(*this, 2);
  auto* arith_rhs_expr = params.create_rhs_ast_value(*this, 3);
  auto* constructor_expr = Mul(arith_lhs_expr, arith_rhs_expr);

  auto* a = Var("a", nullptr, constructor_expr);
  // Self-assign 'a' to force the expression to be resolved so we can test its
  // type below
  auto* a_ident = Expr("a");
  WrapInFunction(Decl(a), Assign(a_ident, "a"));

  ASSERT_TRUE(r()->Resolve()) << r()->error();
  auto* got = TypeOf(a_ident);
  auto* expected = create<sem::Reference>(params.create_rhs_sem_type(*this),
                                          ast::StorageClass::kFunction,
                                          ast::Access::kReadWrite);
  ASSERT_EQ(got, expected) << "got:      " << FriendlyName(got) << "\n"
                           << "expected: " << FriendlyName(expected) << "\n";
}
static constexpr Params from_arithmetic_expression_cases[] = {
    ParamsFor<i32>(),       ParamsFor<u32>(),         ParamsFor<f32>(),
    ParamsFor<vec3<f32>>(), ParamsFor<mat3x3<f32>>(),

    // TODO(amaiorano): Uncomment once https://crbug.com/tint/680 is fixed
    // ParamsFor<alias<ty_i32>>(),
    // ParamsFor<alias<ty_u32>>(),
    // ParamsFor<alias<ty_f32>>(),
    // ParamsFor<alias<ty_vec3<f32>>>(),
    // ParamsFor<alias<ty_mat3x3<f32>>>(),
};
INSTANTIATE_TEST_SUITE_P(ResolverTypeConstructorValidationTest,
                         InferTypeTest_FromArithmeticExpression,
                         testing::ValuesIn(from_arithmetic_expression_cases));

using InferTypeTest_FromCallExpression = ResolverTestWithParam<Params>;
TEST_P(InferTypeTest_FromCallExpression, All) {
  // e.g. for vec3<f32>
  //
  // fn foo() -> vec3<f32> {
  //   return vec3<f32>();
  // }
  //
  // fn bar()
  // {
  //   var a = foo();
  // }
  auto& params = GetParam();

  Func("foo", {}, params.create_rhs_ast_type(*this),
       {Return(Construct(params.create_rhs_ast_type(*this)))}, {});

  auto* a = Var("a", nullptr, Call("foo"));
  // Self-assign 'a' to force the expression to be resolved so we can test its
  // type below
  auto* a_ident = Expr("a");
  WrapInFunction(Decl(a), Assign(a_ident, "a"));

  ASSERT_TRUE(r()->Resolve()) << r()->error();
  auto* got = TypeOf(a_ident);
  auto* expected = create<sem::Reference>(params.create_rhs_sem_type(*this),
                                          ast::StorageClass::kFunction,
                                          ast::Access::kReadWrite);
  ASSERT_EQ(got, expected) << "got:      " << FriendlyName(got) << "\n"
                           << "expected: " << FriendlyName(expected) << "\n";
}
static constexpr Params from_call_expression_cases[] = {
    ParamsFor<bool>(),
    ParamsFor<i32>(),
    ParamsFor<u32>(),
    ParamsFor<f32>(),
    ParamsFor<vec3<i32>>(),
    ParamsFor<vec3<u32>>(),
    ParamsFor<vec3<f32>>(),
    ParamsFor<mat3x3<f32>>(),
    ParamsFor<alias<bool>>(),
    ParamsFor<alias<i32>>(),
    ParamsFor<alias<u32>>(),
    ParamsFor<alias<f32>>(),
    ParamsFor<alias<vec3<i32>>>(),
    ParamsFor<alias<vec3<u32>>>(),
    ParamsFor<alias<vec3<f32>>>(),
    ParamsFor<alias<mat3x3<f32>>>(),
};
INSTANTIATE_TEST_SUITE_P(ResolverTypeConstructorValidationTest,
                         InferTypeTest_FromCallExpression,
                         testing::ValuesIn(from_call_expression_cases));

}  // namespace InferTypeTest

namespace ConversionConstructTest {
enum class Kind {
  Construct,
  Conversion,
};

struct Params {
  Kind kind;
  builder::ast_type_func_ptr lhs_type;
  builder::ast_type_func_ptr rhs_type;
  builder::ast_expr_func_ptr rhs_value_expr;
};

template <typename LhsType, typename RhsType>
constexpr Params ParamsFor(Kind kind) {
  return Params{kind, DataType<LhsType>::AST, DataType<RhsType>::AST,
                DataType<RhsType>::Expr};
}

static constexpr Params valid_cases[] = {
    // Direct init (non-conversions)
    ParamsFor<bool, bool>(Kind::Construct),              //
    ParamsFor<i32, i32>(Kind::Construct),                //
    ParamsFor<u32, u32>(Kind::Construct),                //
    ParamsFor<f32, f32>(Kind::Construct),                //
    ParamsFor<vec3<bool>, vec3<bool>>(Kind::Construct),  //
    ParamsFor<vec3<i32>, vec3<i32>>(Kind::Construct),    //
    ParamsFor<vec3<u32>, vec3<u32>>(Kind::Construct),    //
    ParamsFor<vec3<f32>, vec3<f32>>(Kind::Construct),    //

    // Splat
    ParamsFor<vec3<bool>, bool>(Kind::Construct),  //
    ParamsFor<vec3<i32>, i32>(Kind::Construct),    //
    ParamsFor<vec3<u32>, u32>(Kind::Construct),    //
    ParamsFor<vec3<f32>, f32>(Kind::Construct),    //

    // Conversion
    ParamsFor<bool, u32>(Kind::Conversion),  //
    ParamsFor<bool, i32>(Kind::Conversion),  //
    ParamsFor<bool, f32>(Kind::Conversion),  //

    ParamsFor<i32, bool>(Kind::Conversion),  //
    ParamsFor<i32, u32>(Kind::Conversion),   //
    ParamsFor<i32, f32>(Kind::Conversion),   //

    ParamsFor<u32, bool>(Kind::Conversion),  //
    ParamsFor<u32, i32>(Kind::Conversion),   //
    ParamsFor<u32, f32>(Kind::Conversion),   //

    ParamsFor<f32, bool>(Kind::Conversion),  //
    ParamsFor<f32, u32>(Kind::Conversion),   //
    ParamsFor<f32, i32>(Kind::Conversion),   //

    ParamsFor<vec3<bool>, vec3<u32>>(Kind::Conversion),  //
    ParamsFor<vec3<bool>, vec3<i32>>(Kind::Conversion),  //
    ParamsFor<vec3<bool>, vec3<f32>>(Kind::Conversion),  //

    ParamsFor<vec3<i32>, vec3<bool>>(Kind::Conversion),  //
    ParamsFor<vec3<i32>, vec3<u32>>(Kind::Conversion),   //
    ParamsFor<vec3<i32>, vec3<f32>>(Kind::Conversion),   //

    ParamsFor<vec3<u32>, vec3<bool>>(Kind::Conversion),  //
    ParamsFor<vec3<u32>, vec3<i32>>(Kind::Conversion),   //
    ParamsFor<vec3<u32>, vec3<f32>>(Kind::Conversion),   //

    ParamsFor<vec3<f32>, vec3<bool>>(Kind::Conversion),  //
    ParamsFor<vec3<f32>, vec3<u32>>(Kind::Conversion),   //
    ParamsFor<vec3<f32>, vec3<i32>>(Kind::Conversion),   //
};

using ConversionConstructorValidTest = ResolverTestWithParam<Params>;
TEST_P(ConversionConstructorValidTest, All) {
  auto& params = GetParam();

  // var a : <lhs_type1> = <lhs_type2>(<rhs_type>(<rhs_value_expr>));
  auto* lhs_type1 = params.lhs_type(*this);
  auto* lhs_type2 = params.lhs_type(*this);
  auto* rhs_type = params.rhs_type(*this);
  auto* rhs_value_expr = params.rhs_value_expr(*this, 0);

  std::stringstream ss;
  ss << FriendlyName(lhs_type1) << " = " << FriendlyName(lhs_type2) << "("
     << FriendlyName(rhs_type) << "(<rhs value expr>))";
  SCOPED_TRACE(ss.str());

  auto* arg = Construct(rhs_type, rhs_value_expr);
  auto* tc = Construct(lhs_type2, arg);
  auto* a = Var("a", lhs_type1, ast::StorageClass::kNone, tc);

  // Self-assign 'a' to force the expression to be resolved so we can test its
  // type below
  auto* a_ident = Expr("a");
  WrapInFunction(Decl(a), Assign(a_ident, "a"));

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  switch (params.kind) {
    case Kind::Construct: {
      auto* ctor = call->Target()->As<sem::TypeConstructor>();
      ASSERT_NE(ctor, nullptr);
      EXPECT_EQ(call->Type(), ctor->ReturnType());
      ASSERT_EQ(ctor->Parameters().size(), 1u);
      EXPECT_EQ(ctor->Parameters()[0]->Type(), TypeOf(arg));
      break;
    }
    case Kind::Conversion: {
      auto* conv = call->Target()->As<sem::TypeConversion>();
      ASSERT_NE(conv, nullptr);
      EXPECT_EQ(call->Type(), conv->ReturnType());
      ASSERT_EQ(conv->Parameters().size(), 1u);
      EXPECT_EQ(conv->Parameters()[0]->Type(), TypeOf(arg));
      break;
    }
  }
}
INSTANTIATE_TEST_SUITE_P(ResolverTypeConstructorValidationTest,
                         ConversionConstructorValidTest,
                         testing::ValuesIn(valid_cases));

constexpr CreatePtrs all_types[] = {
    CreatePtrsFor<bool>(),         //
    CreatePtrsFor<u32>(),          //
    CreatePtrsFor<i32>(),          //
    CreatePtrsFor<f32>(),          //
    CreatePtrsFor<vec3<bool>>(),   //
    CreatePtrsFor<vec3<i32>>(),    //
    CreatePtrsFor<vec3<u32>>(),    //
    CreatePtrsFor<vec3<f32>>(),    //
    CreatePtrsFor<mat3x3<i32>>(),  //
    CreatePtrsFor<mat3x3<u32>>(),  //
    CreatePtrsFor<mat3x3<f32>>(),  //
    CreatePtrsFor<mat2x3<i32>>(),  //
    CreatePtrsFor<mat2x3<u32>>(),  //
    CreatePtrsFor<mat2x3<f32>>(),  //
    CreatePtrsFor<mat3x2<i32>>(),  //
    CreatePtrsFor<mat3x2<u32>>(),  //
    CreatePtrsFor<mat3x2<f32>>()   //
};

using ConversionConstructorInvalidTest =
    ResolverTestWithParam<std::tuple<CreatePtrs,  // lhs
                                     CreatePtrs   // rhs
                                     >>;
TEST_P(ConversionConstructorInvalidTest, All) {
  auto& params = GetParam();

  auto& lhs_params = std::get<0>(params);
  auto& rhs_params = std::get<1>(params);

  // Skip test for valid cases
  for (auto& v : valid_cases) {
    if (v.lhs_type == lhs_params.ast && v.rhs_type == rhs_params.ast &&
        v.rhs_value_expr == rhs_params.expr) {
      return;
    }
  }
  // Skip non-conversions
  if (lhs_params.ast == rhs_params.ast) {
    return;
  }

  // var a : <lhs_type1> = <lhs_type2>(<rhs_type>(<rhs_value_expr>));
  auto* lhs_type1 = lhs_params.ast(*this);
  auto* lhs_type2 = lhs_params.ast(*this);
  auto* rhs_type = rhs_params.ast(*this);
  auto* rhs_value_expr = rhs_params.expr(*this, 0);

  std::stringstream ss;
  ss << FriendlyName(lhs_type1) << " = " << FriendlyName(lhs_type2) << "("
     << FriendlyName(rhs_type) << "(<rhs value expr>))";
  SCOPED_TRACE(ss.str());

  auto* a = Var("a", lhs_type1, ast::StorageClass::kNone,
                Construct(lhs_type2, Construct(rhs_type, rhs_value_expr)));

  // Self-assign 'a' to force the expression to be resolved so we can test its
  // type below
  auto* a_ident = Expr("a");
  WrapInFunction(Decl(a), Assign(a_ident, "a"));

  ASSERT_FALSE(r()->Resolve());
}
INSTANTIATE_TEST_SUITE_P(ResolverTypeConstructorValidationTest,
                         ConversionConstructorInvalidTest,
                         testing::Combine(testing::ValuesIn(all_types),
                                          testing::ValuesIn(all_types)));

TEST_F(ResolverTypeConstructorValidationTest,
       ConversionConstructorInvalid_TooManyInitializers) {
  auto* a = Var("a", ty.f32(), ast::StorageClass::kNone,
                Construct(Source{{12, 34}}, ty.f32(), Expr(1.0f), Expr(2.0f)));
  WrapInFunction(a);

  ASSERT_FALSE(r()->Resolve());
  ASSERT_EQ(r()->error(),
            "12:34 error: expected zero or one value in constructor, got 2");
}

TEST_F(ResolverTypeConstructorValidationTest,
       ConversionConstructorInvalid_InvalidInitializer) {
  auto* a =
      Var("a", ty.f32(), ast::StorageClass::kNone,
          Construct(Source{{12, 34}}, ty.f32(), Construct(ty.array<f32, 4>())));
  WrapInFunction(a);

  ASSERT_FALSE(r()->Resolve());
  ASSERT_EQ(r()->error(),
            "12:34 error: cannot construct 'f32' with a value of type "
            "'array<f32, 4>'");
}

}  // namespace ConversionConstructTest

namespace ArrayConstructor {

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Array_ZeroValue_Pass) {
  // array<u32, 10>();
  auto* tc = array<u32, 10>();
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  EXPECT_TRUE(call->Type()->Is<sem::Array>());
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 0u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Array_type_match) {
  // array<u32, 3>(0u, 10u. 20u);
  auto* tc = array<u32, 3>(Expr(0u), Expr(10u), Expr(20u));
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  EXPECT_TRUE(call->Type()->Is<sem::Array>());
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 3u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::U32>());
  EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::U32>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Array_type_Mismatch_U32F32) {
  // array<u32, 3>(0u, 1.0f, 20u);
  auto* tc = array<u32, 3>(Expr(0u), Expr(Source{{12, 34}}, 1.0f), Expr(20u));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in array constructor does not match array type: "
            "expected 'u32', found 'f32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Array_ScalarArgumentTypeMismatch_F32I32) {
  // array<f32, 1>(1);
  auto* tc = array<f32, 1>(Expr(Source{{12, 34}}, 1));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in array constructor does not match array type: "
            "expected 'f32', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Array_ScalarArgumentTypeMismatch_U32I32) {
  // array<u32, 6>(1, 0u, 0u, 0u, 0u, 0u);
  auto* tc = array<u32, 1>(Expr(Source{{12, 34}}, 1), Expr(0u), Expr(0u),
                           Expr(0u), Expr(0u));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in array constructor does not match array type: "
            "expected 'u32', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Array_ScalarArgumentTypeMismatch_Vec2) {
  // array<i32, 3>(1, vec2<i32>());
  auto* tc =
      array<i32, 3>(Expr(1), Construct(Source{{12, 34}}, ty.vec2<i32>()));
  WrapInFunction(tc);
  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in array constructor does not match array type: "
            "expected 'i32', found 'vec2<i32>'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_ArrayOfVector_SubElemTypeMismatch_I32U32) {
  // array<vec3<i32>, 2>(vec3<i32>(), vec3<u32>());
  auto* e0 = vec3<i32>();
  SetSource(Source::Location({12, 34}));
  auto* e1 = vec3<u32>();
  auto* t = Construct(ty.array(ty.vec3<i32>(), 2), e0, e1);
  WrapInFunction(t);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in array constructor does not match array type: "
            "expected 'vec3<i32>', found 'vec3<u32>'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_ArrayOfVector_SubElemTypeMismatch_I32Bool) {
  // array<vec3<i32>, 2>(vec3<i32>(), vec3<bool>(true, true, false));
  SetSource(Source::Location({12, 34}));
  auto* e0 = vec3<bool>(true, true, false);
  auto* e1 = vec3<i32>();
  auto* t = Construct(ty.array(ty.vec3<i32>(), 2), e0, e1);
  WrapInFunction(t);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in array constructor does not match array type: "
            "expected 'vec3<i32>', found 'vec3<bool>'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_ArrayOfArray_SubElemSizeMismatch) {
  // array<array<i32, 2>, 2>(array<i32, 3>(), array<i32, 2>());
  SetSource(Source::Location({12, 34}));
  auto* e0 = array<i32, 3>();
  auto* e1 = array<i32, 2>();
  auto* t = Construct(ty.array(ty.array<i32, 2>(), 2), e0, e1);
  WrapInFunction(t);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in array constructor does not match array type: "
            "expected 'array<i32, 2>', found 'array<i32, 3>'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_ArrayOfArray_SubElemTypeMismatch) {
  // array<array<i32, 2>, 2>(array<i32, 2>(), array<u32, 2>());
  auto* e0 = array<i32, 2>();
  SetSource(Source::Location({12, 34}));
  auto* e1 = array<u32, 2>();
  auto* t = Construct(ty.array(ty.array<i32, 2>(), 2), e0, e1);
  WrapInFunction(t);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in array constructor does not match array type: "
            "expected 'array<i32, 2>', found 'array<u32, 2>'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Array_TooFewElements) {
  // array<i32, 4>(1, 2, 3);
  SetSource(Source::Location({12, 34}));
  auto* tc = array<i32, 4>(Expr(1), Expr(2), Expr(3));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: array constructor has too few elements: expected 4, "
            "found 3");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Array_TooManyElements) {
  // array<i32, 4>(1, 2, 3, 4, 5);
  SetSource(Source::Location({12, 34}));
  auto* tc = array<i32, 4>(Expr(1), Expr(2), Expr(3), Expr(4), Expr(5));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: array constructor has too many "
            "elements: expected 4, "
            "found 5");
}

TEST_F(ResolverTypeConstructorValidationTest, Expr_Constructor_Array_Runtime) {
  // array<i32>(1);
  auto* tc = array(ty.i32(), nullptr, Expr(Source{{12, 34}}, 1));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(), "error: cannot init a runtime-sized array");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Array_RuntimeZeroValue) {
  // array<i32>();
  auto* tc = array(ty.i32(), nullptr);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(), "error: cannot init a runtime-sized array");
}

}  // namespace ArrayConstructor

namespace ScalarConstructor {

TEST_F(ResolverTypeConstructorValidationTest, Expr_Construct_i32_Success) {
  auto* expr = Construct<i32>(Expr(123));
  WrapInFunction(expr);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(expr), nullptr);
  ASSERT_TRUE(TypeOf(expr)->Is<sem::I32>());

  auto* call = Sem().Get(expr);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 1u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
}

TEST_F(ResolverTypeConstructorValidationTest, Expr_Construct_u32_Success) {
  auto* expr = Construct<u32>(Expr(123u));
  WrapInFunction(expr);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(expr), nullptr);
  ASSERT_TRUE(TypeOf(expr)->Is<sem::U32>());

  auto* call = Sem().Get(expr);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 1u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
}

TEST_F(ResolverTypeConstructorValidationTest, Expr_Construct_f32_Success) {
  auto* expr = Construct<f32>(Expr(1.23f));
  WrapInFunction(expr);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(expr), nullptr);
  ASSERT_TRUE(TypeOf(expr)->Is<sem::F32>());

  auto* call = Sem().Get(expr);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 1u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F32>());
}

TEST_F(ResolverTypeConstructorValidationTest, Expr_Convert_f32_to_i32_Success) {
  auto* expr = Construct<i32>(1.23f);
  WrapInFunction(expr);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(expr), nullptr);
  ASSERT_TRUE(TypeOf(expr)->Is<sem::I32>());

  auto* call = Sem().Get(expr);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConversion>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 1u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F32>());
}

TEST_F(ResolverTypeConstructorValidationTest, Expr_Convert_i32_to_u32_Success) {
  auto* expr = Construct<u32>(123);
  WrapInFunction(expr);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(expr), nullptr);
  ASSERT_TRUE(TypeOf(expr)->Is<sem::U32>());

  auto* call = Sem().Get(expr);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConversion>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 1u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
}

TEST_F(ResolverTypeConstructorValidationTest, Expr_Convert_u32_to_f32_Success) {
  auto* expr = Construct<f32>(123u);
  WrapInFunction(expr);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(expr), nullptr);
  ASSERT_TRUE(TypeOf(expr)->Is<sem::F32>());

  auto* call = Sem().Get(expr);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConversion>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 1u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
}

}  // namespace ScalarConstructor

namespace VectorConstructor {

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2F32_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec2<f32>(Expr(Source{{12, 34}}, 1), 1.0f);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'f32', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2U32_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec2<u32>(1u, Expr(Source{{12, 34}}, 1));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'u32', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2I32_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec2<i32>(Expr(Source{{12, 34}}, 1u), 1);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'i32', found 'u32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2Bool_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec2<bool>(true, Expr(Source{{12, 34}}, 1));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'bool', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2_Error_Vec3ArgumentCardinalityTooLarge) {
  auto* tc = vec2<f32>(Construct(Source{{12, 34}}, ty.vec3<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec2<f32>' with 3 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2_Error_Vec4ArgumentCardinalityTooLarge) {
  auto* tc = vec2<f32>(Construct(Source{{12, 34}}, ty.vec4<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec2<f32>' with 4 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2_Error_TooManyArgumentsScalar) {
  auto* tc =
      vec2<f32>(Expr(Source{{12, 34}}, 1.0f), Expr(Source{{12, 40}}, 1.0f),
                Expr(Source{{12, 46}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec2<f32>' with 3 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2_Error_TooManyArgumentsVector) {
  auto* tc = vec2<f32>(Construct(Source{{12, 34}}, ty.vec2<f32>()),
                       Construct(Source{{12, 40}}, ty.vec2<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec2<f32>' with 4 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2_Error_TooManyArgumentsVectorAndScalar) {
  auto* tc = vec2<f32>(Construct(Source{{12, 34}}, ty.vec2<f32>()),
                       Expr(Source{{12, 40}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec2<f32>' with 3 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2_Error_InvalidArgumentType) {
  auto* tc = vec2<f32>(Construct(Source{{12, 34}}, ty.mat2x2<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: expected vector or scalar type in vector "
            "constructor; found: mat2x2<f32>");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2_Success_ZeroValue) {
  auto* tc = vec2<f32>();
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 0u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2F32_Success_Scalar) {
  auto* tc = vec2<f32>(1.0f, 1.0f);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 2u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F32>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::F32>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2U32_Success_Scalar) {
  auto* tc = vec2<u32>(1u, 1u);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 2u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::U32>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2I32_Success_Scalar) {
  auto* tc = vec2<i32>(1, 1);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 2u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2Bool_Success_Scalar) {
  auto* tc = vec2<bool>(true, false);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 2u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Bool>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::Bool>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2_Success_Identity) {
  auto* tc = vec2<f32>(vec2<f32>());
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 1u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec2_Success_Vec2TypeConversion) {
  auto* tc = vec2<f32>(vec2<i32>());
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConversion>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 1u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3F32_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec3<f32>(1.0f, 1.0f, Expr(Source{{12, 34}}, 1));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'f32', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3U32_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec3<u32>(1u, Expr(Source{{12, 34}}, 1), 1u);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'u32', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3I32_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec3<i32>(1, Expr(Source{{12, 34}}, 1u), 1);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'i32', found 'u32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3Bool_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec3<bool>(true, Expr(Source{{12, 34}}, 1), false);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'bool', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Error_Vec4ArgumentCardinalityTooLarge) {
  auto* tc = vec3<f32>(Construct(Source{{12, 34}}, ty.vec4<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec3<f32>' with 4 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Error_TooFewArgumentsScalar) {
  auto* tc =
      vec3<f32>(Expr(Source{{12, 34}}, 1.0f), Expr(Source{{12, 40}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec3<f32>' with 2 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Error_TooManyArgumentsScalar) {
  auto* tc =
      vec3<f32>(Expr(Source{{12, 34}}, 1.0f), Expr(Source{{12, 40}}, 1.0f),
                Expr(Source{{12, 46}}, 1.0f), Expr(Source{{12, 52}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec3<f32>' with 4 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Error_TooFewArgumentsVec2) {
  auto* tc = vec3<f32>(Construct(Source{{12, 34}}, ty.vec2<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec3<f32>' with 2 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Error_TooManyArgumentsVec2) {
  auto* tc = vec3<f32>(Construct(Source{{12, 34}}, ty.vec2<f32>()),
                       Construct(Source{{12, 40}}, ty.vec2<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec3<f32>' with 4 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Error_TooManyArgumentsVec2AndScalar) {
  auto* tc =
      vec3<f32>(Construct(Source{{12, 34}}, ty.vec2<f32>()),
                Expr(Source{{12, 40}}, 1.0f), Expr(Source{{12, 46}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec3<f32>' with 4 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Error_TooManyArgumentsVec3) {
  auto* tc = vec3<f32>(Construct(Source{{12, 34}}, ty.vec3<f32>()),
                       Expr(Source{{12, 40}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec3<f32>' with 4 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Error_InvalidArgumentType) {
  auto* tc = vec3<f32>(Construct(Source{{12, 34}}, ty.mat2x2<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: expected vector or scalar type in vector "
            "constructor; found: mat2x2<f32>");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Success_ZeroValue) {
  auto* tc = vec3<f32>();
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 0u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3F32_Success_Scalar) {
  auto* tc = vec3<f32>(1.0f, 1.0f, 1.0f);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 3u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F32>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::F32>());
  EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::F32>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3U32_Success_Scalar) {
  auto* tc = vec3<u32>(1u, 1u, 1u);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 3u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::U32>());
  EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::U32>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3I32_Success_Scalar) {
  auto* tc = vec3<i32>(1, 1, 1);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 3u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
  EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::I32>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3Bool_Success_Scalar) {
  auto* tc = vec3<bool>(true, false, true);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 3u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Bool>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::Bool>());
  EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::Bool>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Success_Vec2AndScalar) {
  auto* tc = vec3<f32>(vec2<f32>(), 1.0f);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 2u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::F32>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Success_ScalarAndVec2) {
  auto* tc = vec3<f32>(1.0f, vec2<f32>());
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 2u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F32>());
  EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::Vector>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Success_Identity) {
  auto* tc = vec3<f32>(vec3<f32>());
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConstructor>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 1u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec3_Success_Vec3TypeConversion) {
  auto* tc = vec3<f32>(vec3<i32>());
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);

  auto* call = Sem().Get(tc);
  ASSERT_NE(call, nullptr);
  auto* ctor = call->Target()->As<sem::TypeConversion>();
  ASSERT_NE(ctor, nullptr);
  EXPECT_EQ(call->Type(), ctor->ReturnType());
  ASSERT_EQ(ctor->Parameters().size(), 1u);
  EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4F32_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec4<f32>(1.0f, 1.0f, Expr(Source{{12, 34}}, 1), 1.0f);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'f32', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4U32_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec4<u32>(1u, 1u, Expr(Source{{12, 34}}, 1), 1u);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'u32', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4I32_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec4<i32>(1, 1, Expr(Source{{12, 34}}, 1u), 1);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'i32', found 'u32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4Bool_Error_ScalarArgumentTypeMismatch) {
  auto* tc = vec4<bool>(true, false, Expr(Source{{12, 34}}, 1), true);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'bool', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooFewArgumentsScalar) {
  auto* tc =
      vec4<f32>(Expr(Source{{12, 34}}, 1.0f), Expr(Source{{12, 40}}, 1.0f),
                Expr(Source{{12, 46}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 3 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooManyArgumentsScalar) {
  auto* tc =
      vec4<f32>(Expr(Source{{12, 34}}, 1.0f), Expr(Source{{12, 40}}, 1.0f),
                Expr(Source{{12, 46}}, 1.0f), Expr(Source{{12, 52}}, 1.0f),
                Expr(Source{{12, 58}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 5 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooFewArgumentsVec2AndScalar) {
  auto* tc = vec4<f32>(Construct(Source{{12, 34}}, ty.vec2<f32>()),
                       Expr(Source{{12, 40}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 3 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooManyArgumentsVec2AndScalars) {
  auto* tc = vec4<f32>(
      Construct(Source{{12, 34}}, ty.vec2<f32>()), Expr(Source{{12, 40}}, 1.0f),
      Expr(Source{{12, 46}}, 1.0f), Expr(Source{{12, 52}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 5 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooManyArgumentsVec2Vec2Scalar) {
  auto* tc = vec4<f32>(Construct(Source{{12, 34}}, ty.vec2<f32>()),
                       Construct(Source{{12, 40}}, ty.vec2<f32>()),
                       Expr(Source{{12, 46}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 5 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooManyArgumentsVec2Vec2Vec2) {
  auto* tc = vec4<f32>(Construct(Source{{12, 34}}, ty.vec2<f32>()),
                       Construct(Source{{12, 40}}, ty.vec2<f32>()),
                       Construct(Source{{12, 40}}, ty.vec2<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 6 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooFewArgumentsVec3) {
  auto* tc = vec4<f32>(Construct(Source{{12, 34}}, ty.vec3<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 3 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooManyArgumentsVec3AndScalars) {
  auto* tc =
      vec4<f32>(Construct(Source{{12, 34}}, ty.vec3<f32>()),
                Expr(Source{{12, 40}}, 1.0f), Expr(Source{{12, 46}}, 1.0f));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 5 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooManyArgumentsVec3AndVec2) {
  auto* tc = vec4<f32>(Construct(Source{{12, 34}}, ty.vec3<f32>()),
                       Construct(Source{{12, 40}}, ty.vec2<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 5 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooManyArgumentsVec2AndVec3) {
  auto* tc = vec4<f32>(Construct(Source{{12, 34}}, ty.vec2<f32>()),
                       Construct(Source{{12, 40}}, ty.vec3<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 5 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_TooManyArgumentsVec3AndVec3) {
  auto* tc = vec4<f32>(Construct(Source{{12, 34}}, ty.vec3<f32>()),
                       Construct(Source{{12, 40}}, ty.vec3<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec4<f32>' with 6 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Error_InvalidArgumentType) {
  auto* tc = vec4<f32>(Construct(Source{{12, 34}}, ty.mat2x2<f32>()));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: expected vector or scalar type in vector "
            "constructor; found: mat2x2<f32>");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Success_ZeroValue) {
  auto* tc = vec4<f32>();
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4F32_Success_Scalar) {
  auto* tc = vec4<f32>(1.0f, 1.0f, 1.0f, 1.0f);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4U32_Success_Scalar) {
  auto* tc = vec4<u32>(1u, 1u, 1u, 1u);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4I32_Success_Scalar) {
  auto* tc = vec4<i32>(1, 1, 1, 1);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4Bool_Success_Scalar) {
  auto* tc = vec4<bool>(true, false, true, false);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Success_Vec2ScalarScalar) {
  auto* tc = vec4<f32>(vec2<f32>(), 1.0f, 1.0f);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Success_ScalarVec2Scalar) {
  auto* tc = vec4<f32>(1.0f, vec2<f32>(), 1.0f);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Success_ScalarScalarVec2) {
  auto* tc = vec4<f32>(1.0f, 1.0f, vec2<f32>());
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Success_Vec2AndVec2) {
  auto* tc = vec4<f32>(vec2<f32>(), vec2<f32>());
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Success_Vec3AndScalar) {
  auto* tc = vec4<f32>(vec3<f32>(), 1.0f);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Success_ScalarAndVec3) {
  auto* tc = vec4<f32>(1.0f, vec3<f32>());
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Success_Identity) {
  auto* tc = vec4<f32>(vec4<f32>());
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vec4_Success_Vec4TypeConversion) {
  auto* tc = vec4<f32>(vec4<i32>());
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_NestedVectorConstructors_InnerError) {
  auto* tc = vec4<f32>(vec4<f32>(1.0f, 1.0f,
                                 vec3<f32>(Expr(Source{{12, 34}}, 1.0f),
                                           Expr(Source{{12, 34}}, 1.0f))),
                       1.0f);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: attempted to construct 'vec3<f32>' with 2 component(s)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_NestedVectorConstructors_Success) {
  auto* tc = vec4<f32>(vec3<f32>(vec2<f32>(1.0f, 1.0f), 1.0f), 1.0f);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_NE(TypeOf(tc), nullptr);
  ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vector_Alias_Argument_Error) {
  auto* alias = Alias("UnsignedInt", ty.u32());
  Global("uint_var", ty.Of(alias), ast::StorageClass::kPrivate);

  auto* tc = vec2<f32>(Expr(Source{{12, 34}}, "uint_var"));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'f32', found 'u32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vector_Alias_Argument_Success) {
  auto* f32_alias = Alias("Float32", ty.f32());
  auto* vec2_alias = Alias("VectorFloat2", ty.vec2<f32>());
  Global("my_f32", ty.Of(f32_alias), ast::StorageClass::kPrivate);
  Global("my_vec2", ty.Of(vec2_alias), ast::StorageClass::kPrivate);

  auto* tc = vec3<f32>("my_vec2", "my_f32");
  WrapInFunction(tc);
  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vector_ElementTypeAlias_Error) {
  auto* f32_alias = Alias("Float32", ty.f32());

  // vec2<Float32>(1.0f, 1u)
  auto* vec_type = ty.vec(ty.Of(f32_alias), 2);
  auto* tc =
      Construct(Source{{12, 34}}, vec_type, 1.0f, Expr(Source{{12, 40}}, 1u));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:40 error: type in vector constructor does not match vector "
            "type: expected 'f32', found 'u32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vector_ElementTypeAlias_Success) {
  auto* f32_alias = Alias("Float32", ty.f32());

  // vec2<Float32>(1.0f, 1.0f)
  auto* vec_type = ty.vec(ty.Of(f32_alias), 2);
  auto* tc = Construct(Source{{12, 34}}, vec_type, 1.0f, 1.0f);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vector_ArgumentElementTypeAlias_Error) {
  auto* f32_alias = Alias("Float32", ty.f32());

  // vec3<u32>(vec<Float32>(), 1.0f)
  auto* vec_type = ty.vec(ty.Of(f32_alias), 2);
  auto* tc = vec3<u32>(Construct(Source{{12, 34}}, vec_type), 1.0f);
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type in vector constructor does not match vector "
            "type: expected 'u32', found 'f32'");
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_Constructor_Vector_ArgumentElementTypeAlias_Success) {
  auto* f32_alias = Alias("Float32", ty.f32());

  // vec3<f32>(vec<Float32>(), 1.0f)
  auto* vec_type = ty.vec(ty.Of(f32_alias), 2);
  auto* tc = vec3<f32>(Construct(Source{{12, 34}}, vec_type), 1.0f);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_F(ResolverTypeConstructorValidationTest, InferVec2ElementTypeFromScalars) {
  auto* vec2_bool =
      Construct(create<ast::Vector>(nullptr, 2), Expr(true), Expr(false));
  auto* vec2_i32 = Construct(create<ast::Vector>(nullptr, 2), Expr(1), Expr(2));
  auto* vec2_u32 =
      Construct(create<ast::Vector>(nullptr, 2), Expr(1u), Expr(2u));
  auto* vec2_f32 =
      Construct(create<ast::Vector>(nullptr, 2), Expr(1.0f), Expr(2.0f));
  WrapInFunction(vec2_bool, vec2_i32, vec2_u32, vec2_f32);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_TRUE(TypeOf(vec2_bool)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec2_i32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec2_u32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec2_f32)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(vec2_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_TRUE(TypeOf(vec2_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_TRUE(TypeOf(vec2_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_TRUE(TypeOf(vec2_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(vec2_bool)->As<sem::Vector>()->Width(), 2u);
  EXPECT_EQ(TypeOf(vec2_i32)->As<sem::Vector>()->Width(), 2u);
  EXPECT_EQ(TypeOf(vec2_u32)->As<sem::Vector>()->Width(), 2u);
  EXPECT_EQ(TypeOf(vec2_f32)->As<sem::Vector>()->Width(), 2u);
  EXPECT_EQ(TypeOf(vec2_bool), TypeOf(vec2_bool->target.type));
  EXPECT_EQ(TypeOf(vec2_i32), TypeOf(vec2_i32->target.type));
  EXPECT_EQ(TypeOf(vec2_u32), TypeOf(vec2_u32->target.type));
  EXPECT_EQ(TypeOf(vec2_f32), TypeOf(vec2_f32->target.type));
}

TEST_F(ResolverTypeConstructorValidationTest, InferVec2ElementTypeFromVec2) {
  auto* vec2_bool =
      Construct(create<ast::Vector>(nullptr, 2), vec2<bool>(true, false));
  auto* vec2_i32 = Construct(create<ast::Vector>(nullptr, 2), vec2<i32>(1, 2));
  auto* vec2_u32 =
      Construct(create<ast::Vector>(nullptr, 2), vec2<u32>(1u, 2u));
  auto* vec2_f32 =
      Construct(create<ast::Vector>(nullptr, 2), vec2<f32>(1.0f, 2.0f));
  WrapInFunction(vec2_bool, vec2_i32, vec2_u32, vec2_f32);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_TRUE(TypeOf(vec2_bool)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec2_i32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec2_u32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec2_f32)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(vec2_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_TRUE(TypeOf(vec2_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_TRUE(TypeOf(vec2_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_TRUE(TypeOf(vec2_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(vec2_bool)->As<sem::Vector>()->Width(), 2u);
  EXPECT_EQ(TypeOf(vec2_i32)->As<sem::Vector>()->Width(), 2u);
  EXPECT_EQ(TypeOf(vec2_u32)->As<sem::Vector>()->Width(), 2u);
  EXPECT_EQ(TypeOf(vec2_f32)->As<sem::Vector>()->Width(), 2u);
  EXPECT_EQ(TypeOf(vec2_bool), TypeOf(vec2_bool->target.type));
  EXPECT_EQ(TypeOf(vec2_i32), TypeOf(vec2_i32->target.type));
  EXPECT_EQ(TypeOf(vec2_u32), TypeOf(vec2_u32->target.type));
  EXPECT_EQ(TypeOf(vec2_f32), TypeOf(vec2_f32->target.type));
}

TEST_F(ResolverTypeConstructorValidationTest, InferVec3ElementTypeFromScalars) {
  auto* vec3_bool = Construct(create<ast::Vector>(nullptr, 3), Expr(true),
                              Expr(false), Expr(true));
  auto* vec3_i32 =
      Construct(create<ast::Vector>(nullptr, 3), Expr(1), Expr(2), Expr(3));
  auto* vec3_u32 =
      Construct(create<ast::Vector>(nullptr, 3), Expr(1u), Expr(2u), Expr(3u));
  auto* vec3_f32 = Construct(create<ast::Vector>(nullptr, 3), Expr(1.0f),
                             Expr(2.0f), Expr(3.0f));
  WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_TRUE(TypeOf(vec3_bool)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec3_i32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec3_u32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec3_f32)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(vec3_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_TRUE(TypeOf(vec3_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_TRUE(TypeOf(vec3_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_TRUE(TypeOf(vec3_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(vec3_bool)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_i32)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_u32)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_f32)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_bool), TypeOf(vec3_bool->target.type));
  EXPECT_EQ(TypeOf(vec3_i32), TypeOf(vec3_i32->target.type));
  EXPECT_EQ(TypeOf(vec3_u32), TypeOf(vec3_u32->target.type));
  EXPECT_EQ(TypeOf(vec3_f32), TypeOf(vec3_f32->target.type));
}

TEST_F(ResolverTypeConstructorValidationTest, InferVec3ElementTypeFromVec3) {
  auto* vec3_bool =
      Construct(create<ast::Vector>(nullptr, 3), vec3<bool>(true, false, true));
  auto* vec3_i32 =
      Construct(create<ast::Vector>(nullptr, 3), vec3<i32>(1, 2, 3));
  auto* vec3_u32 =
      Construct(create<ast::Vector>(nullptr, 3), vec3<u32>(1u, 2u, 3u));
  auto* vec3_f32 =
      Construct(create<ast::Vector>(nullptr, 3), vec3<f32>(1.0f, 2.0f, 3.0f));
  WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_TRUE(TypeOf(vec3_bool)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec3_i32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec3_u32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec3_f32)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(vec3_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_TRUE(TypeOf(vec3_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_TRUE(TypeOf(vec3_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_TRUE(TypeOf(vec3_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(vec3_bool)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_i32)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_u32)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_f32)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_bool), TypeOf(vec3_bool->target.type));
  EXPECT_EQ(TypeOf(vec3_i32), TypeOf(vec3_i32->target.type));
  EXPECT_EQ(TypeOf(vec3_u32), TypeOf(vec3_u32->target.type));
  EXPECT_EQ(TypeOf(vec3_f32), TypeOf(vec3_f32->target.type));
}

TEST_F(ResolverTypeConstructorValidationTest,
       InferVec3ElementTypeFromScalarAndVec2) {
  auto* vec3_bool = Construct(create<ast::Vector>(nullptr, 3), Expr(true),
                              vec2<bool>(false, true));
  auto* vec3_i32 =
      Construct(create<ast::Vector>(nullptr, 3), Expr(1), vec2<i32>(2, 3));
  auto* vec3_u32 =
      Construct(create<ast::Vector>(nullptr, 3), Expr(1u), vec2<u32>(2u, 3u));
  auto* vec3_f32 = Construct(create<ast::Vector>(nullptr, 3), Expr(1.0f),
                             vec2<f32>(2.0f, 3.0f));
  WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_TRUE(TypeOf(vec3_bool)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec3_i32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec3_u32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec3_f32)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(vec3_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_TRUE(TypeOf(vec3_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_TRUE(TypeOf(vec3_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_TRUE(TypeOf(vec3_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(vec3_bool)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_i32)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_u32)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_f32)->As<sem::Vector>()->Width(), 3u);
  EXPECT_EQ(TypeOf(vec3_bool), TypeOf(vec3_bool->target.type));
  EXPECT_EQ(TypeOf(vec3_i32), TypeOf(vec3_i32->target.type));
  EXPECT_EQ(TypeOf(vec3_u32), TypeOf(vec3_u32->target.type));
  EXPECT_EQ(TypeOf(vec3_f32), TypeOf(vec3_f32->target.type));
}

TEST_F(ResolverTypeConstructorValidationTest, InferVec4ElementTypeFromScalars) {
  auto* vec4_bool = Construct(create<ast::Vector>(nullptr, 4), Expr(true),
                              Expr(false), Expr(true), Expr(false));
  auto* vec4_i32 = Construct(create<ast::Vector>(nullptr, 4), Expr(1), Expr(2),
                             Expr(3), Expr(4));
  auto* vec4_u32 = Construct(create<ast::Vector>(nullptr, 4), Expr(1u),
                             Expr(2u), Expr(3u), Expr(4u));
  auto* vec4_f32 = Construct(create<ast::Vector>(nullptr, 4), Expr(1.0f),
                             Expr(2.0f), Expr(3.0f), Expr(4.0f));
  WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_TRUE(TypeOf(vec4_bool)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_i32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_u32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_f32)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(vec4_bool)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_i32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_u32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_f32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_bool), TypeOf(vec4_bool->target.type));
  EXPECT_EQ(TypeOf(vec4_i32), TypeOf(vec4_i32->target.type));
  EXPECT_EQ(TypeOf(vec4_u32), TypeOf(vec4_u32->target.type));
  EXPECT_EQ(TypeOf(vec4_f32), TypeOf(vec4_f32->target.type));
}

TEST_F(ResolverTypeConstructorValidationTest, InferVec4ElementTypeFromVec4) {
  auto* vec4_bool = Construct(create<ast::Vector>(nullptr, 4),
                              vec4<bool>(true, false, true, false));
  auto* vec4_i32 =
      Construct(create<ast::Vector>(nullptr, 4), vec4<i32>(1, 2, 3, 4));
  auto* vec4_u32 =
      Construct(create<ast::Vector>(nullptr, 4), vec4<u32>(1u, 2u, 3u, 4u));
  auto* vec4_f32 = Construct(create<ast::Vector>(nullptr, 4),
                             vec4<f32>(1.0f, 2.0f, 3.0f, 4.0f));
  WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_TRUE(TypeOf(vec4_bool)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_i32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_u32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_f32)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(vec4_bool)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_i32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_u32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_f32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_bool), TypeOf(vec4_bool->target.type));
  EXPECT_EQ(TypeOf(vec4_i32), TypeOf(vec4_i32->target.type));
  EXPECT_EQ(TypeOf(vec4_u32), TypeOf(vec4_u32->target.type));
  EXPECT_EQ(TypeOf(vec4_f32), TypeOf(vec4_f32->target.type));
}

TEST_F(ResolverTypeConstructorValidationTest,
       InferVec4ElementTypeFromScalarAndVec3) {
  auto* vec4_bool = Construct(create<ast::Vector>(nullptr, 4), Expr(true),
                              vec3<bool>(false, true, false));
  auto* vec4_i32 =
      Construct(create<ast::Vector>(nullptr, 4), Expr(1), vec3<i32>(2, 3, 4));
  auto* vec4_u32 = Construct(create<ast::Vector>(nullptr, 4), Expr(1u),
                             vec3<u32>(2u, 3u, 4u));
  auto* vec4_f32 = Construct(create<ast::Vector>(nullptr, 4), Expr(1.0f),
                             vec3<f32>(2.0f, 3.0f, 4.0f));
  WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_TRUE(TypeOf(vec4_bool)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_i32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_u32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_f32)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(vec4_bool)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_i32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_u32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_f32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_bool), TypeOf(vec4_bool->target.type));
  EXPECT_EQ(TypeOf(vec4_i32), TypeOf(vec4_i32->target.type));
  EXPECT_EQ(TypeOf(vec4_u32), TypeOf(vec4_u32->target.type));
  EXPECT_EQ(TypeOf(vec4_f32), TypeOf(vec4_f32->target.type));
}

TEST_F(ResolverTypeConstructorValidationTest,
       InferVec4ElementTypeFromVec2AndVec2) {
  auto* vec4_bool = Construct(create<ast::Vector>(nullptr, 4),
                              vec2<bool>(true, false), vec2<bool>(true, false));
  auto* vec4_i32 = Construct(create<ast::Vector>(nullptr, 4), vec2<i32>(1, 2),
                             vec2<i32>(3, 4));
  auto* vec4_u32 = Construct(create<ast::Vector>(nullptr, 4), vec2<u32>(1u, 2u),
                             vec2<u32>(3u, 4u));
  auto* vec4_f32 = Construct(create<ast::Vector>(nullptr, 4),
                             vec2<f32>(1.0f, 2.0f), vec2<f32>(3.0f, 4.0f));
  WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32);

  ASSERT_TRUE(r()->Resolve()) << r()->error();

  ASSERT_TRUE(TypeOf(vec4_bool)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_i32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_u32)->Is<sem::Vector>());
  ASSERT_TRUE(TypeOf(vec4_f32)->Is<sem::Vector>());
  EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
  EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
  EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
  EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
  EXPECT_EQ(TypeOf(vec4_bool)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_i32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_u32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_f32)->As<sem::Vector>()->Width(), 4u);
  EXPECT_EQ(TypeOf(vec4_bool), TypeOf(vec4_bool->target.type));
  EXPECT_EQ(TypeOf(vec4_i32), TypeOf(vec4_i32->target.type));
  EXPECT_EQ(TypeOf(vec4_u32), TypeOf(vec4_u32->target.type));
  EXPECT_EQ(TypeOf(vec4_f32), TypeOf(vec4_f32->target.type));
}

TEST_F(ResolverTypeConstructorValidationTest,
       CannotInferVectorElementTypeWithoutArgs) {
  WrapInFunction(Construct(create<ast::Vector>(Source{{12, 34}}, nullptr, 3)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(), "12:34 error: missing vector element type");
}

TEST_F(ResolverTypeConstructorValidationTest,
       CannotInferVec2ElementTypeFromScalarsMismatch) {
  WrapInFunction(Construct(Source{{1, 1}}, create<ast::Vector>(nullptr, 2),
                           Expr(Source{{1, 2}}, 1),  //
                           Expr(Source{{1, 3}}, 2u)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      R"(1:1 error: cannot infer vector element type, as constructor arguments have different types
1:2 note: argument 0 has type i32
1:3 note: argument 1 has type u32)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       CannotInferVec3ElementTypeFromScalarsMismatch) {
  WrapInFunction(Construct(Source{{1, 1}}, create<ast::Vector>(nullptr, 3),
                           Expr(Source{{1, 2}}, 1),   //
                           Expr(Source{{1, 3}}, 2u),  //
                           Expr(Source{{1, 4}}, 3)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      R"(1:1 error: cannot infer vector element type, as constructor arguments have different types
1:2 note: argument 0 has type i32
1:3 note: argument 1 has type u32
1:4 note: argument 2 has type i32)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       CannotInferVec3ElementTypeFromScalarAndVec2Mismatch) {
  WrapInFunction(
      Construct(Source{{1, 1}}, create<ast::Vector>(nullptr, 3),
                Expr(Source{{1, 2}}, 1),  //
                Construct(Source{{1, 3}}, ty.vec2<f32>(), 2.0f, 3.0f)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      R"(1:1 error: cannot infer vector element type, as constructor arguments have different types
1:2 note: argument 0 has type i32
1:3 note: argument 1 has type vec2<f32>)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       CannotInferVec4ElementTypeFromScalarsMismatch) {
  WrapInFunction(Construct(Source{{1, 1}}, create<ast::Vector>(nullptr, 4),
                           Expr(Source{{1, 2}}, 1),     //
                           Expr(Source{{1, 3}}, 2),     //
                           Expr(Source{{1, 4}}, 3.0f),  //
                           Expr(Source{{1, 5}}, 4)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      R"(1:1 error: cannot infer vector element type, as constructor arguments have different types
1:2 note: argument 0 has type i32
1:3 note: argument 1 has type i32
1:4 note: argument 2 has type f32
1:5 note: argument 3 has type i32)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       CannotInferVec4ElementTypeFromScalarAndVec3Mismatch) {
  WrapInFunction(
      Construct(Source{{1, 1}}, create<ast::Vector>(nullptr, 4),
                Expr(Source{{1, 2}}, 1),  //
                Construct(Source{{1, 3}}, ty.vec3<u32>(), 2u, 3u, 4u)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      R"(1:1 error: cannot infer vector element type, as constructor arguments have different types
1:2 note: argument 0 has type i32
1:3 note: argument 1 has type vec3<u32>)");
}

TEST_F(ResolverTypeConstructorValidationTest,
       CannotInferVec4ElementTypeFromVec2AndVec2Mismatch) {
  WrapInFunction(Construct(Source{{1, 1}}, create<ast::Vector>(nullptr, 4),
                           Construct(Source{{1, 2}}, ty.vec2<i32>(), 3, 4),  //
                           Construct(Source{{1, 3}}, ty.vec2<u32>(), 3u, 4u)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      R"(1:1 error: cannot infer vector element type, as constructor arguments have different types
1:2 note: argument 0 has type vec2<i32>
1:3 note: argument 1 has type vec2<u32>)");
}

}  // namespace VectorConstructor

namespace MatrixConstructor {
struct MatrixDimensions {
  uint32_t rows;
  uint32_t columns;
};

static std::string MatrixStr(const MatrixDimensions& dimensions) {
  return "mat" + std::to_string(dimensions.columns) + "x" +
         std::to_string(dimensions.rows) + "<f32>";
}

using MatrixConstructorTest = ResolverTestWithParam<MatrixDimensions>;

TEST_P(MatrixConstructorTest, Expr_ColumnConstructor_Error_TooFewArguments) {
  // matNxM<f32>(vecM<f32>(), ...); with N - 1 arguments

  const auto param = GetParam();

  std::stringstream args_tys;
  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns - 1; i++) {
    auto* vec_type = ty.vec<f32>(param.rows);
    args.push_back(Construct(Source{{12, i}}, vec_type));
    if (i > 1) {
      args_tys << ", ";
    }
    args_tys << "vec" << param.rows << "<f32>";
  }

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), HasSubstr("12:1 error: no matching constructor " +
                                      MatrixStr(param) + "(" + args_tys.str() +
                                      ")\n\n3 candidates available:"));
}

TEST_P(MatrixConstructorTest, Expr_ElementConstructor_Error_TooFewArguments) {
  // matNxM<f32>(f32,...,f32); with N*M - 1 arguments

  const auto param = GetParam();

  std::stringstream args_tys;
  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns * param.rows - 1; i++) {
    args.push_back(Construct(Source{{12, i}}, ty.f32()));
    if (i > 1) {
      args_tys << ", ";
    }
    args_tys << "f32";
  }

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), HasSubstr("12:1 error: no matching constructor " +
                                      MatrixStr(param) + "(" + args_tys.str() +
                                      ")\n\n3 candidates available:"));
}

TEST_P(MatrixConstructorTest, Expr_ColumnConstructor_Error_TooManyArguments) {
  // matNxM<f32>(vecM<f32>(), ...); with N + 1 arguments

  const auto param = GetParam();

  std::stringstream args_tys;
  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns + 1; i++) {
    auto* vec_type = ty.vec<f32>(param.rows);
    args.push_back(Construct(Source{{12, i}}, vec_type));
    if (i > 1) {
      args_tys << ", ";
    }
    args_tys << "vec" << param.rows << "<f32>";
  }

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), HasSubstr("12:1 error: no matching constructor " +
                                      MatrixStr(param) + "(" + args_tys.str() +
                                      ")\n\n3 candidates available:"));
}

TEST_P(MatrixConstructorTest, Expr_ElementConstructor_Error_TooManyArguments) {
  // matNxM<f32>(f32,...,f32); with N*M + 1 arguments

  const auto param = GetParam();

  std::stringstream args_tys;
  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns * param.rows + 1; i++) {
    args.push_back(Construct(Source{{12, i}}, ty.f32()));
    if (i > 1) {
      args_tys << ", ";
    }
    args_tys << "f32";
  }

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), HasSubstr("12:1 error: no matching constructor " +
                                      MatrixStr(param) + "(" + args_tys.str() +
                                      ")\n\n3 candidates available:"));
}

TEST_P(MatrixConstructorTest,
       Expr_ColumnConstructor_Error_InvalidArgumentType) {
  // matNxM<f32>(vec<u32>, vec<u32>, ...); N arguments

  const auto param = GetParam();

  std::stringstream args_tys;
  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns; i++) {
    auto* vec_type = ty.vec<u32>(param.rows);
    args.push_back(Construct(Source{{12, i}}, vec_type));
    if (i > 1) {
      args_tys << ", ";
    }
    args_tys << "vec" << param.rows << "<u32>";
  }

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), HasSubstr("12:1 error: no matching constructor " +
                                      MatrixStr(param) + "(" + args_tys.str() +
                                      ")\n\n3 candidates available:"));
}

TEST_P(MatrixConstructorTest,
       Expr_ElementConstructor_Error_InvalidArgumentType) {
  // matNxM<f32>(u32, u32, ...); N*M arguments

  const auto param = GetParam();

  std::stringstream args_tys;
  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns; i++) {
    args.push_back(Expr(Source{{12, i}}, 1u));
    if (i > 1) {
      args_tys << ", ";
    }
    args_tys << "u32";
  }

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), HasSubstr("12:1 error: no matching constructor " +
                                      MatrixStr(param) + "(" + args_tys.str() +
                                      ")\n\n3 candidates available:"));
}

TEST_P(MatrixConstructorTest,
       Expr_ColumnConstructor_Error_TooFewRowsInVectorArgument) {
  // matNxM<f32>(vecM<f32>(),...,vecM-1<f32>());

  const auto param = GetParam();

  // Skip the test if parameters would have resulted in an invalid vec1 type.
  if (param.rows == 2) {
    return;
  }

  std::stringstream args_tys;
  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns - 1; i++) {
    auto* valid_vec_type = ty.vec<f32>(param.rows);
    args.push_back(Construct(Source{{12, i}}, valid_vec_type));
    if (i > 1) {
      args_tys << ", ";
    }
    args_tys << "vec" << param.rows << "<f32>";
  }
  const size_t kInvalidLoc = 2 * (param.columns - 1);
  auto* invalid_vec_type = ty.vec<f32>(param.rows - 1);
  args.push_back(Construct(Source{{12, kInvalidLoc}}, invalid_vec_type));
  args_tys << ", vec" << (param.rows - 1) << "<f32>";

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), HasSubstr("12:1 error: no matching constructor " +
                                      MatrixStr(param) + "(" + args_tys.str() +
                                      ")\n\n3 candidates available:"));
}

TEST_P(MatrixConstructorTest,
       Expr_ColumnConstructor_Error_TooManyRowsInVectorArgument) {
  // matNxM<f32>(vecM<f32>(),...,vecM+1<f32>());

  const auto param = GetParam();

  // Skip the test if parameters would have resulted in an invalid vec5 type.
  if (param.rows == 4) {
    return;
  }

  std::stringstream args_tys;
  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns - 1; i++) {
    auto* valid_vec_type = ty.vec<f32>(param.rows);
    args.push_back(Construct(Source{{12, i}}, valid_vec_type));
    if (i > 1) {
      args_tys << ", ";
    }
    args_tys << "vec" << param.rows << "<f32>";
  }
  const size_t kInvalidLoc = 2 * (param.columns - 1);
  auto* invalid_vec_type = ty.vec<f32>(param.rows + 1);
  args.push_back(Construct(Source{{12, kInvalidLoc}}, invalid_vec_type));
  args_tys << ", vec" << (param.rows + 1) << "<f32>";

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), HasSubstr("12:1 error: no matching constructor " +
                                      MatrixStr(param) + "(" + args_tys.str() +
                                      ")\n\n3 candidates available:"));
}

TEST_P(MatrixConstructorTest, Expr_Constructor_ZeroValue_Success) {
  // matNxM<f32>();

  const auto param = GetParam();
  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{{12, 40}}, matrix_type);
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_P(MatrixConstructorTest, Expr_Constructor_WithColumns_Success) {
  // matNxM<f32>(vecM<f32>(), ...); with N arguments

  const auto param = GetParam();

  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns; i++) {
    auto* vec_type = ty.vec<f32>(param.rows);
    args.push_back(Construct(Source{{12, i}}, vec_type));
  }

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_P(MatrixConstructorTest, Expr_Constructor_WithElements_Success) {
  // matNxM<f32>(f32,...,f32); with N*M arguments

  const auto param = GetParam();

  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns * param.rows; i++) {
    args.push_back(Construct(Source{{12, i}}, ty.f32()));
  }

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_P(MatrixConstructorTest, Expr_Constructor_ElementTypeAlias_Error) {
  // matNxM<Float32>(vecM<u32>(), ...); with N arguments

  const auto param = GetParam();
  auto* f32_alias = Alias("Float32", ty.f32());

  std::stringstream args_tys;
  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns; i++) {
    auto* vec_type = ty.vec(ty.u32(), param.rows);
    args.push_back(Construct(Source{{12, i}}, vec_type));
    if (i > 1) {
      args_tys << ", ";
    }
    args_tys << "vec" << param.rows << "<u32>";
  }

  auto* matrix_type = ty.mat(ty.Of(f32_alias), param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), HasSubstr("12:1 error: no matching constructor " +
                                      MatrixStr(param) + "(" + args_tys.str() +
                                      ")\n\n3 candidates available:"));
}

TEST_P(MatrixConstructorTest, Expr_Constructor_ElementTypeAlias_Success) {
  // matNxM<Float32>(vecM<f32>(), ...); with N arguments

  const auto param = GetParam();
  auto* f32_alias = Alias("Float32", ty.f32());

  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns; i++) {
    auto* vec_type = ty.vec<f32>(param.rows);
    args.push_back(Construct(Source{{12, i}}, vec_type));
  }

  auto* matrix_type = ty.mat(ty.Of(f32_alias), param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_F(ResolverTypeConstructorValidationTest,
       Expr_MatrixConstructor_ArgumentTypeAlias_Error) {
  auto* alias = Alias("VectorUnsigned2", ty.vec2<u32>());
  auto* tc =
      mat2x2<f32>(Construct(Source{{12, 34}}, ty.Of(alias)), vec2<f32>());
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      R"(12:34 error: no matching constructor mat2x2<f32>(vec2<u32>, vec2<f32>)

3 candidates available:
  mat2x2<f32>()
  mat2x2<f32>(f32,...,f32) // 4 arguments
  mat2x2<f32>(vec2<f32>, vec2<f32>)
)");
}

TEST_P(MatrixConstructorTest, Expr_Constructor_ArgumentTypeAlias_Success) {
  const auto param = GetParam();
  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* vec_type = ty.vec<f32>(param.rows);
  auto* vec_alias = Alias("VectorFloat2", vec_type);

  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns; i++) {
    args.push_back(Construct(Source{{12, i}}, ty.Of(vec_alias)));
  }

  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_P(MatrixConstructorTest, Expr_Constructor_ArgumentElementTypeAlias_Error) {
  const auto param = GetParam();
  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* f32_alias = Alias("UnsignedInt", ty.u32());

  std::stringstream args_tys;
  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns; i++) {
    auto* vec_type = ty.vec(ty.Of(f32_alias), param.rows);
    args.push_back(Construct(Source{{12, i}}, vec_type));
    if (i > 1) {
      args_tys << ", ";
    }
    args_tys << "vec" << param.rows << "<u32>";
  }

  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), HasSubstr("12:1 error: no matching constructor " +
                                      MatrixStr(param) + "(" + args_tys.str() +
                                      ")\n\n3 candidates available:"));
}

TEST_P(MatrixConstructorTest,
       Expr_Constructor_ArgumentElementTypeAlias_Success) {
  const auto param = GetParam();
  auto* f32_alias = Alias("Float32", ty.f32());

  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns; i++) {
    auto* vec_type = ty.vec(ty.Of(f32_alias), param.rows);
    args.push_back(Construct(Source{{12, i}}, vec_type));
  }

  auto* matrix_type = ty.mat<f32>(param.columns, param.rows);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_P(MatrixConstructorTest, InferElementTypeFromVectors) {
  const auto param = GetParam();

  ast::ExpressionList args;
  for (uint32_t i = 1; i <= param.columns; i++) {
    args.push_back(Construct(ty.vec<f32>(param.rows)));
  }

  auto* matrix_type = create<ast::Matrix>(nullptr, param.rows, param.columns);
  auto* tc = Construct(Source{}, matrix_type, std::move(args));
  WrapInFunction(tc);

  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_P(MatrixConstructorTest, InferElementTypeFromScalars) {
  const auto param = GetParam();

  ast::ExpressionList args;
  for (uint32_t i = 0; i < param.rows * param.columns; i++) {
    args.push_back(Expr(static_cast<f32>(i)));
  }

  auto* matrix_type = create<ast::Matrix>(nullptr, param.rows, param.columns);
  WrapInFunction(Construct(Source{{12, 34}}, matrix_type, std::move(args)));

  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_P(MatrixConstructorTest, CannotInferElementTypeFromVectors_Mismatch) {
  const auto param = GetParam();

  std::stringstream err;
  err << "12:34 error: cannot infer matrix element type, as constructor "
         "arguments have different types";

  ast::ExpressionList args;
  for (uint32_t i = 0; i < param.columns; i++) {
    err << "\n";
    auto src = Source{{1, 10 + i}};
    if (i == 1) {
      // Odd one out
      args.push_back(Construct(src, ty.vec<i32>(param.rows)));
      err << src << " note: argument " << i << " has type vec" << param.rows
          << "<i32>";
    } else {
      args.push_back(Construct(src, ty.vec<f32>(param.rows)));
      err << src << " note: argument " << i << " has type vec" << param.rows
          << "<f32>";
    }
  }

  auto* matrix_type = create<ast::Matrix>(nullptr, param.rows, param.columns);
  WrapInFunction(Construct(Source{{12, 34}}, matrix_type, std::move(args)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), err.str());
}

TEST_P(MatrixConstructorTest, CannotInferElementTypeFromScalars_Mismatch) {
  const auto param = GetParam();

  std::stringstream err;
  err << "12:34 error: cannot infer matrix element type, as constructor "
         "arguments have different types";
  ast::ExpressionList args;
  for (uint32_t i = 0; i < param.rows * param.columns; i++) {
    err << "\n";
    auto src = Source{{1, 10 + i}};
    if (i == 3) {
      args.push_back(Expr(src, static_cast<i32>(i)));  // The odd one out
      err << src << " note: argument " << i << " has type i32";
    } else {
      args.push_back(Expr(src, static_cast<f32>(i)));
      err << src << " note: argument " << i << " has type f32";
    }
  }

  auto* matrix_type = create<ast::Matrix>(nullptr, param.rows, param.columns);
  WrapInFunction(Construct(Source{{12, 34}}, matrix_type, std::move(args)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_THAT(r()->error(), err.str());
}

INSTANTIATE_TEST_SUITE_P(ResolverTypeConstructorValidationTest,
                         MatrixConstructorTest,
                         testing::Values(MatrixDimensions{2, 2},
                                         MatrixDimensions{3, 2},
                                         MatrixDimensions{4, 2},
                                         MatrixDimensions{2, 3},
                                         MatrixDimensions{3, 3},
                                         MatrixDimensions{4, 3},
                                         MatrixDimensions{2, 4},
                                         MatrixDimensions{3, 4},
                                         MatrixDimensions{4, 4}));
}  // namespace MatrixConstructor

namespace StructConstructor {
using builder::CreatePtrs;
using builder::CreatePtrsFor;
using builder::f32;
using builder::i32;
using builder::mat2x2;
using builder::mat3x3;
using builder::mat4x4;
using builder::u32;
using builder::vec2;
using builder::vec3;
using builder::vec4;

constexpr CreatePtrs all_types[] = {
    CreatePtrsFor<bool>(),         //
    CreatePtrsFor<u32>(),          //
    CreatePtrsFor<i32>(),          //
    CreatePtrsFor<f32>(),          //
    CreatePtrsFor<vec4<bool>>(),   //
    CreatePtrsFor<vec2<i32>>(),    //
    CreatePtrsFor<vec3<u32>>(),    //
    CreatePtrsFor<vec4<f32>>(),    //
    CreatePtrsFor<mat2x2<f32>>(),  //
    CreatePtrsFor<mat3x3<f32>>(),  //
    CreatePtrsFor<mat4x4<f32>>()   //
};

auto number_of_members = testing::Values(2u, 32u, 64u);

using StructConstructorInputsTest =
    ResolverTestWithParam<std::tuple<CreatePtrs,  // struct member type
                                     uint32_t>>;  // number of struct members
TEST_P(StructConstructorInputsTest, TooFew) {
  auto& param = GetParam();
  auto& str_params = std::get<0>(param);
  uint32_t N = std::get<1>(param);

  ast::StructMemberList members;
  ast::ExpressionList values;
  for (uint32_t i = 0; i < N; i++) {
    auto* struct_type = str_params.ast(*this);
    members.push_back(Member("member_" + std::to_string(i), struct_type));
    if (i < N - 1) {
      auto* ctor_value_expr = str_params.expr(*this, 0);
      values.push_back(ctor_value_expr);
    }
  }
  auto* s = Structure("s", members);
  auto* tc = Construct(Source{{12, 34}}, ty.Of(s), values);
  WrapInFunction(tc);
  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: struct constructor has too few inputs: expected " +
                std::to_string(N) + ", found " + std::to_string(N - 1));
}

TEST_P(StructConstructorInputsTest, TooMany) {
  auto& param = GetParam();
  auto& str_params = std::get<0>(param);
  uint32_t N = std::get<1>(param);

  ast::StructMemberList members;
  ast::ExpressionList values;
  for (uint32_t i = 0; i < N + 1; i++) {
    if (i < N) {
      auto* struct_type = str_params.ast(*this);
      members.push_back(Member("member_" + std::to_string(i), struct_type));
    }
    auto* ctor_value_expr = str_params.expr(*this, 0);
    values.push_back(ctor_value_expr);
  }
  auto* s = Structure("s", members);
  auto* tc = Construct(Source{{12, 34}}, ty.Of(s), values);
  WrapInFunction(tc);
  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: struct constructor has too many inputs: expected " +
                std::to_string(N) + ", found " + std::to_string(N + 1));
}

INSTANTIATE_TEST_SUITE_P(ResolverTypeConstructorValidationTest,
                         StructConstructorInputsTest,
                         testing::Combine(testing::ValuesIn(all_types),
                                          number_of_members));
using StructConstructorTypeTest =
    ResolverTestWithParam<std::tuple<CreatePtrs,  // struct member type
                                     CreatePtrs,  // constructor value type
                                     uint32_t>>;  // number of struct members
TEST_P(StructConstructorTypeTest, AllTypes) {
  auto& param = GetParam();
  auto& str_params = std::get<0>(param);
  auto& ctor_params = std::get<1>(param);
  uint32_t N = std::get<2>(param);

  if (str_params.ast == ctor_params.ast) {
    return;
  }

  ast::StructMemberList members;
  ast::ExpressionList values;
  // make the last value of the constructor to have a different type
  uint32_t constructor_value_with_different_type = N - 1;
  for (uint32_t i = 0; i < N; i++) {
    auto* struct_type = str_params.ast(*this);
    members.push_back(Member("member_" + std::to_string(i), struct_type));
    auto* ctor_value_expr = (i == constructor_value_with_different_type)
                                ? ctor_params.expr(*this, 0)
                                : str_params.expr(*this, 0);
    values.push_back(ctor_value_expr);
  }
  auto* s = Structure("s", members);
  auto* tc = Construct(ty.Of(s), values);
  WrapInFunction(tc);

  std::string found = FriendlyName(ctor_params.ast(*this));
  std::string expected = FriendlyName(str_params.ast(*this));
  std::stringstream err;
  err << "error: type in struct constructor does not match struct member ";
  err << "type: expected '" << expected << "', found '" << found << "'";
  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(), err.str());
}

INSTANTIATE_TEST_SUITE_P(ResolverTypeConstructorValidationTest,
                         StructConstructorTypeTest,
                         testing::Combine(testing::ValuesIn(all_types),
                                          testing::ValuesIn(all_types),
                                          number_of_members));

TEST_F(ResolverTypeConstructorValidationTest, Expr_Constructor_Struct_Nested) {
  auto* inner_m = Member("m", ty.i32());
  auto* inner_s = Structure("inner_s", {inner_m});

  auto* m0 = Member("m0", ty.i32());
  auto* m1 = Member("m1", ty.Of(inner_s));
  auto* m2 = Member("m2", ty.i32());
  auto* s = Structure("s", {m0, m1, m2});

  auto* tc = Construct(Source{{12, 34}}, ty.Of(s), 1, 1, 1);
  WrapInFunction(tc);
  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "error: type in struct constructor does not match struct member "
            "type: expected 'inner_s', found 'i32'");
}

TEST_F(ResolverTypeConstructorValidationTest, Expr_Constructor_Struct) {
  auto* m = Member("m", ty.i32());
  auto* s = Structure("MyInputs", {m});
  auto* tc = Construct(Source{{12, 34}}, ty.Of(s));
  WrapInFunction(tc);
  ASSERT_TRUE(r()->Resolve()) << r()->error();
}

TEST_F(ResolverTypeConstructorValidationTest, Expr_Constructor_Struct_Empty) {
  auto* str = Structure("S", {
                                 Member("a", ty.i32()),
                                 Member("b", ty.f32()),
                                 Member("c", ty.vec3<i32>()),
                             });

  WrapInFunction(Construct(ty.Of(str)));
  ASSERT_TRUE(r()->Resolve()) << r()->error();
}
}  // namespace StructConstructor

TEST_F(ResolverTypeConstructorValidationTest, NonConstructibleType_Atomic) {
  WrapInFunction(
      Assign(Phony(), Construct(Source{{12, 34}}, ty.atomic(ty.i32()))));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(), "12:34 error: type is not constructible");
}

TEST_F(ResolverTypeConstructorValidationTest,
       NonConstructibleType_AtomicArray) {
  WrapInFunction(Assign(
      Phony(), Construct(Source{{12, 34}}, ty.array(ty.atomic(ty.i32()), 4))));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(
      r()->error(),
      "12:34 error: array constructor has non-constructible element type");
}

TEST_F(ResolverTypeConstructorValidationTest,
       NonConstructibleType_AtomicStructMember) {
  auto* str = Structure("S", {Member("a", ty.atomic(ty.i32()))});
  WrapInFunction(Assign(Phony(), Construct(Source{{12, 34}}, ty.Of(str))));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: struct constructor has non-constructible type");
}

TEST_F(ResolverTypeConstructorValidationTest, NonConstructibleType_Sampler) {
  WrapInFunction(Assign(
      Phony(),
      Construct(Source{{12, 34}}, ty.sampler(ast::SamplerKind::kSampler))));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(), "12:34 error: type is not constructible");
}

TEST_F(ResolverTypeConstructorValidationTest, TypeConstructorAsStatement) {
  WrapInFunction(
      CallStmt(Construct(Source{{12, 34}}, ty.vec2<f32>(), 1.f, 2.f)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(),
            "12:34 error: type constructor evaluated but not used");
}

TEST_F(ResolverTypeConstructorValidationTest, TypeConversionAsStatement) {
  WrapInFunction(CallStmt(Construct(Source{{12, 34}}, ty.f32(), 1)));

  EXPECT_FALSE(r()->Resolve());
  EXPECT_EQ(r()->error(), "12:34 error: type cast evaluated but not used");
}

}  // namespace
}  // namespace resolver
}  // namespace tint
