tcsrcmap.pas 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. unit TCSrcMap;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry, fpjson, JSSrcMap;
  6. type
  7. { TCustomTestSrcMap }
  8. TCustomTestSrcMap = class(TTestCase)
  9. protected
  10. procedure CheckEl(aName: String; El: TJSONData; aClass: TClass);
  11. function GetEl(Obj: TJSONObject; aName: String; aClass: TClass): TJSONData;
  12. end;
  13. { TTestSrcMap }
  14. TTestSrcMap = class(TCustomTestSrcMap)
  15. published
  16. procedure Test_Base64VLQ;
  17. procedure TestSrcMapIgnoreDuplicate;
  18. procedure TestSrcMapNames;
  19. procedure TestSrcMapLoad;
  20. end;
  21. implementation
  22. { TCustomTestSrcMap }
  23. procedure TCustomTestSrcMap.CheckEl(aName: String; El: TJSONData; aClass: TClass);
  24. begin
  25. AssertNotNull('json "'+aName+'" exists',El);
  26. AssertEquals('json "'+aName+'" class',El.ClassType,aClass);
  27. end;
  28. function TCustomTestSrcMap.GetEl(Obj: TJSONObject; aName: String; aClass: TClass): TJSONData;
  29. begin
  30. Result:=Obj.Elements[aName];
  31. CheckEl(aName,Result,aClass);
  32. end;
  33. { TTestSrcMap }
  34. procedure TTestSrcMap.Test_Base64VLQ;
  35. var
  36. i: Integer;
  37. s: String;
  38. p: PChar;
  39. j: NativeInt;
  40. begin
  41. for i:=-511 to 511 do
  42. begin
  43. s:=EncodeBase64VLQ(i);
  44. p:=PChar(s);
  45. j:=DecodeBase64VLQ(p);
  46. if i<>j then
  47. Fail('Encode/DecodeBase64VLQ OrigIndex='+IntToStr(i)+' Code="'+s+'" NewIndex='+IntToStr(j));
  48. end;
  49. end;
  50. procedure TTestSrcMap.TestSrcMapIgnoreDuplicate;
  51. var
  52. sm: TSourceMap;
  53. Obj: TJSONObject;
  54. El: TJSONData;
  55. Arr: TJSONArray;
  56. begin
  57. Obj:=nil;
  58. sm:=TSourceMap.Create('generated.js');
  59. try
  60. sm.AddMapping(1,0,'a.js',1,0);
  61. sm.AddMapping(2,0);
  62. sm.AddMapping(2,0);
  63. sm.AddMapping(3,0,'a.js',2,0);
  64. //writeln(sm.ToString);
  65. {
  66. version: 3,
  67. file: 'generated.js',
  68. sources: ['a.js'],
  69. names: [],
  70. mappings: 'AAAA;A;AACA'
  71. }
  72. Obj:=sm.ToJSON;
  73. // version
  74. El:=GetEl(Obj,'version',TJSONIntegerNumber);
  75. AssertEquals('json "version" value',El.AsInt64,3);
  76. // file
  77. El:=GetEl(Obj,'file',TJSONString);
  78. AssertEquals('json "file" value',El.AsString,'generated.js');
  79. // sources
  80. Arr:=TJSONArray(GetEl(Obj,'sources',TJSONArray));
  81. AssertEquals('json "sources".count',Arr.Count,1);
  82. El:=Arr[0];
  83. CheckEl('sources[0]',El,TJSONString);
  84. AssertEquals('json "sources[0]" value',El.AsString,'a.js');
  85. // names
  86. Arr:=TJSONArray(GetEl(Obj,'names',TJSONArray));
  87. AssertEquals('json "names".count',Arr.Count,0);
  88. // mappings
  89. El:=GetEl(Obj,'mappings',TJSONString);
  90. AssertEquals('json "mappings" value',El.AsString,'AAAA;A;AACA');
  91. finally
  92. Obj.Free;
  93. sm.Free;
  94. end;
  95. end;
  96. procedure TTestSrcMap.TestSrcMapNames;
  97. var
  98. sm: TSourceMap;
  99. Obj: TJSONObject;
  100. El: TJSONData;
  101. Arr: TJSONArray;
  102. begin
  103. Obj:=nil;
  104. sm:=TSourceMap.Create('generated.js');
  105. try
  106. sm.AddMapping(1,1,'a.js',2,2,'foo');
  107. sm.AddMapping(3,3,'a.js',4,4,'foo');
  108. {$IFDEF VerboseSrcMap}
  109. writeln(sm.ToString);
  110. {$ENDIF}
  111. {
  112. version: 3,
  113. file: 'generated.js',
  114. sources: ['a.js'],
  115. names: ['foo'],
  116. mappings: 'CACEA;;GAEEA'
  117. }
  118. Obj:=sm.ToJSON;
  119. // version
  120. El:=GetEl(Obj,'version',TJSONIntegerNumber);
  121. AssertEquals('json "version" value',3,El.AsInt64);
  122. // file
  123. El:=GetEl(Obj,'file',TJSONString);
  124. AssertEquals('json "file" value','generated.js',El.AsString);
  125. // sources
  126. Arr:=TJSONArray(GetEl(Obj,'sources',TJSONArray));
  127. AssertEquals('json "sources".count',Arr.Count,1);
  128. El:=Arr[0];
  129. CheckEl('sources[0]',El,TJSONString);
  130. AssertEquals('json "sources[0]" value','a.js',El.AsString);
  131. // names
  132. Arr:=TJSONArray(GetEl(Obj,'names',TJSONArray));
  133. AssertEquals('json "names".count',Arr.Count,1);
  134. El:=Arr[0];
  135. CheckEl('names[0]',El,TJSONString);
  136. AssertEquals('json "names[0]" value','foo',El.AsString);
  137. // mappings
  138. El:=GetEl(Obj,'mappings',TJSONString);
  139. AssertEquals('json "mappings" value','CACEA;;EAEEA',El.AsString);
  140. finally
  141. Obj.Free;
  142. sm.Free;
  143. end;
  144. end;
  145. procedure TTestSrcMap.TestSrcMapLoad;
  146. var
  147. sm, sm2: TSourceMap;
  148. Obj: TJSONObject;
  149. i: Integer;
  150. begin
  151. Obj:=nil;
  152. sm2:=nil;
  153. sm:=TSourceMap.Create('generated.js');
  154. try
  155. sm.AddMapping(1,1,'a.js',2,2,'foo');
  156. sm.AddMapping(3,3,'a.js',4,4,'foo');
  157. {$IFDEF VerboseSrcMap}
  158. writeln(sm.ToString);
  159. {$ENDIF}
  160. {
  161. version: 3,
  162. file: 'generated.js',
  163. sources: ['a.js'],
  164. names: ['foo'],
  165. mappings: 'CACEA;;GAEEA'
  166. }
  167. Obj:=sm.ToJSON;
  168. sm2:=TSourceMap.Create('(not set)');
  169. sm2.LoadFromJSON(Obj);
  170. AssertEquals('same GeneratedFilename',sm.GeneratedFilename,sm2.GeneratedFilename);
  171. AssertEquals('same SourceCount',sm.SourceCount,sm2.SourceCount);
  172. for i:=0 to sm.SourceCount-1 do
  173. AssertEquals('same SourceFiles['+IntToStr(i)+']',sm.SourceFiles[i],sm2.SourceFiles[i]);
  174. AssertEquals('same NameCount',sm.NameCount,sm2.NameCount);
  175. for i:=0 to sm.NameCount-1 do
  176. AssertEquals('same Names['+IntToStr(i)+']',sm.Names[i],sm2.Names[i]);
  177. AssertEquals('same Count',sm.Count,sm2.Count);
  178. for i:=0 to sm.Count-1 do
  179. begin
  180. AssertEquals('same Items['+IntToStr(i)+'].Index',sm[i].Index,sm2[i].Index);
  181. AssertEquals('same Items['+IntToStr(i)+'].GeneratedLine',sm[i].GeneratedLine,sm2[i].GeneratedLine);
  182. AssertEquals('same Items['+IntToStr(i)+'].GeneratedColumn',sm[i].GeneratedColumn,sm2[i].GeneratedColumn);
  183. AssertEquals('same Items['+IntToStr(i)+'].SrcFileIndex',sm[i].SrcFileIndex,sm2[i].SrcFileIndex);
  184. AssertEquals('same Items['+IntToStr(i)+'].SrcLine',sm[i].SrcLine,sm2[i].SrcLine);
  185. AssertEquals('same Items['+IntToStr(i)+'].SrcColumn',sm[i].SrcColumn,sm2[i].SrcColumn);
  186. AssertEquals('same Items['+IntToStr(i)+'].NameIndex',sm[i].NameIndex,sm2[i].NameIndex);
  187. end;
  188. finally
  189. Obj.Free;
  190. sm.Free;
  191. sm2:=nil;
  192. end;
  193. end;
  194. initialization
  195. RegisterTests([TTestSrcMap]);
  196. end.