mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-06 16:50:25 +02:00
pastojs: test invalid mode and modeswitch
git-svn-id: trunk@36172 -
This commit is contained in:
parent
2e80006c6d
commit
65d14ace38
@ -247,10 +247,12 @@ Works:
|
|||||||
- dotted unit names, namespaces
|
- dotted unit names, namespaces
|
||||||
|
|
||||||
ToDos:
|
ToDos:
|
||||||
- $modeswitch -> define/undefine <modeswitch>
|
|
||||||
- scanner: bark on unknown modeswitch
|
- scanner: bark on unknown modeswitch
|
||||||
- scanner: bark on disabling fixed modeswitch
|
- scanner: bark on disabling fixed modeswitch
|
||||||
- $ifopt, $if option
|
- scanner: bark on unknown mode
|
||||||
|
- $hint
|
||||||
|
- $note
|
||||||
|
- $warn
|
||||||
|
|
||||||
- constant evaluation
|
- constant evaluation
|
||||||
- integer ranges
|
- integer ranges
|
||||||
|
@ -123,6 +123,8 @@ type
|
|||||||
procedure CheckSource(Msg,Statements: String; InitStatements: string = '';
|
procedure CheckSource(Msg,Statements: String; InitStatements: string = '';
|
||||||
ImplStatements: string = ''); virtual;
|
ImplStatements: string = ''); virtual;
|
||||||
procedure CheckDiff(Msg, Expected, Actual: string); virtual;
|
procedure CheckDiff(Msg, Expected, Actual: string); virtual;
|
||||||
|
procedure SetExpectedScannerError(Msg: string; MsgNumber: integer);
|
||||||
|
procedure SetExpectedParserError(Msg: string; MsgNumber: integer);
|
||||||
procedure SetExpectedPasResolverError(Msg: string; MsgNumber: integer);
|
procedure SetExpectedPasResolverError(Msg: string; MsgNumber: integer);
|
||||||
procedure SetExpectedConverterError(Msg: string; MsgNumber: integer);
|
procedure SetExpectedConverterError(Msg: string; MsgNumber: integer);
|
||||||
function IsErrorExpected(E: Exception): boolean;
|
function IsErrorExpected(E: Exception): boolean;
|
||||||
@ -173,6 +175,8 @@ type
|
|||||||
Procedure TestEmptyUnitUseStrict;
|
Procedure TestEmptyUnitUseStrict;
|
||||||
Procedure TestDottedUnitNames;
|
Procedure TestDottedUnitNames;
|
||||||
Procedure TestDottedUnitExpr;
|
Procedure TestDottedUnitExpr;
|
||||||
|
Procedure Test_ModeFPCFail;
|
||||||
|
Procedure Test_ModeSwitchCBlocksFail;
|
||||||
|
|
||||||
// vars/const
|
// vars/const
|
||||||
Procedure TestVarInt;
|
Procedure TestVarInt;
|
||||||
@ -643,7 +647,7 @@ begin
|
|||||||
CurEngine.Resolver.AddStream(CurEngine.FileName,TStringStream.Create(CurEngine.Source));
|
CurEngine.Resolver.AddStream(CurEngine.FileName,TStringStream.Create(CurEngine.Source));
|
||||||
CurEngine.Scanner:=TPascalScanner.Create(CurEngine.Resolver);
|
CurEngine.Scanner:=TPascalScanner.Create(CurEngine.Resolver);
|
||||||
CurEngine.Parser:=TTestPasParser.Create(CurEngine.Scanner,CurEngine.Resolver,CurEngine);
|
CurEngine.Parser:=TTestPasParser.Create(CurEngine.Scanner,CurEngine.Resolver,CurEngine);
|
||||||
CurEngine.Parser.Options:=CurEngine.Parser.Options+po_pas2js;
|
CurEngine.Parser.Options:=CurEngine.Parser.Options+po_pas2js+[po_KeepScannerError];
|
||||||
if CompareText(CurUnitName,'System')=0 then
|
if CompareText(CurUnitName,'System')=0 then
|
||||||
CurEngine.Parser.ImplicitUses.Clear;
|
CurEngine.Parser.ImplicitUses.Clear;
|
||||||
CurEngine.Scanner.OpenFile(CurEngine.Filename);
|
CurEngine.Scanner.OpenFile(CurEngine.Filename);
|
||||||
@ -651,10 +655,6 @@ begin
|
|||||||
CurEngine.Parser.NextToken;
|
CurEngine.Parser.NextToken;
|
||||||
CurEngine.Parser.ParseUnit(CurEngine.FModule);
|
CurEngine.Parser.ParseUnit(CurEngine.FModule);
|
||||||
except
|
except
|
||||||
on E: EParserError do
|
|
||||||
HandleParserError(E);
|
|
||||||
on E: EPasResolve do
|
|
||||||
HandlePasResolveError(E);
|
|
||||||
on E: Exception do
|
on E: Exception do
|
||||||
HandleException(E);
|
HandleException(E);
|
||||||
end;
|
end;
|
||||||
@ -681,7 +681,7 @@ begin
|
|||||||
FScanner.CurrentModeSwitches:=OBJFPCModeSwitches*msAllPas2jsModeSwitches+msAllPas2jsModeSwitchesReadOnly;
|
FScanner.CurrentModeSwitches:=OBJFPCModeSwitches*msAllPas2jsModeSwitches+msAllPas2jsModeSwitchesReadOnly;
|
||||||
FEngine:=AddModule(Filename);
|
FEngine:=AddModule(Filename);
|
||||||
FParser:=TTestPasParser.Create(FScanner,FFileResolver,FEngine);
|
FParser:=TTestPasParser.Create(FScanner,FFileResolver,FEngine);
|
||||||
Parser.Options:=Parser.Options+po_pas2js;
|
Parser.Options:=Parser.Options+po_pas2js+[po_KeepScannerError];
|
||||||
FModule:=Nil;
|
FModule:=Nil;
|
||||||
FConverter:=TPasToJSConverter.Create;
|
FConverter:=TPasToJSConverter.Create;
|
||||||
FConverter.Options:=co_tcmodules;
|
FConverter.Options:=co_tcmodules;
|
||||||
@ -754,12 +754,6 @@ begin
|
|||||||
StartParsing;
|
StartParsing;
|
||||||
Parser.ParseMain(FModule);
|
Parser.ParseMain(FModule);
|
||||||
except
|
except
|
||||||
on E: EParserError do
|
|
||||||
HandleParserError(E);
|
|
||||||
on E: EPasResolve do
|
|
||||||
HandlePasResolveError(E);
|
|
||||||
on E: EPas2JS do
|
|
||||||
HandlePas2JSError(E);
|
|
||||||
on E: Exception do
|
on E: Exception do
|
||||||
HandleException(E);
|
HandleException(E);
|
||||||
end;
|
end;
|
||||||
@ -943,14 +937,6 @@ begin
|
|||||||
try
|
try
|
||||||
FJSModule:=FConverter.ConvertPasElement(Module,Engine) as TJSSourceElements;
|
FJSModule:=FConverter.ConvertPasElement(Module,Engine) as TJSSourceElements;
|
||||||
except
|
except
|
||||||
on E: EScannerError do
|
|
||||||
HandleScannerError(E);
|
|
||||||
on E: EParserError do
|
|
||||||
HandleParserError(E);
|
|
||||||
on E: EPasResolve do
|
|
||||||
HandlePasResolveError(E);
|
|
||||||
on E: EPas2JS do
|
|
||||||
HandlePas2JSError(E);
|
|
||||||
on E: Exception do
|
on E: Exception do
|
||||||
HandleException(E);
|
HandleException(E);
|
||||||
end;
|
end;
|
||||||
@ -1221,6 +1207,22 @@ begin
|
|||||||
until false;
|
until false;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCustomTestModule.SetExpectedScannerError(Msg: string;
|
||||||
|
MsgNumber: integer);
|
||||||
|
begin
|
||||||
|
ExpectedErrorClass:=EScannerError;
|
||||||
|
ExpectedErrorMsg:=Msg;
|
||||||
|
ExpectedErrorNumber:=MsgNumber;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCustomTestModule.SetExpectedParserError(Msg: string;
|
||||||
|
MsgNumber: integer);
|
||||||
|
begin
|
||||||
|
ExpectedErrorClass:=EParserError;
|
||||||
|
ExpectedErrorMsg:=Msg;
|
||||||
|
ExpectedErrorNumber:=MsgNumber;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCustomTestModule.SetExpectedPasResolverError(Msg: string;
|
procedure TCustomTestModule.SetExpectedPasResolverError(Msg: string;
|
||||||
MsgNumber: integer);
|
MsgNumber: integer);
|
||||||
begin
|
begin
|
||||||
@ -1247,6 +1249,10 @@ begin
|
|||||||
MsgNumber:=EPas2JS(E).MsgNumber
|
MsgNumber:=EPas2JS(E).MsgNumber
|
||||||
else if E is EPasResolve then
|
else if E is EPasResolve then
|
||||||
MsgNumber:=EPasResolve(E).MsgNumber
|
MsgNumber:=EPasResolve(E).MsgNumber
|
||||||
|
else if E is EParserError then
|
||||||
|
MsgNumber:=Parser.LastMsgNumber
|
||||||
|
else if E is EScannerError then
|
||||||
|
MsgNumber:=Scanner.LastMsgNumber
|
||||||
else
|
else
|
||||||
MsgNumber:=0;
|
MsgNumber:=0;
|
||||||
Result:=(MsgNumber=ExpectedErrorNumber) and (E.Message=ExpectedErrorMsg);
|
Result:=(MsgNumber=ExpectedErrorNumber) and (E.Message=ExpectedErrorMsg);
|
||||||
@ -1302,13 +1308,24 @@ end;
|
|||||||
|
|
||||||
procedure TCustomTestModule.HandleException(E: Exception);
|
procedure TCustomTestModule.HandleException(E: Exception);
|
||||||
begin
|
begin
|
||||||
if IsErrorExpected(E) then exit;
|
if E is EScannerError then
|
||||||
if not (E is EAssertionFailedError) then
|
HandleScannerError(EScannerError(E))
|
||||||
|
else if E is EParserError then
|
||||||
|
HandleParserError(EParserError(E))
|
||||||
|
else if E is EPasResolve then
|
||||||
|
HandlePasResolveError(EPasResolve(E))
|
||||||
|
else if E is EPas2JS then
|
||||||
|
HandlePas2JSError(EPas2JS(E))
|
||||||
|
else
|
||||||
begin
|
begin
|
||||||
WriteSources('',0,0);
|
if IsErrorExpected(E) then exit;
|
||||||
writeln('ERROR: TCustomTestModule.HandleException '+E.ClassName+':'+E.Message);
|
if not (E is EAssertionFailedError) then
|
||||||
|
begin
|
||||||
|
WriteSources('',0,0);
|
||||||
|
writeln('ERROR: TCustomTestModule.HandleException '+E.ClassName+':'+E.Message);
|
||||||
|
end;
|
||||||
|
RaiseException(E);
|
||||||
end;
|
end;
|
||||||
RaiseException(E);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomTestModule.RaiseException(E: Exception);
|
procedure TCustomTestModule.RaiseException(E: Exception);
|
||||||
@ -1321,6 +1338,10 @@ begin
|
|||||||
MsgNumber:=EPas2JS(E).MsgNumber
|
MsgNumber:=EPas2JS(E).MsgNumber
|
||||||
else if E is EPasResolve then
|
else if E is EPasResolve then
|
||||||
MsgNumber:=EPasResolve(E).MsgNumber
|
MsgNumber:=EPasResolve(E).MsgNumber
|
||||||
|
else if E is EParserError then
|
||||||
|
MsgNumber:=Parser.LastMsgNumber
|
||||||
|
else if E is EScannerError then
|
||||||
|
MsgNumber:=Scanner.LastMsgNumber
|
||||||
else
|
else
|
||||||
MsgNumber:=0;
|
MsgNumber:=0;
|
||||||
AssertEquals('Expected error message ('+IntToStr(ExpectedErrorNumber)+')','{'+ExpectedErrorMsg+'}','{'+E.Message+'}');
|
AssertEquals('Expected error message ('+IntToStr(ExpectedErrorNumber)+')','{'+ExpectedErrorMsg+'}','{'+E.Message+'}');
|
||||||
@ -1481,6 +1502,24 @@ begin
|
|||||||
'']) );
|
'']) );
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestModule.Test_ModeFPCFail;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add('{$mode FPC}');
|
||||||
|
Add('begin');
|
||||||
|
SetExpectedScannerError('Invalid mode: "FPC"',nErrInvalidMode);
|
||||||
|
ConvertProgram;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TTestModule.Test_ModeSwitchCBlocksFail;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add('{$modeswitch cblocks-}');
|
||||||
|
Add('begin');
|
||||||
|
SetExpectedScannerError('Invalid mode switch: "cblocks-"',nErrInvalidModeSwitch);
|
||||||
|
ConvertProgram;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestModule.TestVarInt;
|
procedure TTestModule.TestVarInt;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
|
Loading…
Reference in New Issue
Block a user