mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 00:49:31 +02:00
199 lines
5.7 KiB
ObjectPascal
199 lines
5.7 KiB
ObjectPascal
{$MODE OBJFPC}
|
|
{$M+}
|
|
{$Modeswitch advancedrecords}
|
|
|
|
program texrtti14;
|
|
|
|
uses typinfo, sysutils, uexrttiutil;
|
|
|
|
Type
|
|
{$RTTI EXPLICIT
|
|
PROPERTIES([vcPrivate,vcProtected,vcPublic,vcPublished])
|
|
FIELDS([vcPrivate,vcProtected,vcPublic,vcPublished])
|
|
METHODS([vcPrivate,vcProtected,vcPublic,vcPublished])}
|
|
|
|
{ TFieldRTTI }
|
|
|
|
// Use different names, so we can distinguish RTTI in asm file...
|
|
TRecordFieldRTTI = record
|
|
private
|
|
FRPrivateA: Integer;
|
|
FRPrivateB: Integer;
|
|
Property RPrivateA : Integer Read FRPrivateA Write FRPrivateA;
|
|
Property RPrivateB : Integer Read FRPrivateB Write FRPrivateB;
|
|
Public
|
|
FRPublicA: Integer;
|
|
FRPublicB: Integer;
|
|
Property RPublicA : Integer Read FRPublicA Write FRPublicA;
|
|
Property RPublicB : Integer Read FRPublicA Write FRPublicB;
|
|
|
|
end;
|
|
|
|
TRecordFieldRTTIMixed = record
|
|
private
|
|
FRPrivateA: Integer;
|
|
FRPrivateB: Integer;
|
|
Property RPrivateA : Integer Read FRPrivateA Write FRPrivateA;
|
|
Property RPrivateB : Integer Read FRPrivateB Write FRPrivateB;
|
|
Public
|
|
FRPublicA: Integer;
|
|
FRPublicB: Integer;
|
|
Property RPublicA : Integer Read FRPublicA Write FRPublicA;
|
|
Property RPublicB : Integer Read FRPublicA Write FRPublicB;
|
|
Procedure DoA;
|
|
end;
|
|
// Use different names, so we can distinguish RTTI in asm file...
|
|
|
|
{ TRecordMethodRTTI }
|
|
|
|
TRecordMethodRTTI = record
|
|
a,b,c : Integer;
|
|
private
|
|
Procedure PrivateMethodA;
|
|
Procedure PrivateMethodB;
|
|
Public
|
|
Procedure PublicMethodA;
|
|
Procedure PublicMethodB;
|
|
end;
|
|
|
|
{ TRecordMethodRTTI }
|
|
|
|
procedure TRecordMethodRTTI.PrivateMethodA;
|
|
begin
|
|
//
|
|
end;
|
|
|
|
procedure TRecordMethodRTTI.PrivateMethodB;
|
|
begin
|
|
//
|
|
end;
|
|
|
|
procedure TRecordMethodRTTI.PublicMethodA;
|
|
begin
|
|
//
|
|
end;
|
|
|
|
procedure TRecordMethodRTTI.PublicMethodB;
|
|
begin
|
|
//
|
|
end;
|
|
|
|
Procedure TRecordFieldRTTIMixed.DoA;
|
|
|
|
begin
|
|
//
|
|
end;
|
|
|
|
|
|
Procedure TestRecordProperties;
|
|
|
|
Var
|
|
A : PPropListEx;
|
|
aCount : Integer;
|
|
|
|
begin
|
|
aCount:=GetPropListEx(TypeInfo(TRecordFieldRTTI),A);
|
|
try
|
|
AssertEquals('Record property Count',4,aCount);
|
|
CheckProperty(0, A^[0]^,'RPrivateA',tkInteger,vcPrivate);
|
|
CheckProperty(1, A^[1]^,'RPrivateB',tkInteger,vcPrivate);
|
|
CheckProperty(2, A^[2]^,'RPublicA',tkInteger,vcPublic);
|
|
CheckProperty(3, A^[3]^,'RPublicB',tkInteger,vcPublic);
|
|
finally
|
|
Freemem(A);
|
|
end;
|
|
aCount:=GetPropListEx(TypeInfo(TRecordFieldRTTIMixed),A);
|
|
try
|
|
AssertEquals('Record mixed property Count',4,aCount);
|
|
CheckProperty(0, A^[0]^,'RPrivateA',tkInteger,vcPrivate);
|
|
CheckProperty(1, A^[1]^,'RPrivateB',tkInteger,vcPrivate);
|
|
CheckProperty(2, A^[2]^,'RPublicA',tkInteger,vcPublic);
|
|
CheckProperty(3, A^[3]^,'RPublicB',tkInteger,vcPublic);
|
|
finally
|
|
Freemem(A);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
Procedure TestRecordFields;
|
|
|
|
Var
|
|
A : PExtendedFieldInfoTable;
|
|
aCount : Integer;
|
|
|
|
begin
|
|
aCount:=GetFieldList(TypeInfo(TRecordFieldRTTI),A);
|
|
AssertEquals('Record fields Count',4,aCount);
|
|
CheckField(0, A^[0],'FRPrivateA',tkInteger,vcPrivate);
|
|
CheckField(1, A^[1],'FRPrivateB',tkInteger,vcPrivate);
|
|
CheckField(4, A^[2],'FRPublicA',tkInteger,vcPublic);
|
|
CheckField(5, A^[3],'FRPublicB',tkInteger,vcPublic);
|
|
FreeMem(A); A:=Nil;
|
|
aCount:=GetFieldList(TypeInfo(TRecordFieldRTTI),A,[vcPrivate]);
|
|
AssertEquals('Private Record fields Count',2,aCount);
|
|
CheckField(0, A^[0],'FRPrivateA',tkInteger,vcPrivate);
|
|
CheckField(1, A^[1],'FRPrivateB',tkInteger,vcPrivate);
|
|
FreeMem(A); A:=Nil;
|
|
aCount:=GetFieldList(TypeInfo(TRecordFieldRTTI),A,[vcProtected]);
|
|
AssertEquals('Protected record fields Count',0,aCount);
|
|
A:=Nil;
|
|
aCount:=GetFieldList(TypeInfo(TRecordFieldRTTI),A,[vcPublic]);
|
|
AssertEquals('Public record fields Count',2,aCount);
|
|
CheckField(0, A^[0],'FRPublicA',tkInteger,vcPublic);
|
|
CheckField(1, A^[1],'FRPublicB',tkInteger,vcPublic);
|
|
FreeMem(A); A:=Nil;
|
|
aCount:=GetFieldList(TypeInfo(TRecordFieldRTTI),A,[vcPublished]);
|
|
AssertEquals('Published record fields count Count',0,aCount);
|
|
A:=Nil;
|
|
aCount:=GetFieldList(TypeInfo(TRecordFieldRTTIMixed),A);
|
|
AssertEquals('Mixed record fields Count',4,aCount);
|
|
CheckField(0, A^[0],'FRPrivateA',tkInteger,vcPrivate);
|
|
CheckField(1, A^[1],'FRPrivateB',tkInteger,vcPrivate);
|
|
CheckField(4, A^[2],'FRPublicA',tkInteger,vcPublic);
|
|
CheckField(5, A^[3],'FRPublicB',tkInteger,vcPublic);
|
|
FreeMem(A); A:=Nil;
|
|
end;
|
|
|
|
procedure TestRecordMethods;
|
|
|
|
Var
|
|
A : PRecordMethodInfoTable;
|
|
aCount : Integer;
|
|
|
|
begin
|
|
aCount:=GetMethodList(PTypeInfo(TypeInfo(TRecordMethodRTTI)),A,True,[]);
|
|
AssertEquals('Method Full Count',4,aCount);
|
|
CheckMethod('Full',0, A^[0],'PrivateMethodA',vcPrivate);
|
|
CheckMethod('Full',1, A^[1],'PrivateMethodB',vcPrivate);
|
|
CheckMethod('Full',2, A^[2],'PublicMethodA',vcPublic);
|
|
CheckMethod('Full',3, A^[3],'PublicMethodB',vcPublic);
|
|
FreeMem(A);
|
|
aCount:=GetMethodList(PTypeInfo(TypeInfo(TRecordMethodRTTI)),A,False,[vcPrivate]);
|
|
AssertEquals('Method Private Count',2,aCount);
|
|
CheckMethod('Priv',0, A^[0],'PrivateMethodA',vcPrivate);
|
|
CheckMethod('Priv',1, A^[1],'PrivateMethodB',vcPrivate);
|
|
FreeMem(A);
|
|
aCount:=GetMethodList(PTypeInfo(TypeInfo(TRecordMethodRTTI)),A,False,[vcProtected]);
|
|
AssertEquals('Method Protected Count',0,aCount);
|
|
if A<>Nil then
|
|
FreeMem(A);
|
|
aCount:=GetMethodList(PTypeInfo(TypeInfo(TRecordMethodRTTI)),A,False,[vcPublic]);
|
|
AssertEquals('Method Public Count',2,aCount);
|
|
CheckMethod('Publ',0, A^[0],'PublicMethodA',vcPublic);
|
|
CheckMethod('Publ',1, A^[1],'PublicMethodB',vcPublic);
|
|
FreeMem(A);
|
|
aCount:=GetMethodList(PTypeInfo(TypeInfo(TRecordMethodRTTI)),A,False,[vcPublished]);
|
|
AssertEquals('Method Published Count',0,aCount);
|
|
if A<>Nil then
|
|
FreeMem(A);
|
|
end;
|
|
|
|
|
|
begin
|
|
TestRecordFields;
|
|
// TestRecordProperties;
|
|
TestRecordMethods;
|
|
end.
|
|
|