// Unit Tests for Scintilla internal data structures #include #include #include "Platform.h" #include "SplitVector.h" #include "Partitioning.h" #include 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; iLength(); 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