// Copyright 2022 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "src/resolver/resolver.h"

#include "gtest/gtest.h"
#include "src/resolver/resolver_test_helper.h"
#include "src/sem/expression.h"
#include "src/sem/member_accessor_expression.h"

namespace tint::resolver {
namespace {

struct SideEffectsTest : ResolverTest {
  template <typename T>
  void MakeSideEffectFunc(const char* name) {
    auto global = Sym();
    Global(global, ty.Of<T>(), ast::StorageClass::kPrivate);
    auto local = Sym();
    Func(name, {}, ty.Of<T>(),
         {
             Decl(Var(local, ty.Of<T>())),
             Assign(global, local),
             Return(global),
         });
  }

  template <typename MAKE_TYPE_FUNC>
  void MakeSideEffectFunc(const char* name, MAKE_TYPE_FUNC make_type) {
    auto global = Sym();
    Global(global, make_type(), ast::StorageClass::kPrivate);
    auto local = Sym();
    Func(name, {}, make_type(),
         {
             Decl(Var(local, make_type())),
             Assign(global, local),
             Return(global),
         });
  }
};

TEST_F(SideEffectsTest, Phony) {
  auto* expr = Phony();
  auto* body = Assign(expr, 1);
  WrapInFunction(body);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Literal) {
  auto* expr = Expr(1);
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, VariableUser) {
  auto* var = Decl(Var("a", ty.i32()));
  auto* expr = Expr("a");
  WrapInFunction(var, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->Is<sem::VariableUser>());
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Call_Builtin_NoSE) {
  Global("a", ty.f32(), ast::StorageClass::kPrivate);
  auto* expr = Call("dpdx", "a");
  Func("f", {}, ty.void_(), {Ignore(expr)},
       {create<ast::StageAttribute>(ast::PipelineStage::kFragment)});

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->Is<sem::Call>());
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Call_Builtin_NoSE_WithSEArg) {
  MakeSideEffectFunc<f32>("se");
  auto* expr = Call("dpdx", Call("se"));
  Func("f", {}, ty.void_(), {Ignore(expr)},
       {create<ast::StageAttribute>(ast::PipelineStage::kFragment)});

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->Is<sem::Call>());
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Call_Builtin_SE) {
  Global("a", ty.atomic(ty.i32()), ast::StorageClass::kWorkgroup);
  auto* expr = Call("atomicAdd", AddressOf("a"), 1);
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->Is<sem::Call>());
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Call_Function) {
  Func("f", {}, ty.i32(), {Return(1)});
  auto* expr = Call("f");
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->Is<sem::Call>());
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Call_TypeConversion_NoSE) {
  auto* var = Decl(Var("a", ty.i32()));
  auto* expr = Construct(ty.f32(), "a");
  WrapInFunction(var, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->Is<sem::Call>());
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Call_TypeConversion_SE) {
  MakeSideEffectFunc<i32>("se");
  auto* expr = Construct(ty.f32(), Call("se"));
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->Is<sem::Call>());
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Call_TypeConstructor_NoSE) {
  auto* var = Decl(Var("a", ty.f32()));
  auto* expr = Construct(ty.f32(), "a");
  WrapInFunction(var, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->Is<sem::Call>());
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Call_TypeConstructor_SE) {
  MakeSideEffectFunc<f32>("se");
  auto* expr = Construct(ty.f32(), Call("se"));
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->Is<sem::Call>());
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, MemberAccessor_Struct_NoSE) {
  auto* s = Structure("S", {Member("m", ty.i32())});
  auto* var = Decl(Var("a", ty.Of(s)));
  auto* expr = MemberAccessor("a", "m");
  WrapInFunction(var, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, MemberAccessor_Struct_SE) {
  auto* s = Structure("S", {Member("m", ty.i32())});
  MakeSideEffectFunc("se", [&] { return ty.Of(s); });
  auto* expr = MemberAccessor(Call("se"), "m");
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, MemberAccessor_Vector) {
  auto* var = Decl(Var("a", ty.vec4<f32>()));
  auto* expr = MemberAccessor("a", "x");
  WrapInFunction(var, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  EXPECT_TRUE(sem->Is<sem::MemberAccessorExpression>());
  ASSERT_NE(sem, nullptr);
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, MemberAccessor_VectorSwizzle) {
  auto* var = Decl(Var("a", ty.vec4<f32>()));
  auto* expr = MemberAccessor("a", "xzyw");
  WrapInFunction(var, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  EXPECT_TRUE(sem->Is<sem::Swizzle>());
  ASSERT_NE(sem, nullptr);
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Binary_NoSE) {
  auto* a = Decl(Var("a", ty.i32()));
  auto* b = Decl(Var("b", ty.i32()));
  auto* expr = Add("a", "b");
  WrapInFunction(a, b, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Binary_LeftSE) {
  MakeSideEffectFunc<i32>("se");
  auto* b = Decl(Var("b", ty.i32()));
  auto* expr = Add(Call("se"), "b");
  WrapInFunction(b, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Binary_RightSE) {
  MakeSideEffectFunc<i32>("se");
  auto* a = Decl(Var("a", ty.i32()));
  auto* expr = Add("a", Call("se"));
  WrapInFunction(a, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Binary_BothSE) {
  MakeSideEffectFunc<i32>("se1");
  MakeSideEffectFunc<i32>("se2");
  auto* expr = Add(Call("se1"), Call("se2"));
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Unary_NoSE) {
  auto* var = Decl(Var("a", ty.bool_()));
  auto* expr = Not("a");
  WrapInFunction(var, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Unary_SE) {
  MakeSideEffectFunc<bool>("se");
  auto* expr = Not(Call("se"));
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, IndexAccessor_NoSE) {
  auto* var = Decl(Var("a", ty.array<i32, 10>()));
  auto* expr = IndexAccessor("a", 0);
  WrapInFunction(var, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, IndexAccessor_ObjSE) {
  MakeSideEffectFunc("se", [&] { return ty.array<i32, 10>(); });
  auto* expr = IndexAccessor(Call("se"), 0);
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, IndexAccessor_IndexSE) {
  MakeSideEffectFunc<i32>("se");
  auto* var = Decl(Var("a", ty.array<i32, 10>()));
  auto* expr = IndexAccessor("a", Call("se"));
  WrapInFunction(var, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, IndexAccessor_BothSE) {
  MakeSideEffectFunc("se1", [&] { return ty.array<i32, 10>(); });
  MakeSideEffectFunc<i32>("se2");
  auto* expr = IndexAccessor(Call("se1"), Call("se2"));
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Bitcast_NoSE) {
  auto* var = Decl(Var("a", ty.i32()));
  auto* expr = Bitcast<f32>("a");
  WrapInFunction(var, expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_FALSE(sem->HasSideEffects());
}

TEST_F(SideEffectsTest, Bitcast_SE) {
  MakeSideEffectFunc<i32>("se");
  auto* expr = Bitcast<f32>(Call("se"));
  WrapInFunction(expr);

  EXPECT_TRUE(r()->Resolve()) << r()->error();
  auto* sem = Sem().Get(expr);
  ASSERT_NE(sem, nullptr);
  EXPECT_TRUE(sem->HasSideEffects());
}

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