diff --git a/.gitattributes b/.gitattributes index 04379e7532..93d28f1047 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2018,6 +2018,7 @@ components/synedit/test/testbase.pas svneol=native#text/pascal components/synedit/test/testsynbeautifier.pas svneol=native#text/pascal components/synedit/test/testsyncroedit.pas svneol=native#text/pascal components/synedit/test/testsynselection.pas svneol=native#text/pascal +components/synedit/test/testtrimspace.pas svneol=native#text/pascal components/synunihighlighter/CHANGES.txt svneol=native#text/plain components/synunihighlighter/CREDITS.txt svneol=native#text/plain components/synunihighlighter/README.txt svneol=native#text/plain diff --git a/components/synedit/test/SynTest.lpr b/components/synedit/test/SynTest.lpr index c1ee7a0eb4..5482852fa5 100644 --- a/components/synedit/test/SynTest.lpr +++ b/components/synedit/test/SynTest.lpr @@ -5,7 +5,7 @@ program SynTest; uses Interfaces, Forms, GuiTestRunner, LResources, TestBase, - TestSynSelection, TestSynBeautifier, TestSyncroEdit; + TestSynSelection, TestSynBeautifier, TestSyncroEdit, TestTrimSpace; {$IFDEF WINDOWS}{$R SynTest.rc}{$ENDIF} diff --git a/components/synedit/test/testtrimspace.pas b/components/synedit/test/testtrimspace.pas new file mode 100644 index 0000000000..f63805005f --- /dev/null +++ b/components/synedit/test/testtrimspace.pas @@ -0,0 +1,534 @@ +unit TestTrimSpace; + +{$mode objfpc}{$H+} + +interface + +(* TODO + +trim if the caret changes between identical lines +__abc|___ +__abc + +or between two empty lines +|___ + +*) + +uses + Classes, SysUtils, Forms, testregistry, TestBase, LCLProc, LCLType, + SynEdit, SynEditKeyCmds; + +type + + { TTestTrimSpace } + + TTestTrimSpace = class(TTestBase) + private + FTName: String; + FUseEc: Boolean; + protected + procedure test_assert(ASubName: String; AExp: String = ''; AExpX: Integer = -1; AExpY: Integer = -1); + procedure test_start(AName, Txt: String); + Procedure test_cmd(ASubName: String; X, Y: Integer; Cmd: TSynEditorCommand; AChar: TUTF8Char; + AExp: String = ''; AExpX: Integer = -1; AExpY: Integer = -1); + Procedure test_caret(ASubName: String; X, Y: Integer; + AExp: String = ''; AExpX: Integer = -1; AExpY: Integer = -1); + Procedure test_undo(ASubName: String; + AExp: String = ''; AExpX: Integer = -1; AExpY: Integer = -1); + Procedure test_redo(ASubName: String; + AExp: String = ''; AExpX: Integer = -1; AExpY: Integer = -1); + procedure SetUp; override; + published + procedure TrimUndoRedo; + procedure TrimUndoRedoEc; + procedure NoTrimUndoRedo; + end; + +implementation +const + cr: String = LineEnding; + +procedure TTestTrimSpace.SetUp; +begin + inherited; + FUseEc := False; +end; + +procedure TTestTrimSpace.test_assert(ASubName: String; AExp: String = ''; AExpX: Integer = -1; AExpY: Integer = -1); +begin + if AExp <> '' then + AssertEquals(FTName+' ('+ASubName+') Text', DbgStr(AExp+cr), DbgStr(SynEdit.ViewedTextBuffer.Text)); + if AExpX > 0 then begin + AssertEquals(FTName+' ('+ASubName+') Caret X', AExpX, SynEdit.CaretX); + AssertEquals(FTName+' ('+ASubName+') Caret Y', AExpY, SynEdit.CaretY); + end; +debugln(['done ',ASubName]); +end; + +procedure TTestTrimSpace.test_start(AName, Txt: String); +begin + FTName := AName; + SynEdit.Text := Txt; +debugln(['----- START ',AName]); +end; + + +Procedure TTestTrimSpace.test_cmd(ASubName: String; X, Y: Integer; Cmd: TSynEditorCommand; AChar: TUTF8Char; + AExp: String = ''; AExpX: Integer = -1; AExpY: Integer = -1); +begin + SynEdit.CaretXY := Point(x, y); + SynEdit.CommandProcessor(Cmd, AChar, nil); + test_assert('cmd: '+ASubName, AExp, AExpX, AExpY); +end; + +Procedure TTestTrimSpace.test_caret(ASubName: String; X, Y: Integer; + AExp: String = ''; AExpX: Integer = -1; AExpY: Integer = -1); +begin + SynEdit.CaretXY := Point(x, y); + test_assert('caret: '+ASubName, AExp, AExpX, AExpY); +end; + +Procedure TTestTrimSpace.test_undo(ASubName: String; + AExp: String = ''; AExpX: Integer = -1; AExpY: Integer = -1); +begin + if FUseEc then + SynEdit.CommandProcessor(ecUndo, ' ', nil) + else + SynEdit.Undo; + test_assert('undo: '+ASubName, AExp, AExpX, AExpY); +end; + +Procedure TTestTrimSpace.test_redo(ASubName: String; + AExp: String = ''; AExpX: Integer = -1; AExpY: Integer = -1); +begin + if FUseEc then + SynEdit.CommandProcessor(ecRedo, ' ', nil) + else + SynEdit.Redo; + test_assert('redo: '+ASubName, AExp, AExpX, AExpY); +end; + +procedure TTestTrimSpace.TrimUndoRedo; +begin + SynEdit.Options := [eoTrimTrailingSpaces, eoAutoIndent, eoScrollPastEol]; // eoGroupUndo + + { Edit Lines } + (* *) + test_start('Delete leaves trimable space', cr+'abc d'); + test_cmd ('Backspace 6,2', 6,2, ecDeleteLastChar, '', cr+'abc ', 5,2); + test_caret('trim', 1,1, cr+'abc', 1,1); + // undo +//# test_undo('undo trim', cr+'abc ', 5,2); + test_undo('undo bspace', cr+'abc d', 6,2); + test_redo('redo bspace', cr+'abc ', 5,2); + test_caret('trim', 1,1, cr+'abc', 1,1); + // undo again +//# test_undo('undo trim(2)', cr+'abc ', 5,2); + test_undo('undo bspace(2)', cr+'abc d', 6,2); + test_redo('redo bspace(2)', cr+'abc ', 5,2); + test_redo('no redo trim(2)', cr+'abc ', 5,2); + // undo again + test_caret('trim(3)', 1,1, cr+'abc', 1,1); +//# test_undo('undo trim(3)', cr+'abc ', 5,2); +//## test_caret('trim(3)', 1,1, cr+'abc', 1,1); + + (* *) + test_start('insert past real space', cr+'abc '); + test_cmd ('insert 5,2', 5,2, ecChar, 'x', cr+'abc x', 6,2); + // undo + test_undo('undo insert', cr+'abc ', 5,2); + test_caret('no trim', 1,1, cr+'abc ', 1,1); + // rdeo/undo again + test_redo('redo insert', cr+'abc x', 6,2); + test_undo('undo insert(2)', cr+'abc ', 5,2); + test_caret('no trim(2)', 1,1, cr+'abc ', 1,1); + + (* *) + test_start('insert spaces past real space', cr+'abc '); + test_cmd ('insert 5,2', 5,2, ecChar, ' ', cr+'abc ', 6,2); + test_cmd ('insert 6,2', 6,2, ecChar, ' ', cr+'abc ', 7,2); + // undo + test_undo('undo insert2', cr+'abc ', 6,2); + test_undo('undo insert1', cr+'abc ', 5,2); + test_caret('no trim', 1,1, cr+'abc ', 1,1); + // rdeo/undo again + test_redo('redo insert1', cr+'abc ', 6,2); + test_redo('redo insert2', cr+'abc ', 7,2); + test_undo('undo inserts2(2)', cr+'abc ', 6,2); + test_undo('undo inserts1(2)', cr+'abc ', 5,2); + test_caret('no trim(2)', 1,1, cr+'abc ', 1,1); + + + (* *) + test_start('insert spaces,char', cr+'abc'); + test_cmd ('insert 4,2', 4,2, ecChar, ' ', cr+'abc ', 5,2); + test_cmd ('insert 5,2', 5,2, ecChar, 'x', cr+'abc x', 6,2); + // undo + test_undo('undo ins char', cr+'abc ', 5,2); + test_caret('trim', 1,1, cr+'abc', 1,1); /// xxx this undo, remose the ability to redo.... + + (* *) + test_start('insert spaces,char after space', cr+'ab '); + test_cmd ('insert 4,2', 4,2, ecChar, ' ', cr+'ab ', 5,2); + test_cmd ('insert 5,2', 5,2, ecChar, 'x', cr+'ab x', 6,2); + // undo + test_undo('undo ins char', cr+'ab ', 5,2); + test_caret('trim', 1,1, cr+'ab', 1,1); /// xxx this undo, remose the ability to redo.... xxxxxxxxxxxxxxxx + // We can no longer undo back to the real space + + (* *) + test_start('insert spaces,char after space (2)', cr+'ab '); + test_cmd ('insert 4,2', 4,2, ecChar, ' ', cr+'ab ', 5,2); + test_cmd ('insert 5,2', 5,2, ecChar, 'x', cr+'ab x', 6,2); + // undo + test_undo('undo ins char', cr+'ab ', 5,2); + test_undo('undo ins space', cr+'ab ', 4,2); + test_caret('no trim', 1,1, cr+'ab ', 1,1); /// xxx this undo, remose the ability to redo.... + + (* *) + test_start('insert past eol', cr+'abc '); + test_cmd ('insert 8,2', 8,2, ecChar, 'x', cr+'abc x', 9,2); + test_undo('undo insert', cr+'abc ', 8,2); + test_caret('trim', 1,1, cr+'abc ', 1,1); + // TODO: redo + + { Insert LineBreaks } + (* *) + test_start('insert newline', cr+'ab 1234 '); + test_cmd ('insert 4,2', 4,2, ecLineBreak, ' ', cr+'ab'+cr+'1234 ', 1,3); + test_caret('trim', 1,1, cr+'ab'+cr+'1234', 1,1); +//# test_undo('-trim', cr+'ab'+cr+'1234 ', 6,3); // TODO caret at: 1,3); + test_undo('-newline', cr+'ab 1234 ', 4,2); + test_caret('no trim', 1,1, cr+'ab 1234 ', 1,1); + + (* *) + test_start('insert newline+indent', cr+' ab '); + test_cmd ('insert 6,2', 6,2, ecLineBreak, ' ', cr+' ab'+cr+' ', 3,3); + test_cmd ('insert 3,3', 3,3, ecLineBreak, ' ', cr+' ab'+cr+''+cr+' ', 3,4); + test_cmd ('insert 3,4', 3,4, ecLineBreak, ' ', cr+' ab'+cr+''+cr+''+cr+' ', 3,5); + test_caret('trim', 1,1, cr+' ab'+cr+''+cr+''+cr+'', 1,1); +//# test_undo('-trim', cr+' ab'+cr+''+cr+''+cr+' ', 3,5); + test_undo('-newlin 1', cr+' ab'+cr+''+cr+' ', 3,4); + test_undo('-newlin 2', cr+' ab'+cr+' ', 3,3); + test_undo('-newlin 3', cr+' ab ', 6,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); + test_redo('redo 3', cr+' ab'+cr+' ', 3,3); + test_redo('redo 2', cr+' ab'+cr+''+cr+' ', 3,4); + test_redo('redo 1', cr+' ab'+cr+''+cr+''+cr+' ', 3,5); + test_undo('-newlin 1(r)', cr+' ab'+cr+''+cr+' ', 3,4); + test_undo('-newlin 2(r)', cr+' ab'+cr+' ', 3,3); + test_undo('-newlin 3(r)', cr+' ab ', 6,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); + + (* *) + test_start('insert newline+indent before space', cr+' ab '); + test_cmd ('insert 5,2', 5,2, ecLineBreak, ' ', cr+' ab'+cr+' ', 3,3); + test_cmd ('insert 3,3', 3,3, ecLineBreak, ' ', cr+' ab'+cr+''+cr+' ', 3,4); + test_cmd ('insert 3,4', 3,4, ecLineBreak, ' ', cr+' ab'+cr+''+cr+''+cr+' ', 3,5); + test_caret('trim', 1,1, cr+' ab'+cr+''+cr+''+cr+'', 1,1); +//# test_undo('-trim', cr+' ab'+cr+''+cr+''+cr+' ', 4,5); // TODO caret at: 3,5); + test_undo('-newlin 1', cr+' ab'+cr+''+cr+' ', 3,4); + test_undo('-newlin 2', cr+' ab'+cr+' ', 3,3); + test_undo('-newlin 3', cr+' ab ', 5,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); + test_redo('redo 3', cr+' ab'+cr+' ', 3,3); + test_redo('redo 2', cr+' ab'+cr+''+cr+' ', 3,4); + test_redo('redo 1', cr+' ab'+cr+''+cr+''+cr+' ', 3,5); + test_undo('-newlin 1(r)', cr+' ab'+cr+''+cr+' ', 3,4); + test_undo('-newlin 2(r)', cr+' ab'+cr+' ', 3,3); + test_undo('-newlin 3(r)', cr+' ab ', 5,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); + + (* *) + test_start('insert linebreak', cr+'ab 1234 '); + test_cmd ('insert 4,2', 4,2, ecInsertLine, ' ', cr+'ab '+cr+'1234', 4,2); + test_caret('trim', 1,1, cr+'ab'+cr+'1234', 1,1); +//# test_undo('-trim', cr+'ab '+cr+'1234', 4,2); + test_undo('-linebreak', cr+'ab 1234 ', 4,2); + test_caret('no trim', 1,1, cr+'ab 1234 ', 1,1); + + (* *) + test_start('insert linebreak+indent', cr+' ab '); + test_cmd ('insert1 6,2', 6,2, ecInsertLine, ' ', cr+' ab '+cr+'', 6,2); + test_cmd ('insert2 6,2', 6,2, ecInsertLine, ' ', cr+' ab '+cr+''+cr+'', 6,2); + test_caret('trim', 1,1, cr+' ab'+cr+''+cr+'', 1,1); +//# test_undo('-trim', cr+' ab '+cr+''+cr+'', 6,2); + test_undo('-linebreak 1', cr+' ab '+cr+'', 6,2); + test_undo('-linebreak 2', cr+' ab ', 6,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); +(* + test_redo('redo 2', cr+' ab '+cr+'', 6,2); + test_redo('redo 1', cr+' ab '+cr+''+cr+'', 6,2); + test_undo('-linebreak 1(r)', cr+' ab '+cr+'', 6,2); + test_undo('-linebreak 2(r)', cr+' ab ', 6,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); +*) + + (* *) + test_start('insert linebreak+indent before space', cr+' ab '); + test_cmd ('insert1 5,2', 5,2, ecInsertLine, ' ', cr+' ab'+cr+'', 5,2); + test_cmd ('insert2 5,2', 5,2, ecInsertLine, ' ', cr+' ab'+cr+''+cr+'', 5,2); + test_caret('no trim (0 spaces)', 1,1, cr+' ab'+cr+''+cr+'', 1,1); + test_undo('-linebreak 1', cr+' ab'+cr+'', 5,2); + test_undo('-linebreak 2', cr+' ab ', 5,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); +(* + test_redo('redo 2', cr+' ab'+cr+'', 5,2); + test_redo('redo 1', cr+' ab'+cr+''+cr+'', 5,2); + test_undo('-linebreak 1(r)', cr+' ab'+cr+'', 5,2); + test_undo('-linebreak 2(r)', cr+' ab ', 5,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); +*) + + { Join Lines } + (* *) + test_start('del', cr+'ab '+cr+'12'); + test_cmd ('del 4,2', 4,2, ecDeleteChar, ' ', cr+'ab 12', 4,2); + test_undo('-del', cr+'ab '+cr+'12', 4,2); + test_caret('trim', 1,1, cr+'ab '+cr+'12', 1,1); + test_redo('+del', cr+'ab 12', 4,2); + test_undo('-del(2)', cr+'ab '+cr+'12', 4,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12', 1,1); + + (* *) + test_start('del (both sp)', cr+'ab '+cr+'12 '); + test_cmd ('del 4,2', 4,2, ecDeleteChar, ' ', cr+'ab 12 ', 4,2); + test_undo('-del', cr+'ab '+cr+'12 ', 4,2); + test_caret('trim', 1,1, cr+'ab '+cr+'12 ', 1,1); + test_redo('+del', cr+'ab 12 ', 4,2); + test_undo('-del(2)', cr+'ab '+cr+'12 ', 4,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12 ', 1,1); + + (* *) + test_start('del past eol', cr+'ab '+cr+'12'); + test_cmd ('del 6,2', 6,2, ecDeleteChar, ' ', cr+'ab 12', 6,2); + test_undo('-del', cr+'ab '+cr+'12', 6,2); + test_caret('no trim', 1,1, cr+'ab '+cr+'12', 1,1); + test_caret('-no trim', 6,2, cr+'ab '+cr+'12', 6,2); + test_redo('+del(2)', cr+'ab 12', 6,2); + test_undo('-del(2)', cr+'ab '+cr+'12', 6,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12', 1,1); + test_redo('+del(3)', cr+'ab 12', 6,2); // redo with mis-place caret + + (* *) + test_start('backspace', cr+'ab '+cr+'12'); + test_cmd ('bs 1,3', 1,3, ecDeleteLastChar, ' ', cr+'ab 12', 4,2); + test_undo('-bs', cr+'ab '+cr+'12', 1,3); + test_caret('trim', 1,1, cr+'ab '+cr+'12', 1,1); + test_redo('+bs', cr+'ab 12', 4,2); + test_undo('-bs(2)', cr+'ab '+cr+'12', 1,3); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12', 1,1); + + (* *) + test_start('del-word', cr+'ab '+cr+'12'); + test_cmd ('del 4,2', 4,2, ecDeleteWord, ' ', cr+'ab 12', 4,2); + test_undo('-del', cr+'ab '+cr+'12', 4,2); + test_caret('no trim', 1,1, cr+'ab '+cr+'12', 1,1); + test_redo('+del', cr+'ab 12', 4,2); + test_undo('-del(2)', cr+'ab '+cr+'12', 4,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12', 1,1); + + (* *) + test_start('del-word (both sp)', cr+'ab '+cr+'12 '); + test_cmd ('del 4,2', 4,2, ecDeleteWord, ' ', cr+'ab 12 ', 4,2); +(* xxxxxxxxxxxxxxx + test_undo('-del', cr+'ab '+cr+'12 ', 4,2); + test_caret('trim', 1,1, cr+'ab '+cr+'12 ', 1,1); + test_redo('+del', cr+'ab 12 ', 4,2); + test_undo('-del(2)', cr+'ab '+cr+'12 ', 4,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12 ', 1,1); +*) + + (* *) + test_start('del-word past eol', cr+'ab '+cr+'12'); + test_cmd ('del 6,2', 6,2, ecDeleteWord, ' ', cr+'ab 12', 6,2); + test_undo('-del', cr+'ab '+cr+'12', 6,2); + test_caret('trim', 1,1, cr+'ab '+cr+'12', 1,1); + test_caret('-trim', 6,2, cr+'ab '+cr+'12', 6,2); + test_redo('+del(2)', cr+'ab 12', 6,2); + test_undo('-del(2)', cr+'ab '+cr+'12', 6,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12', 1,1); + test_redo('+del(3)', cr+'ab 12', 6,2); // redo with mis-place caret + +end; + +procedure TTestTrimSpace.TrimUndoRedoEc; +begin + FUseEc := True; + TrimUndoRedo; +end; + +procedure TTestTrimSpace.NoTrimUndoRedo; +begin + SynEdit.Options := [eoAutoIndent, eoScrollPastEol]; // eoGroupUndo + + + { Insert LineBreaks } + (* *) + test_start('insert newline', cr+'ab 1234 '); + test_cmd ('insert 4,2', 4,2, ecLineBreak, ' ', cr+'ab '+cr+'1234 ', 1,3); + test_caret('trim', 1,1, cr+'ab '+cr+'1234 ', 1,1); + test_undo('-newline', cr+'ab 1234 ', 4,2); + test_caret('no trim', 1,1, cr+'ab 1234 ', 1,1); + + (* *) + test_start('insert newline+indent', cr+' ab '); + test_cmd ('insert 6,2', 6,2, ecLineBreak, ' ', cr+' ab '+cr+' ', 3,3); + test_cmd ('insert 3,3', 3,3, ecLineBreak, ' ', cr+' ab '+cr+' '+cr+' ', 3,4); + test_cmd ('insert 3,4', 3,4, ecLineBreak, ' ', cr+' ab '+cr+' '+cr+' '+cr+' ', 3,5); + test_caret('trim', 1,1, cr+' ab '+cr+' '+cr+' '+cr+' ', 1,1); + test_undo('-newlin 1', cr+' ab '+cr+' '+cr+' ', 3,4); + test_undo('-newlin 2', cr+' ab '+cr+' ', 3,3); + test_undo('-newlin 3', cr+' ab ', 6,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); + test_redo('redo 3', cr+' ab '+cr+' ', 3,3); + test_redo('redo 2', cr+' ab '+cr+' '+cr+' ', 3,4); + test_redo('redo 1', cr+' ab '+cr+' '+cr+' '+cr+' ', 3,5); + test_undo('-newlin 1(r)', cr+' ab '+cr+' '+cr+' ', 3,4); + test_undo('-newlin 2(r)', cr+' ab '+cr+' ', 3,3); + test_undo('-newlin 3(r)', cr+' ab ', 6,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); + +(* + (* *) + test_start('insert newline+indent before space', cr+' ab '); + test_cmd ('insert 5,2', 5,2, ecLineBreak, ' ', cr+' ab'+cr+' ', 3,3); + test_cmd ('insert 3,3', 3,3, ecLineBreak, ' ', cr+' ab'+cr+''+cr+' ', 3,4); + test_cmd ('insert 3,4', 3,4, ecLineBreak, ' ', cr+' ab'+cr+''+cr+''+cr+' ', 3,5); + test_caret('trim', 1,1, cr+' ab'+cr+''+cr+''+cr+'', 1,1); + test_undo('-trim', cr+' ab'+cr+''+cr+''+cr+' ', 4,5); // TODO caret at: 3,5); + test_undo('-newlin 1', cr+' ab'+cr+''+cr+' ', 3,4); + test_undo('-newlin 2', cr+' ab'+cr+' ', 3,3); + test_undo('-newlin 3', cr+' ab ', 5,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); + test_redo('redo 3', cr+' ab'+cr+' ', 3,3); + test_redo('redo 2', cr+' ab'+cr+''+cr+' ', 3,4); + test_redo('redo 1', cr+' ab'+cr+''+cr+''+cr+' ', 3,5); + test_undo('-newlin 1(r)', cr+' ab'+cr+''+cr+' ', 3,4); + test_undo('-newlin 2(r)', cr+' ab'+cr+' ', 3,3); + test_undo('-newlin 3(r)', cr+' ab ', 5,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); + + + (* *) + test_start('insert linebreak', cr+'ab 1234 '); + test_cmd ('insert 4,2', 4,2, ecInsertLine, ' ', cr+'ab '+cr+'1234', 4,2); + test_caret('trim', 1,1, cr+'ab'+cr+'1234', 1,1); + test_undo('-trim', cr+'ab '+cr+'1234', 4,2); + test_undo('-linebreak', cr+'ab 1234 ', 4,2); + test_caret('no trim', 1,1, cr+'ab 1234 ', 1,1); + + (* *) + test_start('insert linebreak+indent', cr+' ab '); + test_cmd ('insert1 6,2', 6,2, ecInsertLine, ' ', cr+' ab '+cr+'', 6,2); + test_cmd ('insert2 6,2', 6,2, ecInsertLine, ' ', cr+' ab '+cr+''+cr+'', 6,2); + test_caret('trim', 1,1, cr+' ab'+cr+''+cr+'', 1,1); + test_undo('-trim', cr+' ab '+cr+''+cr+'', 6,2); + test_undo('-linebreak 1', cr+' ab '+cr+'', 6,2); + test_undo('-linebreak 2', cr+' ab ', 6,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); +(* + test_redo('redo 2', cr+' ab '+cr+'', 6,2); + test_redo('redo 1', cr+' ab '+cr+''+cr+'', 6,2); + test_undo('-linebreak 1(r)', cr+' ab '+cr+'', 6,2); + test_undo('-linebreak 2(r)', cr+' ab ', 6,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); +*) + + (* *) + test_start('insert linebreak+indent before space', cr+' ab '); + test_cmd ('insert1 5,2', 5,2, ecInsertLine, ' ', cr+' ab'+cr+'', 5,2); + test_cmd ('insert2 5,2', 5,2, ecInsertLine, ' ', cr+' ab'+cr+''+cr+'', 5,2); + test_caret('no trim (0 spaces)', 1,1, cr+' ab'+cr+''+cr+'', 1,1); + test_undo('-linebreak 1', cr+' ab'+cr+'', 5,2); + test_undo('-linebreak 2', cr+' ab ', 5,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); +(* + test_redo('redo 2', cr+' ab'+cr+'', 5,2); + test_redo('redo 1', cr+' ab'+cr+''+cr+'', 5,2); + test_undo('-linebreak 1(r)', cr+' ab'+cr+'', 5,2); + test_undo('-linebreak 2(r)', cr+' ab ', 5,2); + test_caret('no trim', 1,1, cr+' ab ', 1,1); +*) +*) + + { Join Lines } + (* *) + test_start('del', cr+'ab '+cr+'12'); + test_cmd ('del 4,2', 4,2, ecDeleteChar, ' ', cr+'ab 12', 4,2); + test_undo('-del', cr+'ab '+cr+'12', 4,2); + test_caret('trim', 1,1, cr+'ab '+cr+'12', 1,1); + test_redo('+del', cr+'ab 12', 4,2); + test_undo('-del(2)', cr+'ab '+cr+'12', 4,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12', 1,1); + + (* *) + test_start('del (both sp)', cr+'ab '+cr+'12 '); + test_cmd ('del 4,2', 4,2, ecDeleteChar, ' ', cr+'ab 12 ', 4,2); + test_undo('-del', cr+'ab '+cr+'12 ', 4,2); + test_caret('trim', 1,1, cr+'ab '+cr+'12 ', 1,1); + test_redo('+del', cr+'ab 12 ', 4,2); + test_undo('-del(2)', cr+'ab '+cr+'12 ', 4,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12 ', 1,1); + + (* *) + test_start('del past eol', cr+'ab '+cr+'12'); + test_cmd ('del 6,2', 6,2, ecDeleteChar, ' ', cr+'ab 12', 6,2); + test_undo('-del', cr+'ab '+cr+'12', 6,2); + test_caret('trim', 1,1, cr+'ab '+cr+'12', 1,1); + test_caret('-trim', 6,2, cr+'ab '+cr+'12', 6,2); +(* + test_redo('+del(2)', cr+'ab 12', 6,2); + test_undo('-del(2)', cr+'ab '+cr+'12', 6,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12', 1,1); + test_redo('+del(3)', cr+'ab 12', 6,2); // redo with mis-place caret +*) + + (* *) + test_start('backspace', cr+'ab '+cr+'12'); + test_cmd ('bs 1,3', 1,3, ecDeleteLastChar, ' ', cr+'ab 12', 4,2); + test_undo('-bs', cr+'ab '+cr+'12', 1,3); + test_caret('trim', 1,1, cr+'ab '+cr+'12', 1,1); + test_redo('+bs', cr+'ab 12', 4,2); + test_undo('-bs(2)', cr+'ab '+cr+'12', 1,3); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12', 1,1); + + (* *) + test_start('del-word', cr+'ab '+cr+'12'); + test_cmd ('del 4,2', 4,2, ecDeleteWord, ' ', cr+'ab 12', 4,2); + test_undo('-del', cr+'ab '+cr+'12', 4,2); + test_caret('trim', 1,1, cr+'ab '+cr+'12', 1,1); + test_redo('+del', cr+'ab 12', 4,2); + test_undo('-del(2)', cr+'ab '+cr+'12', 4,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12', 1,1); + + (* *) + test_start('del-word (both sp)', cr+'ab '+cr+'12 '); + test_cmd ('del 4,2', 4,2, ecDeleteWord, ' ', cr+'ab 12 ', 4,2); + test_undo('-del', cr+'ab '+cr+'12 ', 4,2); + test_caret('trim', 1,1, cr+'ab '+cr+'12 ', 1,1); + test_redo('+del', cr+'ab 12 ', 4,2); + test_undo('-del(2)', cr+'ab '+cr+'12 ', 4,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12 ', 1,1); + + (* *) + test_start('del-word past eol', cr+'ab '+cr+'12'); + test_cmd ('del 6,2', 6,2, ecDeleteWord, ' ', cr+'ab 12', 6,2); + test_undo('-del', cr+'ab '+cr+'12', 6,2); + test_caret('trim', 1,1, cr+'ab '+cr+'12', 1,1); + test_caret('-trim', 6,2, cr+'ab '+cr+'12', 6,2); + test_redo('+del(2)', cr+'ab 12', 6,2); + test_undo('-del(2)', cr+'ab '+cr+'12', 6,2); + test_caret('trim(2)', 1,1, cr+'ab '+cr+'12', 1,1); + test_redo('+del(3)', cr+'ab 12', 6,2); // redo with mis-place caret + +end; + + + +initialization + + RegisterTest(TTestTrimSpace); +end. +