tcgenerics.pp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. unit tcgenerics;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, pastree, testregistry, pscanner, pparser, tctypeparser;
  6. Type
  7. { TTestGenerics }
  8. TTestGenerics = Class(TBaseTestTypeParser)
  9. Published
  10. Procedure TestObjectGenerics;
  11. Procedure TestSpecializationDelphi;
  12. Procedure TestDeclarationDelphi;
  13. Procedure TestDeclarationDelphiSpecialize;
  14. Procedure TestMethodImplementation;
  15. Procedure TestInlineSpecializationInProcedure;
  16. end;
  17. implementation
  18. procedure TTestGenerics.TestObjectGenerics;
  19. begin
  20. Source.Add('Type');
  21. Source.Add('Generic TSomeClass<T> = Object');
  22. Source.Add(' b : T;');
  23. Source.Add('end;');
  24. ParseDeclarations;
  25. end;
  26. procedure TTestGenerics.TestSpecializationDelphi;
  27. begin
  28. ParseType('TFPGList<integer>',TPasClassType,'');
  29. end;
  30. procedure TTestGenerics.TestDeclarationDelphi;
  31. Var
  32. T : TPasClassType;
  33. begin
  34. Scanner.CurrentModeSwitches:=[msDelphi]+Scanner.CurrentModeSwitches ;
  35. Source.Add('Type');
  36. Source.Add(' TSomeClass<T,T2> = Class(TObject)');
  37. Source.Add(' b : T;');
  38. Source.Add(' b2 : T2;');
  39. Source.Add('end;');
  40. ParseDeclarations;
  41. AssertNotNull('have generic definition',Declarations.Classes);
  42. AssertEquals('have generic definition',1,Declarations.Classes.Count);
  43. AssertEquals('Pascal class',TPasClassType,TObject(Declarations.Classes[0]).ClassType);
  44. T:=TPasClassType(Declarations.Classes[0]);
  45. AssertNotNull('have generic templates',T.GenericTemplateTypes);
  46. AssertEquals('2 template types',2,T.GenericTemplateTypes.Count);
  47. AssertSame('Parent 0 is class',T,TPasElement(T.GenericTemplateTypes[0]).Parent);
  48. AssertSame('Parent 1 is class',T,TPasElement(T.GenericTemplateTypes[1]).Parent);
  49. end;
  50. procedure TTestGenerics.TestDeclarationDelphiSpecialize;
  51. Var
  52. T : TPasClassType;
  53. begin
  54. Scanner.CurrentModeSwitches:=[msDelphi]+Scanner.CurrentModeSwitches ;
  55. Source.Add('Type');
  56. Source.Add(' TSomeClass<T,T2> = Class(TSomeGeneric<Integer,Integer>)');
  57. Source.Add(' b : T;');
  58. Source.Add(' b2 : T2;');
  59. Source.Add('end;');
  60. ParseDeclarations;
  61. AssertNotNull('have generic definition',Declarations.Classes);
  62. AssertEquals('have generic definition',1,Declarations.Classes.Count);
  63. AssertEquals('Pascal class',TPasClassType,TObject(Declarations.Classes[0]).ClassType);
  64. T:=TPasClassType(Declarations.Classes[0]);
  65. AssertEquals('Name is correct','TSomeClass',T.Name);
  66. AssertNotNull('have generic templates',T.GenericTemplateTypes);
  67. AssertEquals('2 template types',2,T.GenericTemplateTypes.Count);
  68. AssertSame('Parent 0 is class',T,TPasElement(T.GenericTemplateTypes[0]).Parent);
  69. AssertSame('Parent 1 is class',T,TPasElement(T.GenericTemplateTypes[1]).Parent);
  70. end;
  71. procedure TTestGenerics.TestMethodImplementation;
  72. begin
  73. With source do
  74. begin
  75. Add('unit afile;');
  76. Add('{$MODE DELPHI}');
  77. Add('interface');
  78. Add('type');
  79. Add(' TTest<T> = object');
  80. Add(' procedure foo(v:T);');
  81. Add(' end;');
  82. Add('implementation');
  83. Add('procedure TTest<T>.foo;');
  84. Add('begin');
  85. Add('end;');
  86. end;
  87. ParseModule;
  88. end;
  89. procedure TTestGenerics.TestInlineSpecializationInProcedure;
  90. begin
  91. With source do
  92. begin
  93. Add('unit afile;');
  94. Add('{$MODE DELPHI}');
  95. Add('interface');
  96. Add('type');
  97. Add(' TFoo=class');
  98. Add(' procedure foo(var Node:TSomeGeneric<TBoundingBox>;const index:Integer);');
  99. Add(' end;');
  100. Add('implementation');
  101. end;
  102. ParseModule;
  103. end;
  104. initialization
  105. RegisterTest(TTestGenerics);
  106. end.