program tclass13;

{$ifdef fpc}
  {$mode delphi}{$H+}
{$endif}
{$apptype console}
uses
  typinfo;
type
  TRootClass = class
  public
    type
      TNode = class
      private
        FTest: Integer;
        type
          TNode = class
            FNode: TRootClass.TNode.TNode;
          end;
          en = (e1,e2);
          TOtherNode = class
          public
            type
              TNestedInOtherNode = class
                ffield: longint;
              end;
          end;
          TFinalNode = class
            fx: TRootClass.TNode.TOtherNode.TNestedInOtherNode;
          end;
      published
        property Test: Integer read FTest write FTest;
      end;
    class procedure DoTest;
  end;

class procedure TRootClass.DoTest;
var
  Test: TNode;
  Test1: TNode.TNode;
begin
  Test := TNode.Create;
  Test.Test := 1;
  if Test.ClassName <> 'TRootClass.TNode' then
    halt(1);
  Test.Free;
  Test1 := TNode.TNode.Create;
  if Test1.ClassName <> 'TRootClass.TNode.TNode' then
    halt(2);
  Test1.FNode:=Test1;
  Test1.Free;
end;

begin
  TRootClass.DoTest;
  if GetEnumName(TypeInfo(TRootClass.TNode.en), ord(e1))<>'e1' then
    halt(3);
end.
