aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/unit/testSplitVector.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/testSplitVector.cxx')
-rw-r--r--test/unit/testSplitVector.cxx220
1 files changed, 220 insertions, 0 deletions
diff --git a/test/unit/testSplitVector.cxx b/test/unit/testSplitVector.cxx
new file mode 100644
index 000000000..b5d9a1d36
--- /dev/null
+++ b/test/unit/testSplitVector.cxx
@@ -0,0 +1,220 @@
+// Unit Tests for Scintilla internal data structures
+
+#include <string.h>
+
+#include "Platform.h"
+
+#include "SplitVector.h"
+
+#include <gtest/gtest.h>
+
+// Test SplitVector.
+
+class SplitVectorTest : public ::testing::Test {
+protected:
+ virtual void SetUp() {
+ psv = new SplitVector<int>;
+ }
+
+ virtual void TearDown() {
+ delete psv;
+ psv = 0;
+ }
+
+ SplitVector<int> *psv;
+};
+
+const int lengthTestArray = 4;
+static const int testArray[4] = {3, 4, 5, 6};
+
+TEST_F(SplitVectorTest, IsEmptyInitially) {
+ EXPECT_EQ(0, psv->Length());
+}
+
+TEST_F(SplitVectorTest, InsertOne) {
+ psv->InsertValue(0, 10, 0);
+ psv->Insert(5, 3);
+ EXPECT_EQ(11, psv->Length());
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ((i == 5) ? 3 : 0, psv->ValueAt(i));
+ }
+}
+
+TEST_F(SplitVectorTest, Insertion) {
+ psv->InsertValue(0, 10, 0);
+ EXPECT_EQ(10, psv->Length());
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ(0, psv->ValueAt(i));
+ }
+}
+
+TEST_F(SplitVectorTest, EnsureLength) {
+ psv->EnsureLength(4);
+ EXPECT_EQ(4, psv->Length());
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ(0, psv->ValueAt(i));
+ }
+}
+
+TEST_F(SplitVectorTest, InsertFromArray) {
+ psv->InsertFromArray(0, testArray, 0, lengthTestArray);
+ EXPECT_EQ(lengthTestArray, psv->Length());
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ(i+3, psv->ValueAt(i));
+ }
+}
+
+TEST_F(SplitVectorTest, SetValue) {
+ psv->InsertValue(0, 10, 0);
+ psv->SetValueAt(5, 3);
+ EXPECT_EQ(10, psv->Length());
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ((i == 5) ? 3 : 0, psv->ValueAt(i));
+ }
+ // Move the gap
+ psv->InsertValue(7, 1, 17);
+ EXPECT_EQ(17, psv->ValueAt(7));
+ EXPECT_EQ(0, psv->ValueAt(8));
+ // Set after the gap
+ psv->SetValueAt(8, 19);
+ EXPECT_EQ(19, psv->ValueAt(8));
+}
+
+TEST_F(SplitVectorTest, Indexing) {
+ psv->InsertValue(0, 10, 0);
+ psv->SetValueAt(5, 3);
+ EXPECT_EQ(10, psv->Length());
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ((i == 5) ? 3 : 0, (*psv)[i]);
+ }
+}
+
+TEST_F(SplitVectorTest, Fill) {
+ psv->InsertValue(0, 10, 0);
+ EXPECT_EQ(10, psv->Length());
+ psv->InsertValue(7, 1, 1);
+ EXPECT_EQ(11, psv->Length());
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ((i == 7) ? 1 : 0, psv->ValueAt(i));
+ }
+}
+
+TEST_F(SplitVectorTest, DeleteOne) {
+ psv->InsertFromArray(0, testArray, 0, lengthTestArray);
+ psv->Delete(2);
+ EXPECT_EQ(lengthTestArray-1, psv->Length());
+ EXPECT_EQ(3, (*psv)[0]);
+ EXPECT_EQ(4, (*psv)[1]);
+ EXPECT_EQ(6, (*psv)[2]);
+}
+
+TEST_F(SplitVectorTest, DeleteRange) {
+ psv->InsertValue(0, 10, 0);
+ EXPECT_EQ(10, psv->Length());
+ psv->InsertValue(7, 1, 1);
+ EXPECT_EQ(11, psv->Length());
+ psv->DeleteRange(2, 3);
+ EXPECT_EQ(8, psv->Length());
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ((i == 4) ? 1 : 0, psv->ValueAt(i));
+ }
+}
+
+TEST_F(SplitVectorTest, DeleteAll) {
+ psv->InsertValue(0, 10, 0);
+ psv->InsertValue(7, 1, 1);
+ psv->DeleteRange(2, 3);
+ psv->DeleteAll();
+ EXPECT_EQ(0, psv->Length());
+}
+
+TEST_F(SplitVectorTest, GetRange) {
+ psv->InsertValue(0, 10, 0);
+ psv->InsertValue(7, 1, 1);
+ int retrieveArray[11] = {0};
+ psv->GetRange(retrieveArray, 0, 11);
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ((i==7) ? 1 : 0, retrieveArray[i]);
+ }
+}
+
+TEST_F(SplitVectorTest, GetRangeOverGap) {
+ psv->InsertFromArray(0, testArray, 0, lengthTestArray);
+ EXPECT_EQ(lengthTestArray, psv->Length());
+ int retrieveArray[lengthTestArray] = {0};
+ psv->GetRange(retrieveArray, 0, lengthTestArray);
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ(i+3, retrieveArray[i]);
+ }
+}
+
+TEST_F(SplitVectorTest, ReplaceUp) {
+ // Replace each element by inserting and then deleting the displaced element
+ // This should perform many moves
+ const int testLength=105;
+ psv->EnsureLength(testLength);
+ for (int i=0; i<testLength; i++)
+ psv->SetValueAt(i, i+2);
+ EXPECT_EQ(testLength, psv->Length());
+ for (int i=0; i<psv->Length(); i++) {
+ psv->InsertValue(i, 1, i+9);
+ psv->Delete(i+1);
+ }
+ for (int i=0; i<psv->Length(); i++)
+ EXPECT_EQ(i+9, psv->ValueAt(i));
+}
+
+TEST_F(SplitVectorTest, ReplaceDown) {
+ // From the end, replace each element by inserting and then deleting the displaced element
+ // This should perform many moves
+ const int testLength=24;
+ psv->EnsureLength(testLength);
+ for (int i=0; i<testLength; i++)
+ psv->SetValueAt(i, i+12);
+ EXPECT_EQ(testLength, psv->Length());
+ for (int i=psv->Length()-1; i>=0; i--) {
+ psv->InsertValue(i, 1, i+5);
+ psv->Delete(i+1);
+ }
+ for (int i=0; i<psv->Length(); i++)
+ EXPECT_EQ(i+5, psv->ValueAt(i));
+}
+
+TEST_F(SplitVectorTest, BufferPointer) {
+ psv->InsertFromArray(0, testArray, 0, lengthTestArray);
+ int *retrievePointer = psv->BufferPointer();
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ(i+3, retrievePointer[i]);
+ }
+}
+
+TEST_F(SplitVectorTest, DeleteBackAndForth) {
+ psv->InsertValue(0, 10, 87);
+ for (int i=0; i<10; i+=2) {
+ int len = 10 - i;
+ EXPECT_EQ(len, psv->Length());
+ for (int i=0; i<psv->Length(); i++) {
+ EXPECT_EQ(87, psv->ValueAt(i));
+ }
+ psv->Delete(len-1);
+ psv->Delete(0);
+ }
+}
+
+TEST_F(SplitVectorTest, GrowSize) {
+ psv->SetGrowSize(5);
+ EXPECT_EQ(5, psv->GetGrowSize());
+}
+
+TEST_F(SplitVectorTest, OutsideBounds) {
+ psv->InsertValue(0, 10, 87);
+ EXPECT_EQ(0, psv->ValueAt(-1));
+ EXPECT_EQ(0, psv->ValueAt(10));
+
+ /* Could be a death test as this asserts:
+ psv->SetValueAt(-1,98);
+ psv->SetValueAt(10,99);
+ EXPECT_EQ(0, psv->ValueAt(-1));
+ EXPECT_EQ(0, psv->ValueAt(10));
+ */
+}