// 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 "gtest/gtest.h"
#include "src/ast/binding_decoration.h"
#include "src/ast/builtin_decoration.h"
#include "src/ast/location_decoration.h"
#include "src/ast/set_decoration.h"
#include "src/reader/wgsl/parser_impl.h"
#include "src/reader/wgsl/parser_impl_test_helper.h"

namespace tint {
namespace reader {
namespace wgsl {
namespace {

TEST_F(ParserImplTest, VariableDecoration_Location) {
  auto* p = parser("location 4");
  auto deco = p->variable_decoration();
  ASSERT_NE(deco, nullptr);
  ASSERT_FALSE(p->has_error());
  ASSERT_TRUE(deco->IsLocation());

  auto* loc = deco->AsLocation();
  EXPECT_EQ(loc->value(), 4u);
}

TEST_F(ParserImplTest, VariableDecoration_Location_MissingValue) {
  auto* p = parser("location");
  auto deco = p->variable_decoration();
  ASSERT_EQ(deco, nullptr);
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:9: invalid value for location decoration");
}

TEST_F(ParserImplTest, VariableDecoration_Location_MissingInvalid) {
  auto* p = parser("location nan");
  auto deco = p->variable_decoration();
  ASSERT_EQ(deco, nullptr);
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:10: invalid value for location decoration");
}

TEST_F(ParserImplTest, VariableDecoration_Builtin) {
  auto* p = parser("builtin frag_depth");
  auto deco = p->variable_decoration();
  ASSERT_FALSE(p->has_error());
  ASSERT_NE(deco, nullptr);
  ASSERT_TRUE(deco->IsBuiltin());

  auto* builtin = deco->AsBuiltin();
  EXPECT_EQ(builtin->value(), ast::Builtin::kFragDepth);
}

TEST_F(ParserImplTest, VariableDecoration_Builtin_MissingValue) {
  auto* p = parser("builtin");
  auto deco = p->variable_decoration();
  ASSERT_EQ(deco, nullptr);
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:8: invalid value for builtin decoration");
}

TEST_F(ParserImplTest, VariableDecoration_Builtin_MissingInvalid) {
  auto* p = parser("builtin 3");
  auto deco = p->variable_decoration();
  ASSERT_EQ(deco, nullptr);
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:9: invalid value for builtin decoration");
}

TEST_F(ParserImplTest, VariableDecoration_Binding) {
  auto* p = parser("binding 4");
  auto deco = p->variable_decoration();
  ASSERT_NE(deco, nullptr);
  ASSERT_FALSE(p->has_error());
  ASSERT_TRUE(deco->IsBinding());

  auto* binding = deco->AsBinding();
  EXPECT_EQ(binding->value(), 4u);
}

TEST_F(ParserImplTest, VariableDecoration_Binding_MissingValue) {
  auto* p = parser("binding");
  auto deco = p->variable_decoration();
  ASSERT_EQ(deco, nullptr);
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:8: invalid value for binding decoration");
}

TEST_F(ParserImplTest, VariableDecoration_Binding_MissingInvalid) {
  auto* p = parser("binding nan");
  auto deco = p->variable_decoration();
  ASSERT_EQ(deco, nullptr);
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:9: invalid value for binding decoration");
}

TEST_F(ParserImplTest, VariableDecoration_set) {
  auto* p = parser("set 4");
  auto deco = p->variable_decoration();
  ASSERT_FALSE(p->has_error());
  ASSERT_NE(deco.get(), nullptr);
  ASSERT_TRUE(deco->IsSet());

  auto* set = deco->AsSet();
  EXPECT_EQ(set->value(), 4u);
}

TEST_F(ParserImplTest, VariableDecoration_Set_MissingValue) {
  auto* p = parser("set");
  auto deco = p->variable_decoration();
  ASSERT_EQ(deco, nullptr);
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:4: invalid value for set decoration");
}

TEST_F(ParserImplTest, VariableDecoration_Set_MissingInvalid) {
  auto* p = parser("set nan");
  auto deco = p->variable_decoration();
  ASSERT_EQ(deco, nullptr);
  ASSERT_TRUE(p->has_error());
  EXPECT_EQ(p->error(), "1:5: invalid value for set decoration");
}

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