jsonconftest.pp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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 = 1;
  39. B = 'A string';
  40. C = 1.23;
  41. D = True;
  42. Var
  43. Co : TJSONCOnfig;
  44. begin
  45. Co:=CreateConf('test.json');
  46. try
  47. Co.SetValue('a',a);
  48. AssertEquals('Integer read/Write',a,Co.GetValue('a',0));
  49. Co.SetValue('b',b);
  50. AssertEquals('String read/Write',b,Co.GetValue('b',''));
  51. Co.SetValue('c',C);
  52. AssertEquals('Float read/Write',c,Co.GetValue('c',0.0),0.01);
  53. Co.SetValue('d',d);
  54. AssertEquals('Boolean read/Write',d,Co.GetValue('d',False));
  55. Co.Flush;
  56. finally
  57. DeleteConf(Co,True);
  58. end;
  59. end;
  60. procedure TTestJSONConfig.TestSubNodes;
  61. Var
  62. C : TJSONCOnfig;
  63. begin
  64. C:=CreateConf('test.json');
  65. try
  66. C.SetValue('a',1);
  67. AssertEquals('Read at root',1,C.GetValue('a',0));
  68. C.SetValue('b/a',2);
  69. AssertEquals('Read at root',2,C.GetValue('b/a',2));
  70. C.SetValue('b/c/a',3);
  71. AssertEquals('Read at root',3,C.GetValue('b/c/a',3));
  72. finally
  73. DeleteConf(C,True);
  74. end;
  75. end;
  76. procedure TTestJSONConfig.TestEnumSubkeys;
  77. Var
  78. C : TJSONCOnfig;
  79. L : TStringList;
  80. begin
  81. C:=CreateConf('test.json');
  82. try
  83. C.SetValue('/a',1);
  84. C.SetValue('/b/a',2);
  85. C.SetValue('/b/b',2);
  86. C.SetValue('/c/a',3);
  87. C.SetValue('/c/b/a',4);
  88. C.SetValue('/c/c/a',4);
  89. C.SetValue('/c/d/d',4);
  90. L:=TStringList.Create;
  91. try
  92. C.EnumSubKeys('/',L);
  93. If (L.Count<>2) then
  94. Fail('EnumSubkeys count');
  95. If (L[0]<>'b') then
  96. Fail('EnumSubkeys first element');
  97. If (L[1]<>'c') then
  98. Fail('EnumSubkeys second element');
  99. finally
  100. L.Free;
  101. end;
  102. finally
  103. DeleteConf(C,True);
  104. end;
  105. end;
  106. procedure TTestJSONConfig.TestEnumValues;
  107. Var
  108. C : TJSONCOnfig;
  109. L : TStringList;
  110. begin
  111. C:=CreateConf('test.json');
  112. try
  113. C.SetValue('/a',1);
  114. C.SetValue('/b/a',2);
  115. C.SetValue('/b/b',2);
  116. C.SetValue('/c/a',3);
  117. C.SetValue('/c/b/a',4);
  118. C.SetValue('/c/c/a',4);
  119. C.SetValue('/c/d/d',4);
  120. L:=TStringList.Create;
  121. try
  122. C.EnumValues('/',L);
  123. If (L.Count<>1) then
  124. Fail('EnumValues count');
  125. If (L[0]<>'a') then
  126. Fail('EnumValues first element');
  127. L.Clear;
  128. C.EnumValues('/b',L);
  129. If (L.Count<>2) then
  130. Fail('EnumValues subkey count');
  131. If (L[0]<>'a') then
  132. Fail('EnumValues subkey first element');
  133. If (L[1]<>'b') then
  134. Fail('EnumValues subkey second element');
  135. finally
  136. L.Free;
  137. end;
  138. finally
  139. DeleteConf(C,True);
  140. end;
  141. end;
  142. procedure TTestJSONConfig.TestClear;
  143. Var
  144. C : TJSONCOnfig;
  145. begin
  146. C:=CreateConf('test.json');
  147. try
  148. C.SetValue('a',1);
  149. C.DeleteValue('a');
  150. AssertEquals('Delete value',0,C.GetValue('a',0));
  151. C.SetValue('b/a',1);
  152. C.SetValue('b/c',2);
  153. C.DeleteValue('b/a');
  154. AssertEquals('Delete value in subkey',0,C.GetValue('a',0));
  155. AssertEquals('Delete value only clears deleted value',2,C.GetValue('b/c',0));
  156. C.SetValue('b/a',1);
  157. C.DeletePath('b');
  158. AssertEquals('Delete path',0,C.GetValue('b/a',0));
  159. AssertEquals('Delete path deletes all values',0,C.GetValue('b/c',0));
  160. C.Clear;
  161. AssertEquals('Clear',0,C.GetValue('/a',0));
  162. finally
  163. DeleteConf(C,True);
  164. end;
  165. end;
  166. procedure TTestJSONConfig.TestKey;
  167. Var
  168. C : TJSONCOnfig;
  169. L : TStrings;
  170. begin
  171. C:=CreateConf('test.json');
  172. try
  173. C.SetValue('a',1);
  174. C.SetValue('b/a',2);
  175. C.SetValue('b/b',2);
  176. C.SetValue('b/c/a',3);
  177. C.SetValue('b/c/b',3);
  178. C.OpenKey('/b',False);
  179. AssertEquals('Read relative to key a',2,C.GetValue('a',0));
  180. AssertEquals('Read relative to key b',2,C.GetValue('b',0));
  181. AssertEquals('Read in subkey relative to key a',3,C.GetValue('c/a',0));
  182. AssertEquals('Read in subkey relative to key b',3,C.GetValue('c/b',0));
  183. AssertEquals('Read absolute, disregarding key',1,C.GetValue('/a',0));
  184. AssertEquals('Read absolute in subkey, disregarding key',2,C.GetValue('/b/a',0));
  185. AssertEquals('Read absolute in subkeys, disregarding key',3,C.GetValue('/b/c/a',0));
  186. C.CloseKey;
  187. AssertEquals('Closekey',1,C.GetValue('a',0));
  188. C.OpenKey('b',False);
  189. C.OpenKey('c',False);
  190. AssertEquals('Open relative key',3,C.GetValue('a',0));
  191. C.ResetKey;
  192. AssertEquals('ResetKey',1,C.GetValue('a',0));
  193. C.Clear;
  194. L:=TStringList.Create;
  195. try
  196. C.EnumSubKeys('/',L);
  197. If (L.Count<>0) then
  198. Fail('clear failed');
  199. C.OpenKey('/a/b/c/d',true);
  200. C.EnumSubKeys('/a',L);
  201. If (L.Count<>1) then
  202. Fail('Open key with allowcreate, level 1');
  203. If (L[0]<>'b') then
  204. Fail('Open key with allowcreate, level 1');
  205. L.Clear;
  206. C.EnumSubKeys('/a/b',L);
  207. If (L.Count<>1) then
  208. Fail('Open key with allowcreate, level 2');
  209. If (L[0]<>'c') then
  210. Fail('Open key with allowcreate, level 2');
  211. L.Clear;
  212. C.EnumSubKeys('/a/b/c',L);
  213. If (L.Count<>1) then
  214. Fail('Open key with allowcreate, level 3');
  215. If (L[0]<>'d') then
  216. Fail('Open key with allowcreate, level 3');
  217. finally
  218. L.Free;
  219. end;
  220. finally
  221. DeleteConf(C,True);
  222. end;
  223. end;
  224. initialization
  225. RegisterTest(TTestJSONConfig);
  226. end.