You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

285 line
11 KiB

  1. unit uShaderFileTestCase;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry,
  6. uengShaderFile, uengShaderGenerator, uengShaderFileTypes, uengShaderGeneratorEx;
  7. type
  8. TShaderFileTestCase = class(TTestCase)
  9. protected
  10. procedure DoTest(const aCode, aClass, aResult: String; const aArgs: array of const);
  11. procedure DoTest(const aCode, aClass, aResult: String);
  12. procedure DoTest(const aCode, aResult: String; const aArgs: array of const);
  13. procedure DoTest(const aCode, aResult: String);
  14. end;
  15. TTestCase_IfElifElseEnd = class(TShaderFileTestCase)
  16. published
  17. procedure Simple_0;
  18. procedure Simple_1;
  19. procedure Simple_2;
  20. procedure Inline_0;
  21. procedure Inline_1;
  22. end;
  23. TTestCase_FuncProcMain = class(TShaderFileTestCase)
  24. published
  25. procedure Main_Simple;
  26. procedure Func_Simple_0;
  27. procedure Func_Simple_1;
  28. procedure Proc_Inline;
  29. procedure Func_InlineSingleReturn;
  30. procedure Func_InlineMultiReturn;
  31. end;
  32. TTestCase_Include = class(TShaderFileTestCase)
  33. published
  34. procedure Include_Simple;
  35. end;
  36. TTestCase_Class = class(TShaderFileTestCase)
  37. published
  38. procedure Simple;
  39. procedure InheritedFunc;
  40. procedure InheritedMain;
  41. end;
  42. TTestCase_General = class(TShaderFileTestCase)
  43. published
  44. procedure OrderOfMainProcClassContent;
  45. end;
  46. TTestCase_Generator = class(TShaderFileTestCase)
  47. published
  48. procedure DefaultValues;
  49. end;
  50. implementation
  51. uses
  52. Forms, variants;
  53. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  54. //TShaderFileTestCase///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. procedure TShaderFileTestCase.DoTest(const aCode, aClass, aResult: String; const aArgs: array of const);
  57. var
  58. shdr: TengShaderFile;
  59. gen: TengShaderGenerator;
  60. code: TengShaderCode;
  61. sl: TStringList;
  62. i: Integer;
  63. s: String;
  64. begin
  65. shdr := TengShaderFile.Create;
  66. code := TengShaderCode.Create;
  67. sl := TStringList.Create;
  68. try
  69. shdr.LoadFromFile(ExpandFileName('testfiles\' + aCode));
  70. gen := shdr.Generator[aClass];
  71. for i := 0 to High(aArgs) do begin
  72. case aArgs[i].VType of
  73. vtAnsiString: s := AnsiString(aArgs[i].VAnsiString);
  74. vtString: s := String(aArgs[i].VString);
  75. vtWideString: s := string(WideString(aArgs[i].VWideString));
  76. vtUnicodeString: s := string(UnicodeString(aArgs[i].VUnicodeString));
  77. vtInteger: gen.PropertyByName[s] := aArgs[i].VInteger;
  78. vtBoolean: gen.PropertyByName[s] := aArgs[i].VBoolean;
  79. vtExtended: gen.PropertyByName[s] := aArgs[i].VExtended^;
  80. vtCurrency: gen.PropertyByName[s] := aArgs[i].VCurrency^;
  81. vtVariant: gen.PropertyByName[s] := aArgs[i].VVariant^;
  82. vtInt64: gen.PropertyByName[s] := aArgs[i].VInt64^;
  83. vtQWord: gen.PropertyByName[s] := aArgs[i].VQWord^;
  84. else
  85. raise Exception.Create('invalid variadic type');
  86. end;
  87. end;
  88. gen.GenerateCode(code);
  89. sl.LoadFromFile(ExpandFileName('testfiles\' + aResult));
  90. AssertEquals(sl.Text, code.Text);
  91. finally
  92. FreeAndNil(sl);
  93. FreeAndNil(code);
  94. FreeAndNil(shdr);
  95. end;
  96. end;
  97. procedure TShaderFileTestCase.DoTest(const aCode, aClass, aResult: String);
  98. begin
  99. DoTest(aCode, aClass, aResult, []);
  100. end;
  101. procedure TShaderFileTestCase.DoTest(const aCode, aResult: String; const aArgs: array of const);
  102. begin
  103. DoTest(aCode, '', aResult, aArgs);
  104. end;
  105. procedure TShaderFileTestCase.DoTest(const aCode, aResult: String);
  106. begin
  107. DoTest(aCode, '', aResult, []);
  108. end;
  109. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  110. //TTestCase_IfElifElseEnd///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  111. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. procedure TTestCase_IfElifElseEnd.Simple_0;
  113. begin
  114. DoTest('code_IfElifElseEnd_Simple.shdr', 'result_IfElifElseEnd_Simple_0.shdr', ['TestProp', 0]);
  115. end;
  116. procedure TTestCase_IfElifElseEnd.Simple_1;
  117. begin
  118. DoTest('code_IfElifElseEnd_Simple.shdr', 'result_IfElifElseEnd_Simple_1.shdr', ['TestProp', 1]);
  119. end;
  120. procedure TTestCase_IfElifElseEnd.Simple_2;
  121. begin
  122. DoTest('code_IfElifElseEnd_Simple.shdr', 'result_IfElifElseEnd_Simple_2.shdr', ['TestProp', 2]);
  123. end;
  124. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125. procedure TTestCase_IfElifElseEnd.Inline_0;
  126. begin
  127. DoTest('code_IfElifElseEnd_Inline.shdr', 'result_IfElifElseEnd_Inline_0.shdr', ['TestProp', 0]);
  128. end;
  129. procedure TTestCase_IfElifElseEnd.Inline_1;
  130. begin
  131. DoTest('code_IfElifElseEnd_Inline.shdr', 'result_IfElifElseEnd_Inline_1.shdr', ['TestProp', 1]);
  132. end;
  133. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  134. //TTestCase_MainSimple//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  135. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  136. procedure TTestCase_FuncProcMain.Main_Simple;
  137. begin
  138. DoTest('code_Main_Simple.shdr', 'result_Main_Simple.shdr');
  139. end;
  140. procedure TTestCase_FuncProcMain.Func_Simple_0;
  141. begin
  142. DoTest('code_Func_Simple.shdr', 'result_Func_Simple_0.shdr', ['TestProperty', 0]);
  143. end;
  144. procedure TTestCase_FuncProcMain.Func_Simple_1;
  145. begin
  146. DoTest('code_Func_Simple.shdr', 'result_Func_Simple_1.shdr', ['TestProperty', 1]);
  147. end;
  148. procedure TTestCase_FuncProcMain.Proc_Inline;
  149. begin
  150. DoTest('code_Proc_Inline.shdr', 'result_Proc_Inline.shdr');
  151. end;
  152. procedure TTestCase_FuncProcMain.Func_InlineSingleReturn;
  153. begin
  154. DoTest('code_Func_InlineSingleReturn.shdr', 'result_Func_InlineSingleReturn.shdr');
  155. end;
  156. procedure TTestCase_FuncProcMain.Func_InlineMultiReturn;
  157. begin
  158. DoTest('code_Func_InlineMultiReturn.shdr', 'result_Func_InlineMultiReturn.shdr');
  159. end;
  160. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  161. //TTestCase_Include/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  162. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  163. procedure TTestCase_Include.Include_Simple;
  164. begin
  165. DoTest('code_Include_Simple.shdr', 'result_Include_Simple.shdr');
  166. end;
  167. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  168. //TTestCase_Class///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  169. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  170. procedure TTestCase_Class.Simple;
  171. begin
  172. DoTest('code_Class_Simple.shdr', 'SimpleClass', 'result_Class_Simple.shdr');
  173. end;
  174. procedure TTestCase_Class.InheritedFunc;
  175. begin
  176. DoTest('code_Class_InheritedFunc.shdr', 'SimpleClass', 'result_Class_InheritedFunc.shdr');
  177. end;
  178. procedure TTestCase_Class.InheritedMain;
  179. begin
  180. DoTest('code_Class_InheritedMain.shdr', 'SimpleClass', 'result_Class_InheritedMain.shdr');
  181. end;
  182. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  183. //TTestCase_General/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  184. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185. procedure TTestCase_General.OrderOfMainProcClassContent;
  186. begin
  187. DoTest('code_General_OrderOfMainProcClassContent.shdr', 'TestClass', 'result_General_OrderOfMainProcClassContent.shdr');
  188. end;
  189. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  190. //TTestCase_Generator//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  191. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  192. procedure TTestCase_Generator.DefaultValues;
  193. var
  194. shdr: TengShaderFile;
  195. gen: TengShaderGeneratorEx;
  196. code: TengShaderCode;
  197. v: Variant;
  198. i: Integer;
  199. begin
  200. shdr := TengShaderFile.Create;
  201. code := TengShaderCode.Create;
  202. try
  203. shdr.LoadFromFile(ExpandFileName('testfiles\code_Generator_DefaultValues.shdr'));
  204. for i := 0 to 3 do begin
  205. gen := TengShaderGeneratorEx.Create(shdr, '');
  206. try
  207. AssertEquals(true, gen.TryGetProperty('TestProperty1', v));
  208. AssertEquals(0, v);
  209. AssertEquals(true, gen.TryGetProperty('TestProperty2', v));
  210. AssertEquals('asd', v);
  211. AssertEquals(true, gen.TryGetProperty('TestProperty3', v));
  212. AssertEquals(false, v);
  213. AssertEquals(true, gen.TryGetProperty('TestProperty4', v));
  214. AssertTrue(Unassigned = v);
  215. AssertEquals(true, gen.TrySetProperty('TestProperty1', 101));
  216. AssertEquals(true, gen.TrySetProperty('TestProperty2', 102));
  217. AssertEquals(true, gen.TrySetProperty('TestProperty3', 103));
  218. AssertEquals(true, gen.TrySetProperty('TestProperty4', 104));
  219. gen.Generate(code);
  220. finally
  221. FreeAndNil(gen);
  222. end;
  223. end;
  224. finally
  225. FreeAndNil(code);
  226. FreeAndNil(shdr);
  227. end;
  228. end;
  229. initialization
  230. RegisterTest(TTestCase_IfElifElseEnd);
  231. RegisterTest(TTestCase_FuncProcMain);
  232. RegisterTest(TTestCase_Include);
  233. RegisterTest(TTestCase_Class);
  234. RegisterTest(TTestCase_General);
  235. RegisterTest(TTestCase_Generator);
  236. end.