testbasics.pp 5.5 KB

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