// Copyright 2023 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "src/tint/lang/core/ir/ir_helper_test.h"

#include "src/tint/lang/core/ir/binary/decode.h"
#include "src/tint/lang/core/ir/binary/encode.h"
#include "src/tint/lang/core/ir/disassembler.h"
#include "src/tint/lang/core/type/depth_multisampled_texture.h"
#include "src/tint/lang/core/type/depth_texture.h"
#include "src/tint/lang/core/type/external_texture.h"
#include "src/tint/lang/core/type/multisampled_texture.h"
#include "src/tint/lang/core/type/sampled_texture.h"
#include "src/tint/lang/core/type/storage_texture.h"

namespace tint::core::ir::binary {
namespace {

using namespace tint::core::number_suffixes;  // NOLINT
using namespace tint::core::fluent_types;     // NOLINT

template <typename T = testing::Test>
class IRBinaryRoundtripTestBase : public IRTestParamHelper<T> {
  public:
    std::pair<std::string, std::string> Roundtrip() {
        auto pre = Disassemble(this->mod);
        auto encoded = Encode(this->mod);
        if (encoded != Success) {
            return {pre, encoded.Failure().reason.str()};
        }
        auto decoded = Decode(encoded->Slice());
        if (decoded != Success) {
            return {pre, decoded.Failure().reason.str()};
        }
        auto post = Disassemble(decoded.Get());
        return {pre, post};
    }
};

#define RUN_TEST()                      \
    {                                   \
        auto [pre, post] = Roundtrip(); \
        EXPECT_EQ(pre, post);           \
    }                                   \
    TINT_REQUIRE_SEMICOLON

using IRBinaryRoundtripTest = IRBinaryRoundtripTestBase<>;
TEST_F(IRBinaryRoundtripTest, EmptyModule) {
    RUN_TEST();
}

////////////////////////////////////////////////////////////////////////////////
// Root block
////////////////////////////////////////////////////////////////////////////////
TEST_F(IRBinaryRoundtripTest, RootBlock_Var_private_i32_Unnamed) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, i32>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, RootBlock_Var_workgroup_f32_Named) {
    b.Append(b.ir.root_block, [&] { b.Var<workgroup, f32>("WG"); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, RootBlock_Var_storage_binding) {
    b.Append(b.ir.root_block, [&] {
        auto* v = b.Var<storage, f32>();
        v->SetBindingPoint(10, 20);
    });
    RUN_TEST();
}

////////////////////////////////////////////////////////////////////////////////
// Functions
////////////////////////////////////////////////////////////////////////////////
TEST_F(IRBinaryRoundtripTest, Fn_i32_ret) {
    b.Function("Function", ty.i32());
    RUN_TEST();
}

using IRBinaryRoundtripTest_FnPipelineStage = IRBinaryRoundtripTestBase<Function::PipelineStage>;
TEST_P(IRBinaryRoundtripTest_FnPipelineStage, Test) {
    b.Function("Function", ty.i32(), GetParam());
    RUN_TEST();
}
INSTANTIATE_TEST_SUITE_P(,
                         IRBinaryRoundtripTest_FnPipelineStage,
                         testing::Values(Function::PipelineStage::kCompute,
                                         Function::PipelineStage::kFragment,
                                         Function::PipelineStage::kVertex));

TEST_F(IRBinaryRoundtripTest, Fn_WorkgroupSize) {
    b.Function("Function", ty.i32(), Function::PipelineStage::kCompute,
               std::array<uint32_t, 3>{1, 2, 3});
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Fn_Parameters) {
    auto* fn = b.Function("Function", ty.void_());
    auto* p0 = b.FunctionParam(ty.i32());
    auto* p1 = b.FunctionParam(ty.u32());
    auto* p2 = b.FunctionParam(ty.f32());
    b.ir.SetName(p1, "p1");
    fn->SetParams({p0, p1, p2});
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Fn_ParameterAttributes) {
    auto* fn = b.Function("Function", ty.void_());
    auto* p0 = b.FunctionParam(ty.i32());
    auto* p1 = b.FunctionParam(ty.u32());
    auto* p2 = b.FunctionParam(ty.f32());
    auto* p3 = b.FunctionParam(ty.bool_());
    p0->SetBuiltin(BuiltinValue::kGlobalInvocationId);
    p1->SetInvariant(true);
    p2->SetLocation(10, Interpolation{InterpolationType::kFlat, InterpolationSampling::kCenter});
    p3->SetBindingPoint(20, 30);
    fn->SetParams({p0, p1, p2, p3});
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Fn_ReturnBuiltin) {
    auto* fn = b.Function("Function", ty.void_());
    fn->SetReturnBuiltin(BuiltinValue::kFragDepth);
    b.ir.SetName(fn, "Function");
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Fn_ReturnLocation) {
    auto* fn = b.Function("Function", ty.void_());
    fn->SetReturnLocation(42, std::nullopt);
    b.ir.SetName(fn, "Function");
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Fn_ReturnLocation_Interpolation) {
    auto* fn = b.Function("Function", ty.void_());
    fn->SetReturnLocation(0, core::Interpolation{
                                 core::InterpolationType::kPerspective,
                                 core::InterpolationSampling::kCentroid,
                             });
    b.ir.SetName(fn, "Function");
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Fn_ReturnInvariant) {
    auto* fn = b.Function("Function", ty.void_());
    fn->SetReturnInvariant(true);
    b.ir.SetName(fn, "Function");
    RUN_TEST();
}

////////////////////////////////////////////////////////////////////////////////
// Types
////////////////////////////////////////////////////////////////////////////////
TEST_F(IRBinaryRoundtripTest, bool) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, bool>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, i32) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, i32>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, u32) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, u32>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, f32) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, f32>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, f16) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, f16>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, vec2_f32) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, vec2<f32>>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, vec3_i32) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, vec3<i32>>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, vec4_bool) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, vec4<bool>>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, mat4x2_f32) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, vec4<mat4x2<f32>>>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, mat2x4_f16) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, vec4<mat2x4<f16>>>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, ptr_function_f32_read_write) {
    auto p = b.FunctionParam<ptr<function, f32, read_write>>("p");
    auto* fn = b.Function("Function", ty.void_());
    fn->SetParams({p});
    b.Append(fn->Block(), [&] { b.Return(fn); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, ptr_workgroup_i32_read) {
    auto p = b.FunctionParam<ptr<workgroup, i32, read>>("p");
    auto* fn = b.Function("Function", ty.void_());
    fn->SetParams({p});
    b.Append(fn->Block(), [&] { b.Return(fn); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, array_i32_4) {
    b.Append(b.ir.root_block, [&] { b.Var<private_, array<i32, 4>>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, array_i32_runtime_sized) {
    b.Append(b.ir.root_block, [&] { b.Var<storage, array<i32>>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, struct) {
    Vector members{
        ty.Get<core::type::StructMember>(b.ir.symbols.New("a"), ty.i32(), /* index */ 0u,
                                         /* offset */ 0u, /* align */ 4u, /* size */ 4u,
                                         type::StructMemberAttributes{}),
        ty.Get<core::type::StructMember>(b.ir.symbols.New("b"), ty.f32(), /* index */ 1u,
                                         /* offset */ 4u, /* align */ 4u, /* size */ 32u,
                                         type::StructMemberAttributes{}),
        ty.Get<core::type::StructMember>(b.ir.symbols.New("c"), ty.u32(), /* index */ 2u,
                                         /* offset */ 36u, /* align */ 4u, /* size */ 4u,
                                         type::StructMemberAttributes{}),
        ty.Get<core::type::StructMember>(b.ir.symbols.New("d"), ty.u32(), /* index */ 3u,
                                         /* offset */ 64u, /* align */ 32u, /* size */ 4u,
                                         type::StructMemberAttributes{}),
    };
    auto* S = ty.Struct(b.ir.symbols.New("S"), std::move(members));
    b.Append(b.ir.root_block, [&] { b.Var(ty.ptr<function, read_write>(S)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, StructMemberAttributes) {
    type::StructMemberAttributes attrs{};
    attrs.location = 1;
    attrs.index = 2;
    attrs.color = 3;
    attrs.builtin = core::BuiltinValue::kFragDepth;
    attrs.interpolation = core::Interpolation{
        core::InterpolationType::kLinear,
        core::InterpolationSampling::kCentroid,
    };
    attrs.invariant = true;
    Vector members{
        ty.Get<core::type::StructMember>(b.ir.symbols.New("a"), ty.i32(), /* index */ 0u,
                                         /* offset */ 0u, /* align */ 4u, /* size */ 4u, attrs),
    };
    auto* S = ty.Struct(b.ir.symbols.New("S"), std::move(members));
    b.Append(b.ir.root_block, [&] { b.Var(ty.ptr<function, read_write>(S)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, atomic_i32) {
    b.Append(b.ir.root_block, [&] { b.Var<storage, atomic<i32>>(); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, depth_texture) {
    auto* tex = ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2d);
    b.Append(b.ir.root_block, [&] { b.Var(ty.ptr(handle, tex, read)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, sampled_texture) {
    auto* tex = ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k3d, ty.i32());
    b.Append(b.ir.root_block, [&] { b.Var(ty.ptr(handle, tex, read)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, multisampled_texture) {
    auto* tex =
        ty.Get<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, ty.f32());
    b.Append(b.ir.root_block, [&] { b.Var(ty.ptr(handle, tex, read)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, depth_multisampled_texture) {
    auto* tex = ty.Get<core::type::DepthMultisampledTexture>(core::type::TextureDimension::k2d);
    b.Append(b.ir.root_block, [&] { b.Var(ty.ptr(handle, tex, read)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, storage_texture) {
    auto* tex = ty.Get<core::type::StorageTexture>(core::type::TextureDimension::k2dArray,
                                                   core::TexelFormat::kRg32Float,
                                                   core::Access::kReadWrite, ty.f32());
    b.Append(b.ir.root_block, [&] { b.Var(ty.ptr(handle, tex, read)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, external_texture) {
    auto* tex = ty.Get<core::type::ExternalTexture>();
    b.Append(b.ir.root_block, [&] { b.Var(ty.ptr(handle, tex, read)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, sampler) {
    auto* sampler = ty.Get<core::type::Sampler>(core::type::SamplerKind::kSampler);
    b.Append(b.ir.root_block, [&] { b.Var(ty.ptr(handle, sampler, read)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, comparision_sampler) {
    auto* sampler = ty.Get<core::type::Sampler>(core::type::SamplerKind::kComparisonSampler);
    b.Append(b.ir.root_block, [&] { b.Var(ty.ptr(handle, sampler, read)); });
    RUN_TEST();
}

////////////////////////////////////////////////////////////////////////////////
// Instructions
////////////////////////////////////////////////////////////////////////////////
TEST_F(IRBinaryRoundtripTest, Return) {
    auto* fn = b.Function("Function", ty.void_());
    b.Append(fn->Block(), [&] { b.Return(fn); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_bool) {
    auto* fn = b.Function("Function", ty.bool_());
    b.Append(fn->Block(), [&] { b.Return(fn, true); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_i32) {
    auto* fn = b.Function("Function", ty.i32());
    b.Append(fn->Block(), [&] { b.Return(fn, 42_i); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_u32) {
    auto* fn = b.Function("Function", ty.u32());
    b.Append(fn->Block(), [&] { b.Return(fn, 42_u); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_f32) {
    auto* fn = b.Function("Function", ty.f32());
    b.Append(fn->Block(), [&] { b.Return(fn, 42_f); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_f16) {
    auto* fn = b.Function("Function", ty.f16());
    b.Append(fn->Block(), [&] { b.Return(fn, 42_h); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_vec3f_Composite) {
    auto* fn = b.Function("Function", ty.vec3<f32>());
    b.Append(fn->Block(), [&] { b.Return(fn, b.Composite<vec3<f32>>(1_f, 2_f, 3_f)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_vec3f_Splat) {
    auto* fn = b.Function("Function", ty.vec3<f32>());
    b.Append(fn->Block(), [&] { b.Return(fn, b.Splat<vec3<f32>>(1_f, 3)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_mat2x3f_Composite) {
    auto* fn = b.Function("Function", ty.mat2x3<f32>());
    b.Append(fn->Block(),
             [&] { b.Return(fn, b.Composite<mat2x3<f32>>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_mat2x3f_Splat) {
    auto* fn = b.Function("Function", ty.mat2x3<f32>());
    b.Append(fn->Block(), [&] { b.Return(fn, b.Splat<mat2x3<f32>>(1_f, 6)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_array_f32_Composite) {
    auto* fn = b.Function("Function", ty.array<f32, 3>());
    b.Append(fn->Block(), [&] { b.Return(fn, b.Composite<array<f32, 3>>(1_i, 2_i, 3_i)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Return_array_f32_Splat) {
    auto* fn = b.Function("Function", ty.array<f32, 3>());
    b.Append(fn->Block(), [&] { b.Return(fn, b.Splat<array<f32, 3>>(1_i, 3)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Construct) {
    auto* fn = b.Function("Function", ty.void_());
    b.Append(fn->Block(), [&] {
        b.Construct<vec3<f32>>(1_f, 2_f, 3_f);
        b.Return(fn);
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Discard) {
    auto* fn = b.Function("Function", ty.void_());
    b.Append(fn->Block(), [&] {
        b.Discard();
        b.Return(fn);
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Let) {
    auto* fn = b.Function("Function", ty.void_());
    b.Append(fn->Block(), [&] {
        b.Let("Let", b.Constant(42_i));
        b.Return(fn);
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Var) {
    auto* fn = b.Function("Function", ty.void_());
    b.Append(fn->Block(), [&] {
        b.Var<function>("Var", b.Constant(42_i));
        b.Return(fn);
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Access) {
    auto* fn = b.Function("Function", ty.f32());
    b.Append(fn->Block(),
             [&] { b.Return(fn, b.Access<f32>(b.Construct<mat4x4<f32>>(), 1_u, 2_u)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, UserCall) {
    auto* fn_a = b.Function("A", ty.f32());
    b.Append(fn_a->Block(), [&] { b.Return(fn_a, 42_f); });
    auto* fn_b = b.Function("B", ty.f32());
    b.Append(fn_b->Block(), [&] { b.Return(fn_b, b.Call(fn_a)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, BuiltinCall) {
    auto* fn = b.Function("Function", ty.f32());
    b.Append(fn->Block(), [&] { b.Return(fn, b.Call<i32>(core::BuiltinFn::kMax, 1_i, 2_i)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Load) {
    auto p = b.FunctionParam<ptr<function, f32, read_write>>("p");
    auto* fn = b.Function("Function", ty.f32());
    fn->SetParams({p});
    b.Append(fn->Block(), [&] { b.Return(fn, b.Load(p)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Store) {
    auto p = b.FunctionParam<ptr<function, f32, read_write>>("p");
    auto* fn = b.Function("Function", ty.void_());
    fn->SetParams({p});
    b.Append(fn->Block(), [&] {
        b.Store(p, 42_f);
        b.Return(fn);
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, LoadVectorElement) {
    auto p = b.FunctionParam<ptr<function, vec3<f32>, read_write>>("p");
    auto* fn = b.Function("Function", ty.f32());
    fn->SetParams({p});
    b.Append(fn->Block(), [&] { b.Return(fn, b.LoadVectorElement(p, 1_i)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, StoreVectorElement) {
    auto p = b.FunctionParam<ptr<function, vec3<f32>, read_write>>("p");
    auto* fn = b.Function("Function", ty.void_());
    fn->SetParams({p});
    b.Append(fn->Block(), [&] {
        b.StoreVectorElement(p, 1_u, 42_f);
        b.Return(fn);
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, UnaryOp) {
    auto* x = b.FunctionParam<bool>("x");
    auto* fn = b.Function("Function", ty.bool_());
    fn->SetParams({x});
    b.Append(fn->Block(), [&] { b.Return(fn, b.Not<bool>(x)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, BinaryOp) {
    auto* x = b.FunctionParam<f32>("x");
    auto* y = b.FunctionParam<f32>("y");
    auto* fn = b.Function("Function", ty.f32());
    fn->SetParams({x, y});
    b.Append(fn->Block(), [&] { b.Return(fn, b.Add<f32>(x, y)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Swizzle) {
    auto* x = b.FunctionParam<vec4<f32>>("x");
    auto* fn = b.Function("Function", ty.vec3<f32>());
    fn->SetParams({x});
    b.Append(fn->Block(), [&] {
        b.Return(fn, b.Swizzle<vec3<f32>>(x, Vector<uint32_t, 3>{1, 0, 2}));
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Bitcast) {
    auto* x = b.FunctionParam<vec4<f32>>("x");
    auto* fn = b.Function("Function", ty.vec4<u32>());
    fn->SetParams({x});
    b.Append(fn->Block(), [&] { b.Return(fn, b.Bitcast<vec4<u32>>(x)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Convert) {
    auto* x = b.FunctionParam<vec4<f32>>("x");
    auto* fn = b.Function("Function", ty.vec4<u32>());
    fn->SetParams({x});
    b.Append(fn->Block(), [&] { b.Return(fn, b.Convert<vec4<u32>>(x)); });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, IfTrue) {
    auto* cond = b.FunctionParam<bool>("cond");
    auto* x = b.FunctionParam<i32>("x");
    auto* fn = b.Function("Function", ty.i32());
    fn->SetParams({cond, x});
    b.Append(fn->Block(), [&] {
        auto* if_ = b.If(cond);
        b.Append(if_->True(), [&] { b.Return(fn, x); });
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, IfFalse) {
    auto* cond = b.FunctionParam<bool>("cond");
    auto* x = b.FunctionParam<i32>("x");
    auto* fn = b.Function("Function", ty.i32());
    fn->SetParams({cond, x});
    b.Append(fn->Block(), [&] {
        auto* if_ = b.If(cond);
        b.Append(if_->False(), [&] { b.Return(fn, x); });
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, IfTrueFalse) {
    auto* cond = b.FunctionParam<bool>("cond");
    auto* x = b.FunctionParam<i32>("x");
    auto* y = b.FunctionParam<i32>("y");
    auto* fn = b.Function("Function", ty.i32());
    fn->SetParams({cond, x, y});
    b.Append(fn->Block(), [&] {
        auto* if_ = b.If(cond);
        b.Append(if_->True(), [&] { b.Return(fn, x); });
        b.Append(if_->False(), [&] { b.Return(fn, y); });
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, IfResults) {
    auto* cond = b.FunctionParam<bool>("cond");
    auto* fn = b.Function("Function", ty.i32());
    fn->SetParams({cond});
    b.Append(fn->Block(), [&] {
        auto* if_ = b.If(cond);
        auto* res_a = b.InstructionResult<i32>();
        auto* res_b = b.InstructionResult<f32>();
        if_->SetResults(Vector{res_a, res_b});
        b.Append(if_->True(), [&] { b.ExitIf(if_, 1_i, 2_f); });
        b.Append(if_->False(), [&] { b.ExitIf(if_, 3_i, 4_f); });
        b.Return(fn, res_a);
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Switch) {
    auto* x = b.FunctionParam<i32>("x");
    auto* fn = b.Function("Function", ty.i32());
    fn->SetParams({x});
    b.Append(fn->Block(), [&] {
        auto* switch_ = b.Switch(x);
        b.Append(b.Case(switch_, {b.Constant(1_i)}), [&] { b.Return(fn, 1_i); });
        b.Append(b.Case(switch_, {b.Constant(2_i), b.Constant(3_i)}), [&] { b.Return(fn, 2_i); });
        b.Append(b.Case(switch_, {nullptr}), [&] { b.Return(fn, 3_i); });
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, SwitchResults) {
    auto* x = b.FunctionParam<i32>("x");
    auto* fn = b.Function("Function", ty.i32());
    fn->SetParams({x});
    b.Append(fn->Block(), [&] {
        auto* switch_ = b.Switch(x);
        auto* res = b.InstructionResult<i32>();
        switch_->SetResults(Vector{res});
        b.Append(b.Case(switch_, {b.Constant(1_i)}), [&] { b.ExitSwitch(switch_, 1_i); });
        b.Append(b.Case(switch_, {b.Constant(2_i), b.Constant(3_i)}),
                 [&] { b.ExitSwitch(switch_, 2_i); });
        b.Append(b.Case(switch_, {nullptr}), [&] { b.ExitSwitch(switch_, 3_i); });
        b.Return(fn, res);
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, LoopBody) {
    auto* fn = b.Function("Function", ty.i32());
    b.Append(fn->Block(), [&] {
        auto* loop = b.Loop();
        b.Append(loop->Body(), [&] { b.Return(fn, 1_i); });
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, LoopInitBody) {
    auto* fn = b.Function("Function", ty.i32());
    b.Append(fn->Block(), [&] {
        auto* loop = b.Loop();
        b.Append(loop->Initializer(), [&] {
            b.Let("L", 1_i);
            b.NextIteration(loop);
        });
        b.Append(loop->Body(), [&] { b.Return(fn, 2_i); });
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, LoopInitBodyCont) {
    auto* fn = b.Function("Function", ty.i32());
    b.Append(fn->Block(), [&] {
        auto* loop = b.Loop();
        b.Append(loop->Initializer(), [&] {
            b.Let("L", 1_i);
            b.NextIteration(loop);
        });
        b.Append(loop->Body(), [&] { b.Continue(loop); });
        b.Append(loop->Continuing(), [&] { b.BreakIf(loop, false); });
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, LoopResults) {
    auto* fn = b.Function("Function", ty.i32());
    b.Append(fn->Block(), [&] {
        auto* loop = b.Loop();
        auto* res = b.InstructionResult<i32>();
        loop->SetResults(Vector{res});
        b.Append(loop->Body(), [&] { b.ExitLoop(loop, 1_i); });
        b.Return(fn, res);
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, LoopBlockParams) {
    auto* fn = b.Function("Function", ty.void_());
    b.Append(fn->Block(), [&] {
        auto* loop = b.Loop();
        b.Append(loop->Initializer(), [&] {
            b.Let("L", 1_i);
            b.NextIteration(loop);
        });
        auto* x = b.BlockParam<i32>("x");
        auto* y = b.BlockParam<f32>("y");
        loop->Body()->SetParams({x, y});
        b.Append(loop->Body(), [&] { b.Continue(loop, 1_u, true); });
        auto* z = b.BlockParam<u32>("z");
        auto* w = b.BlockParam<bool>("w");
        loop->Continuing()->SetParams({z, w});
        b.Append(loop->Continuing(), [&] { b.BreakIf(loop, false, 3_i, 4_f); });
        b.Return(fn);
    });
    RUN_TEST();
}

TEST_F(IRBinaryRoundtripTest, Unreachable) {
    auto* fn = b.Function("Function", ty.i32());
    b.Append(fn->Block(), [&] { b.Unreachable(); });
    RUN_TEST();
}

}  // namespace
}  // namespace tint::core::ir::binary
