gencomptest.dpr 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. program gencomptest;
  2. {$APPTYPE CONSOLE}
  3. uses
  4. SysUtils,
  5. classes,
  6. typinfo,
  7. tcstreaming in 'tcstreaming.pas',
  8. testcomps in 'testcomps.pas';
  9. Var
  10. Indent : String;
  11. Src,
  12. Procs : TStrings;
  13. Procedure AddLn(S : String); overload;
  14. begin
  15. Src.Add(Indent+S);
  16. end;
  17. Procedure AddLn(Fmt : String; Args : Array of Const); overload;
  18. begin
  19. AddLn(Format(Fmt,Args));
  20. end;
  21. Function CreateString(S : String) : string;
  22. begin
  23. Result:=StringReplace(S,'''','''''',[rfReplaceAll]);
  24. Result:=''''+Result+'''';
  25. end;
  26. Function ValName(V : TValueType) : String;
  27. begin
  28. Result:=GetEnumName(TypeInfo(TValueType),Ord(v));
  29. end;
  30. Function AddExpectValue(V : TValueType) : String;
  31. begin
  32. AddLn('ExpectValue(%s);',[ValName(V)]);
  33. end;
  34. // This is a reworked version of ObjectBinaryToText.
  35. // Instead of a text stream, it outputs testsuite code.
  36. // Note it will only work on i386/AMD64 platforms.
  37. Procedure AnalyzeStream(Input : TStream);
  38. var
  39. NestingLevel: Integer;
  40. SaveSeparator: Char;
  41. Reader: TReader;
  42. ObjectName, PropName: string;
  43. procedure ConvertValue; forward;
  44. procedure ConvertHeader;
  45. var
  46. ClassName: string;
  47. Flags: TFilerFlags;
  48. F : TFilerFlag;
  49. Position: Integer;
  50. S : String;
  51. begin
  52. Position:=0;
  53. Reader.ReadPrefix(Flags, Position);
  54. S:='';
  55. For F:=Low(TFilerFlag) to High(TFilerFlag) do
  56. if F in Flags then
  57. begin
  58. If (S<>'') then
  59. S:=S+',';
  60. S:=S+GetEnumName(TypeInfo(TFilerFlag),Ord(F));
  61. end;
  62. Addln('ExpectFlags([%s],%d);',[S,Position]);
  63. ClassName := Reader.ReadStr;
  64. Addln('ExpectBareString(%s);',[CreateString(ClassName)]);
  65. ObjectName := Reader.ReadStr;
  66. Addln('ExpectBareString(%s);',[CreateString(ObjectName)]);
  67. end;
  68. procedure ConvertBinary;
  69. const
  70. BytesPerLine = 32;
  71. var
  72. I,j: Integer;
  73. Count: Longint;
  74. Buffer: array[0..BytesPerLine - 1] of Char;
  75. V : TValueTYpe;
  76. begin
  77. V:=Reader.ReadValue;
  78. AddExpectValue(V);
  79. Reader.Read(Count, SizeOf(Count));
  80. Addln('ExpectInteger(%d);',[Count]);
  81. while Count > 0 do
  82. begin
  83. if Count >= 32 then I := 32 else I := Count;
  84. Reader.Read(Buffer, I);
  85. For J:=0 to I-1 do
  86. Addln('ExpectByte(%d);',[Byte(Buffer[J])]);
  87. Dec(Count, I);
  88. end;
  89. end;
  90. procedure ConvertProperty; forward;
  91. procedure ConvertValue;
  92. var
  93. S: string;
  94. W: WideString;
  95. V : TValueType;
  96. begin
  97. V:=Reader.NextValue;
  98. case V of
  99. vaList:
  100. begin
  101. V:=Reader.ReadValue;
  102. AddExpectValue(V);
  103. Inc(NestingLevel);
  104. while not Reader.EndOfList do
  105. begin
  106. ConvertValue;
  107. end;
  108. Reader.ReadListEnd;
  109. Addln('ExpectListEnd');
  110. Dec(NestingLevel);
  111. end;
  112. vaInt8, vaInt16, vaInt32:
  113. begin
  114. Addln('ExpectInteger(%d);',[Reader.ReadInteger]);
  115. end;
  116. vaExtended:
  117. Addln('ExpectExtended(%f);',[Reader.ReadFloat]);
  118. vaSingle:
  119. Addln('ExpectSingle(%f);',[Reader.ReadSingle]);
  120. vaCurrency:
  121. Addln('ExpectCurrency(%f);',[Reader.ReadCurrency]);
  122. vaDate:
  123. Addln('ExpectDate(%f);',[Reader.ReadDate]);
  124. vaWString, vaUTF8String:
  125. begin
  126. W := Reader.ReadWideString;
  127. Addln('ExpectWideString(%s);',[CreateString(W)]);
  128. end;
  129. vaString, vaLString:
  130. begin
  131. S := Reader.ReadString;
  132. Addln('ExpectString(%s);',[CreateString(S)]);
  133. end;
  134. vaIdent, vaFalse, vaTrue, vaNil, vaNull:
  135. Addln('ExpectIdent(%s);',[CreateString(Reader.ReadIdent)]);
  136. vaBinary:
  137. ConvertBinary;
  138. vaSet:
  139. begin
  140. V:=Reader.ReadValue;
  141. AddExpectValue(V);
  142. while True do
  143. begin
  144. S := Reader.ReadStr;
  145. Addln('ExpectBareString(%s);',[CreateString(S)]);
  146. if S = '' then Break;
  147. end;
  148. end;
  149. vaCollection:
  150. begin
  151. V:=Reader.ReadValue;
  152. AddExpectValue(V);
  153. Inc(NestingLevel);
  154. while not Reader.EndOfList do
  155. begin
  156. V:=Reader.NextValue;
  157. if V in [vaInt8, vaInt16, vaInt32] then
  158. begin
  159. ConvertValue;
  160. end;
  161. Reader.CheckValue(vaList);
  162. AddExpectValue(vaList);
  163. Inc(NestingLevel);
  164. while not Reader.EndOfList do
  165. ConvertProperty;
  166. Reader.ReadListEnd;
  167. Addln('ExpectEndOfList;');
  168. Dec(NestingLevel);
  169. end;
  170. Reader.ReadListEnd;
  171. Addln('ExpectEndOfList;');
  172. Dec(NestingLevel);
  173. end;
  174. vaInt64:
  175. Addln('ExpectInt64(%d);',[Reader.ReadInt64]);
  176. else
  177. Raise Exception.Create('Invalid stream');
  178. end;
  179. end;
  180. procedure ConvertProperty;
  181. begin
  182. PropName := Reader.ReadStr; // save for error reporting
  183. Addln('ExpectBareString(%s);',[CreateString(PropName)]);
  184. ConvertValue;
  185. end;
  186. procedure ConvertObject;
  187. begin
  188. ConvertHeader;
  189. Inc(NestingLevel);
  190. while not Reader.EndOfList do ConvertProperty;
  191. Reader.ReadListEnd;
  192. Addln('ExpectEndOfList;');
  193. while not Reader.EndOfList do ConvertObject;
  194. Reader.ReadListEnd;
  195. Addln('ExpectEndOfList;');
  196. Dec(NestingLevel);
  197. end;
  198. begin
  199. NestingLevel := 0;
  200. Reader := TReader.Create(Input, 4096);
  201. SaveSeparator := DecimalSeparator;
  202. DecimalSeparator := '.';
  203. try
  204. Reader.ReadSignature;
  205. Addln('ExpectSignature;');
  206. ConvertObject;
  207. finally
  208. DecimalSeparator := SaveSeparator;
  209. Reader.Free;
  210. end;
  211. end;
  212. Procedure TestComponent(AClass : TComponentClass; AOwner : TComponent);
  213. Var
  214. S : TMemoryStream;
  215. C : TComponent;
  216. N,O : String;
  217. begin
  218. Addln('');
  219. Addln('');
  220. Addln('Procedure TTestComponentStream.Test%s;',[AClass.ClassName]);
  221. Addln('');
  222. Addln('Var');
  223. Addln(' C : TComponent;');
  224. Addln('');
  225. Addln('begin');
  226. Indent:=' ';
  227. N:=AClass.ClassName;
  228. Procs.Add('Test'+N);
  229. If (AOwner=Nil) then
  230. O:='Nil'
  231. else
  232. O:=AOwner.Name;
  233. AddLn('C:=%s.Create(%s);',[N,O]);
  234. Addln('Try');
  235. Indent:=' ';
  236. Addln('SaveToStream(C);');
  237. S:=TMemoryStream.Create;
  238. try
  239. C:=AClass.Create(AOwner);
  240. Try
  241. C.Name:='Test'+C.ClassName;
  242. S.WriteComponent(C);
  243. S.Position:=0;
  244. AnalyzeStream(S);
  245. With TFileStream.Create(AClass.ClassName+'.dat',fmCreate) do
  246. try
  247. CopyFrom(S,0);
  248. finally
  249. Free;
  250. end;
  251. Finally
  252. C.Free;
  253. end;
  254. finally
  255. S.Free;
  256. end;
  257. Indent:=' ';
  258. Addln('Finally');
  259. Indent:=' ';
  260. Addln('C.Free;');
  261. Addln('end;');
  262. Indent:='';
  263. Addln('end;');
  264. end;
  265. Procedure GenTests;
  266. begin
  267. TestComponent(TEmptyComponent,Nil);
  268. TestComponent(TIntegerComponent,Nil);
  269. TestComponent(TIntegerComponent2,Nil);
  270. TestComponent(TIntegerComponent3,Nil);
  271. TestComponent(TIntegerComponent4,Nil);
  272. TestComponent(TIntegerComponent5,Nil);
  273. TestComponent(TInt64Component,Nil);
  274. TestComponent(TInt64Component2,Nil);
  275. TestComponent(TInt64Component3,Nil);
  276. TestComponent(TInt64Component4,Nil);
  277. TestComponent(TInt64Component5,Nil);
  278. TestComponent(TInt64Component6,Nil);
  279. TestComponent(TStringComponent,Nil);
  280. TestComponent(TStringComponent2,Nil);
  281. TestComponent(TWideStringComponent,Nil);
  282. TestComponent(TWideStringComponent2,Nil);
  283. TestComponent(TSingleComponent,Nil);
  284. TestComponent(TDoubleComponent,Nil);
  285. TestComponent(TExtendedComponent,Nil);
  286. TestComponent(TCompComponent,Nil);
  287. TestComponent(TCurrencyComponent,Nil);
  288. TestComponent(TDateTimeComponent,Nil);
  289. TestComponent(TDateTimeComponent2,Nil);
  290. TestComponent(TDateTimeComponent3,Nil);
  291. TestComponent(TEnumComponent,Nil);
  292. TestComponent(TEnumComponent2,Nil);
  293. TestComponent(TEnumComponent3,Nil);
  294. TestComponent(TEnumComponent4,Nil);
  295. TestComponent(TSetComponent,Nil);
  296. TestComponent(TSetComponent2,Nil);
  297. TestComponent(TSetComponent3,Nil);
  298. TestComponent(TSetComponent4,Nil);
  299. TestComponent(TMultipleComponent,Nil);
  300. TestComponent(TPersistentComponent,Nil);
  301. TestComponent(TCollectionComponent,Nil);
  302. TestComponent(TCollectionComponent2,Nil);
  303. TestComponent(TCollectionComponent3,Nil);
  304. TestComponent(TCollectionComponent4,Nil);
  305. TestComponent(TOwnedComponent,Nil);
  306. TestComponent(TStreamedOwnedComponent,Nil);
  307. TestComponent(TMethodComponent,Nil);
  308. TestComponent(TMethodComponent2,Nil);
  309. end;
  310. Procedure GenUnit;
  311. Var
  312. I : Integer;
  313. F : Text;
  314. begin
  315. Assign(f,'tctestcompstreaming.pas');
  316. Rewrite(F);
  317. try
  318. Writeln(F,'Unit tctestcompstreaming;');
  319. Writeln(F);
  320. Writeln(F,'interface');
  321. Writeln(F);
  322. Writeln(F,'Uses');
  323. Writeln(F,' SysUtils,Classes,tcstreaming;');
  324. Writeln(F);
  325. Writeln(F,'Type ');
  326. Writeln(F,' TTestComponentStream = Class(TTestStreaming)');
  327. Writeln(F,' Published');
  328. For I:=0 to Procs.Count-1 do
  329. Writeln(F,' Procedure '+Procs[i]+';');
  330. Writeln(F,' end;');
  331. Writeln(F);
  332. Writeln(F,'Implementation');
  333. Writeln(F);
  334. Writeln(F,'uses testcomps;');
  335. For I:=0 to Src.Count-1 do
  336. Writeln(F,Src[i]);
  337. Writeln(F);
  338. Writeln(F,'end.');
  339. Finally
  340. Close(f);
  341. end;
  342. end;
  343. Procedure GenCode;
  344. begin
  345. Src:=TStringList.Create;
  346. try
  347. Procs:=TStringList.Create;
  348. try
  349. GenTests;
  350. GenUnit;
  351. finally
  352. Procs.Free;
  353. end;
  354. finally
  355. Src.Free;
  356. end;
  357. end;
  358. begin
  359. GenCode;
  360. end.