// 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/resolver/resolver_test_helper.h"
#include "src/sem/reference_type.h"
#include "src/sem/type_constructor.h"
#include "src/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(
      Call("ignore", 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(Call(
      "ignore", 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(Call("ignore", 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(Call(
      "ignore",
      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
