tcsrcmap.pas 6.0 KB

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