Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1409)

Unified Diff: base/gap_buffer_unittest.cc

Issue 5158004: Generic Gap Buffer data structure (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: addressed comments Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/gap_buffer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/gap_buffer_unittest.cc
diff --git a/base/gap_buffer_unittest.cc b/base/gap_buffer_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a3e2cacd3dbb56b2ae482d5a0161e510f60ff61e
--- /dev/null
+++ b/base/gap_buffer_unittest.cc
@@ -0,0 +1,165 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/gap_buffer.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+
+class GapBufferTester {
+ public:
+ GapBufferTester() { GapBufferTester(1, 'a'); }
+
+ GapBufferTester(int a, char b)
+ : a_(a),
+ b_(b) { }
+
+ // Overloading operator because it is required by the ElementsAreArrayMatcher.
+ bool operator==(const GapBufferTester& that) const {
+ return this->a_ == that.a_ && this->b_ == that.b_;
+ }
+
+ private:
+ int a_;
+ char b_;
+};
+
+template <class T>
+void Expectations(int current_size,
+ int buffer_size,
+ int contents_size,
+ int gap_start,
+ const T* contents_array,
+ GapBuffer<T>* gap_buffer) {
+ std::vector<T> contents;
+ gap_buffer->GetContents(&contents);
+ EXPECT_EQ(buffer_size, gap_buffer->GetBufferSize());
+ EXPECT_EQ(current_size, gap_buffer->GetCurrentSize());
+ EXPECT_EQ(gap_start, gap_buffer->GetGapStart());
+ EXPECT_EQ(static_cast<size_t>(contents_size), contents.size());
+ EXPECT_THAT(contents,
+ testing::ElementsAreArray(contents_array, contents_size));
+}
+
+GapBufferTester* GenerateTestData(int count) {
+ GapBufferTester* data = new GapBufferTester[count];
+ for (int i = 0; i < count; i++) {
+ data[i] = GapBufferTester(i, static_cast<int>('a') + i);
+ }
+ return data;
+}
+
+TEST(GapBufferTest, InitializationTest) {
+ scoped_array<int> array;
+ GapBuffer<int> gap_buffer(20);
+ array.reset(new int[0]);
+ Expectations(0, 20, 0, 0, array.get(), &gap_buffer);
+}
+
+TEST(GapBufferTest, InsertionTest) {
+ GapBuffer<wchar_t> gap_buffer(20);
+ gap_buffer.InsertAtGapStart('a');
+ Expectations(1, 20, 1, 1, L"a", &gap_buffer);
+
+ gap_buffer.InsertAtGapStart(' ');
+ gap_buffer.InsertAtGapStart('t');
+ gap_buffer.InsertAtGapStart('e');
+ gap_buffer.InsertAtGapStart('s');
+ gap_buffer.InsertAtGapStart('t');
+ Expectations(6, 20, 6, 6, L"a test", &gap_buffer);
+}
+
+TEST(GapBufferTest, DeletionTest) {
+ scoped_array<GapBufferTester> array;
+ GapBuffer<GapBufferTester> gap_buffer(10);
+ array.reset(new GapBufferTester[0]);
+ Expectations(0, 10, 0, 0, array.get(), &gap_buffer);
+
+ // try to remove on empty buffer.
+ gap_buffer.RemoveFromGapStart();
+ gap_buffer.RemoveFromGapEnd();
+ Expectations(0, 10, 0, 0, array.get(), &gap_buffer);
+
+ // generate some test data.
+ array.reset(GenerateTestData(5));
+
+ // fill up the gap buffer.
+ for (int i = 0; i < 5; i++) {
+ gap_buffer.InsertAtGapStart(array[i]);
+ }
+ Expectations(5, 10, 5, 5, array.get(), &gap_buffer);
+
+ // move the gap around so that we can get data on either end of the gap.
+ gap_buffer.MoveGapLeft(3);
+ gap_buffer.MoveGapRight(1);
+ Expectations(5, 10, 5, 3, array.get(), &gap_buffer);
+
+ // remove some stuff.
+ gap_buffer.RemoveFromGapEnd();
+ // update the expected array.
+ array.get()[3] = array[4];
+ Expectations(4, 10, 4, 3, array.get(), &gap_buffer);
+ gap_buffer.RemoveFromGapStart();
+ // update the expected array.
+ array.get()[2] = array[3];
+ Expectations(3, 10, 3, 2, array.get(), &gap_buffer);
+ // try to remove more than available.
+ gap_buffer.RemoveFromGapEnd();
+ gap_buffer.RemoveFromGapEnd();
+ gap_buffer.RemoveFromGapEnd();
+ Expectations(2, 10, 2, 2, array.get(), &gap_buffer);
+ // now from the start.
+ gap_buffer.RemoveFromGapStart();
+ gap_buffer.RemoveFromGapStart();
+ gap_buffer.RemoveFromGapStart();
+ Expectations(0, 10, 0, 0, array.get(), &gap_buffer);
+}
+
+TEST(GapBufferTest, GapMoveTest) {
+ // generate some test data.
+ scoped_array<GapBufferTester> array;
+ array.reset(GenerateTestData(26));
+
+ GapBuffer<GapBufferTester> gap_buffer(array.get(), 26);
+ Expectations(26, 36, 26, 26, array.get(), &gap_buffer);
+
+ // Move the gap around
+ gap_buffer.MoveGapLeft(20);
+ Expectations(26, 36, 26, 6, array.get(), &gap_buffer);
+ gap_buffer.MoveGapRight(15);
+ Expectations(26, 36, 26, 21, array.get(), &gap_buffer);
+}
+
+TEST(GapBufferTest, ReziseTest) {
+ scoped_array<GapBufferTester> array;
+ GapBuffer<GapBufferTester> gap_buffer(10);
+ array.reset(new GapBufferTester[0]);
+ Expectations(0, 10, 0, 0, array.get(), &gap_buffer);
+
+ // generate some test data.
+ array.reset(GenerateTestData(1000));
+
+ // fill up the gap buffer.
+ for (int i = 0; i < 1000; i++) {
+ gap_buffer.InsertAtGapStart(array[i]);
+ }
+
+ // the buffer must have resized. It increases 10% of its current size (or 10,
+ // which ever is greater) on every resize. The final size should be 1053.
+ Expectations(1000, 1053, 1000, 1000, array.get(), &gap_buffer);
+}
+
+TEST(GapBufferTest, ConstructorTest) {
+ // generate some test data.
+ scoped_array<GapBufferTester> array;
+ array.reset(GenerateTestData(1000));
+
+ GapBuffer<GapBufferTester> gap_buffer(array.get(), 1000);
+ Expectations(1000, 1010, 1000, 1000, array.get(), &gap_buffer);
+}
+
+} // namespace
« no previous file with comments | « base/gap_buffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698