// 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 "gmock/gmock.h"
#include "src/tint/lang/core/constant/scalar.h"
#include "src/tint/lang/wgsl/ast/case_selector.h"
#include "src/tint/lang/wgsl/ast/int_literal_expression.h"
#include "src/tint/lang/wgsl/helpers/ir_program_test.h"

namespace tint::wgsl::reader {
namespace {

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

using ProgramToIRVarTest = helpers::IRProgramTest;

TEST_F(ProgramToIRVarTest, Emit_GlobalVar_NoInit) {
    GlobalVar("a", ty.u32(), core::AddressSpace::kPrivate);

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
  %a:ptr<private, u32, read_write> = var
}

)");
}

TEST_F(ProgramToIRVarTest, Emit_GlobalVar_Init) {
    auto* expr = Expr(2_u);
    GlobalVar("a", ty.u32(), core::AddressSpace::kPrivate, expr);

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
  %a:ptr<private, u32, read_write> = var, 2u
}

)");
}

TEST_F(ProgramToIRVarTest, Emit_GlobalVar_GroupBinding) {
    GlobalVar("a", ty.u32(), core::AddressSpace::kStorage, Vector{Group(2_u), Binding(3_u)});

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
  %a:ptr<storage, u32, read> = var @binding_point(2, 3)
}

)");
}

TEST_F(ProgramToIRVarTest, Emit_Var_NoInit) {
    auto* a = Var("a", ty.u32(), core::AddressSpace::kFunction);
    WrapInFunction(a);

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()),
              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
  %b1 = block {
    %a:ptr<function, u32, read_write> = var
    ret
  }
}
)");
}

TEST_F(ProgramToIRVarTest, Emit_Var_Init_Constant) {
    auto* expr = Expr(2_u);
    auto* a = Var("a", ty.u32(), core::AddressSpace::kFunction, expr);
    WrapInFunction(a);

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()),
              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
  %b1 = block {
    %a:ptr<function, u32, read_write> = var, 2u
    ret
  }
}
)");
}

TEST_F(ProgramToIRVarTest, Emit_Var_Init_NonConstant) {
    auto* a = Var("a", ty.u32(), core::AddressSpace::kFunction);
    auto* b = Var("b", ty.u32(), core::AddressSpace::kFunction, Add("a", 2_u));
    WrapInFunction(a, b);

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()),
              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
  %b1 = block {
    %a:ptr<function, u32, read_write> = var
    %3:u32 = load %a
    %4:u32 = add %3, 2u
    %b:ptr<function, u32, read_write> = var, %4
    ret
  }
}
)");
}

TEST_F(ProgramToIRVarTest, Emit_Var_Assign_42i) {
    WrapInFunction(Var("a", ty.i32(), core::AddressSpace::kFunction),  //
                   Assign("a", 42_i));

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()),
              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
  %b1 = block {
    %a:ptr<function, i32, read_write> = var
    store %a, 42i
    ret
  }
}
)");
}

TEST_F(ProgramToIRVarTest, Emit_Var_Assign_ArrayOfArray_EvalOrder) {
    Func("f", Vector{Param("p", ty.i32())}, ty.i32(), Vector{Return("p")});

    auto* lhs =                                 //
        IndexAccessor(                          //
            IndexAccessor(                      //
                IndexAccessor("a",              //
                              Call("f", 1_i)),  //
                Call("f", 2_i)),                //
            Call("f", 3_i));

    auto* rhs =                                 //
        IndexAccessor(                          //
            IndexAccessor(                      //
                IndexAccessor("a",              //
                              Call("f", 4_i)),  //
                Call("f", 5_i)),                //
            Call("f", 6_i));

    WrapInFunction(
        Var("a", ty.array<array<array<i32, 5>, 5>, 5>(), core::AddressSpace::kFunction),  //
        Assign(lhs, rhs));

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()),
              R"(%f = func(%p:i32):i32 -> %b1 {
  %b1 = block {
    ret %p
  }
}
%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
  %b2 = block {
    %a:ptr<function, array<array<array<i32, 5>, 5>, 5>, read_write> = var
    %5:i32 = call %f, 1i
    %6:i32 = call %f, 2i
    %7:i32 = call %f, 3i
    %8:ptr<function, i32, read_write> = access %a, %5, %6, %7
    %9:i32 = call %f, 4i
    %10:i32 = call %f, 5i
    %11:i32 = call %f, 6i
    %12:ptr<function, i32, read_write> = access %a, %9, %10, %11
    %13:i32 = load %12
    store %8, %13
    ret
  }
}
)");
}

TEST_F(ProgramToIRVarTest, Emit_Var_Assign_ArrayOfVec_EvalOrder) {
    Func("f", Vector{Param("p", ty.i32())}, ty.i32(), Vector{Return("p")});

    auto* lhs =                             //
        IndexAccessor(                      //
            IndexAccessor("a",              //
                          Call("f", 1_i)),  //
            Call("f", 2_i));

    auto* rhs =                             //
        IndexAccessor(                      //
            IndexAccessor("a",              //
                          Call("f", 4_i)),  //
            Call("f", 5_i));

    WrapInFunction(Var("a", ty.array<vec4<f32>, 5>(), core::AddressSpace::kFunction),  //
                   Assign(lhs, rhs));

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()),
              R"(%f = func(%p:i32):i32 -> %b1 {
  %b1 = block {
    ret %p
  }
}
%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
  %b2 = block {
    %a:ptr<function, array<vec4<f32>, 5>, read_write> = var
    %5:i32 = call %f, 1i
    %6:ptr<function, vec4<f32>, read_write> = access %a, %5
    %7:i32 = call %f, 2i
    %8:i32 = call %f, 4i
    %9:ptr<function, vec4<f32>, read_write> = access %a, %8
    %10:i32 = call %f, 5i
    %11:f32 = load_vector_element %9, %10
    store_vector_element %6, %7, %11
    ret
  }
}
)");
}

TEST_F(ProgramToIRVarTest, Emit_Var_Assign_ArrayOfMatrix_EvalOrder) {
    Func("f", Vector{Param("p", ty.i32())}, ty.i32(), Vector{Return("p")});

    auto* lhs =                                 //
        IndexAccessor(                          //
            IndexAccessor(                      //
                IndexAccessor("a",              //
                              Call("f", 1_i)),  //
                Call("f", 2_i)),                //
            Call("f", 3_i));

    auto* rhs =                                 //
        IndexAccessor(                          //
            IndexAccessor(                      //
                IndexAccessor("a",              //
                              Call("f", 4_i)),  //
                Call("f", 5_i)),                //
            Call("f", 6_i));

    WrapInFunction(Var("a", ty.array<mat3x4<f32>, 5>(), core::AddressSpace::kFunction),  //
                   Assign(lhs, rhs));

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()),
              R"(%f = func(%p:i32):i32 -> %b1 {
  %b1 = block {
    ret %p
  }
}
%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
  %b2 = block {
    %a:ptr<function, array<mat3x4<f32>, 5>, read_write> = var
    %5:i32 = call %f, 1i
    %6:i32 = call %f, 2i
    %7:ptr<function, vec4<f32>, read_write> = access %a, %5, %6
    %8:i32 = call %f, 3i
    %9:i32 = call %f, 4i
    %10:i32 = call %f, 5i
    %11:ptr<function, vec4<f32>, read_write> = access %a, %9, %10
    %12:i32 = call %f, 6i
    %13:f32 = load_vector_element %11, %12
    store_vector_element %7, %8, %13
    ret
  }
}
)");
}

TEST_F(ProgramToIRVarTest, Emit_Var_CompoundAssign_42i) {
    WrapInFunction(Var("a", ty.i32(), core::AddressSpace::kFunction),  //
                   CompoundAssign("a", 42_i, core::BinaryOp::kAdd));

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()),
              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
  %b1 = block {
    %a:ptr<function, i32, read_write> = var
    %3:i32 = load %a
    %4:i32 = add %3, 42i
    store %a, %4
    ret
  }
}
)");
}

TEST_F(ProgramToIRVarTest, Emit_Var_CompoundAssign_ArrayOfArray_EvalOrder) {
    Func("f", Vector{Param("p", ty.i32())}, ty.i32(), Vector{Return("p")});

    auto* lhs =                                 //
        IndexAccessor(                          //
            IndexAccessor(                      //
                IndexAccessor("a",              //
                              Call("f", 1_i)),  //
                Call("f", 2_i)),                //
            Call("f", 3_i));

    auto* rhs =                                 //
        IndexAccessor(                          //
            IndexAccessor(                      //
                IndexAccessor("a",              //
                              Call("f", 4_i)),  //
                Call("f", 5_i)),                //
            Call("f", 6_i));

    WrapInFunction(
        Var("a", ty.array<array<array<i32, 5>, 5>, 5>(), core::AddressSpace::kFunction),  //
        CompoundAssign(lhs, rhs, core::BinaryOp::kAdd));

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()),
              R"(%f = func(%p:i32):i32 -> %b1 {
  %b1 = block {
    ret %p
  }
}
%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
  %b2 = block {
    %a:ptr<function, array<array<array<i32, 5>, 5>, 5>, read_write> = var
    %5:i32 = call %f, 1i
    %6:i32 = call %f, 2i
    %7:i32 = call %f, 3i
    %8:ptr<function, i32, read_write> = access %a, %5, %6, %7
    %9:i32 = call %f, 4i
    %10:i32 = call %f, 5i
    %11:i32 = call %f, 6i
    %12:ptr<function, i32, read_write> = access %a, %9, %10, %11
    %13:i32 = load %12
    %14:i32 = load %8
    %15:i32 = add %14, %13
    store %8, %15
    ret
  }
}
)");
}

TEST_F(ProgramToIRVarTest, Emit_Var_CompoundAssign_ArrayOfMatrix_EvalOrder) {
    Func("f", Vector{Param("p", ty.i32())}, ty.i32(), Vector{Return("p")});

    auto* lhs =                                 //
        IndexAccessor(                          //
            IndexAccessor(                      //
                IndexAccessor("a",              //
                              Call("f", 1_i)),  //
                Call("f", 2_i)),                //
            Call("f", 3_i));

    auto* rhs =                                 //
        IndexAccessor(                          //
            IndexAccessor(                      //
                IndexAccessor("a",              //
                              Call("f", 4_i)),  //
                Call("f", 5_i)),                //
            Call("f", 6_i));

    WrapInFunction(Var("a", ty.array<mat3x4<f32>, 5>(), core::AddressSpace::kFunction),  //
                   CompoundAssign(lhs, rhs, core::BinaryOp::kAdd));

    auto m = Build();
    ASSERT_TRUE(m) << m;

    EXPECT_EQ(Disassemble(m.Get()),
              R"(%f = func(%p:i32):i32 -> %b1 {
  %b1 = block {
    ret %p
  }
}
%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
  %b2 = block {
    %a:ptr<function, array<mat3x4<f32>, 5>, read_write> = var
    %5:i32 = call %f, 1i
    %6:i32 = call %f, 2i
    %7:ptr<function, vec4<f32>, read_write> = access %a, %5, %6
    %8:i32 = call %f, 3i
    %9:i32 = call %f, 4i
    %10:i32 = call %f, 5i
    %11:ptr<function, vec4<f32>, read_write> = access %a, %9, %10
    %12:i32 = call %f, 6i
    %13:f32 = load_vector_element %11, %12
    %14:f32 = load_vector_element %7, %8
    %15:f32 = add %14, %13
    store_vector_element %7, %8, %15
    ret
  }
}
)");
}

}  // namespace
}  // namespace tint::wgsl::reader
