Add a test for ResizeableBuffer

Change-Id: I15375104a525d459fdb0439df4c2b8f8584b75ca
diff --git a/aos/containers/BUILD b/aos/containers/BUILD
index 8277212..9e527cd 100644
--- a/aos/containers/BUILD
+++ b/aos/containers/BUILD
@@ -66,3 +66,15 @@
         "@com_github_google_glog//:glog",
     ],
 )
+
+cc_test(
+    name = "resizeable_buffer_test",
+    srcs = [
+        "resizeable_buffer_test.cc",
+    ],
+    deps = [
+        ":resizeable_buffer",
+        "//aos/testing:googletest",
+        "@com_google_absl//absl/types:span",
+    ],
+)
diff --git a/aos/containers/resizeable_buffer_test.cc b/aos/containers/resizeable_buffer_test.cc
new file mode 100644
index 0000000..1d27a39
--- /dev/null
+++ b/aos/containers/resizeable_buffer_test.cc
@@ -0,0 +1,95 @@
+#include "aos/containers/resizeable_buffer.h"
+
+#include <numeric>
+
+#include "absl/types/span.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+namespace aos::testing {
+
+// Tests using resize to do some stuff with a ResizeableBuffer.
+TEST(ResizeableBufferTest, Resize) {
+  ResizeableBuffer buffer;
+  EXPECT_EQ(buffer.size(), 0u);
+  EXPECT_EQ(buffer.capacity(), 0u);
+
+  buffer.resize(3);
+  EXPECT_EQ(buffer.size(), 3u);
+  EXPECT_GE(buffer.capacity(), 3u);
+  EXPECT_EQ(buffer.begin() + 3, buffer.end());
+
+  buffer.resize(5);
+  EXPECT_EQ(buffer.size(), 5u);
+  EXPECT_GE(buffer.capacity(), 5u);
+  EXPECT_EQ(buffer.begin() + 5, buffer.end());
+
+  buffer.resize(2);
+  EXPECT_EQ(buffer.size(), 2u);
+  EXPECT_GE(buffer.capacity(), 2u);
+  EXPECT_EQ(buffer.begin() + 2, buffer.end());
+}
+
+// Tests using erase_front on a ResizeableBuffer.
+TEST(ResizeableBufferTest, EraseFront) {
+  ResizeableBuffer buffer;
+  EXPECT_EQ(buffer.size(), 0u);
+  EXPECT_EQ(buffer.capacity(), 0u);
+
+  buffer.resize(5);
+  for (int i = 0; i < 5; ++i) {
+    buffer.begin()[i] = '1' + i;
+  }
+  EXPECT_THAT(absl::Span<uint8_t>(buffer.begin(), buffer.size()),
+              ::testing::ElementsAre('1', '2', '3', '4', '5'));
+  buffer.erase_front(2);
+  EXPECT_THAT(absl::Span<uint8_t>(buffer.begin(), buffer.size()),
+              ::testing::ElementsAre('3', '4', '5'));
+}
+
+// Tests using push_back starting from an empty ResizeableBuffer.
+TEST(ResizeableBufferTest, PushBackEmpty) {
+  ResizeableBuffer buffer;
+  buffer.push_back('1');
+  buffer.push_back('2');
+  buffer.push_back('3');
+  EXPECT_THAT(absl::Span<uint8_t>(buffer.begin(), buffer.size()),
+              ::testing::ElementsAre('1', '2', '3'));
+}
+
+// Tests using push_back starting from a non-empty ResizeableBuffer.
+TEST(ResizeableBufferTest, PushBackNonEmpty) {
+  ResizeableBuffer buffer;
+  EXPECT_EQ(buffer.size(), 0u);
+  EXPECT_EQ(buffer.capacity(), 0u);
+
+  buffer.resize(2);
+  for (int i = 0; i < 2; ++i) {
+    buffer.begin()[i] = '1' + i;
+  }
+  buffer.push_back('3');
+  buffer.push_back('4');
+  buffer.push_back('5');
+  EXPECT_THAT(absl::Span<uint8_t>(buffer.begin(), buffer.size()),
+              ::testing::ElementsAre('1', '2', '3', '4', '5'));
+}
+
+// Tests using push_back starting from a large non-empty ResizeableBuffer.
+TEST(ResizeableBufferTest, PushBackLargeNonEmpty) {
+  ResizeableBuffer buffer;
+  EXPECT_EQ(buffer.size(), 0u);
+  EXPECT_EQ(buffer.capacity(), 0u);
+
+  buffer.resize(27);
+  for (int i = 0; i < 27; ++i) {
+    buffer.begin()[i] = '1' + i;
+  }
+  buffer.push_back('1' + 27);
+  buffer.push_back('1' + 28);
+  std::vector<char> expected(29);
+  std::iota(expected.begin(), expected.end(), '1');
+  EXPECT_THAT(absl::Span<uint8_t>(buffer.begin(), buffer.size()),
+              ::testing::ElementsAreArray(expected));
+}
+
+}  // namespace aos::testing