diff --git a/components/synedit/test/testsynsharededits.pas b/components/synedit/test/testsynsharededits.pas index e0d5feec68..32729aee96 100644 --- a/components/synedit/test/testsynsharededits.pas +++ b/components/synedit/test/testsynsharededits.pas @@ -28,6 +28,7 @@ type function AddMark(EditIndex: Integer; Y, X: Integer) : TSynEditMark; published procedure TestMarks; + procedure TestBookMarks; end; implementation @@ -122,8 +123,8 @@ begin // default setting is shared marklist FSynEdits[1].ShareOptions := [eosShareMarks]; FSynEdits[1].ShareTextBufferFrom(FSynEdits[0]); - SetLines(TestText1); + CheckMarks('empty', 0, []); CheckMarks('empty', 1, []); @@ -142,8 +143,8 @@ begin // setting is not shared marklist FSynEdits[1].ShareOptions := []; FSynEdits[1].ShareTextBufferFrom(FSynEdits[0]); - SetLines(TestText1); + CheckMarks('empty', 0, []); CheckMarks('empty', 1, []); @@ -158,6 +159,146 @@ begin end; +procedure TTestSynSharedEdits.TestBookMarks; + procedure CheckBMarks(Name: String; EditIndex: Integer; MarkList: Array of Integer); + var + m: TSynEditMark; + l: Array of Integer; + i, j: Integer; + begin + Name := BaseTestName + Name; + AssertEquals(Name + ' Edit: '+IntToStr(EditIndex)+' Count: ', length(MarkList) div 2, FSynEdits[EditIndex].Marks.Count); + + SetLength(l, FSynEdits[EditIndex].Lines.Count); + for i := 0 to length(l)-1 do + l[i] := 0; + + for i := 0 to (length(MarkList) div 2) - 1 do begin + l[MarkList[i*2+0]] := l[MarkList[i*2+0]] + 1; + m := FSynEdits[EditIndex].Marks[i]; + AssertEquals(Name + ' Edit: '+IntToStr(EditIndex)+' Mark( '+IntToStr(i)+' ) Line: ', MarkList[i*2+0], m.Line); + AssertEquals(Name + ' Edit: '+IntToStr(EditIndex)+' Mark( '+IntToStr(i)+' ) BookNum: ', MarkList[i*2+1], m.BookmarkNumber); + AssertEquals(Name + ' Edit: '+IntToStr(EditIndex)+' Mark( '+IntToStr(i)+' ) IndexOf: ', i, FSynEdits[EditIndex].Marks.IndexOf(m)); + end; + + for i := 0 to length(l)-1 do begin + j := 0; + if FSynEdits[EditIndex].Marks.Line[i] <> nil then + j := FSynEdits[EditIndex].Marks.Line[i].Count; + AssertEquals(Name + ' Edit: '+IntToStr(EditIndex)+' Count in line '+IntToStr(i)+': ', l[i], j); + end; + + end; + +var + e1, e2, e3: Integer; +begin + {%region edits already shared } + ReCreateEdit(2); + // default setting is shared marklist + FSynEdits[1].ShareOptions := [eosShareMarks]; + FSynEdits[1].ShareTextBufferFrom(FSynEdits[0]); + SetLines(TestText1); + PushBaseName('2 shared'); + + PushBaseName(''); + for e1 := 0 to 1 do begin + for e2 := 0 to 1 do begin + PopPushBaseName('e1='+IntToStr(e1) + ' e2='+IntToStr(e2) ); + // Set Mark + FSynEdits[e1].SetBookMark(1, 2, 4); + CheckBMarks('bm 1', 0, [ 4, 1 ]); + CheckBMarks('bm 1', 1, [ 4, 1 ]); + + // goto + SelectEdit(0); + SynEdit.GotoBookMark(1); + TestIsCaret('Goto1 /0', 2, 4); + SelectEdit(1); + SynEdit.GotoBookMark(1); + TestIsCaret('Goto1 /1', 2, 4); + + // clear + FSynEdits[e2].ClearBookMark(1); + CheckBMarks('bm clear', 0, [] ); + CheckBMarks('bm clear', 1, [] ); + end; + end; + PopBaseName; + + PushBaseName(''); + for e1 := 0 to 1 do begin + for e2 := 0 to 1 do begin + for e3 := 0 to 1 do begin + PopPushBaseName('e1='+IntToStr(e1) + ' e2='+IntToStr(e2) + ' e3='+IntToStr(e3)); + FSynEdits[e1].ClearBookMark(1); + FSynEdits[e1].ClearBookMark(2); + // set 1 on ed1 + FSynEdits[e1].SetBookMark(1, 2, 4); + CheckBMarks('bm set 1', 0, [ 4, 1 ]); + CheckBMarks('bm set 1', 1, [ 4, 1 ]); + + // set 2 on ed2 + FSynEdits[e2].SetBookMark(2, 2, 5); + CheckBMarks('bm set 2', 0, [ 4,1, 5,2 ]); + CheckBMarks('bm set 2', 1, [ 4,1, 5,2 ]); + + // move 1 on ed3 + FSynEdits[e3].SetBookMark(1, 2, 3); + CheckBMarks('bm move 1', 0, [ 3,1, 5,2 ]); + CheckBMarks('bm move 1', 1, [ 3,1, 5,2 ]); + + // move 2 over 1 on ed3 + FSynEdits[e3].SetBookMark(2, 3, 3); + CheckBMarks('bm move 2 over 1', 0, [ 3,2 ]); + CheckBMarks('bm move 2 over 1', 1, [ 3,2 ]); + end; + end; + end; + PopBaseName; + {%endregion} + + + {%region edits shared after bookmark set } + ReCreateEdit(2); + // default setting is shared marklist + FSynEdits[1].ShareOptions := [eosShareMarks]; + SetLines(TestText1); + PopPushBaseName('2 shared after bm set'); + + FSynEdits[0].SetBookMark(1, 2, 4); + CheckBMarks('bm 1', 0, [ 4, 1 ]); + CheckBMarks('bm 1', 1, [ ]); + + FSynEdits[1].ShareTextBufferFrom(FSynEdits[0]); + + CheckBMarks('bm shared 1', 0, [ 4, 1 ]); + CheckBMarks('bm shared 1', 1, [ 4, 1 ]); + + FSynEdits[1].ClearBookMark(1); + + CheckBMarks('clear', 0, []); + CheckBMarks('clear', 1, []); + + // unshare edits + FSynEdits[0].SetBookMark(1, 2, 4); + CheckBMarks('bm 1', 0, [ 4, 1 ]); + CheckBMarks('bm 1', 1, [ 4, 1 ]); + + FSynEdits[1].UnShareTextBuffer; + CheckBMarks('unshare 1', 0, [ 4, 1 ]); + CheckBMarks('unshare 1', 1, [ ]); + + FSynEdits[1].ClearBookMark(1); + CheckBMarks('unshare 1', 0, [ 4, 1 ]); // not affected + CheckBMarks('unshare 1', 1, [ ]); + + FSynEdits[0].ClearBookMark(1); + CheckBMarks('unshare 1', 0, [ ]); + CheckBMarks('unshare 1', 1, [ ]); + {%endregion} +end; + initialization RegisterTest(TTestSynSharedEdits);