utOfficialTests.pp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. {
  2. This file is part of the Free Component Library
  3. Testsuite to load schema from official testsuite
  4. Copyright (c) 2024 by Michael Van Canneyt [email protected]
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit utOfficialTests;
  12. {$mode ObjFPC}{$H+}
  13. interface
  14. uses
  15. Classes, SysUtils, fpcunit, testregistry, fpjson.schema.testutils;
  16. Type
  17. { TSchemaFileTest }
  18. TSchemaFileTest = class(TAssert)
  19. Private
  20. FIgnores: Boolean;
  21. FTestDef: TTestDef;
  22. protected
  23. function GetTestName: string; override;
  24. function GetTestSuiteName: string; override;
  25. function GetEnableIgnores: boolean; override;
  26. procedure SetEnableIgnores(Value: boolean); override;
  27. procedure SetTestSuiteName(const aName: string); override;
  28. procedure TestSchema; virtual; abstract;
  29. Public
  30. constructor Create(aTestDef : TTestDef);
  31. function CountTestCases: integer; override;
  32. procedure Run(AResult: TTestResult); override;
  33. property TestDef : TTestDef Read FTestDef;
  34. end;
  35. TSchemaReaderFileTest = class(TSchemaFileTest)
  36. procedure TestSchema; override;
  37. end;
  38. TSchemaLoaderFileTest = class(TSchemaFileTest)
  39. procedure TestSchema; override;
  40. end;
  41. { TSchemaFileTests }
  42. TSchemaFileTests = class(TTestSuite)
  43. private
  44. FList : TTestDefs;
  45. Protected
  46. procedure FindTestFiles(const aDir : String; aFiles : TStrings);
  47. procedure AddAllTests(const aDir : string);
  48. procedure DoAddTestDef(aTest : TTestDef); virtual; abstract;
  49. Public
  50. Constructor Create(const aTestDir : String); reintroduce;
  51. destructor destroy; override;
  52. end;
  53. { TSchemaFileReaderTests }
  54. TSchemaFileReaderTests = class(TSchemaFileTests)
  55. protected
  56. procedure DoAddTestDef(aTest : TTestDef); override;
  57. end;
  58. { TSchemaFileLoaderTests }
  59. TSchemaFileLoaderTests = class(TSchemaFileTests)
  60. protected
  61. procedure DoAddTestDef(aTest : TTestDef); override;
  62. end;
  63. Procedure RegisterTestFiles(const aDir : String);
  64. implementation
  65. uses fpjson.schema.loader, fpjson.schema.reader, fpjson.schema.schema;
  66. procedure RegisterTestFiles(const aDir: String);
  67. begin
  68. RegisterTest('Reader JSONSchema testsuite',TSchemaFileReaderTests.Create(aDir));
  69. RegisterTest('Loader JSONSchema testsuite',TSchemaFileLoaderTests.Create(aDir));
  70. end;
  71. { TSchemaFileTest }
  72. function TSchemaFileTest.CountTestCases: integer;
  73. begin
  74. Result:=1;
  75. end;
  76. function TSchemaFileTest.GetTestName: string;
  77. begin
  78. Result:=ChangeFileExt(ExtractFileName(FTestDef.FileName),'')+' : '+FTestDef.Description;
  79. end;
  80. function TSchemaFileTest.GetTestSuiteName: string;
  81. begin
  82. Result:='';
  83. end;
  84. function TSchemaFileTest.GetEnableIgnores: boolean;
  85. begin
  86. Result:=FIgnores;
  87. end;
  88. procedure TSchemaFileTest.SetEnableIgnores(Value: boolean);
  89. begin
  90. FIgnores:=Value
  91. end;
  92. procedure TSchemaFileTest.SetTestSuiteName(const aName: string);
  93. begin
  94. // Do nothing
  95. end;
  96. Procedure DoRun(aTest: TTest; aResult: TTestResult);
  97. begin
  98. TSchemaFileTest(aTest).TestSchema;
  99. end;
  100. procedure TSchemaFileTest.Run(AResult: TTestResult);
  101. begin
  102. aResult.StartTest(Self);
  103. AResult.RunProtected(Self,@DoRun);
  104. aResult.EndTest(Self);
  105. end;
  106. constructor TSchemaFileTest.Create(aTestDef: TTestDef);
  107. begin
  108. FTestDef:=aTestDef;
  109. end;
  110. { TSchemaFileTests }
  111. procedure TSchemaFileTests.FindTestFiles(const aDir: String; aFiles: TStrings);
  112. var
  113. Info : TSearchRec;
  114. D : String;
  115. begin
  116. D:=IncludeTrailingPathDelimiter(aDir);
  117. if FindFirst(D+'*.json',faNormal,Info)=0 then
  118. try
  119. Repeat
  120. aFiles.Add(D+Info.Name);
  121. until FindNext(Info)<>0;
  122. finally
  123. FindClose(Info);
  124. end;
  125. end;
  126. procedure TSchemaReaderFileTest.TestSchema;
  127. var
  128. S : TJSONSchema;
  129. Reader : TJsonSchemaReader;
  130. begin
  131. Reader:=Nil;
  132. S:=TJSONSchema.Create;
  133. try
  134. Reader:=TJSONSChemaReader.Create(Nil);
  135. Reader.ReadFromString(S,TestDef.Schema.AsJSON);
  136. finally
  137. S.Free;
  138. Reader.Free;
  139. end;
  140. end;
  141. procedure TSchemaLoaderFileTest.TestSchema;
  142. var
  143. S : TJSONSchema;
  144. Loader : TJsonSchemaLoader;
  145. begin
  146. Loader:=Nil;
  147. S:=TJSONSchema.Create;
  148. try
  149. Loader:=TJSONSChemaLoader.Create(Nil);
  150. Loader.ReadFromJSON(S,TestDef.Schema);
  151. finally
  152. S.Free;
  153. Loader.Free;
  154. end;
  155. end;
  156. procedure TSchemaFileTests.AddAllTests(const aDir: string);
  157. Var
  158. aFile : String;
  159. aFiles : TStrings;
  160. i : integer;
  161. begin
  162. if aDir='' then
  163. Ignore('No test dir specified');
  164. aFiles:=TStringList.Create;
  165. try
  166. FindTestFiles(aDir,aFiles);
  167. FList.Clear;
  168. for aFile in aFiles do
  169. ExtractTestsFromFile(aFile,FList);
  170. For I:=0 to FList.Count-1 do
  171. DoAddTestDef(FList[I]);
  172. finally
  173. aFiles.Free;
  174. end;
  175. end;
  176. constructor TSchemaFileTests.Create(const aTestDir: String);
  177. begin
  178. Inherited Create();
  179. FList:=TTestDefs.Create(True);
  180. AddAllTests(aTestDir);
  181. end;
  182. destructor TSchemaFileTests.destroy;
  183. begin
  184. FreeAndNil(FList);
  185. inherited destroy;
  186. end;
  187. { TSchemaFileReaderTests }
  188. procedure TSchemaFileReaderTests.DoAddTestDef(aTest: TTestDef);
  189. begin
  190. AddTest(TSchemaReaderFileTest.Create(aTest));
  191. end;
  192. { TSchemaFileLoaderTests }
  193. procedure TSchemaFileLoaderTests.DoAddTestDef(aTest: TTestDef);
  194. begin
  195. AddTest(TSchemaLoaderFileTest.Create(aTest));
  196. end;
  197. end.