regtestbasics.pp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. unit RegTestBasics;
  2. {$IFDEF FPC}
  3. {$mode objfpc}{$H+}
  4. {$ENDIF}
  5. interface
  6. uses
  7. fpcunit, testutils, testregistry, testdecorator, Classes, SysUtils;
  8. type
  9. { TTestBasics }
  10. TTestBasics = class(TTestCase)
  11. private
  12. procedure DeleteUserXmlFile;
  13. protected
  14. published
  15. procedure TestSimpleWinRegistry;
  16. procedure TestDoubleWrite;
  17. procedure bug16395;
  18. procedure TestStringList;
  19. Procedure TestInt64;
  20. Procedure TestDeleteSubkey;
  21. end;
  22. implementation
  23. uses
  24. registry;
  25. { TTestBasics }
  26. procedure TTestBasics.DeleteUserXmlFile;
  27. {$ifndef windows}
  28. var
  29. fn: string;
  30. {$endif}
  31. begin
  32. {$ifdef windows}
  33. with TRegistry.Create do
  34. try
  35. DeleteKey('FirstNode');
  36. finally
  37. Free;
  38. end;
  39. {$else}
  40. FN:=includetrailingpathdelimiter(GetAppConfigDir(False))+'reg.xml';
  41. if FileExists(FN) then
  42. AssertTrue(DeleteFile(FN));
  43. {$endif}
  44. end;
  45. procedure TTestBasics.TestSimpleWinRegistry;
  46. var
  47. Registry : TRegistry;
  48. begin
  49. Registry := TRegistry.Create(KEY_READ);
  50. Registry.RootKey:=HKEY_LOCAL_MACHINE;
  51. // use a hopefully non existing key
  52. AssertFalse(Registry.KeyExists('FPC1234'));
  53. {$ifdef windows}
  54. AssertTrue(Registry.KeyExists('SOFTWARE'));
  55. {$endif}
  56. Registry.Free;
  57. end;
  58. procedure TTestBasics.TestDoubleWrite;
  59. begin
  60. DeleteUserXmlFile;
  61. with TRegistry.Create do
  62. try
  63. OpenKey('FirstNode', true);
  64. WriteString('LAYOUT', '');
  65. CloseKey;
  66. finally
  67. Free;
  68. end;
  69. with TRegistry.Create do
  70. try
  71. OpenKey('FirstNode', true);
  72. WriteString('LAYOUT', '');
  73. CloseKey;
  74. finally
  75. Free;
  76. end;
  77. DeleteUserXmlFile;
  78. end;
  79. procedure TTestBasics.bug16395;
  80. var
  81. r: TRegistry;
  82. s,t: string;
  83. begin
  84. DeleteUserXmlFile;
  85. r := TRegistry.Create;
  86. try
  87. r.RootKey := HKEY_CURRENT_USER;
  88. r.OpenKey('FirstNode', true);
  89. r.WriteString('string1', '');
  90. r.CloseKey;
  91. finally
  92. r.Free;
  93. end;
  94. // verify that empty value can be changed to non-empty one
  95. r := TRegistry.Create;
  96. try
  97. r.RootKey := HKEY_CURRENT_USER;
  98. r.OpenKey('FirstNode',false);
  99. s := r.ReadString('string1');
  100. AssertEquals('Failed to read back an empty string', '', s);
  101. r.WriteString('string1', 'string_value_1');
  102. r.CloseKey;
  103. finally
  104. r.Free;
  105. end;
  106. // verify that non-empty value can be changed to empty one
  107. r := TRegistry.Create;
  108. try
  109. r.RootKey := HKEY_CURRENT_USER;
  110. r.OpenKey('FirstNode',false);
  111. s := r.ReadString('string1');
  112. AssertEquals('Failed chaning empty string value to non-empty one', 'string_value_1',s);
  113. r.WriteString('string1', '');
  114. r.CloseKey;
  115. finally
  116. r.Free;
  117. end;
  118. r := TRegistry.Create;
  119. try
  120. r.RootKey := HKEY_CURRENT_USER;
  121. r.OpenKey('FirstNode',false);
  122. s := r.ReadString('string1');
  123. AssertEquals('Failed changing non-empty string value to empty one', '', s);
  124. r.CloseKey;
  125. finally
  126. r.Free;
  127. end;
  128. r := TRegistry.Create;
  129. try
  130. r.RootKey := HKEY_CURRENT_USER;
  131. r.OpenKey('LongNode',true);
  132. t:=StringOfChar('*',4000);
  133. r.WriteString('LongString',T);
  134. s := r.ReadString('LongString');
  135. AssertEquals('Writing long string works OK', t, s);
  136. r.CloseKey;
  137. finally
  138. r.Free;
  139. end;
  140. DeleteUserXmlFile;
  141. end;
  142. Procedure TTestBasics.TestStringList;
  143. Var
  144. SL : TStringList;
  145. I : Integer;
  146. begin
  147. With TRegistry.Create do
  148. try
  149. RootKey:=HKEY_CURRENT_USER;
  150. OpenKey('Software/Test',True);
  151. SL:=TstringList.Create;
  152. For I:=0 to 10 do
  153. SL.Add(IntToStr(I));
  154. WriteStringList('me',SL);
  155. SL.Clear;
  156. ReadStringList('me',SL);
  157. For I:=0 to 10 do
  158. AssertEquals('String '+IntToStr(i),IntToStr(I),SL[I]);
  159. finally
  160. Free;
  161. end;
  162. end;
  163. procedure TTestBasics.TestInt64;
  164. Var
  165. Def,I64 : Int64;
  166. begin
  167. def:=MaxInt*1024;
  168. With TRegistry.Create do
  169. try
  170. RootKey:=HKEY_CURRENT_USER;
  171. OpenKey('Software/Test',True);
  172. WriteInt64('you',Def);
  173. I64:=ReadInt64('you');
  174. AssertEquals('Value written and read',Def,I64);
  175. finally
  176. Free;
  177. end;
  178. end;
  179. procedure TTestBasics.TestDeleteSubKey;
  180. const
  181. BugID = 'Bug35132';
  182. Base = 'Software\' + BugID;
  183. One = 'One';
  184. OneFull = Base + '\' + One;
  185. Two = 'Two';
  186. TwoFull = OneFull + '\' + Two;
  187. procedure CleanUp(AssertionFailed: Boolean);
  188. var
  189. R: TRegistry;
  190. B: Boolean;
  191. begin
  192. R := TRegistry.Create(KEY_ALL_ACCESS);
  193. try
  194. R.RootKey := HKEY_CURRENT_USER;
  195. if R.KeyExists(TwoFull) then
  196. begin
  197. B := R. DeleteKey(TwoFull);
  198. if B then B := R.DeleteKey(OneFull);
  199. if B then B := R.DeleteKey(Base);
  200. AssertTrue('cleanup OK',B);
  201. end;
  202. finally
  203. R.Free;
  204. end;
  205. end;
  206. var
  207. R: TRegistry;
  208. B: Boolean;
  209. begin
  210. R := TRegistry.Create(KEY_ALL_ACCESS);
  211. try
  212. R.RootKey := HKEY_CURRENT_USER;
  213. B := R.OpenKey(Base, True);
  214. AssertTrue(format('OpenKey(''%s'') failed.',[Base]),B);
  215. B := R.OpenKey('One',True);
  216. AssertTrue(format('OpenKey(''%s'') failed.',[OneFull]),B);
  217. B := R.OpenKey('Two',True);
  218. AssertTrue(format('OpenKey(''%s'') failed.',[TwoFull]),B);
  219. R.CloseKey;
  220. B := R.KeyExists(TwoFull);
  221. AssertTrue(format('KeyExists(''%s'') failed.',[TwoFull]),B);
  222. R.CloseKey;
  223. B := R.OpenKey(Base,False);
  224. AssertTrue(format('OpenKey(''%s'') failed.',[Base]),B);
  225. B := R.DeleteKey('One');
  226. AssertTrue(format('DeleteKey(''%s'') should have succeeded, but it failed.',[OneFull]),B);
  227. finally
  228. R.Free;
  229. CleanUp(ExceptObject <> nil);
  230. end;
  231. end;
  232. initialization
  233. RegisterTest(TTestBasics);
  234. end.