// Copyright 2017-2022 The Verible 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 "common/util/container_proxy.h"

#include <list>
#include <ostream>
#include <string>
#include <utility>
#include <vector>

#include "common/strings/display_utils.h"
#include "common/util/type_traits.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"

namespace verible {
namespace {

using ::testing::ElementsAre;

enum class ContainerProxyEvent {
  kUnknown,
  kInserted,
  kBeingRemoved,
  kBeingReplaced,
  kWereReplaced,
};

template <class Container>
struct TestTrace {
  using value_type = typename Container::value_type;
  using const_iterator = typename Container::const_iterator;

  ContainerProxyEvent triggered_method = ContainerProxyEvent::kUnknown;
  // Snapshot of the container when the method has been called.
  std::vector<value_type> container_snapshot;

  int first_index = -1;
  int last_index = -1;
  std::vector<value_type> values = {};

  // Constructors for creating reference object in tests

  template <class SnapshotRange, class ValuesRange>
  TestTrace(ContainerProxyEvent method, const SnapshotRange &snapshot,
            int first_index, int last_index, const ValuesRange &values)
      : triggered_method(method),
        container_snapshot(std::begin(snapshot), std::end(snapshot)),
        first_index(first_index),
        last_index(last_index),
        values(std::begin(values), std::end(values)) {}

  template <class SnapshotRange>
  TestTrace(ContainerProxyEvent method, const SnapshotRange &snapshot,
            int first_index, int last_index,
            std::initializer_list<value_type> values)
      : triggered_method(method),
        container_snapshot(std::begin(snapshot), std::end(snapshot)),
        first_index(first_index),
        last_index(last_index),
        values(values) {}

  TestTrace(ContainerProxyEvent method,
            std::initializer_list<value_type> snapshot, int first_index,
            int last_index, std::initializer_list<value_type> values)
      : triggered_method(method),
        container_snapshot(snapshot),
        first_index(first_index),
        last_index(last_index),
        values(values) {}

  TestTrace(ContainerProxyEvent method,
            std::initializer_list<value_type> snapshot)
      : triggered_method(method), container_snapshot(snapshot) {}

  // Constructors for creating trace objects in a container implementation

  template <class Range>
  TestTrace(ContainerProxyEvent method, const Range &container)
      : triggered_method(method),
        container_snapshot(container.begin(), container.end()) {}

  template <class Range>
  TestTrace(ContainerProxyEvent method, const Range &container,
            const_iterator first, const_iterator last)
      : triggered_method(method),
        container_snapshot(container.begin(), container.end()),
        first_index(std::distance(container.begin(), first)),
        last_index(std::distance(container.begin(), last)),
        values(first, last) {}

  // Operators

  bool operator==(const TestTrace &other) const {
    return triggered_method == other.triggered_method &&
           std::equal(container_snapshot.begin(), container_snapshot.end(),
                      other.container_snapshot.begin()) &&
           first_index == other.first_index && last_index == other.last_index &&
           last_index == other.last_index &&
           std::equal(values.begin(), values.end(), other.values.begin());
  }

  friend std::ostream &operator<<(std::ostream &s, TestTrace obj) {
    switch (obj.triggered_method) {
      case ContainerProxyEvent::kUnknown:
        s << "UNKNOWN";
        break;
      case ContainerProxyEvent::kInserted:
        s << "inserted";
        break;
      case ContainerProxyEvent::kBeingRemoved:
        s << "being_removed";
        break;
      case ContainerProxyEvent::kBeingReplaced:
        s << "being_replaced";
        break;
      case ContainerProxyEvent::kWereReplaced:
        s << "were_replaced";
        break;
    }
    s << "(";
    if (obj.first_index >= 0) {
      s << "elements = [" << obj.first_index << ", " << obj.last_index << ")";
      s << " {" << SequenceFormatter(obj.values) << "}; ";
    }
    s << "snapshot = {" << SequenceFormatter(obj.container_snapshot) << "})";
    return s;
  }
};

template <class Container>
class ContainerProxy
    : private ContainerProxyBase<ContainerProxy<Container>, Container> {
  using ThisType = ContainerProxy<Container>;
  using Base = ContainerProxyBase<ContainerProxy<Container>, Container>;
  friend Base;

 public:
  explicit ContainerProxy(Container &container) : container_(container) {}

  using typename Base::container_type;

  using typename Base::value_type;

  using typename Base::const_reference;
  using typename Base::reference;

  using typename Base::const_iterator;
  using typename Base::iterator;

  using typename Base::difference_type;
  using typename Base::size_type;

  using typename Base::const_reverse_iterator;
  using typename Base::reverse_iterator;

  using Base::begin;
  using Base::cbegin;
  using Base::cend;
  using Base::end;

  using Base::crbegin;
  using Base::crend;
  using Base::rbegin;
  using Base::rend;

  using Base::back;
  using Base::front;
  using Base::operator[];
  using Base::at;

  using Base::empty;
  using Base::max_size;
  using Base::size;

  using Base::emplace_back;
  using Base::push_back;

  using Base::emplace_front;
  using Base::push_front;

  using Base::emplace;
  using Base::insert;

  using Base::clear;
  using Base::erase;
  using Base::pop_back;
  using Base::pop_front;

  using Base::assign;
  using Base::operator=;
  using Base::swap;

  using Base::capacity;
  using Base::reserve;
  using Base::resize;

  // Tracing data for test purposes.
  std::vector<TestTrace<ThisType>> trace_data;

 private:
  Container &container_;

  Container &underlying_container() { return container_; }
  const Container &underlying_container() const { return container_; }

  void ElementsInserted(const_iterator first, const_iterator last) {
    trace_data.push_back(TestTrace<ThisType>(ContainerProxyEvent::kInserted,
                                             container_, first, last));
  }

  void ElementsBeingRemoved(const_iterator first, const_iterator last) {
    trace_data.push_back(TestTrace<ThisType>(ContainerProxyEvent::kBeingRemoved,
                                             container_, first, last));
  }

  void ElementsBeingReplaced() {
    trace_data.push_back(
        TestTrace<ThisType>(ContainerProxyEvent::kBeingReplaced, container_));
  }

  void ElementsWereReplaced() {
    trace_data.push_back(
        TestTrace<ThisType>(ContainerProxyEvent::kWereReplaced, container_));
  }
};

template <class Proxy>
class ContainerProxyTest : public ::testing::Test {
 public:
  ContainerProxyTest() = default;

  using Container = typename Proxy::container_type;
  Container container = {"zero", "one", "two"};
  Proxy proxy = Proxy(container);
};

using BidirectionalContainerProxyTestTypes = ::testing::Types<
    // vector
    ContainerProxy<std::vector<std::string>>,
    const ContainerProxy<std::vector<std::string>>,
    // list
    ContainerProxy<std::list<std::string>>,
    const ContainerProxy<std::list<std::string>>
    // TODO: deque
    // TODO: const array
    >;
template <class T>
class BidirectionalContainerProxyTest : public ContainerProxyTest<T> {};
TYPED_TEST_SUITE(BidirectionalContainerProxyTest,
                 BidirectionalContainerProxyTestTypes);

using MutableBidirectionalContainerProxyTestTypes = ::testing::Types<
    // vector
    ContainerProxy<std::vector<std::string>>,
    // list
    ContainerProxy<std::list<std::string>>
    // TODO: deque
    >;
template <class T>
class MutableBidirectionalContainerProxyTest : public ContainerProxyTest<T> {};
TYPED_TEST_SUITE(MutableBidirectionalContainerProxyTest,
                 MutableBidirectionalContainerProxyTestTypes);

using MutablePrependableContainerProxyTestTypes = ::testing::Types<
    // list
    ContainerProxy<std::list<std::string>>
    // TODO: deque
    >;
template <class T>
class MutablePrependableContainerProxyTest : public ContainerProxyTest<T> {};
TYPED_TEST_SUITE(MutablePrependableContainerProxyTest,
                 MutablePrependableContainerProxyTestTypes);

using RandomAccessContainerProxyTestTypes = ::testing::Types<
    // vector
    ContainerProxy<std::vector<std::string>>,
    const ContainerProxy<std::vector<std::string>>>;
template <class T>
class RandomAccessContainerProxyTest : public ContainerProxyTest<T> {};
TYPED_TEST_SUITE(RandomAccessContainerProxyTest,
                 RandomAccessContainerProxyTestTypes);

using MutableRandomAccessContainerProxyTestTypes = ::testing::Types<
    // vector
    ContainerProxy<std::vector<std::string>>>;
template <class T>
class MutableRandomAccessContainerProxyTest : public ContainerProxyTest<T> {};
TYPED_TEST_SUITE(MutableRandomAccessContainerProxyTest,
                 MutableRandomAccessContainerProxyTestTypes);

// Access

TYPED_TEST(BidirectionalContainerProxyTest, Access) {
  EXPECT_EQ(this->proxy.front(), this->container.front());
  EXPECT_EQ(this->proxy.back(), this->container.back());
  EXPECT_EQ(&this->proxy.front(), &this->container.front());
  EXPECT_EQ(&this->proxy.back(), &this->container.back());
  EXPECT_EQ(*this->proxy.begin(), this->container.front());
}

TYPED_TEST(RandomAccessContainerProxyTest, Access) {
  EXPECT_EQ(this->proxy[0], this->container[0]);
  EXPECT_EQ(this->proxy[1], this->container[1]);
  EXPECT_EQ(this->proxy[2], this->container[2]);

  EXPECT_EQ(this->proxy.at(0), this->container[0]);
  EXPECT_EQ(this->proxy.at(1), this->container[1]);
  EXPECT_EQ(this->proxy.at(2), this->container[2]);

  EXPECT_EQ(&this->proxy[0], &this->container[0]);
  EXPECT_EQ(&this->proxy[1], &this->container[1]);
  EXPECT_EQ(&this->proxy[2], &this->container[2]);

  EXPECT_EQ(&this->proxy.at(0), &this->container[0]);
  EXPECT_EQ(&this->proxy.at(1), &this->container[1]);
  EXPECT_EQ(&this->proxy.at(2), &this->container[2]);
}

// Iteration

TYPED_TEST(BidirectionalContainerProxyTest, Iteration) {
  const int initial_size = this->container.size();

  {
    auto iter = this->proxy.begin();
    for (int i = 0; i < initial_size; ++i) {
      EXPECT_EQ(*iter, *std::next(this->container.begin(), i)) << "i = " << i;
      EXPECT_EQ(&*iter, &*std::next(this->container.begin(), i)) << "i = " << i;
      ++iter;
    }
    EXPECT_EQ(iter, this->proxy.end());
  }
  {
    auto iter = this->proxy.cbegin();
    for (int i = 0; i < initial_size; ++i) {
      EXPECT_EQ(*iter, *std::next(this->container.begin(), i)) << "i = " << i;
      EXPECT_EQ(&*iter, &*std::next(this->container.begin(), i)) << "i = " << i;
      ++iter;
    }
    EXPECT_EQ(iter, this->proxy.cend());
  }
  {
    int i = 0;
    for (auto &elem : this->proxy) {
      EXPECT_EQ(elem, *std::next(this->container.begin(), i)) << "i = " << i;
      EXPECT_EQ(&elem, &*std::next(this->container.begin(), i)) << "i = " << i;
      ++i;
    }
  }
}

TYPED_TEST(BidirectionalContainerProxyTest, ReverseIteration) {
  const int initial_size = this->container.size();

  {
    auto iter = this->proxy.rbegin();
    for (int i = initial_size - 1; i >= 0; --i) {
      EXPECT_EQ(*iter, *std::next(this->container.begin(), i)) << "i = " << i;
      EXPECT_EQ(&*iter, &*std::next(this->container.begin(), i)) << "i = " << i;
      ++iter;
    }
    EXPECT_EQ(iter, this->proxy.rend());
  }
  {
    auto iter = this->proxy.crbegin();
    for (int i = initial_size - 1; i >= 0; --i) {
      EXPECT_EQ(*iter, *std::next(this->container.begin(), i)) << "i = " << i;
      EXPECT_EQ(&*iter, &*std::next(this->container.begin(), i)) << "i = " << i;
      ++iter;
    }
    EXPECT_EQ(iter, this->proxy.crend());
  }
}

// Modifiers (inserting)

TYPED_TEST(MutableBidirectionalContainerProxyTest, ModifiersPushEmplaceBack) {
  using Trace = TestTrace<TypeParam>;
  const int initial_size = this->proxy.size();

  this->proxy.trace_data.clear();

  this->proxy.push_back("three");
  EXPECT_EQ(this->proxy.size(), initial_size + 1);
  EXPECT_EQ(this->proxy.back(), "three");
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        initial_size, initial_size + 1, {"three"})));

  this->proxy.trace_data.clear();

  std::string four = std::string("four");
  // Make sure the string buffer is dynamically allocated.
  four.reserve(1000);
  const auto *four_data = four.data();
  this->proxy.push_back(std::move(four));
  EXPECT_EQ(this->proxy.size(), initial_size + 2);
  EXPECT_EQ(this->proxy.back(), "four");
  // Verify that the string has been moved and not copied.
  // TODO(mglb): make sure this is reliable.
  EXPECT_EQ(this->proxy.back().data(), four_data);
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        initial_size + 1, initial_size + 2, {"four"})));

  this->proxy.trace_data.clear();

  this->proxy.emplace_back(5, '5');
  EXPECT_EQ(this->proxy.size(), initial_size + 3);
  EXPECT_EQ(this->proxy.back(), "55555");
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        initial_size + 2, initial_size + 3, {"55555"})));
}

TYPED_TEST(MutablePrependableContainerProxyTest, ModifiersPushEmplaceFront) {
  using Trace = TestTrace<TypeParam>;
  const int initial_size = this->proxy.size();

  this->proxy.trace_data.clear();

  this->proxy.push_front("minus_one");
  EXPECT_EQ(this->proxy.size(), initial_size + 1);
  EXPECT_EQ(this->proxy.front(), "minus_one");
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        0, 1, {"minus_one"})));

  this->proxy.trace_data.clear();

  std::string minus_two = std::string("minus_two");
  // Make sure the string buffer is dynamically allocated.
  minus_two.reserve(1000);
  const auto *minus_two_data = minus_two.data();
  this->proxy.push_front(std::move(minus_two));
  EXPECT_EQ(this->proxy.size(), initial_size + 2);
  EXPECT_EQ(this->proxy.front(), "minus_two");
  // Verify that the string has been moved and not copied.
  // TODO(mglb): make sure this is reliable.
  EXPECT_EQ(this->proxy.front().data(), minus_two_data);
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        0, 1, {"minus_two"})));

  this->proxy.trace_data.clear();

  this->proxy.emplace_front(3, '-');
  EXPECT_EQ(this->proxy.size(), initial_size + 3);
  EXPECT_EQ(this->proxy.front(), "---");
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        0, 1, {"---"})));
}

TYPED_TEST(MutableBidirectionalContainerProxyTest, ModifiersInsertEmplace) {
  using Trace = TestTrace<TypeParam>;

  const int initial_size = this->proxy.size();

  this->proxy.trace_data.clear();

  this->proxy.emplace(std::next(this->proxy.begin()), 3, 'a');
  EXPECT_EQ(this->proxy.size(), initial_size + 1);
  EXPECT_EQ(*std::next(this->proxy.begin()), "aaa");
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        1, 2, {"aaa"})));

  this->proxy.trace_data.clear();

  this->proxy.insert(this->proxy.begin(), "foo");
  EXPECT_EQ(this->proxy.size(), initial_size + 2);
  EXPECT_EQ(this->proxy.front(), "foo");
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        0, 1, {"foo"})));

  this->proxy.trace_data.clear();

  this->proxy.insert(std::next(this->proxy.begin(), 3), {"bbb", "ccc", "ddd"});
  EXPECT_EQ(this->proxy.size(), initial_size + 5);
  EXPECT_EQ(*std::next(this->proxy.begin(), 3), "bbb");
  EXPECT_EQ(*std::next(this->proxy.begin(), 4), "ccc");
  EXPECT_EQ(*std::next(this->proxy.begin(), 5), "ddd");
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        3, 6, {"bbb", "ccc", "ddd"})));

  this->proxy.trace_data.clear();

  static const std::string source[] = {"eee", "fff", "ggg"};
  this->proxy.insert(std::next(this->proxy.begin(), 6), std::begin(source),
                     std::end(source));
  EXPECT_EQ(this->proxy.size(), initial_size + 8);
  EXPECT_EQ(*std::next(this->proxy.begin(), 6), "eee");
  EXPECT_EQ(*std::next(this->proxy.begin(), 7), "fff");
  EXPECT_EQ(*std::next(this->proxy.begin(), 8), "ggg");
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        6, 9, {"eee", "fff", "ggg"})));

  this->proxy.trace_data.clear();

  std::string s = std::string("bar");
  // Make sure the string buffer is dynamically allocated.
  s.reserve(1000);
  const auto *s_data = s.data();
  this->proxy.insert(std::next(this->proxy.begin(), 1), std::move(s));
  EXPECT_EQ(this->proxy.size(), initial_size + 9);
  EXPECT_EQ(*std::next(this->proxy.begin(), 1), "bar");
  // Verify that the string has been moved and not copied.
  // TODO(mglb): make sure this is reliable.
  EXPECT_EQ(std::next(this->proxy.begin(), 1)->data(), s_data);
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        1, 2, {"bar"})));

  this->proxy.trace_data.clear();

  this->proxy.insert(std::next(this->proxy.begin(), 2), 3, "baz");
  EXPECT_EQ(this->proxy.size(), initial_size + 12);
  EXPECT_EQ(*std::next(this->proxy.begin(), 2), "baz");
  EXPECT_EQ(*std::next(this->proxy.begin(), 3), "baz");
  EXPECT_EQ(*std::next(this->proxy.begin(), 4), "baz");
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kInserted, this->container,  //
                        2, 5, {"baz", "baz", "baz"})));

  // Check whole container, just to be sure.

  EXPECT_THAT(this->container, ElementsAre("foo", "bar", "baz", "baz", "baz",
                                           "zero", "aaa", "bbb", "ccc", "ddd",
                                           "eee", "fff", "ggg", "one", "two"));
}

// Modifiers (removing)

TYPED_TEST(MutableBidirectionalContainerProxyTest, ModifiersErase) {
  using Trace = TestTrace<TypeParam>;
  using iterator = typename TypeParam::iterator;
  using const_iterator = typename TypeParam::const_iterator;

  // Add a few more elements
  this->container.push_back("three");
  this->container.push_back("four");
  this->container.push_back("five");
  this->container.push_back("six");
  this->container.push_back("seven");
  this->container.push_back("eight");

  {
    this->proxy.trace_data.clear();

    iterator pos = std::next(this->proxy.begin(), 2);  // "two"
    this->proxy.erase(pos);
    EXPECT_THAT(this->container, ElementsAre("zero", "one", "three", "four",
                                             "five", "six", "seven", "eight"));
    EXPECT_THAT(this->proxy.trace_data,
                ElementsAre(Trace(ContainerProxyEvent::kBeingRemoved,
                                  {"zero", "one", "two", "three", "four",
                                   "five", "six", "seven", "eight"},  //
                                  2, 3, {"two"})));
  }
  {
    this->proxy.trace_data.clear();

    const_iterator pos = std::next(this->proxy.begin(), 2);  // "three"
    this->proxy.erase(pos);
    EXPECT_THAT(this->container, ElementsAre("zero", "one", "four", "five",
                                             "six", "seven", "eight"));
    EXPECT_THAT(this->proxy.trace_data,
                ElementsAre(Trace(ContainerProxyEvent::kBeingRemoved,
                                  {"zero", "one", "three", "four", "five",
                                   "six", "seven", "eight"},  //
                                  2, 3, {"three"})));
  }
  {
    this->proxy.trace_data.clear();

    iterator first = std::next(this->proxy.begin(), 2);  // "four"
    iterator last = std::next(this->proxy.begin(), 5);   // "seven"
    this->proxy.erase(first, last);
    EXPECT_THAT(this->container, ElementsAre("zero", "one", "seven", "eight"));
    EXPECT_THAT(this->proxy.trace_data,
                ElementsAre(Trace(ContainerProxyEvent::kBeingRemoved,
                                  {"zero", "one", "four", "five", "six",
                                   "seven", "eight"},  //
                                  2, 5, {"four", "five", "six"})));
  }
  {
    this->proxy.trace_data.clear();

    const_iterator first = std::next(this->proxy.begin(), 1);  // "one"
    const_iterator last = std::next(this->proxy.begin(), 3);   // "eight"
    this->proxy.erase(first, last);
    EXPECT_THAT(this->container, ElementsAre("zero", "eight"));
    EXPECT_THAT(this->proxy.trace_data,
                ElementsAre(Trace(ContainerProxyEvent::kBeingRemoved,
                                  {"zero", "one", "seven", "eight"},  //
                                  1, 3, {"one", "seven"})));
  }
}

TYPED_TEST(MutablePrependableContainerProxyTest, ModifiersPopFront) {
  using Trace = TestTrace<TypeParam>;

  this->proxy.trace_data.clear();

  this->proxy.pop_front();
  EXPECT_THAT(this->container, ElementsAre("one", "two"));
  EXPECT_THAT(this->proxy.trace_data,
              ElementsAre(Trace(ContainerProxyEvent::kBeingRemoved,
                                {"zero", "one", "two"},  //
                                0, 1, {"zero"})));
}

TYPED_TEST(MutableRandomAccessContainerProxyTest, ModifiersPopBack) {
  using Trace = TestTrace<TypeParam>;

  this->proxy.trace_data.clear();

  this->proxy.pop_back();
  EXPECT_THAT(this->container, ElementsAre("zero", "one"));
  EXPECT_THAT(this->proxy.trace_data,
              ElementsAre(Trace(ContainerProxyEvent::kBeingRemoved,
                                {"zero", "one", "two"},  //
                                2, 3, {"two"})));
}

TYPED_TEST(MutableRandomAccessContainerProxyTest, ModifiersClear) {
  using Trace = TestTrace<TypeParam>;

  this->proxy.trace_data.clear();

  this->proxy.clear();
  EXPECT_TRUE(this->container.empty());
  EXPECT_THAT(this->proxy.trace_data,
              ElementsAre(Trace(ContainerProxyEvent::kBeingRemoved,
                                {"zero", "one", "two"},  //
                                0, 3, {"zero", "one", "two"})));
}

// Assignment

TYPED_TEST(MutableBidirectionalContainerProxyTest, Assign) {
  using Trace = TestTrace<TypeParam>;

  static const std::vector<std::string> other_container = {"foo", "bar", "baz"};

  this->proxy.trace_data.clear();

  this->proxy.assign(other_container.begin(), other_container.end());
  EXPECT_THAT(this->container, ElementsAre("foo", "bar", "baz"));
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(
          Trace(ContainerProxyEvent::kBeingReplaced, {"zero", "one", "two"}),
          Trace(ContainerProxyEvent::kWereReplaced, {"foo", "bar", "baz"})));

  this->proxy.trace_data.clear();

  this->proxy.assign({"x", "y"});
  EXPECT_THAT(this->container, ElementsAre("x", "y"));
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(
          Trace(ContainerProxyEvent::kBeingReplaced, {"foo", "bar", "baz"}),
          Trace(ContainerProxyEvent::kWereReplaced, {"x", "y"})));

  this->proxy.trace_data.clear();

  this->proxy.assign(4, "FOUR");
  EXPECT_THAT(this->container, ElementsAre("FOUR", "FOUR", "FOUR", "FOUR"));
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(Trace(ContainerProxyEvent::kBeingReplaced, {"x", "y"}),
                  Trace(ContainerProxyEvent::kWereReplaced,
                        {"FOUR", "FOUR", "FOUR", "FOUR"})));
}

TYPED_TEST(MutableBidirectionalContainerProxyTest, AssignmentOperator) {
  using Trace = TestTrace<TypeParam>;
  using Container = typename TypeParam::container_type;

  Container other_container = {"foo", "bar", "baz"};

  this->proxy.trace_data.clear();

  auto &proxy_ref_0 = this->proxy = other_container;
  static_assert(std::is_same_v<decltype(proxy_ref_0), TypeParam &>);
  EXPECT_THAT(this->container, ElementsAre("foo", "bar", "baz"));
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(
          Trace(ContainerProxyEvent::kBeingReplaced, {"zero", "one", "two"}),
          Trace(ContainerProxyEvent::kWereReplaced, {"foo", "bar", "baz"})));

  this->proxy.trace_data.clear();

  auto &proxy_ref_1 = this->proxy = {"x", "y"};
  static_assert(std::is_same_v<decltype(proxy_ref_1), TypeParam &>);
  EXPECT_THAT(this->container, ElementsAre("x", "y"));
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(
          Trace(ContainerProxyEvent::kBeingReplaced, {"foo", "bar", "baz"}),
          Trace(ContainerProxyEvent::kWereReplaced, {"x", "y"})));

  this->proxy.trace_data.clear();

  auto *const foo_ptr = &other_container.front();
  auto &proxy_ref_2 = this->proxy = std::move(other_container);
  static_assert(std::is_same_v<decltype(proxy_ref_2), TypeParam &>);
  EXPECT_THAT(this->container, ElementsAre("foo", "bar", "baz"));
  // Verify that the container has been moved and not copied.
  EXPECT_EQ(&this->container.front(), foo_ptr);
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(
          Trace(ContainerProxyEvent::kBeingReplaced, {"x", "y"}),
          Trace(ContainerProxyEvent::kWereReplaced, {"foo", "bar", "baz"})));
}

TYPED_TEST(MutableBidirectionalContainerProxyTest, Swap) {
  using Proxy = TypeParam;
  using Container = typename Proxy::container_type;
  using Trace = TestTrace<TypeParam>;

  Container other_container = {"foo", "bar"};
  Proxy other_proxy = Proxy(other_container);

  this->proxy.trace_data.clear();
  other_proxy.trace_data.clear();

  this->proxy.swap(other_proxy);
  EXPECT_THAT(this->container, ElementsAre("foo", "bar"));
  EXPECT_THAT(other_container, ElementsAre("zero", "one", "two"));
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(
          Trace(ContainerProxyEvent::kBeingReplaced, {"zero", "one", "two"}),
          Trace(ContainerProxyEvent::kWereReplaced, {"foo", "bar"})));
  EXPECT_THAT(
      other_proxy.trace_data,
      ElementsAre(
          Trace(ContainerProxyEvent::kBeingReplaced, {"foo", "bar"}),
          Trace(ContainerProxyEvent::kWereReplaced, {"zero", "one", "two"})));

  this->proxy.trace_data.clear();
  other_proxy.trace_data.clear();

  swap(this->proxy, other_proxy);
  EXPECT_THAT(this->container, ElementsAre("zero", "one", "two"));
  EXPECT_THAT(other_container, ElementsAre("foo", "bar"));
  EXPECT_THAT(
      this->proxy.trace_data,
      ElementsAre(
          Trace(ContainerProxyEvent::kBeingReplaced, {"foo", "bar"}),
          Trace(ContainerProxyEvent::kWereReplaced, {"zero", "one", "two"})));
  EXPECT_THAT(
      other_proxy.trace_data,
      ElementsAre(
          Trace(ContainerProxyEvent::kBeingReplaced, {"zero", "one", "two"}),
          Trace(ContainerProxyEvent::kWereReplaced, {"foo", "bar"})));

  Container container_without_proxy = {"qux", "quux", "quz", "quuz"};

  this->proxy.trace_data.clear();

  this->proxy.swap(container_without_proxy);
  EXPECT_THAT(this->container, ElementsAre("qux", "quux", "quz", "quuz"));
  EXPECT_THAT(container_without_proxy, ElementsAre("zero", "one", "two"));
  EXPECT_THAT(this->proxy.trace_data,
              ElementsAre(Trace(ContainerProxyEvent::kBeingReplaced,
                                {"zero", "one", "two"}),
                          Trace(ContainerProxyEvent::kWereReplaced,
                                {"qux", "quux", "quz", "quuz"})));
}

// Capacity

TYPED_TEST(BidirectionalContainerProxyTest, Capacity) {
  EXPECT_EQ(this->proxy.size(), this->container.size());
  EXPECT_EQ(this->proxy.empty(), this->container.empty());
  EXPECT_EQ(this->proxy.max_size(), this->container.max_size());
}

TYPED_TEST(RandomAccessContainerProxyTest, Capacity) {
  EXPECT_EQ(this->proxy.capacity(), this->container.capacity());
}

TYPED_TEST(MutableBidirectionalContainerProxyTest, Capacity) {
  using Trace = TestTrace<TypeParam>;

  const int initial_size = this->proxy.size();
  const int resized_up_size = initial_size + 3;
  const int resized_down_size = 2;
  const int resized_down_again_size = 1;

  this->proxy.trace_data.clear();

  this->proxy.resize(resized_up_size);
  EXPECT_EQ(this->proxy.size(), resized_up_size);
  EXPECT_THAT(this->container, ElementsAre("zero", "one", "two", "", "", ""));
  EXPECT_THAT(this->proxy.trace_data,
              ElementsAre(Trace(ContainerProxyEvent::kInserted,
                                {"zero", "one", "two", "", "", ""},  //
                                initial_size, resized_up_size,       //
                                {"", "", ""})));

  this->proxy.trace_data.clear();

  this->proxy.resize(resized_down_size);
  EXPECT_EQ(this->proxy.size(), resized_down_size);
  EXPECT_THAT(this->container, ElementsAre("zero", "one"));
  EXPECT_THAT(this->proxy.trace_data,
              ElementsAre(Trace(ContainerProxyEvent::kBeingRemoved,
                                {"zero", "one", "two", "", "", ""},  //
                                resized_down_size, resized_up_size,  //
                                {"two", "", "", ""})));

  this->proxy.trace_data.clear();

  this->proxy.resize(resized_up_size, "1");
  EXPECT_EQ(this->proxy.size(), resized_up_size);
  EXPECT_THAT(this->container, ElementsAre("zero", "one", "1", "1", "1", "1"));
  EXPECT_THAT(this->proxy.trace_data,
              ElementsAre(Trace(ContainerProxyEvent::kInserted,
                                {"zero", "one", "1", "1", "1", "1"},  //
                                resized_down_size, resized_up_size,   //
                                {"1", "1", "1", "1"})));

  this->proxy.trace_data.clear();

  this->proxy.resize(resized_down_again_size, "whatever, will not be used");
  EXPECT_EQ(this->proxy.size(), resized_down_again_size);
  EXPECT_THAT(this->container, ElementsAre("zero"));
  EXPECT_THAT(this->proxy.trace_data,
              ElementsAre(Trace(ContainerProxyEvent::kBeingRemoved,
                                {"zero", "one", "1", "1", "1", "1"},       //
                                resized_down_again_size, resized_up_size,  //
                                {"one", "1", "1", "1", "1"})));
}

TYPED_TEST(MutableRandomAccessContainerProxyTest, Capacity) {
  const int initial_capacity = this->proxy.capacity();
  EXPECT_EQ(this->proxy.capacity(), this->container.capacity());

  const int new_capacity = initial_capacity + 42;
  this->proxy.reserve(new_capacity);
  EXPECT_EQ(this->proxy.capacity(), new_capacity);
  EXPECT_EQ(this->container.capacity(), new_capacity);

  const int lower_capacity = 1;
  this->proxy.reserve(lower_capacity);
  EXPECT_EQ(this->proxy.capacity(), new_capacity);
  EXPECT_EQ(this->container.capacity(), new_capacity);
}

}  // namespace
}  // namespace verible
