jsonconftest.pp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. unit jsonconftest;
  2. {$mode objfpc}{$H+}
  3. {$codepage utf8}
  4. interface
  5. uses
  6. Classes, SysUtils, fpcunit, testutils, testregistry, jsonconf;
  7. type
  8. { TTestJSONConfig }
  9. TTestJSONConfig= class(TTestCase)
  10. Private
  11. procedure AssertStrings(Msg: String; L: TStrings;
  12. const Values: array of string);
  13. Function CreateConf(AFileName : String) : TJSONCOnfig;
  14. Procedure DeleteConf(C : TJSONConfig; DeleteConfFile : Boolean = true);
  15. published
  16. procedure TestDataTypes;
  17. procedure TestSubNodes;
  18. procedure TestEnumSubkeys;
  19. procedure TestEnumValues;
  20. procedure TestClear;
  21. procedure TestKey;
  22. procedure TestStrings;
  23. procedure TestUnicodeStrings;
  24. procedure TestUnicodeStrings2;
  25. end;
  26. implementation
  27. function TTestJSONConfig.CreateConf(AFileName: String): TJSONCOnfig;
  28. begin
  29. Result:=TJSONConfig.Create(Nil);
  30. Result.FileName:=AFileName;
  31. end;
  32. procedure TTestJSONConfig.DeleteConf(C: TJSONConfig; DeleteConfFile: Boolean);
  33. Var
  34. FN : String;
  35. begin
  36. If DeleteConfFile then
  37. FN:=C.FileName;
  38. FreeAndNil(C);
  39. If DeleteConfFile then
  40. DeleteFile(FN);
  41. end;
  42. procedure TTestJSONConfig.TestDataTypes;
  43. Const
  44. A = Integer(1);
  45. B = 'A string';
  46. C = 1.23;
  47. D = True;
  48. E = Int64($FFFFFFFFFFFFF);
  49. Var
  50. Co : TJSONCOnfig;
  51. begin
  52. Co:=CreateConf('test.json');
  53. try
  54. Co.SetValue('a',a);
  55. AssertEquals('Integer read/Write',a,Co.GetValue('a',0));
  56. Co.SetValue('b',b);
  57. AssertEquals('String read/Write',b,Co.GetValue('b',''));
  58. Co.SetValue('c',C);
  59. AssertEquals('Float read/Write',c,Co.GetValue('c',0.0),0.01);
  60. Co.SetValue('d',d);
  61. AssertEquals('Boolean read/Write',d,Co.GetValue('d',False));
  62. Co.SetValue('e',E);
  63. AssertEquals('Int64 read/Write',e,Co.GetValue('e',Int64(0)));
  64. Co.Flush;
  65. finally
  66. DeleteConf(Co,True);
  67. end;
  68. end;
  69. procedure TTestJSONConfig.TestSubNodes;
  70. Var
  71. C : TJSONCOnfig;
  72. begin
  73. C:=CreateConf('test.json');
  74. try
  75. C.SetValue('a',1);
  76. AssertEquals('Read at root',1,C.GetValue('a',0));
  77. C.SetValue('b/a',2);
  78. AssertEquals('Read at root',2,C.GetValue('b/a',2));
  79. C.SetValue('b/c/a',3);
  80. AssertEquals('Read at root',3,C.GetValue('b/c/a',3));
  81. finally
  82. DeleteConf(C,True);
  83. end;
  84. end;
  85. procedure TTestJSONConfig.TestEnumSubkeys;
  86. Var
  87. C : TJSONCOnfig;
  88. L : TStringList;
  89. begin
  90. C:=CreateConf('test.json');
  91. try
  92. C.SetValue('/a',1);
  93. C.SetValue('/b/a',2);
  94. C.SetValue('/b/b',2);
  95. C.SetValue('/c/a',3);
  96. C.SetValue('/c/b/a',4);
  97. C.SetValue('/c/c/a',4);
  98. C.SetValue('/c/d/d',4);
  99. L:=TStringList.Create;
  100. try
  101. C.EnumSubKeys('/',L);
  102. If (L.Count<>2) then
  103. Fail('EnumSubkeys count');
  104. If (L[0]<>'b') then
  105. Fail('EnumSubkeys first element');
  106. If (L[1]<>'c') then
  107. Fail('EnumSubkeys second element');
  108. finally
  109. L.Free;
  110. end;
  111. finally
  112. DeleteConf(C,True);
  113. end;
  114. end;
  115. procedure TTestJSONConfig.TestEnumValues;
  116. Var
  117. C : TJSONCOnfig;
  118. L : TStringList;
  119. begin
  120. C:=CreateConf('test.json');
  121. try
  122. C.SetValue('/a',1);
  123. C.SetValue('/b/a',2);
  124. C.SetValue('/b/b',2);
  125. C.SetValue('/c/a',3);
  126. C.SetValue('/c/b/a',4);
  127. C.SetValue('/c/c/a',4);
  128. C.SetValue('/c/d/d',4);
  129. L:=TStringList.Create;
  130. try
  131. C.EnumValues('/',L);
  132. If (L.Count<>1) then
  133. Fail('EnumValues count');
  134. If (L[0]<>'a') then
  135. Fail('EnumValues first element');
  136. L.Clear;
  137. C.EnumValues('/b',L);
  138. If (L.Count<>2) then
  139. Fail('EnumValues subkey count');
  140. If (L[0]<>'a') then
  141. Fail('EnumValues subkey first element');
  142. If (L[1]<>'b') then
  143. Fail('EnumValues subkey second element');
  144. finally
  145. L.Free;
  146. end;
  147. finally
  148. DeleteConf(C,True);
  149. end;
  150. end;
  151. procedure TTestJSONConfig.TestClear;
  152. Var
  153. C : TJSONCOnfig;
  154. begin
  155. C:=CreateConf('test.json');
  156. try
  157. C.SetValue('a',1);
  158. C.Flush;
  159. C.DeleteValue('a');
  160. AssertEquals('Modified set',True,C.Modified);
  161. AssertEquals('Delete value',0,C.GetValue('a',0));
  162. C.SetValue('b/a',1);
  163. C.SetValue('b/c',2);
  164. C.DeleteValue('b/a');
  165. AssertEquals('Delete value in subkey',0,C.GetValue('a',0));
  166. AssertEquals('Delete value only clears deleted value',2,C.GetValue('b/c',0));
  167. C.SetValue('b/a',1);
  168. C.Flush;
  169. C.DeletePath('b');
  170. AssertEquals('Modified set',True,C.Modified);
  171. AssertEquals('Delete path',0,C.GetValue('b/a',0));
  172. AssertEquals('Delete path deletes all values',0,C.GetValue('b/c',0));
  173. C.Clear;
  174. AssertEquals('Clear',0,C.GetValue('/a',0));
  175. finally
  176. DeleteConf(C,True);
  177. end;
  178. end;
  179. procedure TTestJSONConfig.TestKey;
  180. Var
  181. C : TJSONCOnfig;
  182. L : TStrings;
  183. begin
  184. C:=CreateConf('test.json');
  185. try
  186. C.SetValue('a',1);
  187. C.SetValue('b/a',2);
  188. C.SetValue('b/b',2);
  189. C.SetValue('b/c/a',3);
  190. C.SetValue('b/c/b',3);
  191. C.OpenKey('/b',False);
  192. AssertEquals('Read relative to key a',2,C.GetValue('a',0));
  193. AssertEquals('Read relative to key b',2,C.GetValue('b',0));
  194. AssertEquals('Read in subkey relative to key a',3,C.GetValue('c/a',0));
  195. AssertEquals('Read in subkey relative to key b',3,C.GetValue('c/b',0));
  196. AssertEquals('Read absolute, disregarding key',1,C.GetValue('/a',0));
  197. AssertEquals('Read absolute in subkey, disregarding key',2,C.GetValue('/b/a',0));
  198. AssertEquals('Read absolute in subkeys, disregarding key',3,C.GetValue('/b/c/a',0));
  199. C.CloseKey;
  200. AssertEquals('Closekey',1,C.GetValue('a',0));
  201. C.OpenKey('b',False);
  202. C.OpenKey('c',False);
  203. AssertEquals('Open relative key',3,C.GetValue('a',0));
  204. C.ResetKey;
  205. AssertEquals('ResetKey',1,C.GetValue('a',0));
  206. C.Clear;
  207. L:=TStringList.Create;
  208. try
  209. C.EnumSubKeys('/',L);
  210. If (L.Count<>0) then
  211. Fail('clear failed');
  212. C.OpenKey('/a/b/c/d',true);
  213. C.EnumSubKeys('/a',L);
  214. If (L.Count<>1) then
  215. Fail('Open key with allowcreate, level 1');
  216. If (L[0]<>'b') then
  217. Fail('Open key with allowcreate, level 1');
  218. L.Clear;
  219. C.EnumSubKeys('/a/b',L);
  220. If (L.Count<>1) then
  221. Fail('Open key with allowcreate, level 2');
  222. If (L[0]<>'c') then
  223. Fail('Open key with allowcreate, level 2');
  224. L.Clear;
  225. C.EnumSubKeys('/a/b/c',L);
  226. If (L.Count<>1) then
  227. Fail('Open key with allowcreate, level 3');
  228. If (L[0]<>'d') then
  229. Fail('Open key with allowcreate, level 3');
  230. finally
  231. L.Free;
  232. end;
  233. finally
  234. DeleteConf(C,True);
  235. end;
  236. end;
  237. procedure TTestJSONConfig.AssertStrings(Msg: String; L: TStrings;
  238. const Values: array of string);
  239. Var
  240. I : Integer;
  241. begin
  242. Msg:=Msg+': ';
  243. AssertNotNull(Msg+'Have strings',L);
  244. AssertEquals(Msg+'Correct element count',Length(Values),L.Count);
  245. For I:=0 to L.Count-1 do
  246. AssertEquals(Msg+'element '+IntToStr(i),Values[i],l[i]);
  247. end;
  248. procedure TTestJSONConfig.TestStrings;
  249. Var
  250. C : TJSONCOnfig;
  251. L,LD : TStrings;
  252. begin
  253. L:=Nil;
  254. LD:=Nil;
  255. C:=CreateConf('test.json');
  256. try
  257. L:=TStringList.Create;
  258. LD:=TStringList.Create;
  259. L.Add('abc');
  260. C.GetValue('list',L,'');
  261. AssertStrings('Clear, no default.',L,[]);
  262. C.GetValue('list',L,'text');
  263. AssertStrings('Use default.',L,['text']);
  264. L.Clear;
  265. L.Add('abc');
  266. L.Add('def');
  267. C.SetValue('a',L);
  268. C.GetValue('a',LD,'');
  269. AssertStrings('List',LD,['abc','def']);
  270. L.Clear;
  271. L.Add('abc=1');
  272. L.Add('def=2');
  273. C.SetValue('a',L,True);
  274. LD.Clear;
  275. C.GetValue('a',LD,'');
  276. AssertStrings('List',LD,['abc=1','def=2']);
  277. C.SetValue('a','abc');
  278. C.GetValue('a',L,'');
  279. AssertStrings('String',L,['abc']);
  280. C.SetValue('a',Integer(1));
  281. C.GetValue('a',L,'');
  282. AssertStrings('integer',L,['1']);
  283. C.SetValue('a',True);
  284. C.GetValue('a',L,'');
  285. AssertStrings('integer',L,['True']);
  286. C.SetValue('a',Int64(1));
  287. C.GetValue('a',L,'');
  288. AssertStrings('int64',L,['1']);
  289. finally
  290. L.Free;
  291. DeleteConf(C,True);
  292. end;
  293. end;
  294. procedure TTestJSONConfig.TestUnicodeStrings;
  295. Const
  296. utf8str = 'Größe ÄÜÖ ㎰ す 가';
  297. utf8path = 'Größe/す가';
  298. Var
  299. Co : TJSONCOnfig;
  300. begin
  301. Co:=CreateConf('test.json');
  302. try
  303. Co.SetValue('a',utf8str);
  304. Co.SetValue(utf8path,'something');
  305. Co.Flush;
  306. finally
  307. co.Free;
  308. end;
  309. Co:=CreateConf('test.json');
  310. try
  311. AssertEquals('UTF8 string read/Write',utf8str,utf8encode(Co.GetValue('a','')));
  312. AssertEquals('UTF8 path read/Write','something',Co.GetValue(utf8path,'something'));
  313. finally
  314. DeleteConf(Co,True);
  315. end;
  316. end;
  317. procedure TTestJSONConfig.TestUnicodeStrings2;
  318. Const
  319. utf8str = 'Größe ÄÜÖ ㎰ す 가';
  320. utf8path = 'Größe/す가';
  321. Var
  322. Co : TJSONCOnfig;
  323. begin
  324. Co:=CreateConf('test.json');
  325. try
  326. Co.SetValue('/проверка',utf8str);
  327. Co.SetValue(utf8path,'something');
  328. Co.Flush;
  329. finally
  330. co.Free;
  331. end;
  332. Co:=CreateConf('test.json');
  333. try
  334. AssertEquals('UTF8 string read/Write',utf8str,utf8encode(Co.GetValue('/проверка','')));
  335. AssertEquals('UTF8 path read/Write','something',Co.GetValue(utf8path,'something'));
  336. finally
  337. DeleteConf(Co,True);
  338. end;
  339. end;
  340. initialization
  341. RegisterTest(TTestJSONConfig);
  342. end.