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

View File

@ -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

View File

@ -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);