aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/unit/testPartitioning.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/testPartitioning.cxx')
-rw-r--r--test/unit/testPartitioning.cxx208
1 files changed, 208 insertions, 0 deletions
diff --git a/test/unit/testPartitioning.cxx b/test/unit/testPartitioning.cxx
new file mode 100644
index 000000000..7eff5d9c9
--- /dev/null
+++ b/test/unit/testPartitioning.cxx
@@ -0,0 +1,208 @@
+// Unit Tests for Scintilla internal data structures
+
+#include <string.h>
+
+#include "Platform.h"
+
+#include "SplitVector.h"
+#include "Partitioning.h"
+
+#include <gtest/gtest.h>
+
+const int growSize = 4;
+
+const int lengthTestArray = 8;
+static const int testArray[lengthTestArray] = {3, 4, 5, 6, 7, 8, 9, 10};
+
+// Test SplitVectorWithRangeAdd.
+
+class SplitVectorWithRangeAddTest : public ::testing::Test {
+protected:
+ virtual void SetUp() {
+ psvwra = new SplitVectorWithRangeAdd(growSize);
+ }
+
+ virtual void TearDown() {
+ delete psvwra;
+ psvwra = 0;
+ }
+
+ SplitVectorWithRangeAdd *psvwra;
+};
+
+TEST_F(SplitVectorWithRangeAddTest, IsEmptyInitially) {
+ EXPECT_EQ(0, psvwra->Length());
+}
+
+TEST_F(SplitVectorWithRangeAddTest, IncrementExceptEnds) {
+ psvwra->InsertFromArray(0, testArray, 0, lengthTestArray);
+ psvwra->RangeAddDelta(1, lengthTestArray-1, 1);
+ for (int i=0; i<psvwra->Length(); i++) {
+ if ((i == 0) || (i == lengthTestArray-1))
+ EXPECT_EQ(i+3, psvwra->ValueAt(i));
+ else
+ EXPECT_EQ(i+4, psvwra->ValueAt(i));
+ }
+}
+
+// Test Partitioning.
+
+class PartitioningTest : public ::testing::Test {
+protected:
+ virtual void SetUp() {
+ pp = new Partitioning(growSize);
+ }
+
+ virtual void TearDown() {
+ delete pp;
+ pp = 0;
+ }
+
+ Partitioning *pp;
+};
+
+TEST_F(PartitioningTest, IsEmptyInitially) {
+ EXPECT_EQ(1, pp->Partitions());
+ EXPECT_EQ(0, pp->PositionFromPartition(pp->Partitions()));
+ EXPECT_EQ(0, pp->PartitionFromPosition(0));
+}
+
+TEST_F(PartitioningTest, SimpleInsert) {
+ pp->InsertText(0, 1);
+ EXPECT_EQ(1, pp->Partitions());
+ EXPECT_EQ(1, pp->PositionFromPartition(pp->Partitions()));
+}
+
+TEST_F(PartitioningTest, TwoPartitions) {
+ pp->InsertText(0, 2);
+ pp->InsertPartition(1, 1);
+ EXPECT_EQ(2, pp->Partitions());
+ EXPECT_EQ(0, pp->PositionFromPartition(0));
+ EXPECT_EQ(1, pp->PositionFromPartition(1));
+ EXPECT_EQ(2, pp->PositionFromPartition(2));
+}
+
+TEST_F(PartitioningTest, MoveStart) {
+ pp->InsertText(0, 3);
+ pp->InsertPartition(1, 2);
+ pp->SetPartitionStartPosition(1,1);
+ EXPECT_EQ(2, pp->Partitions());
+ EXPECT_EQ(0, pp->PositionFromPartition(0));
+ EXPECT_EQ(1, pp->PositionFromPartition(1));
+ EXPECT_EQ(3, pp->PositionFromPartition(2));
+}
+
+TEST_F(PartitioningTest, InsertAgain) {
+ pp->InsertText(0, 3);
+ pp->InsertPartition(1, 2);
+ pp->InsertText(0,3);
+ pp->InsertText(1,2);
+ EXPECT_EQ(2, pp->Partitions());
+ EXPECT_EQ(0, pp->PositionFromPartition(0));
+ EXPECT_EQ(5, pp->PositionFromPartition(1));
+ EXPECT_EQ(8, pp->PositionFromPartition(2));
+}
+
+TEST_F(PartitioningTest, InsertReversed) {
+ pp->InsertText(0, 3);
+ pp->InsertPartition(1, 2);
+ pp->InsertText(1,2);
+ pp->InsertText(0,3);
+ EXPECT_EQ(2, pp->Partitions());
+ EXPECT_EQ(0, pp->PositionFromPartition(0));
+ EXPECT_EQ(5, pp->PositionFromPartition(1));
+ EXPECT_EQ(8, pp->PositionFromPartition(2));
+}
+
+TEST_F(PartitioningTest, InverseSearch) {
+ pp->InsertText(0, 3);
+ pp->InsertPartition(1, 2);
+ pp->SetPartitionStartPosition(1,1);
+
+ EXPECT_EQ(2, pp->Partitions());
+ EXPECT_EQ(0, pp->PositionFromPartition(0));
+ EXPECT_EQ(1, pp->PositionFromPartition(1));
+ EXPECT_EQ(3, pp->PositionFromPartition(2));
+
+ EXPECT_EQ(0, pp->PartitionFromPosition(0));
+ EXPECT_EQ(1, pp->PartitionFromPosition(1));
+ EXPECT_EQ(1, pp->PartitionFromPosition(2));
+
+ EXPECT_EQ(1, pp->PartitionFromPosition(3));
+}
+
+TEST_F(PartitioningTest, DeletePartition) {
+ pp->InsertText(0, 2);
+ pp->InsertPartition(1, 1);
+ pp->RemovePartition(1);
+ EXPECT_EQ(1, pp->Partitions());
+ EXPECT_EQ(0, pp->PositionFromPartition(0));
+ EXPECT_EQ(2, pp->PositionFromPartition(1));
+}
+
+TEST_F(PartitioningTest, DeleteAll) {
+ pp->InsertText(0, 3);
+ pp->InsertPartition(1, 2);
+ pp->SetPartitionStartPosition(1,1);
+ pp->DeleteAll();
+ // Back to initial state
+ EXPECT_EQ(1, pp->Partitions());
+ EXPECT_EQ(0, pp->PositionFromPartition(pp->Partitions()));
+}
+
+TEST_F(PartitioningTest, TestBackwards) {
+ pp->InsertText(0, 10);
+ pp->InsertPartition(1, 3);
+ pp->InsertPartition(2, 6);
+ pp->InsertPartition(3, 9);
+ pp->InsertText(2,4);
+ pp->InsertText(1,2);
+ pp->InsertText(0,3);
+ EXPECT_EQ(4, pp->Partitions());
+ EXPECT_EQ(0, pp->PositionFromPartition(0));
+ EXPECT_EQ(6, pp->PositionFromPartition(1));
+ EXPECT_EQ(11, pp->PositionFromPartition(2));
+ EXPECT_EQ(18, pp->PositionFromPartition(3));
+ EXPECT_EQ(19, pp->PositionFromPartition(4));
+}
+
+TEST_F(PartitioningTest, TestMany) {
+ // Provoke backstep call
+ pp->InsertText(0, 42);
+ for (int i=0; i<20; i++) {
+ pp->InsertPartition(i+1, (i+1) * 2);
+ }
+ for (int i=20; i>0; i--) {
+ pp->InsertText(i,2);
+ }
+ EXPECT_EQ(21, pp->Partitions());
+ for (int i=1; i<20; i++) {
+ EXPECT_EQ(i*4 - 2, pp->PositionFromPartition(i));
+ EXPECT_EQ(i, pp->PartitionFromPosition(i*4 - 2));
+ }
+ pp->InsertText(19,2);
+ EXPECT_EQ(3, pp->PartitionFromPosition(10));
+ pp->InsertText(0,2);
+ pp->InsertText(0,-2);
+ pp->RemovePartition(1);
+ EXPECT_EQ(0, pp->PositionFromPartition(0));
+ EXPECT_EQ(6, pp->PositionFromPartition(1));
+ EXPECT_EQ(10, pp->PositionFromPartition(2));
+ pp->RemovePartition(10);
+ EXPECT_EQ(46, pp->PositionFromPartition(10));
+ EXPECT_EQ(10, pp->PartitionFromPosition(46));
+ EXPECT_EQ(50, pp->PositionFromPartition(11));
+ EXPECT_EQ(11, pp->PartitionFromPosition(50));
+}
+
+#if !PLAT_WIN
+// Omit death tests on Windows where they trigger a system "unitTest.exe has stopped working" popup.
+TEST_F(PartitioningTest, OutOfRangeDeathTest) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ pp->InsertText(0, 2);
+ pp->InsertPartition(1, 1);
+ EXPECT_EQ(2, pp->Partitions());
+ ASSERT_DEATH(pp->PositionFromPartition(-1), "Assertion");
+ ASSERT_DEATH(pp->PositionFromPartition(3), "Assertion");
+}
+#endif