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

#include "gtest/gtest.h"
#include "src/program_builder.h"

namespace tint {
namespace {

class ScopeStackTest : public ProgramBuilder, public testing::Test {};

TEST_F(ScopeStackTest, Get) {
  ScopeStack<uint32_t> s;
  Symbol a(1, ID());
  Symbol b(3, ID());
  s.Push();
  s.Set(a, 5u);
  s.Set(b, 10u);

  EXPECT_EQ(s.Get(a), 5u);
  EXPECT_EQ(s.Get(b), 10u);

  s.Push();

  s.Set(a, 15u);
  EXPECT_EQ(s.Get(a), 15u);
  EXPECT_EQ(s.Get(b), 10u);

  s.Pop();
  EXPECT_EQ(s.Get(a), 5u);
  EXPECT_EQ(s.Get(b), 10u);
}

TEST_F(ScopeStackTest, Get_MissingSymbol) {
  ScopeStack<uint32_t> s;
  Symbol sym(1, ID());
  EXPECT_EQ(s.Get(sym), 0u);
}

TEST_F(ScopeStackTest, Set) {
  ScopeStack<uint32_t> s;
  Symbol a(1, ID());
  Symbol b(2, ID());

  EXPECT_EQ(s.Set(a, 5u), 0u);
  EXPECT_EQ(s.Get(a), 5u);

  EXPECT_EQ(s.Set(b, 10u), 0u);
  EXPECT_EQ(s.Get(b), 10u);

  EXPECT_EQ(s.Set(a, 20u), 5u);
  EXPECT_EQ(s.Get(a), 20u);

  EXPECT_EQ(s.Set(b, 25u), 10u);
  EXPECT_EQ(s.Get(b), 25u);
}

}  // namespace
}  // namespace tint
