// 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::reader::wgsl {
namespace {

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

    auto e = p->expect_param_list();
    ASSERT_FALSE(p->has_error()) << p->error();
    ASSERT_FALSE(e.errored);
    EXPECT_EQ(e.value.Length(), 1u);

    EXPECT_EQ(e.value[0]->name->symbol, p->builder().Symbols().Get("a"));
    ASSERT_TRUE(e.value[0]->type->Is<ast::TypeName>());
    EXPECT_EQ(p->builder().Symbols().NameFor(e.value[0]->type->As<ast::TypeName>()->name->symbol),
              "i32");
    EXPECT_TRUE(e.value[0]->Is<ast::Parameter>());

    ASSERT_EQ(e.value[0]->source.range.begin.line, 1u);
    ASSERT_EQ(e.value[0]->source.range.begin.column, 1u);
    ASSERT_EQ(e.value[0]->source.range.end.line, 1u);
    ASSERT_EQ(e.value[0]->source.range.end.column, 2u);
}

TEST_F(ParserImplTest, ParamList_Multiple) {
    auto p = parser("a : i32, b: f32, c: vec2<f32>");

    auto e = p->expect_param_list();
    ASSERT_FALSE(p->has_error()) << p->error();
    ASSERT_FALSE(e.errored);
    EXPECT_EQ(e.value.Length(), 3u);

    EXPECT_EQ(e.value[0]->name->symbol, p->builder().Symbols().Get("a"));
    ASSERT_TRUE(e.value[0]->type->Is<ast::TypeName>());
    EXPECT_EQ(p->builder().Symbols().NameFor(e.value[0]->type->As<ast::TypeName>()->name->symbol),
              "i32");
    EXPECT_TRUE(e.value[0]->Is<ast::Parameter>());

    ASSERT_EQ(e.value[0]->source.range.begin.line, 1u);
    ASSERT_EQ(e.value[0]->source.range.begin.column, 1u);
    ASSERT_EQ(e.value[0]->source.range.end.line, 1u);
    ASSERT_EQ(e.value[0]->source.range.end.column, 2u);

    EXPECT_EQ(e.value[1]->name->symbol, p->builder().Symbols().Get("b"));
    ASSERT_TRUE(e.value[1]->type->Is<ast::TypeName>());
    EXPECT_EQ(p->builder().Symbols().NameFor(e.value[1]->type->As<ast::TypeName>()->name->symbol),
              "f32");
    EXPECT_TRUE(e.value[1]->Is<ast::Parameter>());

    ASSERT_EQ(e.value[1]->source.range.begin.line, 1u);
    ASSERT_EQ(e.value[1]->source.range.begin.column, 10u);
    ASSERT_EQ(e.value[1]->source.range.end.line, 1u);
    ASSERT_EQ(e.value[1]->source.range.end.column, 11u);

    EXPECT_EQ(e.value[2]->name->symbol, p->builder().Symbols().Get("c"));
    ASSERT_TRUE(e.value[2]->type->Is<ast::Vector>());
    ASSERT_TRUE(e.value[2]->type->As<ast::Vector>()->type->Is<ast::TypeName>());
    EXPECT_EQ(p->builder().Symbols().NameFor(
                  e.value[2]->type->As<ast::Vector>()->type->As<ast::TypeName>()->name->symbol),
              "f32");
    EXPECT_EQ(e.value[2]->type->As<ast::Vector>()->width, 2u);
    EXPECT_TRUE(e.value[2]->Is<ast::Parameter>());

    ASSERT_EQ(e.value[2]->source.range.begin.line, 1u);
    ASSERT_EQ(e.value[2]->source.range.begin.column, 18u);
    ASSERT_EQ(e.value[2]->source.range.end.line, 1u);
    ASSERT_EQ(e.value[2]->source.range.end.column, 19u);
}

TEST_F(ParserImplTest, ParamList_Empty) {
    auto p = parser("");
    auto e = p->expect_param_list();
    ASSERT_FALSE(p->has_error());
    ASSERT_FALSE(e.errored);
    EXPECT_EQ(e.value.Length(), 0u);
}

TEST_F(ParserImplTest, ParamList_TrailingComma) {
    auto p = parser("a : i32,");
    auto e = p->expect_param_list();
    ASSERT_FALSE(p->has_error());
    ASSERT_FALSE(e.errored);
    EXPECT_EQ(e.value.Length(), 1u);
}

TEST_F(ParserImplTest, ParamList_Attributes) {
    auto p = parser("@builtin(position) coord : vec4<f32>, @location(1) loc1 : f32");

    auto e = p->expect_param_list();
    ASSERT_FALSE(p->has_error()) << p->error();
    ASSERT_FALSE(e.errored);
    ASSERT_EQ(e.value.Length(), 2u);

    EXPECT_EQ(e.value[0]->name->symbol, p->builder().Symbols().Get("coord"));
    ASSERT_TRUE(e.value[0]->type->Is<ast::Vector>());
    ASSERT_TRUE(e.value[0]->type->As<ast::Vector>()->type->Is<ast::TypeName>());
    EXPECT_EQ(p->builder().Symbols().NameFor(
                  e.value[0]->type->As<ast::Vector>()->type->As<ast::TypeName>()->name->symbol),
              "f32");
    EXPECT_EQ(e.value[0]->type->As<ast::Vector>()->width, 4u);
    EXPECT_TRUE(e.value[0]->Is<ast::Parameter>());
    auto attrs_0 = e.value[0]->attributes;
    ASSERT_EQ(attrs_0.Length(), 1u);
    EXPECT_TRUE(attrs_0[0]->Is<ast::BuiltinAttribute>());
    EXPECT_EQ(attrs_0[0]->As<ast::BuiltinAttribute>()->builtin, ast::BuiltinValue::kPosition);

    ASSERT_EQ(e.value[0]->source.range.begin.line, 1u);
    ASSERT_EQ(e.value[0]->source.range.begin.column, 20u);
    ASSERT_EQ(e.value[0]->source.range.end.line, 1u);
    ASSERT_EQ(e.value[0]->source.range.end.column, 25u);

    EXPECT_EQ(e.value[1]->name->symbol, p->builder().Symbols().Get("loc1"));
    ASSERT_TRUE(e.value[1]->type->Is<ast::TypeName>());
    EXPECT_EQ(p->builder().Symbols().NameFor(e.value[1]->type->As<ast::TypeName>()->name->symbol),
              "f32");
    EXPECT_TRUE(e.value[1]->Is<ast::Parameter>());
    auto attrs_1 = e.value[1]->attributes;
    ASSERT_EQ(attrs_1.Length(), 1u);

    ASSERT_TRUE(attrs_1[0]->Is<ast::LocationAttribute>());
    auto* attr = attrs_1[0]->As<ast::LocationAttribute>();
    ASSERT_TRUE(attr->expr->Is<ast::IntLiteralExpression>());
    auto* loc = attr->expr->As<ast::IntLiteralExpression>();
    EXPECT_EQ(loc->value, 1u);

    EXPECT_EQ(e.value[1]->source.range.begin.line, 1u);
    EXPECT_EQ(e.value[1]->source.range.begin.column, 52u);
    EXPECT_EQ(e.value[1]->source.range.end.line, 1u);
    EXPECT_EQ(e.value[1]->source.range.end.column, 56u);
}

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