// 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, Attribute_Location) {
  auto p = parser("location(4)");
  auto attr = p->attribute();
  EXPECT_TRUE(attr.matched);
  EXPECT_FALSE(attr.errored);
  ASSERT_NE(attr.value, nullptr);
  auto* var_attr = attr.value->As<ast::Attribute>();
  ASSERT_NE(var_attr, nullptr);
  ASSERT_FALSE(p->has_error());
  ASSERT_TRUE(var_attr->Is<ast::LocationAttribute>());

  auto* loc = var_attr->As<ast::LocationAttribute>();
  EXPECT_EQ(loc->value, 4u);
}

TEST_F(ParserImplTest, Attribute_Location_MissingLeftParen) {
  auto p = parser("location 4)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:10: expected '(' for location attribute");
}

TEST_F(ParserImplTest, Attribute_Location_MissingRightParen) {
  auto p = parser("location(4");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:11: expected ')' for location attribute");
}

TEST_F(ParserImplTest, Attribute_Location_MissingValue) {
  auto p = parser("location()");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(),
            "1:10: expected signed integer literal for location attribute");
}

TEST_F(ParserImplTest, Attribute_Location_MissingInvalid) {
  auto p = parser("location(nan)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(),
            "1:10: expected signed integer literal for location attribute");
}

struct BuiltinData {
  const char* input;
  ast::Builtin result;
};
inline std::ostream& operator<<(std::ostream& out, BuiltinData data) {
  out << std::string(data.input);
  return out;
}

class BuiltinTest : public ParserImplTestWithParam<BuiltinData> {};

TEST_P(BuiltinTest, Attribute_Builtin) {
  auto params = GetParam();
  auto p = parser(std::string("builtin(") + params.input + ")");

  auto attr = p->attribute();
  EXPECT_TRUE(attr.matched);
  EXPECT_FALSE(attr.errored);
  ASSERT_NE(attr.value, nullptr);
  auto* var_attr = attr.value->As<ast::Attribute>();
  ASSERT_FALSE(p->has_error()) << p->error();
  ASSERT_NE(var_attr, nullptr);
  ASSERT_TRUE(var_attr->Is<ast::BuiltinAttribute>());

  auto* builtin = var_attr->As<ast::BuiltinAttribute>();
  EXPECT_EQ(builtin->builtin, params.result);
}
INSTANTIATE_TEST_SUITE_P(
    ParserImplTest,
    BuiltinTest,
    testing::Values(
        BuiltinData{"position", ast::Builtin::kPosition},
        BuiltinData{"vertex_index", ast::Builtin::kVertexIndex},
        BuiltinData{"instance_index", ast::Builtin::kInstanceIndex},
        BuiltinData{"front_facing", ast::Builtin::kFrontFacing},
        BuiltinData{"frag_depth", ast::Builtin::kFragDepth},
        BuiltinData{"local_invocation_id", ast::Builtin::kLocalInvocationId},
        BuiltinData{"local_invocation_idx",
                    ast::Builtin::kLocalInvocationIndex},
        BuiltinData{"local_invocation_index",
                    ast::Builtin::kLocalInvocationIndex},
        BuiltinData{"global_invocation_id", ast::Builtin::kGlobalInvocationId},
        BuiltinData{"workgroup_id", ast::Builtin::kWorkgroupId},
        BuiltinData{"num_workgroups", ast::Builtin::kNumWorkgroups},
        BuiltinData{"sample_index", ast::Builtin::kSampleIndex},
        BuiltinData{"sample_mask", ast::Builtin::kSampleMask}));

TEST_F(ParserImplTest, Attribute_Builtin_MissingLeftParen) {
  auto p = parser("builtin position)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:9: expected '(' for builtin attribute");
}

TEST_F(ParserImplTest, Attribute_Builtin_MissingRightParen) {
  auto p = parser("builtin(position");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:17: expected ')' for builtin attribute");
}

TEST_F(ParserImplTest, Attribute_Builtin_MissingValue) {
  auto p = parser("builtin()");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:9: expected identifier for builtin");
}

TEST_F(ParserImplTest, Attribute_Builtin_InvalidValue) {
  auto p = parser("builtin(other_thingy)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:9: invalid value for builtin attribute");
}

TEST_F(ParserImplTest, Attribute_Builtin_MissingInvalid) {
  auto p = parser("builtin(3)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:9: expected identifier for builtin");
}

TEST_F(ParserImplTest, Attribute_Interpolate_Flat) {
  auto p = parser("interpolate(flat)");
  auto attr = p->attribute();
  EXPECT_TRUE(attr.matched);
  EXPECT_FALSE(attr.errored);
  ASSERT_NE(attr.value, nullptr);
  auto* var_attr = attr.value->As<ast::Attribute>();
  ASSERT_NE(var_attr, nullptr);
  ASSERT_FALSE(p->has_error());
  ASSERT_TRUE(var_attr->Is<ast::InterpolateAttribute>());

  auto* interp = var_attr->As<ast::InterpolateAttribute>();
  EXPECT_EQ(interp->type, ast::InterpolationType::kFlat);
  EXPECT_EQ(interp->sampling, ast::InterpolationSampling::kNone);
}

TEST_F(ParserImplTest, Attribute_Interpolate_Perspective_Center) {
  auto p = parser("interpolate(perspective, center)");
  auto attr = p->attribute();
  EXPECT_TRUE(attr.matched);
  EXPECT_FALSE(attr.errored);
  ASSERT_NE(attr.value, nullptr);
  auto* var_attr = attr.value->As<ast::Attribute>();
  ASSERT_NE(var_attr, nullptr);
  ASSERT_FALSE(p->has_error());
  ASSERT_TRUE(var_attr->Is<ast::InterpolateAttribute>());

  auto* interp = var_attr->As<ast::InterpolateAttribute>();
  EXPECT_EQ(interp->type, ast::InterpolationType::kPerspective);
  EXPECT_EQ(interp->sampling, ast::InterpolationSampling::kCenter);
}

TEST_F(ParserImplTest, Attribute_Interpolate_Perspective_Centroid) {
  auto p = parser("interpolate(perspective, centroid)");
  auto attr = p->attribute();
  EXPECT_TRUE(attr.matched);
  EXPECT_FALSE(attr.errored);
  ASSERT_NE(attr.value, nullptr);
  auto* var_attr = attr.value->As<ast::Attribute>();
  ASSERT_NE(var_attr, nullptr);
  ASSERT_FALSE(p->has_error());
  ASSERT_TRUE(var_attr->Is<ast::InterpolateAttribute>());

  auto* interp = var_attr->As<ast::InterpolateAttribute>();
  EXPECT_EQ(interp->type, ast::InterpolationType::kPerspective);
  EXPECT_EQ(interp->sampling, ast::InterpolationSampling::kCentroid);
}

TEST_F(ParserImplTest, Attribute_Interpolate_Linear_Sample) {
  auto p = parser("interpolate(linear, sample)");
  auto attr = p->attribute();
  EXPECT_TRUE(attr.matched);
  EXPECT_FALSE(attr.errored);
  ASSERT_NE(attr.value, nullptr);
  auto* var_attr = attr.value->As<ast::Attribute>();
  ASSERT_NE(var_attr, nullptr);
  ASSERT_FALSE(p->has_error());
  ASSERT_TRUE(var_attr->Is<ast::InterpolateAttribute>());

  auto* interp = var_attr->As<ast::InterpolateAttribute>();
  EXPECT_EQ(interp->type, ast::InterpolationType::kLinear);
  EXPECT_EQ(interp->sampling, ast::InterpolationSampling::kSample);
}

TEST_F(ParserImplTest, Attribute_Interpolate_MissingLeftParen) {
  auto p = parser("interpolate flat)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:13: expected '(' for interpolate attribute");
}

TEST_F(ParserImplTest, Attribute_Interpolate_MissingRightParen) {
  auto p = parser("interpolate(flat");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:17: expected ')' for interpolate attribute");
}

TEST_F(ParserImplTest, Attribute_Interpolate_MissingFirstValue) {
  auto p = parser("interpolate()");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:13: invalid interpolation type");
}

TEST_F(ParserImplTest, Attribute_Interpolate_InvalidFirstValue) {
  auto p = parser("interpolate(other_thingy)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:13: invalid interpolation type");
}

TEST_F(ParserImplTest, Attribute_Interpolate_MissingSecondValue) {
  auto p = parser("interpolate(perspective,)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:25: invalid interpolation sampling");
}

TEST_F(ParserImplTest, Attribute_Interpolate_InvalidSecondValue) {
  auto p = parser("interpolate(perspective, nope)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:26: invalid interpolation sampling");
}

TEST_F(ParserImplTest, Attribute_Binding) {
  auto p = parser("binding(4)");
  auto attr = p->attribute();
  EXPECT_TRUE(attr.matched);
  EXPECT_FALSE(attr.errored);
  ASSERT_NE(attr.value, nullptr);
  auto* var_attr = attr.value->As<ast::Attribute>();
  ASSERT_NE(var_attr, nullptr);
  ASSERT_FALSE(p->has_error());
  ASSERT_TRUE(var_attr->Is<ast::BindingAttribute>());

  auto* binding = var_attr->As<ast::BindingAttribute>();
  EXPECT_EQ(binding->value, 4u);
}

TEST_F(ParserImplTest, Attribute_Binding_MissingLeftParen) {
  auto p = parser("binding 4)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:9: expected '(' for binding attribute");
}

TEST_F(ParserImplTest, Attribute_Binding_MissingRightParen) {
  auto p = parser("binding(4");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:10: expected ')' for binding attribute");
}

TEST_F(ParserImplTest, Attribute_Binding_MissingValue) {
  auto p = parser("binding()");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(),
            "1:9: expected signed integer literal for binding attribute");
}

TEST_F(ParserImplTest, Attribute_Binding_MissingInvalid) {
  auto p = parser("binding(nan)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(),
            "1:9: expected signed integer literal for binding attribute");
}

TEST_F(ParserImplTest, Attribute_group) {
  auto p = parser("group(4)");
  auto attr = p->attribute();
  EXPECT_TRUE(attr.matched);
  EXPECT_FALSE(attr.errored);
  ASSERT_NE(attr.value, nullptr);
  auto* var_attr = attr.value->As<ast::Attribute>();
  ASSERT_FALSE(p->has_error());
  ASSERT_NE(var_attr, nullptr);
  ASSERT_TRUE(var_attr->Is<ast::GroupAttribute>());

  auto* group = var_attr->As<ast::GroupAttribute>();
  EXPECT_EQ(group->value, 4u);
}

TEST_F(ParserImplTest, Attribute_Group_MissingLeftParen) {
  auto p = parser("group 2)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:7: expected '(' for group attribute");
}

TEST_F(ParserImplTest, Attribute_Group_MissingRightParen) {
  auto p = parser("group(2");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:8: expected ')' for group attribute");
}

TEST_F(ParserImplTest, Attribute_Group_MissingValue) {
  auto p = parser("group()");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(),
            "1:7: expected signed integer literal for group attribute");
}

TEST_F(ParserImplTest, Attribute_Group_MissingInvalid) {
  auto p = parser("group(nan)");
  auto attr = p->attribute();
  EXPECT_FALSE(attr.matched);
  EXPECT_TRUE(attr.errored);
  EXPECT_EQ(attr.value, nullptr);
  EXPECT_TRUE(p->has_error());
  EXPECT_EQ(p->error(),
            "1:7: expected signed integer literal for group attribute");
}

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