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

namespace tint {
namespace reader {
namespace wgsl {
namespace {

TEST_F(ParserImplTest, StructMember_Parses) {
  auto p = parser("a : i32,");

  auto& builder = p->builder();

  auto m = p->expect_struct_member();
  ASSERT_FALSE(p->has_error());
  ASSERT_FALSE(m.errored);
  ASSERT_NE(m.value, nullptr);

  EXPECT_EQ(m->symbol, builder.Symbols().Get("a"));
  EXPECT_TRUE(m->type->Is<ast::I32>());
  EXPECT_EQ(m->attributes.size(), 0u);

  EXPECT_EQ(m->source.range, (Source::Range{{1u, 1u}, {1u, 2u}}));
  EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 5u}, {1u, 8u}}));
}

TEST_F(ParserImplTest, StructMember_ParsesWithAlignAttribute) {
  auto p = parser("@align(2) a : i32,");

  auto& builder = p->builder();

  auto m = p->expect_struct_member();
  ASSERT_FALSE(p->has_error());
  ASSERT_FALSE(m.errored);
  ASSERT_NE(m.value, nullptr);

  EXPECT_EQ(m->symbol, builder.Symbols().Get("a"));
  EXPECT_TRUE(m->type->Is<ast::I32>());
  EXPECT_EQ(m->attributes.size(), 1u);
  EXPECT_TRUE(m->attributes[0]->Is<ast::StructMemberAlignAttribute>());
  EXPECT_EQ(m->attributes[0]->As<ast::StructMemberAlignAttribute>()->align, 2u);

  EXPECT_EQ(m->source.range, (Source::Range{{1u, 11u}, {1u, 12u}}));
  EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 15u}, {1u, 18u}}));
}

TEST_F(ParserImplTest, StructMember_ParsesWithSizeAttribute) {
  auto p = parser("@size(2) a : i32,");

  auto& builder = p->builder();

  auto m = p->expect_struct_member();
  ASSERT_FALSE(p->has_error());
  ASSERT_FALSE(m.errored);
  ASSERT_NE(m.value, nullptr);

  EXPECT_EQ(m->symbol, builder.Symbols().Get("a"));
  EXPECT_TRUE(m->type->Is<ast::I32>());
  EXPECT_EQ(m->attributes.size(), 1u);
  EXPECT_TRUE(m->attributes[0]->Is<ast::StructMemberSizeAttribute>());
  EXPECT_EQ(m->attributes[0]->As<ast::StructMemberSizeAttribute>()->size, 2u);

  EXPECT_EQ(m->source.range, (Source::Range{{1u, 10u}, {1u, 11u}}));
  EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 14u}, {1u, 17u}}));
}

TEST_F(ParserImplTest, StructMember_ParsesWithMultipleattributes) {
  auto p = parser(R"(@size(2)
@align(4) a : i32,)");

  auto& builder = p->builder();

  auto m = p->expect_struct_member();
  ASSERT_FALSE(p->has_error());
  ASSERT_FALSE(m.errored);
  ASSERT_NE(m.value, nullptr);

  EXPECT_EQ(m->symbol, builder.Symbols().Get("a"));
  EXPECT_TRUE(m->type->Is<ast::I32>());
  EXPECT_EQ(m->attributes.size(), 2u);
  EXPECT_TRUE(m->attributes[0]->Is<ast::StructMemberSizeAttribute>());
  EXPECT_EQ(m->attributes[0]->As<ast::StructMemberSizeAttribute>()->size, 2u);
  EXPECT_TRUE(m->attributes[1]->Is<ast::StructMemberAlignAttribute>());
  EXPECT_EQ(m->attributes[1]->As<ast::StructMemberAlignAttribute>()->align, 4u);

  EXPECT_EQ(m->source.range, (Source::Range{{2u, 11u}, {2u, 12u}}));
  EXPECT_EQ(m->type->source.range, (Source::Range{{2u, 15u}, {2u, 18u}}));
}

TEST_F(ParserImplTest, StructMember_InvalidAttribute) {
  auto p = parser("@size(nan) a : i32,");

  auto m = p->expect_struct_member();
  ASSERT_TRUE(m.errored);
  ASSERT_EQ(m.value, nullptr);

  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(),
            "1:7: expected signed integer literal for size attribute");
}

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