// Copyright 2021 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/resolver/resolver.h"

#include "src/resolver/resolver_test_helper.h"

namespace tint {
namespace resolver {
namespace {

class ResolverPipelineOverridableConstantTest : public ResolverTest {
 protected:
  /// Verify that the AST node `var` was resolved to an overridable constant
  /// with an ID equal to `id`.
  /// @param var the overridable constant AST node
  /// @param id the expected constant ID
  void ExpectConstantId(const ast::Variable* var, uint16_t id) {
    auto* sem = Sem().Get<sem::GlobalVariable>(var);
    ASSERT_NE(sem, nullptr);
    EXPECT_EQ(sem->Declaration(), var);
    EXPECT_TRUE(sem->IsOverridable());
    EXPECT_EQ(sem->ConstantId(), id);
    EXPECT_FALSE(sem->ConstantValue());
  }
};

TEST_F(ResolverPipelineOverridableConstantTest, NonOverridable) {
  auto* a = GlobalConst("a", ty.f32(), Expr(1.f));

  EXPECT_TRUE(r()->Resolve()) << r()->error();

  auto* sem_a = Sem().Get<sem::GlobalVariable>(a);
  ASSERT_NE(sem_a, nullptr);
  EXPECT_EQ(sem_a->Declaration(), a);
  EXPECT_FALSE(sem_a->IsOverridable());
  EXPECT_TRUE(sem_a->ConstantValue());
}

TEST_F(ResolverPipelineOverridableConstantTest, WithId) {
  auto* a = Override("a", ty.f32(), Expr(1.f), {Id(7u)});

  EXPECT_TRUE(r()->Resolve()) << r()->error();

  ExpectConstantId(a, 7u);
}

TEST_F(ResolverPipelineOverridableConstantTest, WithoutId) {
  auto* a = Override("a", ty.f32(), Expr(1.f));

  EXPECT_TRUE(r()->Resolve()) << r()->error();

  ExpectConstantId(a, 0u);
}

TEST_F(ResolverPipelineOverridableConstantTest, WithAndWithoutIds) {
  std::vector<ast::Variable*> variables;
  auto* a = Override("a", ty.f32(), Expr(1.f));
  auto* b = Override("b", ty.f32(), Expr(1.f));
  auto* c = Override("c", ty.f32(), Expr(1.f), {Id(2u)});
  auto* d = Override("d", ty.f32(), Expr(1.f), {Id(4u)});
  auto* e = Override("e", ty.f32(), Expr(1.f));
  auto* f = Override("f", ty.f32(), Expr(1.f), {Id(1u)});

  EXPECT_TRUE(r()->Resolve()) << r()->error();

  // Verify that constant id allocation order is deterministic.
  ExpectConstantId(a, 0u);
  ExpectConstantId(b, 3u);
  ExpectConstantId(c, 2u);
  ExpectConstantId(d, 4u);
  ExpectConstantId(e, 5u);
  ExpectConstantId(f, 1u);
}

TEST_F(ResolverPipelineOverridableConstantTest, DuplicateIds) {
  Override("a", ty.f32(), Expr(1.f), {Id(Source{{12, 34}}, 7u)});
  Override("b", ty.f32(), Expr(1.f), {Id(Source{{56, 78}}, 7u)});

  EXPECT_FALSE(r()->Resolve());

  EXPECT_EQ(r()->error(), R"(56:78 error: pipeline constant IDs must be unique
12:34 note: a pipeline constant with an ID of 7 was previously declared here:)");
}

TEST_F(ResolverPipelineOverridableConstantTest, IdTooLarge) {
  Override("a", ty.f32(), Expr(1.f), {Id(Source{{12, 34}}, 65536u)});

  EXPECT_FALSE(r()->Resolve());

  EXPECT_EQ(r()->error(),
            "12:34 error: pipeline constant IDs must be between 0 and 65535");
}

}  // namespace
}  // namespace resolver
}  // namespace tint
