// 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/reader/wgsl/parser_impl_test_helper.h"

namespace tint {
namespace reader {
namespace wgsl {
namespace {

TEST_F(ParserImplTest, GlobalDecl_Semicolon) {
  auto p = parser(";");
  p->expect_global_decl();
  ASSERT_FALSE(p->has_error()) << p->error();
}

TEST_F(ParserImplTest, GlobalDecl_GlobalVariable) {
  auto p = parser("var<private> a : vec2<i32> = vec2<i32>(1, 2);");
  p->expect_global_decl();
  ASSERT_FALSE(p->has_error()) << p->error();

  auto program = p->program();
  ASSERT_EQ(program.AST().GlobalVariables().size(), 1u);

  auto* v = program.AST().GlobalVariables()[0];
  EXPECT_EQ(v->symbol, program.Symbols().Get("a"));
}

TEST_F(ParserImplTest, GlobalDecl_GlobalVariable_Inferred_Invalid) {
  auto p = parser("var<private> a = vec2<i32>(1, 2);");
  p->expect_global_decl();
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:16: expected ':' for variable declaration");
}

TEST_F(ParserImplTest, GlobalDecl_GlobalVariable_MissingSemicolon) {
  auto p = parser("var<private> a : vec2<i32>");
  p->expect_global_decl();
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:27: expected ';' for variable declaration");
}

TEST_F(ParserImplTest, GlobalDecl_GlobalConstant) {
  auto p = parser("let a : i32 = 2;");
  p->expect_global_decl();
  ASSERT_FALSE(p->has_error()) << p->error();

  auto program = p->program();
  ASSERT_EQ(program.AST().GlobalVariables().size(), 1u);

  auto* v = program.AST().GlobalVariables()[0];
  EXPECT_EQ(v->symbol, program.Symbols().Get("a"));
}

TEST_F(ParserImplTest, GlobalDecl_GlobalConstant_Invalid) {
  auto p = parser("let a : vec2<i32> 1.0;");
  p->expect_global_decl();
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:19: expected ';' for let declaration");
}

TEST_F(ParserImplTest, GlobalDecl_GlobalConstant_MissingSemicolon) {
  auto p = parser("let a : vec2<i32> = vec2<i32>(1, 2)");
  p->expect_global_decl();
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:36: expected ';' for let declaration");
}

TEST_F(ParserImplTest, GlobalDecl_TypeAlias) {
  auto p = parser("type A = i32;");
  p->expect_global_decl();
  ASSERT_FALSE(p->has_error()) << p->error();

  auto program = p->program();
  ASSERT_EQ(program.AST().TypeDecls().size(), 1u);
  ASSERT_TRUE(program.AST().TypeDecls()[0]->Is<ast::Alias>());
  EXPECT_EQ(program.Symbols().NameFor(
                program.AST().TypeDecls()[0]->As<ast::Alias>()->name),
            "A");
}

TEST_F(ParserImplTest, GlobalDecl_TypeAlias_StructIdent) {
  auto p = parser(R"(struct A {
  a : f32;
};
type B = A;)");
  p->expect_global_decl();
  p->expect_global_decl();
  ASSERT_FALSE(p->has_error()) << p->error();

  auto program = p->program();
  ASSERT_EQ(program.AST().TypeDecls().size(), 2u);
  ASSERT_TRUE(program.AST().TypeDecls()[0]->Is<ast::Struct>());
  auto* str = program.AST().TypeDecls()[0]->As<ast::Struct>();
  EXPECT_EQ(str->name, program.Symbols().Get("A"));

  ASSERT_TRUE(program.AST().TypeDecls()[1]->Is<ast::Alias>());
  auto* alias = program.AST().TypeDecls()[1]->As<ast::Alias>();
  EXPECT_EQ(alias->name, program.Symbols().Get("B"));
  auto* tn = alias->type->As<ast::TypeName>();
  EXPECT_NE(tn, nullptr);
  EXPECT_EQ(tn->name, str->name);
}

TEST_F(ParserImplTest, GlobalDecl_TypeAlias_MissingSemicolon) {
  auto p = parser("type A = i32");
  p->expect_global_decl();
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:13: expected ';' for type alias");
}

TEST_F(ParserImplTest, GlobalDecl_Function) {
  auto p = parser("fn main() { return; }");
  p->expect_global_decl();
  ASSERT_FALSE(p->has_error()) << p->error();

  auto program = p->program();
  ASSERT_EQ(program.AST().Functions().size(), 1u);
  EXPECT_EQ(program.Symbols().NameFor(program.AST().Functions()[0]->symbol),
            "main");
}

TEST_F(ParserImplTest, GlobalDecl_Function_WithDecoration) {
  auto p = parser("[[workgroup_size(2)]] fn main() { return; }");
  p->expect_global_decl();
  ASSERT_FALSE(p->has_error()) << p->error();

  auto program = p->program();
  ASSERT_EQ(program.AST().Functions().size(), 1u);
  EXPECT_EQ(program.Symbols().NameFor(program.AST().Functions()[0]->symbol),
            "main");
}

TEST_F(ParserImplTest, GlobalDecl_Function_Invalid) {
  auto p = parser("fn main() -> { return; }");
  p->expect_global_decl();
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:14: unable to determine function return type");
}

TEST_F(ParserImplTest, GlobalDecl_ParsesStruct) {
  auto p = parser("struct A { b: i32; c: f32;};");
  p->expect_global_decl();
  ASSERT_FALSE(p->has_error()) << p->error();

  auto program = p->program();
  ASSERT_EQ(program.AST().TypeDecls().size(), 1u);

  auto* t = program.AST().TypeDecls()[0];
  ASSERT_NE(t, nullptr);
  ASSERT_TRUE(t->Is<ast::Struct>());

  auto* str = t->As<ast::Struct>();
  EXPECT_EQ(str->name, program.Symbols().Get("A"));
  EXPECT_EQ(str->members.size(), 2u);
}

TEST_F(ParserImplTest, GlobalDecl_Struct_WithStride) {
  auto p = parser("struct A { data: [[stride(4)]] array<f32>; };");

  p->expect_global_decl();
  ASSERT_FALSE(p->has_error()) << p->error();

  auto program = p->program();
  ASSERT_EQ(program.AST().TypeDecls().size(), 1u);

  auto* t = program.AST().TypeDecls()[0];
  ASSERT_NE(t, nullptr);
  ASSERT_TRUE(t->Is<ast::Struct>());

  auto* str = t->As<ast::Struct>();
  EXPECT_EQ(str->name, program.Symbols().Get("A"));
  EXPECT_EQ(str->members.size(), 1u);

  const auto* ty = str->members[0]->type;
  ASSERT_TRUE(ty->Is<ast::Array>());
  const auto* arr = ty->As<ast::Array>();

  ASSERT_EQ(arr->decorations.size(), 1u);
  auto* stride = arr->decorations[0];
  ASSERT_TRUE(stride->Is<ast::StrideDecoration>());
  ASSERT_EQ(stride->As<ast::StrideDecoration>()->stride, 4u);
}

// TODO(crbug.com/tint/1324): DEPRECATED: Remove when [[block]] is removed.
TEST_F(ParserImplTest, GlobalDecl_Struct_WithDecoration) {
  auto p = parser("[[block]] struct A { data: f32; };");
  p->expect_global_decl();
  ASSERT_FALSE(p->has_error()) << p->error();

  auto program = p->program();
  ASSERT_EQ(program.AST().TypeDecls().size(), 1u);

  auto* t = program.AST().TypeDecls()[0];
  ASSERT_NE(t, nullptr);
  ASSERT_TRUE(t->Is<ast::Struct>());

  auto* str = t->As<ast::Struct>();
  EXPECT_EQ(str->name, program.Symbols().Get("A"));
  EXPECT_EQ(str->members.size(), 1u);
}

TEST_F(ParserImplTest, GlobalDecl_Struct_Invalid) {
  auto p = parser("A {};");
  p->expect_global_decl();
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:1: unexpected token");
}

TEST_F(ParserImplTest, GlobalDecl_StructMissing_Semi) {
  auto p = parser("struct A {}");
  p->expect_global_decl();
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:12: expected ';' for struct declaration");
}

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