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

#include "src/tint/resolver/resolver_test_helper.h"

namespace tint::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 tint::resolver
