pastojs: test invalid mode and modeswitch

git-svn-id: trunk@36172 -
This commit is contained in:
Mattias Gaertner 2017-05-10 09:35:38 +00:00
parent 2e80006c6d
commit 65d14ace38
2 changed files with 68 additions and 27 deletions
packages/pastojs

View File

@ -247,10 +247,12 @@ Works:
- dotted unit names, namespaces
ToDos:
- $modeswitch -> define/undefine <modeswitch>
- scanner: bark on unknown modeswitch
- scanner: bark on disabling fixed modeswitch
- $ifopt, $if option
- scanner: bark on unknown mode
- $hint
- $note
- $warn
- constant evaluation
- integer ranges

View File

@ -123,6 +123,8 @@ type
procedure CheckSource(Msg,Statements: String; InitStatements: string = '';
ImplStatements: 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 SetExpectedConverterError(Msg: string; MsgNumber: integer);
function IsErrorExpected(E: Exception): boolean;
@ -173,6 +175,8 @@ type
Procedure TestEmptyUnitUseStrict;
Procedure TestDottedUnitNames;
Procedure TestDottedUnitExpr;
Procedure Test_ModeFPCFail;
Procedure Test_ModeSwitchCBlocksFail;
// vars/const
Procedure TestVarInt;
@ -643,7 +647,7 @@ begin
CurEngine.Resolver.AddStream(CurEngine.FileName,TStringStream.Create(CurEngine.Source));
CurEngine.Scanner:=TPascalScanner.Create(CurEngine.Resolver);
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
CurEngine.Parser.ImplicitUses.Clear;
CurEngine.Scanner.OpenFile(CurEngine.Filename);
@ -651,10 +655,6 @@ begin
CurEngine.Parser.NextToken;
CurEngine.Parser.ParseUnit(CurEngine.FModule);
except
on E: EParserError do
HandleParserError(E);
on E: EPasResolve do
HandlePasResolveError(E);
on E: Exception do
HandleException(E);
end;
@ -681,7 +681,7 @@ begin
FScanner.CurrentModeSwitches:=OBJFPCModeSwitches*msAllPas2jsModeSwitches+msAllPas2jsModeSwitchesReadOnly;
FEngine:=AddModule(Filename);
FParser:=TTestPasParser.Create(FScanner,FFileResolver,FEngine);
Parser.Options:=Parser.Options+po_pas2js;
Parser.Options:=Parser.Options+po_pas2js+[po_KeepScannerError];
FModule:=Nil;
FConverter:=TPasToJSConverter.Create;
FConverter.Options:=co_tcmodules;
@ -754,12 +754,6 @@ begin
StartParsing;
Parser.ParseMain(FModule);
except
on E: EParserError do
HandleParserError(E);
on E: EPasResolve do
HandlePasResolveError(E);
on E: EPas2JS do
HandlePas2JSError(E);
on E: Exception do
HandleException(E);
end;
@ -943,14 +937,6 @@ begin
try
FJSModule:=FConverter.ConvertPasElement(Module,Engine) as TJSSourceElements;
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
HandleException(E);
end;
@ -1221,6 +1207,22 @@ begin
until false;
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;
MsgNumber: integer);
begin
@ -1247,6 +1249,10 @@ begin
MsgNumber:=EPas2JS(E).MsgNumber
else if E is EPasResolve then
MsgNumber:=EPasResolve(E).MsgNumber
else if E is EParserError then
MsgNumber:=Parser.LastMsgNumber
else if E is EScannerError then
MsgNumber:=Scanner.LastMsgNumber
else
MsgNumber:=0;
Result:=(MsgNumber=ExpectedErrorNumber) and (E.Message=ExpectedErrorMsg);
@ -1302,13 +1308,24 @@ end;
procedure TCustomTestModule.HandleException(E: Exception);
begin
if IsErrorExpected(E) then exit;
if not (E is EAssertionFailedError) then
if E is EScannerError 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
WriteSources('',0,0);
writeln('ERROR: TCustomTestModule.HandleException '+E.ClassName+':'+E.Message);
if IsErrorExpected(E) then exit;
if not (E is EAssertionFailedError) then
begin
WriteSources('',0,0);
writeln('ERROR: TCustomTestModule.HandleException '+E.ClassName+':'+E.Message);
end;
RaiseException(E);
end;
RaiseException(E);
end;
procedure TCustomTestModule.RaiseException(E: Exception);
@ -1321,6 +1338,10 @@ begin
MsgNumber:=EPas2JS(E).MsgNumber
else if E is EPasResolve then
MsgNumber:=EPasResolve(E).MsgNumber
else if E is EParserError then
MsgNumber:=Parser.LastMsgNumber
else if E is EScannerError then
MsgNumber:=Scanner.LastMsgNumber
else
MsgNumber:=0;
AssertEquals('Expected error message ('+IntToStr(ExpectedErrorNumber)+')','{'+ExpectedErrorMsg+'}','{'+E.Message+'}');
@ -1481,6 +1502,24 @@ begin
'']) );
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;
begin
StartProgram(false);