// Copyright 2020 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/ast/variable.h"

#include "src/ast/constant_id_decoration.h"
#include "src/ast/identifier_expression.h"
#include "src/ast/test_helper.h"
#include "src/ast/type/f32_type.h"
#include "src/ast/type/i32_type.h"

namespace tint {
namespace ast {
namespace {

using VariableTest = TestHelper;

TEST_F(VariableTest, Creation) {
  auto* v = Var("my_var", StorageClass::kFunction, ty.i32);

  EXPECT_EQ(v->name(), "my_var");
  EXPECT_EQ(v->storage_class(), StorageClass::kFunction);
  EXPECT_EQ(v->type(), ty.i32);
  EXPECT_EQ(v->source().range.begin.line, 0u);
  EXPECT_EQ(v->source().range.begin.column, 0u);
  EXPECT_EQ(v->source().range.end.line, 0u);
  EXPECT_EQ(v->source().range.end.column, 0u);
}

TEST_F(VariableTest, CreationWithSource) {
  auto* v = Var(
      Source{Source::Range{Source::Location{27, 4}, Source::Location{27, 5}}},
      "i", StorageClass::kPrivate, ty.f32, nullptr, VariableDecorationList{});

  EXPECT_EQ(v->name(), "i");
  EXPECT_EQ(v->storage_class(), StorageClass::kPrivate);
  EXPECT_EQ(v->type(), ty.f32);
  EXPECT_EQ(v->source().range.begin.line, 27u);
  EXPECT_EQ(v->source().range.begin.column, 4u);
  EXPECT_EQ(v->source().range.end.line, 27u);
  EXPECT_EQ(v->source().range.end.column, 5u);
}

TEST_F(VariableTest, CreationEmpty) {
  auto* v = Var(
      Source{Source::Range{Source::Location{27, 4}, Source::Location{27, 7}}},
      "a_var", StorageClass::kWorkgroup, ty.i32, nullptr,
      VariableDecorationList{});

  EXPECT_EQ(v->name(), "a_var");
  EXPECT_EQ(v->storage_class(), StorageClass::kWorkgroup);
  EXPECT_EQ(v->type(), ty.i32);
  EXPECT_EQ(v->source().range.begin.line, 27u);
  EXPECT_EQ(v->source().range.begin.column, 4u);
  EXPECT_EQ(v->source().range.end.line, 27u);
  EXPECT_EQ(v->source().range.end.column, 7u);
}

TEST_F(VariableTest, IsValid) {
  auto* v = Var("my_var", StorageClass::kNone, ty.i32);
  EXPECT_TRUE(v->IsValid());
}

TEST_F(VariableTest, IsValid_WithConstructor) {
  auto* v = Var("my_var", StorageClass::kNone, ty.i32, Expr("ident"),
                ast::VariableDecorationList{});
  EXPECT_TRUE(v->IsValid());
}

TEST_F(VariableTest, IsValid_MissinName) {
  auto* v = Var("", StorageClass::kNone, ty.i32);
  EXPECT_FALSE(v->IsValid());
}

TEST_F(VariableTest, IsValid_MissingType) {
  auto* v = Var("x", StorageClass::kNone, nullptr);
  EXPECT_FALSE(v->IsValid());
}

TEST_F(VariableTest, IsValid_MissingBoth) {
  auto* v = Var("", StorageClass::kNone, nullptr);
  EXPECT_FALSE(v->IsValid());
}

TEST_F(VariableTest, IsValid_InvalidConstructor) {
  auto* v = Var("my_var", StorageClass::kNone, ty.i32, Expr(""),
                ast::VariableDecorationList{});
  EXPECT_FALSE(v->IsValid());
}

TEST_F(VariableTest, to_str) {
  auto* v = Var("my_var", StorageClass::kFunction, ty.f32, nullptr,
                ast::VariableDecorationList{});
  std::ostringstream out;
  v->to_str(out, 2);
  EXPECT_EQ(out.str(), R"(  Variable{
    my_var
    function
    __f32
  }
)");
}

TEST_F(VariableTest, WithDecorations) {
  auto* var = Var("my_var", StorageClass::kFunction, ty.i32, nullptr,
                  VariableDecorationList{
                      create<LocationDecoration>(1),
                      create<BuiltinDecoration>(Builtin::kPosition),
                      create<ConstantIdDecoration>(1200),
                  });

  EXPECT_TRUE(var->HasLocationDecoration());
  EXPECT_TRUE(var->HasBuiltinDecoration());
  EXPECT_TRUE(var->HasConstantIdDecoration());
}

TEST_F(VariableTest, ConstantId) {
  auto* var = Var("my_var", StorageClass::kFunction, ty.i32, nullptr,
                  VariableDecorationList{
                      create<ConstantIdDecoration>(1200),
                  });

  EXPECT_EQ(var->constant_id(), 1200u);
}

TEST_F(VariableTest, Decorated_to_str) {
  auto* var = Var("my_var", StorageClass::kFunction, ty.f32, Expr("expr"),
                  VariableDecorationList{
                      create<BindingDecoration>(2),
                      create<SetDecoration>(1),
                  });

  std::ostringstream out;
  var->to_str(out, 2);
  EXPECT_EQ(demangle(out.str()), R"(  Variable{
    Decorations{
      BindingDecoration{2}
      SetDecoration{1}
    }
    my_var
    function
    __f32
    {
      Identifier[not set]{expr}
    }
  }
)");
}

}  // namespace
}  // namespace ast
}  // namespace tint
