Kaynağa Gözat

pastojs: test invalid mode and modeswitch

git-svn-id: trunk@36172 -
Mattias Gaertner 8 yıl önce
ebeveyn
işleme
65d14ace38

+ 4 - 2
packages/pastojs/src/fppas2js.pp

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

+ 64 - 25
packages/pastojs/tests/tcmodules.pas

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