Files
carbon-lang/common/array_stack_test.cpp
T
Richard Smith 45d1c74df8 Stop using ArrayStack for the cleanup stack. (#7505)
Because we merge cleanups across scopes in various cases, and want to
use linear indexes into the complete stack, the ArrayStack abstraction
is getting in the way more than it's helping. Switch to just a
SmallVector.

This loses the unit testing of the MergeIntoGrandparent logic. This is
covered indirectly by check tests still, but direct testing of it is a
bit tricky given that ScopeStack isn't set up for use without a Context.
2026-07-15 00:47:47 +00:00

108 lines
3.0 KiB
C++

// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "common/array_stack.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
namespace Carbon::Testing {
namespace {
using ::testing::ElementsAre;
using ::testing::IsEmpty;
TEST(ArrayStack, Basics) {
ArrayStack<int> stack;
// PeekAllValues is valid when there are no arrays.
EXPECT_THAT(stack.PeekAllValues(), IsEmpty());
// An array starts empty.
stack.PushArray();
EXPECT_THAT(stack.PeekArray(), IsEmpty());
EXPECT_THAT(stack.PeekAllValues(), IsEmpty());
// Pushing a couple values works.
stack.AppendToTop(1);
stack.AppendToTop(2);
EXPECT_THAT(stack.PeekArray(), ElementsAre(1, 2));
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2));
// Pushing a new array starts empty, old values are still there.
stack.PushArray();
EXPECT_THAT(stack.PeekArray(), IsEmpty());
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2));
// The added value goes to the 2nd array.
stack.AppendToTop(3);
EXPECT_THAT(stack.PeekArray(), ElementsAre(3));
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2, 3));
// Popping goes back to the 1st array.
stack.PopArray();
EXPECT_THAT(stack.PeekArray(), ElementsAre(1, 2));
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2));
// Push a couple arrays, then a value on the now-3rd array.
stack.PushArray();
stack.PushArray();
stack.AppendToTop(4);
EXPECT_THAT(stack.PeekArray(), ElementsAre(4));
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2, 4));
// Popping the 3rd array goes to the 2nd array, which is empty.
stack.PopArray();
EXPECT_THAT(stack.PeekArray(), IsEmpty());
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2));
// Again back to the 1st array.
stack.PopArray();
EXPECT_THAT(stack.PeekArray(), ElementsAre(1, 2));
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2));
// Go down to no arrays.
stack.PopArray();
EXPECT_THAT(stack.PeekAllValues(), IsEmpty());
// Add a new 1st array.
stack.PushArray();
stack.AppendToTop(5);
EXPECT_THAT(stack.PeekArray(), ElementsAre(5));
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(5));
}
TEST(ArrayStack, AppendArray) {
ArrayStack<int> stack;
stack.PushArray();
stack.AppendToTop(llvm::ArrayRef<int>());
EXPECT_THAT(stack.PeekArray(), IsEmpty());
stack.AppendToTop({1, 2});
EXPECT_THAT(stack.PeekArray(), ElementsAre(1, 2));
}
TEST(ArrayStack, PeekArrayAt) {
ArrayStack<int> stack;
// Verify behavior with a single array.
stack.PushArray();
stack.AppendToTop(1);
stack.AppendToTop(2);
EXPECT_THAT(stack.PeekArrayAt(0), ElementsAre(1, 2));
// Verify behavior with a couple more arrays.
stack.PushArray();
stack.PushArray();
stack.AppendToTop(3);
EXPECT_THAT(stack.PeekArrayAt(0), ElementsAre(1, 2));
EXPECT_THAT(stack.PeekArrayAt(1), IsEmpty());
EXPECT_THAT(stack.PeekArrayAt(2), ElementsAre(3));
}
} // namespace
} // namespace Carbon::Testing