Browse Source

fcl-passrc: parser: generic record

git-svn-id: trunk@36220 -
Mattias Gaertner 8 years ago
parent
commit
e38a0fa118
1 changed files with 30 additions and 79 deletions
  1. 30 79
      packages/fcl-passrc/tests/tcgenerics.pp

+ 30 - 79
packages/fcl-passrc/tests/tcgenerics.pp

@@ -5,7 +5,7 @@ unit tcgenerics;
 interface
 interface
 
 
 uses
 uses
-  Classes, SysUtils, fpcunit, pastree, testregistry, pscanner, pparser, tctypeparser;
+  Classes, SysUtils, fpcunit, pastree, testregistry, tctypeparser;
 
 
 Type
 Type
 
 
@@ -14,106 +14,57 @@ Type
   TTestGenerics = Class(TBaseTestTypeParser)
   TTestGenerics = Class(TBaseTestTypeParser)
   Published
   Published
     Procedure TestObjectGenerics;
     Procedure TestObjectGenerics;
+    Procedure TestRecordGenerics;
+    Procedure TestArrayGenerics;
     Procedure TestSpecializationDelphi;
     Procedure TestSpecializationDelphi;
-    Procedure TestDeclarationDelphi;
-    Procedure TestDeclarationDelphiSpecialize;
-    Procedure TestMethodImplementation;
-    Procedure TestInlineSpecializationInProcedure;
+    Procedure TestSpecializeNested;
   end;
   end;
 
 
 implementation
 implementation
 
 
 procedure TTestGenerics.TestObjectGenerics;
 procedure TTestGenerics.TestObjectGenerics;
 begin
 begin
-  Source.Add('Type');
-  Source.Add('Generic TSomeClass<T> = Object');
-  Source.Add('  b : T;');
-  Source.Add('end;');
+  Add([
+    'Type',
+    'Generic TSomeClass<T> = Object',
+    '  b : T;',
+    'end;',
+    '']);
   ParseDeclarations;
   ParseDeclarations;
 end;
 end;
 
 
-procedure TTestGenerics.TestSpecializationDelphi;
-begin
-  ParseType('TFPGList<integer>',TPasClassType,'');
-end;
-
-procedure TTestGenerics.TestDeclarationDelphi;
-Var
-  T : TPasClassType;
+procedure TTestGenerics.TestRecordGenerics;
 begin
 begin
-  Scanner.CurrentModeSwitches:=[msDelphi]+Scanner.CurrentModeSwitches ;
-  Source.Add('Type');
-  Source.Add('  TSomeClass<T,T2> = Class(TObject)');
-  Source.Add('  b : T;');
-  Source.Add('  b2 : T2;');
-  Source.Add('end;');
+  Add([
+    'Type',
+    '  Generic TSome<T> = Record',
+    '    b : T;',
+    '  end;',
+    '']);
   ParseDeclarations;
   ParseDeclarations;
-  AssertNotNull('have generic definition',Declarations.Classes);
-  AssertEquals('have generic definition',1,Declarations.Classes.Count);
-  AssertEquals('Pascal class',TPasClassType,TObject(Declarations.Classes[0]).ClassType);
-  T:=TPasClassType(Declarations.Classes[0]);
-  AssertNotNull('have generic templates',T.GenericTemplateTypes);
-  AssertEquals('2 template types',2,T.GenericTemplateTypes.Count);
-  AssertSame('Parent 0 is class',T,TPasElement(T.GenericTemplateTypes[0]).Parent);
-  AssertSame('Parent 1 is class',T,TPasElement(T.GenericTemplateTypes[1]).Parent);
 end;
 end;
 
 
-procedure TTestGenerics.TestDeclarationDelphiSpecialize;
-Var
-  T : TPasClassType;
+procedure TTestGenerics.TestArrayGenerics;
 begin
 begin
-  Scanner.CurrentModeSwitches:=[msDelphi]+Scanner.CurrentModeSwitches ;
-  Source.Add('Type');
-  Source.Add('  TSomeClass<T,T2> = Class(TSomeGeneric<Integer,Integer>)');
-  Source.Add('  b : T;');
-  Source.Add('  b2 : T2;');
-  Source.Add('end;');
+  Add([
+    'Type',
+    '  Generic TSome<T> = array of T;',
+    '']);
   ParseDeclarations;
   ParseDeclarations;
-  AssertNotNull('have generic definition',Declarations.Classes);
-  AssertEquals('have generic definition',1,Declarations.Classes.Count);
-  AssertEquals('Pascal class',TPasClassType,TObject(Declarations.Classes[0]).ClassType);
-  T:=TPasClassType(Declarations.Classes[0]);
-  AssertEquals('Name is correct','TSomeClass',T.Name);
-  AssertNotNull('have generic templates',T.GenericTemplateTypes);
-  AssertEquals('2 template types',2,T.GenericTemplateTypes.Count);
-  AssertSame('Parent 0 is class',T,TPasElement(T.GenericTemplateTypes[0]).Parent);
-  AssertSame('Parent 1 is class',T,TPasElement(T.GenericTemplateTypes[1]).Parent);
-
 end;
 end;
 
 
-procedure TTestGenerics.TestMethodImplementation;
+procedure TTestGenerics.TestSpecializationDelphi;
 begin
 begin
-  With source do
-    begin
-    Add('unit afile;');
-    Add('{$MODE DELPHI}');
-    Add('interface');
-    Add('type');
-    Add('  TTest<T> =  object');
-    Add('    procedure foo(v:T);');
-    Add('  end;');
-    Add('implementation');
-    Add('procedure TTest<T>.foo;');
-    Add('begin');
-    Add('end;');
-    end;
-  ParseModule;
+  ParseType('TFPGList<integer>',TPasSpecializeType,'');
 end;
 end;
 
 
-procedure TTestGenerics.TestInlineSpecializationInProcedure;
+procedure TTestGenerics.TestSpecializeNested;
 begin
 begin
-  With source do
-    begin
-    Add('unit afile;');
-    Add('{$MODE DELPHI}');
-    Add('interface');
-    Add('type');
-    Add('  TFoo=class');
-    Add('    procedure foo(var Node:TSomeGeneric<TBoundingBox>;const index:Integer);');
-    Add('  end;');
-    Add('implementation');
-    end;
-  ParseModule;
+  Add([
+    'Type',
+    '  generic TSomeClass<A,B> = class(specialize TOther<A,specialize TAnother<B>>) end;',
+    '']);
+  ParseDeclarations;
 end;
 end;
 
 
 initialization
 initialization