mirror of
				https://github.com/notepad-plus-plus/notepad-plus-plus.git
				synced 2025-10-31 11:34:05 +01:00 
			
		
		
		
	[BUG_FIXED] (Author: Dave Brotherstone) Fix scintilla crash bug while closing a document. git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@1104 f5eea248-9336-0410-98b8-ebc06183d4e3
		
			
				
	
	
		
			211 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Unit Tests for Scintilla internal data structures
 | |
| 
 | |
| #include <string.h>
 | |
| 
 | |
| #include <algorithm>
 | |
| 
 | |
| #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
 |