testunicode2.pas 6.3 KB

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