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

#include "gtest/gtest.h"
#include "src/tint/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
