mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-10 11:42:44 +02:00
228 lines
7.0 KiB
ObjectPascal
228 lines
7.0 KiB
ObjectPascal
unit TestException;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, fpcunit, testutils, testregistry, TestGDBMIControl,
|
|
TestBase, GDBMIDebugger, LCLProc, DbgIntfDebuggerBase;
|
|
|
|
type
|
|
|
|
{ TTestExceptionOne }
|
|
|
|
TTestExceptionOne = class(TGDBTestCase)
|
|
private
|
|
FGotExceptCount: Integer;
|
|
FGotExceptClass: String;
|
|
FGotExceptMsg: String;
|
|
FGotExceptType: TDBGExceptionType;
|
|
|
|
procedure DoDebuggerException(Sender: TObject;
|
|
const AExceptionType: TDBGExceptionType;
|
|
const AExceptionClass: String;
|
|
const AExceptionLocation: TDBGLocationRec;
|
|
const AExceptionText: String;
|
|
out AContinue: Boolean);
|
|
published
|
|
procedure TestException;
|
|
end;
|
|
|
|
|
|
|
|
|
|
implementation
|
|
|
|
//dbg.OnBreakPointHit := @DebuggerBreakPointHit;
|
|
//dbg.OnState := @DebuggerChangeState;
|
|
//dbg.OnCurrent := @DebuggerCurrentLine;
|
|
//dbg.OnDbgOutput := @DebuggerOutput;
|
|
//dbg.OnDbgEvent := @DebuggerEvent;
|
|
|
|
procedure TTestExceptionOne.DoDebuggerException(Sender: TObject;
|
|
const AExceptionType: TDBGExceptionType; const AExceptionClass: String;
|
|
const AExceptionLocation: TDBGLocationRec; const AExceptionText: String;
|
|
out AContinue: Boolean);
|
|
begin
|
|
inc(FGotExceptCount);
|
|
FGotExceptClass := AExceptionClass;
|
|
FGotExceptMsg := AExceptionText;
|
|
FGotExceptType := AExceptionType;
|
|
AContinue := False;
|
|
end;
|
|
|
|
procedure TTestExceptionOne.TestException;
|
|
var
|
|
TestExeName, TstName: string;
|
|
dbg: TGDBMIDebugger;
|
|
begin
|
|
if SkipTest then exit;
|
|
if not TestControlForm.CheckListBox1.Checked[TestControlForm.CheckListBox1.Items.IndexOf('TTestExceptionOne')] then exit;
|
|
ClearTestErrors;
|
|
|
|
TestCompile(AppDir + 'ExceptPrg.pas', TestExeName, '', '-gt -gh');
|
|
try
|
|
FGotExceptCount := 0; TstName := 'all';
|
|
dbg := StartGDB(AppDir, TestExeName);
|
|
dbg.OnException := @DoDebuggerException;
|
|
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got 1 exception', 1, FGotExceptCount);
|
|
TestEquals(TstName+' Got class', 'Exception', FGotExceptClass);
|
|
TestEquals(TstName+' Got msg', 'foo', FGotExceptMsg, 060000);
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got 2nd exception', 2, FGotExceptCount);
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got no more exception', 2, FGotExceptCount);
|
|
TestEquals(TstName+' Got class', 'MyESome', FGotExceptClass);
|
|
// not yet MakePrintable
|
|
//TestEquals(TstName+' Got msg', 'abc üü {[''''[{ \n\t''#13#9''#', FGotExceptMsg, 050300);
|
|
TestEquals(TstName+' Got msg', 'abc üü {[''[{ \n\t'#13#9'#', FGotExceptMsg, 050300);
|
|
dbg.Stop;
|
|
finally
|
|
dbg.Done;
|
|
CleanGdb;
|
|
dbg.Free;
|
|
end;
|
|
|
|
TestCompile(AppDir + 'ExceptPrg.pas', TestExeName, 'no_etype',
|
|
'-dTEST_NO_EXCEPTION_TYPE -gt -gh');
|
|
try
|
|
FGotExceptCount := 0; TstName := 'no_exp_type';
|
|
dbg := StartGDB(AppDir, TestExeName);
|
|
dbg.OnException := @DoDebuggerException;
|
|
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got 1 exception', 1, FGotExceptCount);
|
|
TestEquals(TstName+' Got class', 'Exception', FGotExceptClass);
|
|
TestEquals(TstName+' Got msg', 'foo', FGotExceptMsg, 050300);
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got no more exception', 1, FGotExceptCount);
|
|
dbg.Stop;
|
|
finally
|
|
dbg.Done;
|
|
CleanGdb;
|
|
dbg.Free;
|
|
end;
|
|
|
|
TestCompile(AppDir + 'ExceptPrg.pas', TestExeName, 'no_etype_ptr',
|
|
'-dTEST_NO_EXCEPTION_TYPE -dTEST_NO_POINTER_VAR -gt -gh');
|
|
try
|
|
FGotExceptCount := 0; TstName := 'no_exp_type_ptr';
|
|
dbg := StartGDB(AppDir, TestExeName);
|
|
dbg.OnException := @DoDebuggerException;
|
|
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got 1 exception', 1, FGotExceptCount);
|
|
TestEquals(TstName+' Got class', 'Exception', FGotExceptClass);
|
|
TestEquals(TstName+' Got msg', 'foo', FGotExceptMsg, 050300);
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got no more exception', 1, FGotExceptCount);
|
|
dbg.Stop;
|
|
finally
|
|
dbg.Done;
|
|
CleanGdb;
|
|
dbg.Free;
|
|
end;
|
|
|
|
TestCompile(AppDir + 'ExceptPrg.pas', TestExeName, 'no_etype_str',
|
|
'-dTEST_NO_EXCEPTION_TYPE -dTEST_NO_STRING_VAR -gt -gh');
|
|
try
|
|
FGotExceptCount := 0; TstName := 'no_exp_type_str';
|
|
dbg := StartGDB(AppDir, TestExeName);
|
|
dbg.OnException := @DoDebuggerException;
|
|
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got 1 exception', 1, FGotExceptCount);
|
|
TestEquals(TstName+' Got class', 'Exception', FGotExceptClass);
|
|
TestEquals(TstName+' Got msg', 'foo', FGotExceptMsg, 050300);
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got no more exception', 1, FGotExceptCount);
|
|
dbg.Stop;
|
|
finally
|
|
dbg.Done;
|
|
CleanGdb;
|
|
dbg.Free;
|
|
end;
|
|
|
|
TestCompile(AppDir + 'ExceptPrg.pas', TestExeName, 'no_etype_ptr_str',
|
|
'-dTEST_NO_EXCEPTION_TYPE -dTEST_NO_POINTER_VAR -gt -gh');
|
|
try
|
|
FGotExceptCount := 0; TstName := 'no_exp_type_ptr_str';
|
|
dbg := StartGDB(AppDir, TestExeName);
|
|
dbg.OnException := @DoDebuggerException;
|
|
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got 1 exception', 1, FGotExceptCount);
|
|
TestEquals(TstName+' Got class', 'Exception', FGotExceptClass);
|
|
TestEquals(TstName+' Got msg', 'foo', FGotExceptMsg, 050300);
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got no more exception', 1, FGotExceptCount);
|
|
dbg.Stop;
|
|
finally
|
|
dbg.Done;
|
|
CleanGdb;
|
|
dbg.Free;
|
|
end;
|
|
|
|
TestCompile(AppDir + 'ExceptPrg.pas', TestExeName, 'no_etype_ptr_str_var',
|
|
'-dTEST_NO_EXCEPTION_TYPE -dTEST_NO_POINTER_VAR -dTEST_NO_EXCEPTION_VAR -gt -gh');
|
|
try
|
|
FGotExceptCount := 0; TstName := 'no_exp_type_ptr_str_var';
|
|
dbg := StartGDB(AppDir, TestExeName);
|
|
dbg.OnException := @DoDebuggerException;
|
|
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got 1 exception', 1, FGotExceptCount);
|
|
TestEquals(TstName+' Got class', 'Exception', FGotExceptClass);
|
|
TestEquals(TstName+' Got msg', 'foo', FGotExceptMsg, 050300);
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got no more exception', 1, FGotExceptCount);
|
|
dbg.Stop;
|
|
finally
|
|
dbg.Done;
|
|
CleanGdb;
|
|
dbg.Free;
|
|
end;
|
|
|
|
|
|
|
|
TestCompile(AppDir + 'ExceptPrg.pas', TestExeName, 'with_hplus', '-dTEST_WITH_HPLUS -gt -gh');
|
|
try
|
|
FGotExceptCount := 0; TstName := 'with_hplus';
|
|
dbg := StartGDB(AppDir, TestExeName);
|
|
dbg.OnException := @DoDebuggerException;
|
|
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got 1 exception', 1, FGotExceptCount);
|
|
TestEquals(TstName+' Got class', 'Exception', FGotExceptClass);
|
|
TestEquals(TstName+' Got msg', 'foo', FGotExceptMsg, 050300);
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got 2nd exception', 2, FGotExceptCount);
|
|
dbg.Run;
|
|
TestEquals(TstName+' Got no more exception', 2, FGotExceptCount);
|
|
TestEquals(TstName+' Got class', 'MyESome', FGotExceptClass);
|
|
//TestEquals(TstName+' Got msg', 'abc üü {[''''[{ \n\t''#13#9''#', FGotExceptMsg, 050300);
|
|
TestEquals(TstName+' Got msg', 'abc üü {[''[{ \n\t'#13#9'#', FGotExceptMsg, 050300);
|
|
|
|
dbg.Stop;
|
|
finally
|
|
dbg.Done;
|
|
CleanGdb;
|
|
dbg.Free;
|
|
end;
|
|
|
|
|
|
|
|
AssertTestErrors;
|
|
end;
|
|
|
|
initialization
|
|
RegisterDbgTest(TTestExceptionOne);
|
|
RegisterTestSelectors(['TTestExceptionOne'
|
|
]);
|
|
|
|
end.
|
|
|