| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 |
- program gencomptest;
- {$APPTYPE CONSOLE}
- uses
- SysUtils,
- classes,
- typinfo,
- tcstreaming in 'tcstreaming.pas',
- testcomps in 'testcomps.pas';
- Var
- Indent : String;
- Src,
- Procs : TStrings;
- Procedure AddLn(S : String); overload;
- begin
- Src.Add(Indent+S);
- end;
- Procedure AddLn(Fmt : String; Args : Array of Const); overload;
- begin
- AddLn(Format(Fmt,Args));
- end;
- Function CreateString(S : String) : string;
- begin
- Result:=StringReplace(S,'''','''''',[rfReplaceAll]);
- Result:=''''+Result+'''';
- end;
- Function ValName(V : TValueType) : String;
- begin
- Result:=GetEnumName(TypeInfo(TValueType),Ord(v));
- end;
- Function AddExpectValue(V : TValueType) : String;
- begin
- AddLn('ExpectValue(%s);',[ValName(V)]);
- end;
- // This is a reworked version of ObjectBinaryToText.
- // Instead of a text stream, it outputs testsuite code.
- // Note it will only work on i386/AMD64 platforms.
- Procedure AnalyzeStream(Input : TStream);
- var
- NestingLevel: Integer;
- SaveSeparator: Char;
- Reader: TReader;
- ObjectName, PropName: string;
- procedure ConvertValue; forward;
- procedure ConvertHeader;
- var
- ClassName: string;
- Flags: TFilerFlags;
- F : TFilerFlag;
- Position: Integer;
- S : String;
- begin
- Position:=0;
- Reader.ReadPrefix(Flags, Position);
- S:='';
- For F:=Low(TFilerFlag) to High(TFilerFlag) do
- if F in Flags then
- begin
- If (S<>'') then
- S:=S+',';
- S:=S+GetEnumName(TypeInfo(TFilerFlag),Ord(F));
- end;
- Addln('ExpectFlags([%s],%d);',[S,Position]);
- ClassName := Reader.ReadStr;
- Addln('ExpectBareString(%s);',[CreateString(ClassName)]);
- ObjectName := Reader.ReadStr;
- Addln('ExpectBareString(%s);',[CreateString(ObjectName)]);
- end;
- procedure ConvertBinary;
- const
- BytesPerLine = 32;
- var
- I,j: Integer;
- Count: Longint;
- Buffer: array[0..BytesPerLine - 1] of Char;
- V : TValueTYpe;
- begin
- V:=Reader.ReadValue;
- AddExpectValue(V);
- Reader.Read(Count, SizeOf(Count));
- Addln('ExpectInteger(%d);',[Count]);
- while Count > 0 do
- begin
- if Count >= 32 then I := 32 else I := Count;
- Reader.Read(Buffer, I);
- For J:=0 to I-1 do
- Addln('ExpectByte(%d);',[Byte(Buffer[J])]);
- Dec(Count, I);
- end;
- end;
- procedure ConvertProperty; forward;
- procedure ConvertValue;
- var
- S: string;
- W: WideString;
- V : TValueType;
- begin
- V:=Reader.NextValue;
- case V of
- vaList:
- begin
- V:=Reader.ReadValue;
- AddExpectValue(V);
- Inc(NestingLevel);
- while not Reader.EndOfList do
- begin
- ConvertValue;
- end;
- Reader.ReadListEnd;
- Addln('ExpectListEnd');
- Dec(NestingLevel);
- end;
- vaInt8, vaInt16, vaInt32:
- begin
- Addln('ExpectInteger(%d);',[Reader.ReadInteger]);
- end;
- vaExtended:
- Addln('ExpectExtended(%f);',[Reader.ReadFloat]);
- vaSingle:
- Addln('ExpectSingle(%f);',[Reader.ReadSingle]);
- vaCurrency:
- Addln('ExpectCurrency(%f);',[Reader.ReadCurrency]);
- vaDate:
- Addln('ExpectDate(%f);',[Reader.ReadDate]);
- vaWString, vaUTF8String:
- begin
- W := Reader.ReadWideString;
- Addln('ExpectWideString(%s);',[CreateString(W)]);
- end;
- vaString, vaLString:
- begin
- S := Reader.ReadString;
- Addln('ExpectString(%s);',[CreateString(S)]);
- end;
- vaIdent, vaFalse, vaTrue, vaNil, vaNull:
- Addln('ExpectIdent(%s);',[CreateString(Reader.ReadIdent)]);
- vaBinary:
- ConvertBinary;
- vaSet:
- begin
- V:=Reader.ReadValue;
- AddExpectValue(V);
- while True do
- begin
- S := Reader.ReadStr;
- Addln('ExpectBareString(%s);',[CreateString(S)]);
- if S = '' then Break;
- end;
- end;
- vaCollection:
- begin
- V:=Reader.ReadValue;
- AddExpectValue(V);
- Inc(NestingLevel);
- while not Reader.EndOfList do
- begin
- V:=Reader.NextValue;
- if V in [vaInt8, vaInt16, vaInt32] then
- begin
- ConvertValue;
- end;
- Reader.CheckValue(vaList);
- AddExpectValue(vaList);
- Inc(NestingLevel);
- while not Reader.EndOfList do
- ConvertProperty;
- Reader.ReadListEnd;
- Addln('ExpectEndOfList;');
- Dec(NestingLevel);
- end;
- Reader.ReadListEnd;
- Addln('ExpectEndOfList;');
- Dec(NestingLevel);
- end;
- vaInt64:
- Addln('ExpectInt64(%d);',[Reader.ReadInt64]);
- else
- Raise Exception.Create('Invalid stream');
- end;
- end;
- procedure ConvertProperty;
- begin
- PropName := Reader.ReadStr; // save for error reporting
- Addln('ExpectBareString(%s);',[CreateString(PropName)]);
- ConvertValue;
- end;
- procedure ConvertObject;
- begin
- ConvertHeader;
- Inc(NestingLevel);
- while not Reader.EndOfList do ConvertProperty;
- Reader.ReadListEnd;
- Addln('ExpectEndOfList;');
- while not Reader.EndOfList do ConvertObject;
- Reader.ReadListEnd;
- Addln('ExpectEndOfList;');
- Dec(NestingLevel);
- end;
- begin
- NestingLevel := 0;
- Reader := TReader.Create(Input, 4096);
- SaveSeparator := DecimalSeparator;
- DecimalSeparator := '.';
- try
- Reader.ReadSignature;
- Addln('ExpectSignature;');
- ConvertObject;
- finally
- DecimalSeparator := SaveSeparator;
- Reader.Free;
- end;
- end;
- Procedure TestComponent(AClass : TComponentClass; AOwner : TComponent);
- Var
- S : TMemoryStream;
- C : TComponent;
- N,O : String;
- begin
- Addln('');
- Addln('');
- Addln('Procedure TTestComponentStream.Test%s;',[AClass.ClassName]);
- Addln('');
- Addln('Var');
- Addln(' C : TComponent;');
- Addln('');
- Addln('begin');
- Indent:=' ';
- N:=AClass.ClassName;
- Procs.Add('Test'+N);
- If (AOwner=Nil) then
- O:='Nil'
- else
- O:=AOwner.Name;
- AddLn('C:=%s.Create(%s);',[N,O]);
- Addln('Try');
- Indent:=' ';
- Addln('SaveToStream(C);');
- S:=TMemoryStream.Create;
- try
- C:=AClass.Create(AOwner);
- Try
- C.Name:='Test'+C.ClassName;
- S.WriteComponent(C);
- S.Position:=0;
- AnalyzeStream(S);
- With TFileStream.Create(AClass.ClassName+'.dat',fmCreate) do
- try
- CopyFrom(S,0);
- finally
- Free;
- end;
- Finally
- C.Free;
- end;
- finally
- S.Free;
- end;
- Indent:=' ';
- Addln('Finally');
- Indent:=' ';
- Addln('C.Free;');
- Addln('end;');
- Indent:='';
- Addln('end;');
- end;
- Procedure GenTests;
- begin
- TestComponent(TEmptyComponent,Nil);
- TestComponent(TIntegerComponent,Nil);
- TestComponent(TIntegerComponent2,Nil);
- TestComponent(TIntegerComponent3,Nil);
- TestComponent(TIntegerComponent4,Nil);
- TestComponent(TIntegerComponent5,Nil);
- TestComponent(TInt64Component,Nil);
- TestComponent(TInt64Component2,Nil);
- TestComponent(TInt64Component3,Nil);
- TestComponent(TInt64Component4,Nil);
- TestComponent(TInt64Component5,Nil);
- TestComponent(TInt64Component6,Nil);
- TestComponent(TStringComponent,Nil);
- TestComponent(TStringComponent2,Nil);
- TestComponent(TWideStringComponent,Nil);
- TestComponent(TWideStringComponent2,Nil);
- TestComponent(TSingleComponent,Nil);
- TestComponent(TDoubleComponent,Nil);
- TestComponent(TExtendedComponent,Nil);
- TestComponent(TCompComponent,Nil);
- TestComponent(TCurrencyComponent,Nil);
- TestComponent(TDateTimeComponent,Nil);
- TestComponent(TDateTimeComponent2,Nil);
- TestComponent(TDateTimeComponent3,Nil);
- TestComponent(TEnumComponent,Nil);
- TestComponent(TEnumComponent2,Nil);
- TestComponent(TEnumComponent3,Nil);
- TestComponent(TEnumComponent4,Nil);
- TestComponent(TSetComponent,Nil);
- TestComponent(TSetComponent2,Nil);
- TestComponent(TSetComponent3,Nil);
- TestComponent(TSetComponent4,Nil);
- TestComponent(TMultipleComponent,Nil);
- TestComponent(TPersistentComponent,Nil);
- TestComponent(TCollectionComponent,Nil);
- TestComponent(TCollectionComponent2,Nil);
- TestComponent(TCollectionComponent3,Nil);
- TestComponent(TCollectionComponent4,Nil);
- TestComponent(TOwnedComponent,Nil);
- TestComponent(TStreamedOwnedComponent,Nil);
- TestComponent(TMethodComponent,Nil);
- TestComponent(TMethodComponent2,Nil);
- end;
- Procedure GenUnit;
- Var
- I : Integer;
- F : Text;
- begin
- Assign(f,'tctestcompstreaming.pas');
- Rewrite(F);
- try
- Writeln(F,'Unit tctestcompstreaming;');
- Writeln(F);
- Writeln(F,'interface');
- Writeln(F);
- Writeln(F,'Uses');
- Writeln(F,' SysUtils,Classes,tcstreaming;');
- Writeln(F);
- Writeln(F,'Type ');
- Writeln(F,' TTestComponentStream = Class(TTestStreaming)');
- Writeln(F,' Published');
- For I:=0 to Procs.Count-1 do
- Writeln(F,' Procedure '+Procs[i]+';');
- Writeln(F,' end;');
- Writeln(F);
- Writeln(F,'Implementation');
- Writeln(F);
- Writeln(F,'uses testcomps;');
- For I:=0 to Src.Count-1 do
- Writeln(F,Src[i]);
- Writeln(F);
- Writeln(F,'end.');
- Finally
- Close(f);
- end;
- end;
- Procedure GenCode;
- begin
- Src:=TStringList.Create;
- try
- Procs:=TStringList.Create;
- try
- GenTests;
- GenUnit;
- finally
- Procs.Free;
- end;
- finally
- Src.Free;
- end;
- end;
- begin
- GenCode;
- end.
|