jsonconftest.pp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. unit jsonconftest;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry, jsonconf;
  6. type
  7. { TTestJSONConfig }
  8. TTestJSONConfig= class(TTestCase)
  9. Private
  10. Function CreateConf(AFileName : String) : TJSONCOnfig;
  11. Procedure DeleteConf(C : TJSONConfig; DeleteConfFile : Boolean = true);
  12. published
  13. procedure TestDataTypes;
  14. procedure TestSubNodes;
  15. procedure TestEnumSubkeys;
  16. procedure TestEnumValues;
  17. procedure TestClear;
  18. procedure TestKey;
  19. end;
  20. implementation
  21. function TTestJSONConfig.CreateConf(AFileName: String): TJSONCOnfig;
  22. begin
  23. Result:=TJSONConfig.Create(Nil);
  24. Result.FileName:=AFileName;
  25. end;
  26. procedure TTestJSONConfig.DeleteConf(C: TJSONConfig; DeleteConfFile: Boolean);
  27. Var
  28. FN : String;
  29. begin
  30. If DeleteConfFile then
  31. FN:=C.FileName;
  32. FreeAndNil(C);
  33. If DeleteConfFile then
  34. DeleteFile(FN);
  35. end;
  36. procedure TTestJSONConfig.TestDataTypes;
  37. Const
  38. A = Integer(1);
  39. B = 'A string';
  40. C = 1.23;
  41. D = True;
  42. E = Int64($FFFFFFFFFFFFF);
  43. Var
  44. Co : TJSONCOnfig;
  45. begin
  46. Co:=CreateConf('test.json');
  47. try
  48. Co.SetValue('a',a);
  49. AssertEquals('Integer read/Write',a,Co.GetValue('a',0));
  50. Co.SetValue('b',b);
  51. AssertEquals('String read/Write',b,Co.GetValue('b',''));
  52. Co.SetValue('c',C);
  53. AssertEquals('Float read/Write',c,Co.GetValue('c',0.0),0.01);
  54. Co.SetValue('d',d);
  55. AssertEquals('Boolean read/Write',d,Co.GetValue('d',False));
  56. Co.SetValue('e',E);
  57. AssertEquals('Int64 read/Write',e,Co.GetValue('e',Int64(0)));
  58. Co.Flush;
  59. finally
  60. DeleteConf(Co,True);
  61. end;
  62. end;
  63. procedure TTestJSONConfig.TestSubNodes;
  64. Var
  65. C : TJSONCOnfig;
  66. begin
  67. C:=CreateConf('test.json');
  68. try
  69. C.SetValue('a',1);
  70. AssertEquals('Read at root',1,C.GetValue('a',0));
  71. C.SetValue('b/a',2);
  72. AssertEquals('Read at root',2,C.GetValue('b/a',2));
  73. C.SetValue('b/c/a',3);
  74. AssertEquals('Read at root',3,C.GetValue('b/c/a',3));
  75. finally
  76. DeleteConf(C,True);
  77. end;
  78. end;
  79. procedure TTestJSONConfig.TestEnumSubkeys;
  80. Var
  81. C : TJSONCOnfig;
  82. L : TStringList;
  83. begin
  84. C:=CreateConf('test.json');
  85. try
  86. C.SetValue('/a',1);
  87. C.SetValue('/b/a',2);
  88. C.SetValue('/b/b',2);
  89. C.SetValue('/c/a',3);
  90. C.SetValue('/c/b/a',4);
  91. C.SetValue('/c/c/a',4);
  92. C.SetValue('/c/d/d',4);
  93. L:=TStringList.Create;
  94. try
  95. C.EnumSubKeys('/',L);
  96. If (L.Count<>2) then
  97. Fail('EnumSubkeys count');
  98. If (L[0]<>'b') then
  99. Fail('EnumSubkeys first element');
  100. If (L[1]<>'c') then
  101. Fail('EnumSubkeys second element');
  102. finally
  103. L.Free;
  104. end;
  105. finally
  106. DeleteConf(C,True);
  107. end;
  108. end;
  109. procedure TTestJSONConfig.TestEnumValues;
  110. Var
  111. C : TJSONCOnfig;
  112. L : TStringList;
  113. begin
  114. C:=CreateConf('test.json');
  115. try
  116. C.SetValue('/a',1);
  117. C.SetValue('/b/a',2);
  118. C.SetValue('/b/b',2);
  119. C.SetValue('/c/a',3);
  120. C.SetValue('/c/b/a',4);
  121. C.SetValue('/c/c/a',4);
  122. C.SetValue('/c/d/d',4);
  123. L:=TStringList.Create;
  124. try
  125. C.EnumValues('/',L);
  126. If (L.Count<>1) then
  127. Fail('EnumValues count');
  128. If (L[0]<>'a') then
  129. Fail('EnumValues first element');
  130. L.Clear;
  131. C.EnumValues('/b',L);
  132. If (L.Count<>2) then
  133. Fail('EnumValues subkey count');
  134. If (L[0]<>'a') then
  135. Fail('EnumValues subkey first element');
  136. If (L[1]<>'b') then
  137. Fail('EnumValues subkey second element');
  138. finally
  139. L.Free;
  140. end;
  141. finally
  142. DeleteConf(C,True);
  143. end;
  144. end;
  145. procedure TTestJSONConfig.TestClear;
  146. Var
  147. C : TJSONCOnfig;
  148. begin
  149. C:=CreateConf('test.json');
  150. try
  151. C.SetValue('a',1);
  152. C.DeleteValue('a');
  153. AssertEquals('Delete value',0,C.GetValue('a',0));
  154. C.SetValue('b/a',1);
  155. C.SetValue('b/c',2);
  156. C.DeleteValue('b/a');
  157. AssertEquals('Delete value in subkey',0,C.GetValue('a',0));
  158. AssertEquals('Delete value only clears deleted value',2,C.GetValue('b/c',0));
  159. C.SetValue('b/a',1);
  160. C.DeletePath('b');
  161. AssertEquals('Delete path',0,C.GetValue('b/a',0));
  162. AssertEquals('Delete path deletes all values',0,C.GetValue('b/c',0));
  163. C.Clear;
  164. AssertEquals('Clear',0,C.GetValue('/a',0));
  165. finally
  166. DeleteConf(C,True);
  167. end;
  168. end;
  169. procedure TTestJSONConfig.TestKey;
  170. Var
  171. C : TJSONCOnfig;
  172. L : TStrings;
  173. begin
  174. C:=CreateConf('test.json');
  175. try
  176. C.SetValue('a',1);
  177. C.SetValue('b/a',2);
  178. C.SetValue('b/b',2);
  179. C.SetValue('b/c/a',3);
  180. C.SetValue('b/c/b',3);
  181. C.OpenKey('/b',False);
  182. AssertEquals('Read relative to key a',2,C.GetValue('a',0));
  183. AssertEquals('Read relative to key b',2,C.GetValue('b',0));
  184. AssertEquals('Read in subkey relative to key a',3,C.GetValue('c/a',0));
  185. AssertEquals('Read in subkey relative to key b',3,C.GetValue('c/b',0));
  186. AssertEquals('Read absolute, disregarding key',1,C.GetValue('/a',0));
  187. AssertEquals('Read absolute in subkey, disregarding key',2,C.GetValue('/b/a',0));
  188. AssertEquals('Read absolute in subkeys, disregarding key',3,C.GetValue('/b/c/a',0));
  189. C.CloseKey;
  190. AssertEquals('Closekey',1,C.GetValue('a',0));
  191. C.OpenKey('b',False);
  192. C.OpenKey('c',False);
  193. AssertEquals('Open relative key',3,C.GetValue('a',0));
  194. C.ResetKey;
  195. AssertEquals('ResetKey',1,C.GetValue('a',0));
  196. C.Clear;
  197. L:=TStringList.Create;
  198. try
  199. C.EnumSubKeys('/',L);
  200. If (L.Count<>0) then
  201. Fail('clear failed');
  202. C.OpenKey('/a/b/c/d',true);
  203. C.EnumSubKeys('/a',L);
  204. If (L.Count<>1) then
  205. Fail('Open key with allowcreate, level 1');
  206. If (L[0]<>'b') then
  207. Fail('Open key with allowcreate, level 1');
  208. L.Clear;
  209. C.EnumSubKeys('/a/b',L);
  210. If (L.Count<>1) then
  211. Fail('Open key with allowcreate, level 2');
  212. If (L[0]<>'c') then
  213. Fail('Open key with allowcreate, level 2');
  214. L.Clear;
  215. C.EnumSubKeys('/a/b/c',L);
  216. If (L.Count<>1) then
  217. Fail('Open key with allowcreate, level 3');
  218. If (L[0]<>'d') then
  219. Fail('Open key with allowcreate, level 3');
  220. finally
  221. L.Free;
  222. end;
  223. finally
  224. DeleteConf(C,True);
  225. end;
  226. end;
  227. initialization
  228. RegisterTest(TTestJSONConfig);
  229. end.