testjsonparser.pp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. unit testjsonparser;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry,fpjson,
  6. jsonParser,testjsondata;
  7. type
  8. { TTestParser }
  9. TTestParser= class(TTestJSON)
  10. private
  11. procedure DoTestError(S: String);
  12. procedure DoTestFloat(F: TJSONFloat); overload;
  13. procedure DoTestFloat(F: TJSONFloat; S: String); overload;
  14. procedure DoTestObject(S: String; const ElNames: array of String);
  15. procedure DoTestString(S : String);
  16. procedure DoTestArray(S: String; ACount: Integer);
  17. published
  18. procedure TestEmpty;
  19. procedure TestNull;
  20. procedure TestTrue;
  21. procedure TestFalse;
  22. procedure TestFloat;
  23. procedure TestInteger;
  24. procedure TestString;
  25. procedure TestArray;
  26. procedure TestObject;
  27. procedure TestMixed;
  28. procedure TestErrors;
  29. end;
  30. implementation
  31. procedure TTestParser.TestEmpty;
  32. Var
  33. P : TJSONParser;
  34. J : TJSONData;
  35. begin
  36. P:=TJSONParser.Create('');
  37. Try
  38. J:=P.Parse;
  39. If (J<>Nil) then
  40. Fail('Empty returns Nil');
  41. Finally
  42. FreeAndNil(J);
  43. FreeAndNil(P);
  44. end;
  45. end;
  46. procedure TTestParser.TestInteger;
  47. Var
  48. P : TJSONParser;
  49. J : TJSONData;
  50. begin
  51. P:=TJSONParser.Create('1');
  52. Try
  53. J:=P.Parse;
  54. If (J=Nil) then
  55. Fail('Parse of 1 fails');
  56. TestJSONType(J,jtNumber);
  57. TestAsInteger(J,1);
  58. Finally
  59. FreeAndNil(J);
  60. FreeAndNil(P);
  61. end;
  62. end;
  63. procedure TTestParser.TestNull;
  64. Var
  65. P : TJSONParser;
  66. J : TJSONData;
  67. begin
  68. P:=TJSONParser.Create('Null');
  69. Try
  70. J:=P.Parse;
  71. If (J=Nil) then
  72. Fail('Parse of Null fails');
  73. TestJSONType(J,jtNull);
  74. Finally
  75. FreeAndNil(J);
  76. FreeAndNil(P);
  77. end;
  78. end;
  79. procedure TTestParser.TestTrue;
  80. Var
  81. P : TJSONParser;
  82. J : TJSONData;
  83. begin
  84. P:=TJSONParser.Create('True');
  85. Try
  86. J:=P.Parse;
  87. If (J=Nil) then
  88. Fail('Parse of True fails');
  89. TestJSONType(J,jtBoolean);
  90. TestAsBoolean(J,True);
  91. Finally
  92. FreeAndNil(J);
  93. FreeAndNil(P);
  94. end;
  95. end;
  96. procedure TTestParser.TestFalse;
  97. Var
  98. P : TJSONParser;
  99. J : TJSONData;
  100. begin
  101. P:=TJSONParser.Create('False');
  102. Try
  103. J:=P.Parse;
  104. If (J=Nil) then
  105. Fail('Parse of False fails');
  106. TestJSONType(J,jtBoolean);
  107. TestAsBoolean(J,False);
  108. Finally
  109. FreeAndNil(J);
  110. FreeAndNil(P);
  111. end;
  112. end;
  113. procedure TTestParser.TestFloat;
  114. begin
  115. DoTestFloat(1.2);
  116. DoTestFloat(-1.2);
  117. DoTestFloat(0);
  118. DoTestFloat(1.2e1);
  119. DoTestFloat(-1.2e1);
  120. DoTestFloat(0);
  121. DoTestFloat(1.2,'1.2');
  122. DoTestFloat(-1.2,'-1.2');
  123. DoTestFloat(0,'0.0');
  124. end;
  125. procedure TTestParser.TestString;
  126. begin
  127. DoTestString('A string');
  128. DoTestString('');
  129. DoTestString('\"');
  130. end;
  131. procedure TTestParser.TestArray;
  132. Var
  133. S1,S2,S3 : String;
  134. begin
  135. DoTestArray('[]',0);
  136. DoTestArray('[Null]',1);
  137. DoTestArray('[True]',1);
  138. DoTestArray('[False]',1);
  139. DoTestArray('[1]',1);
  140. DoTestArray('[1, 2]',2);
  141. DoTestArray('[1, 2, 3]',3);
  142. Str(1.2,S1);
  143. Str(2.3,S2);
  144. Str(3.4,S3);
  145. DoTestArray('['+S1+']',1);
  146. DoTestArray('['+S1+', '+S2+']',2);
  147. DoTestArray('['+S1+', '+S2+', '+S3+']',3);
  148. DoTestArray('["A string"]',1);
  149. DoTestArray('["A string", "Another string"]',2);
  150. DoTestArray('["A string", "Another string", "Yet another string"]',3);
  151. DoTestArray('[Null, False]',2);
  152. DoTestArray('[True, False]',2);
  153. DoTestArray('[Null, 1]',2);
  154. DoTestArray('[1, "A string"]',2);
  155. DoTestArray('[1, []]',2);
  156. DoTestArray('[1, [1, 2]]',2);
  157. end;
  158. procedure TTestParser.TestMixed;
  159. begin
  160. DoTestArray('[1, {}]',2);
  161. DoTestArray('[1, { "a" : 1 }]',2);
  162. DoTestArray('[1, { "a" : 1 }, 1]',3);
  163. DoTestObject('{ "a" : [1, 2] }',['a']);
  164. DoTestObject('{ "a" : [1, 2], "B" : { "c" : "d" } }',['a','B']);
  165. end;
  166. procedure TTestParser.TestObject;
  167. begin
  168. DoTestObject('{}',[]);
  169. DoTestObject('{ "a" : 1 }',['a']);
  170. DoTestObject('{ "a" : 1, "B" : "String" }',['a','B']);
  171. DoTestObject('{ "a" : 1, "B" : {} }',['a','B']);
  172. DoTestObject('{ "a" : 1, "B" : { "c" : "d" } }',['a','B']);
  173. end;
  174. procedure TTestParser.DoTestObject(S : String; Const ElNames : Array of String);
  175. Var
  176. P : TJSONParser;
  177. J : TJSONData;
  178. O : TJSONObject;
  179. I : Integer;
  180. begin
  181. P:=TJSONParser.Create(S);
  182. Try
  183. J:=P.Parse;
  184. If (J=Nil) then
  185. Fail('Parse of object "'+S+'" fails');
  186. TestJSONType(J,jtObject);
  187. TestItemCount(J,High(ElNames)-Low(ElNames)+1);
  188. O:=TJSONObject(J);
  189. For I:=Low(ElNames) to High(ElNames) do
  190. AssertEquals(Format('Element %d name',[I-Low(Elnames)])
  191. ,ElNames[i], O.Names[I-Low(ElNames)]);
  192. TestJSON(J,S);
  193. Finally
  194. FreeAndNil(J);
  195. FreeAndNil(P);
  196. end;
  197. end;
  198. procedure TTestParser.DoTestArray(S : String; ACount : Integer);
  199. Var
  200. P : TJSONParser;
  201. J : TJSONData;
  202. begin
  203. P:=TJSONParser.Create(S);
  204. Try
  205. J:=P.Parse;
  206. If (J=Nil) then
  207. Fail('Parse of array "'+S+'" fails');
  208. TestJSONType(J,jtArray);
  209. TestItemCount(J,ACount);
  210. TestJSON(J,S);
  211. Finally
  212. FreeAndNil(J);
  213. FreeAndNil(P);
  214. end;
  215. end;
  216. procedure TTestParser.TestErrors;
  217. begin
  218. DoTestError('a');
  219. DoTestError('"b');
  220. DoTestError('1Tru');
  221. DoTestError('b"');
  222. DoTestError('{"a" : }');
  223. DoTestError('{"a" : ""');
  224. DoTestError('{"a : ""');
  225. DoTestError('[1,]');
  226. DoTestError('[,]');
  227. DoTestError('[,,]');
  228. DoTestError('[1,,]');
  229. end;
  230. procedure TTestParser.DoTestError(S : String);
  231. Var
  232. P : TJSONParser;
  233. J : TJSONData;
  234. ParseOK : Boolean;
  235. N : String;
  236. begin
  237. ParseOK:=False;
  238. P:=TJSONParser.Create(S);
  239. J:=Nil;
  240. Try
  241. Try
  242. Repeat
  243. FreeAndNil(J);
  244. J:=P.Parse;
  245. ParseOK:=True;
  246. If (J<>Nil) then
  247. N:=J.ClassName;
  248. Until (J=Nil)
  249. Finally
  250. FreeAndNil(J);
  251. FreeAndNil(P);
  252. end;
  253. except
  254. ParseOk:=False;
  255. end;
  256. If ParseOK then
  257. Fail('Parse of JSON string "'+S+'" should fail, but returned '+N);
  258. end;
  259. procedure TTestParser.DoTestString(S: String);
  260. Var
  261. P : TJSONParser;
  262. J : TJSONData;
  263. begin
  264. P:=TJSONParser.Create('"'+S+'"');
  265. Try
  266. J:=P.Parse;
  267. If (J=Nil) then
  268. Fail('Parse of string "'+S+'" fails');
  269. TestJSONType(J,jtString);
  270. TestAsString(J,JSONStringToString(S));
  271. TestJSON(J,'"'+S+'"');
  272. Finally
  273. FreeAndNil(J);
  274. FreeAndNil(P);
  275. end;
  276. end;
  277. procedure TTestParser.DoTestFloat(F : TJSONFloat);
  278. Var
  279. S : String;
  280. begin
  281. Str(F,S);
  282. DoTestFloat(F,S);
  283. end;
  284. procedure TTestParser.DoTestFloat(F : TJSONFloat; S : String);
  285. Var
  286. P : TJSONParser;
  287. J : TJSONData;
  288. begin
  289. P:=TJSONParser.Create(S);
  290. Try
  291. J:=P.Parse;
  292. If (J=Nil) then
  293. Fail('Parse of float '+S+' fails');
  294. TestJSONType(J,jtNumber);
  295. TestAsFloat(J,F);
  296. Finally
  297. FreeAndNil(J);
  298. FreeAndNil(P);
  299. end;
  300. end;
  301. initialization
  302. RegisterTest(TTestParser);
  303. end.