testunicode.pp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. program testunicode;
  2. {$mode objfpc}{$H+}
  3. {$codepage utf8}
  4. {$IFNDEF UNIX}
  5. {$APPTYPE CONSOLE}
  6. {$ENDIF}
  7. uses
  8. sysutils, classes, registry;
  9. Var
  10. EditKey : UTF8String = 'ASCII;这是一个测试';
  11. labeledEditName : UTF8String = 'ASCII;പേര് ഇതാണ്ASCII;这是一个测试';
  12. labeledEditValue : UTF8String = 'これは値です;ASCII';
  13. labelkeycaption : string = 'HKCU\Software\zzz_test\';
  14. reg: TRegistry;
  15. Results : TStrings;
  16. function TestKey (const AKey: utf8string): boolean;
  17. begin
  18. Result:=false;
  19. try
  20. reg.CloseKey;
  21. if reg.KeyExists(AKey) then
  22. reg.DeleteKey(AKey);
  23. if reg.KeyExists(AKey) then
  24. begin
  25. Results.Add('TestKey-01 failed: DeleteKey(%s);',[AKey]);
  26. exit;
  27. end;
  28. if not reg.OpenKey(AKey,true) then
  29. begin
  30. Results.Add('TestKey-02 failed: OpenKey(%s,true)',[AKey]);
  31. exit;
  32. end;
  33. reg.CloseKey;
  34. if not reg.KeyExists(AKey) then
  35. begin
  36. Results.Add('TestKey-03 failed: OpenKey(%s,true)',[AKey]);
  37. exit;
  38. end;
  39. reg.DeleteKey(AKey);
  40. if not reg.CreateKey(AKey) then
  41. begin
  42. Results.Add('TestKey-04 failed: CreateKey(%s)',[AKey]);
  43. exit;
  44. end;
  45. if not reg.KeyExists(AKey) then
  46. begin
  47. Results.Add('TestKey-05 failed: CreateKey(%s,true)',[AKey]);
  48. exit;
  49. end;
  50. if not reg.OpenKeyReadOnly(AKey) then
  51. begin
  52. Results.Add('TestKey-06 failed: OpenKeyReadOnly(%s)',[AKey]);
  53. exit;
  54. end;
  55. reg.CloseKey;
  56. if not reg.OpenKey(AKey,false) then
  57. begin
  58. Results.Add('TestKey-07 failed: OpenKey(%s,false)',[AKey]);
  59. exit;
  60. end;
  61. Results.Add('TestKey passed: %s',[AKey]);
  62. except
  63. on e:Exception do
  64. Results.Add('TestKey-08 failed: %s; %s;',[AKey,e.Message]);
  65. end;
  66. Result:=true;
  67. end;
  68. procedure TestValue (const AName, AValue: utf8string);
  69. var
  70. wrong,s: string;
  71. begin
  72. try
  73. wrong:=AName+'_wrong';
  74. if reg.ValueExists(wrong) then
  75. reg.DeleteValue(wrong);
  76. if reg.ValueExists(wrong) then
  77. begin
  78. Results.Add('TestValue-01 failed: DeleteValue(%s)',[wrong]);
  79. exit;
  80. end;
  81. reg.WriteString(wrong,AValue);
  82. s:=reg.ReadString(wrong);
  83. if s<>AValue then
  84. begin
  85. Results.Add('TestValue-02 failed: WriteString(%s,%s)',[wrong,AValue]);
  86. exit;
  87. end;
  88. if reg.ValueExists(AName) then
  89. reg.DeleteValue(AName);
  90. if reg.ValueExists(AName) then
  91. begin
  92. Results.Add('TestValue-03 failed: DeleteValue(%s)',[AName]);
  93. exit;
  94. end;
  95. reg.RenameValue(wrong,AName);
  96. s:=reg.ReadString(AName);
  97. if s<>AValue then
  98. begin
  99. Results.Add('TestValue-04 failed: RenameValue(%s,%s)',[wrong,AName]);
  100. exit;
  101. end;
  102. Results.Add('TestValue passed: %s; %s;',[AName,AValue]);
  103. except
  104. on e:Exception do
  105. Results.Add('TestValue-08 failed: %s; %s; %s;',[AName,AValue,e.Message]);
  106. end;
  107. end;
  108. procedure TestGetKeyNames (const AKey, AExpected: utf8string);
  109. var
  110. sl: TStringList;
  111. begin
  112. sl:=TStringList.Create;
  113. sl.Delimiter:=';';
  114. reg.CloseKey;
  115. try
  116. if not reg.OpenKeyReadOnly(AKey) then
  117. begin
  118. Results.Add('TestGetKeyNames-01 failed: Key "%s";',[AKey]);
  119. exit;
  120. end;
  121. reg.GetKeyNames(sl);
  122. if sl.DelimitedText=AExpected then
  123. Results.Add('TestGetKeyNames passed: Key: "%s"; Expected: "%s";',[AKey,AExpected])
  124. else
  125. Results.Add('TestGetKeyNames-02 failed: Key: "%s"; got: "%s"; expected: "%s";',
  126. [AKey,sl.DelimitedText,AExpected]);
  127. except
  128. on e:Exception do
  129. Results.Add('TestGetKeyNames-03 failed exception: Key: "%s"; Got: "%s"; Expected: "%s"; Exception: "%s";',
  130. [AKey,sl.DelimitedText,AExpected,e.Message]);
  131. end;
  132. sl.Free;
  133. end;
  134. procedure TestGetValueNames (const AKey, AExpected: UTF8string);
  135. var
  136. sl: TStringList;
  137. begin
  138. sl:=TStringList.Create;
  139. sl.Delimiter:=';';
  140. try
  141. reg.GetValueNames(sl);
  142. if sl.DelimitedText=AExpected then
  143. Results.Add('TestGetValueNames passed: Key: "%s"; Expected "%s";',[AKey,AExpected])
  144. else
  145. Results.Add('TestGetValueNames-01 failed: Key "%s"; Got: "%s"; Expected: "%s";',
  146. [AKey,sl.DelimitedText,AExpected]);
  147. except
  148. on e:Exception do
  149. Results.Add('TestGetValueNames-02 failed exception: Key: "%s"; Got: "%s"; expected: "%s"; exception: "%s";',
  150. [AKey,sl.DelimitedText,AExpected,e.Message]);
  151. end;
  152. sl.Free;
  153. end;
  154. procedure Test;
  155. var
  156. sKey: string;
  157. slKeys,
  158. slNames,
  159. slValues: TStringList;
  160. sValueNames,
  161. s: string;
  162. k,n,v: integer;
  163. l: longint;
  164. begin
  165. sKey:=LabelKeyCaption;
  166. l:=pos('\',LabelKeyCaption);
  167. if l>0 then
  168. delete(sKey,1,l);
  169. if sKey[Length(sKey)]='\' then
  170. SetLength(sKey,Length(sKey)-1);
  171. slKeys:=TStringList.Create;
  172. slKeys.Delimiter:=';';
  173. slKeys.DelimitedText:=EditKey;
  174. slNames:=TStringList.Create;
  175. slNames.Delimiter:=';';
  176. slNames.DelimitedText:=LabeledEditName;
  177. slValues:=TStringList.Create;
  178. slValues.Delimiter:=';';
  179. slValues.DelimitedText:=LabeledEditValue;
  180. for k:=0 to slKeys.Count-1 do
  181. if TestKey(sKey+'\'+slKeys[k]) then
  182. begin
  183. sValueNames:='';
  184. for n:=0 to slNames.Count-1 do
  185. for v:=0 to slValues.Count-1 do
  186. begin
  187. s:=Format('%d%d%d_%s',[k,n,v,slNames[n]]);
  188. if sValueNames='' then
  189. sValueNames:=s
  190. else
  191. sValueNames:=sValueNames+slNames.Delimiter+s;
  192. TestValue(s,slValues[v]);
  193. end;
  194. TestGetValueNames(reg.CurrentPath,sValueNames);
  195. end;
  196. TestGetKeyNames(sKey,slKeys.DelimitedText);
  197. reg.CloseKey;
  198. slKeys.Free;
  199. slNames.Free;
  200. slValues.Free;
  201. end;
  202. Procedure WN;
  203. Var
  204. F : Text;
  205. begin
  206. Assign(F,'names.txt');
  207. Rewrite(F);
  208. Writeln(F,EditKey);
  209. Writeln(F,labeledEditName);
  210. Writeln(F,LabeledEditValue);
  211. Writeln(F,LabelKeyCaption);
  212. Close(F);
  213. end;
  214. begin
  215. defaultsystemcodepage:=CP_UTF8;
  216. if (ParamStr(1)='-s') then
  217. WN;
  218. reg:=TRegistry.Create;
  219. reg.lazywrite:=false;
  220. Results:=TStringList.Create;
  221. Test;
  222. Reg.Free;
  223. if (ParamStr(1)='-s') then
  224. Results.SaveToFile('result.txt');
  225. Writeln(Results.Text);
  226. Results.Free;
  227. {$IFDEF WINDOWS}Readln;{$ENDIF}
  228. end.