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.

205 rivejä
7.6 KiB

  1. unit uShaderFileTestCase;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry,
  6. uengShaderFile, uengShaderGenerator, uengShaderFileTypes;
  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. end;
  40. implementation
  41. uses
  42. Forms, variants;
  43. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. //TShaderFileTestCase///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  45. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. procedure TShaderFileTestCase.DoTest(const aCode, aClass, aResult: String; const aArgs: array of const);
  47. var
  48. shdr: TengShaderFile;
  49. gen: TengShaderGenerator;
  50. code: TengShaderCode;
  51. sl: TStringList;
  52. i: Integer;
  53. s: String;
  54. begin
  55. shdr := TengShaderFile.Create;
  56. code := TengShaderCode.Create;
  57. sl := TStringList.Create;
  58. try
  59. shdr.LoadFromFile(ExpandFileName('testfiles\' + aCode));
  60. gen := shdr.Generator[aClass];
  61. for i := 0 to High(aArgs) do begin
  62. case aArgs[i].VType of
  63. vtAnsiString: s := AnsiString(aArgs[i].VAnsiString);
  64. vtString: s := String(aArgs[i].VString);
  65. vtWideString: s := string(WideString(aArgs[i].VWideString));
  66. vtUnicodeString: s := string(UnicodeString(aArgs[i].VUnicodeString));
  67. vtInteger: gen.PropertyByName[s] := aArgs[i].VInteger;
  68. vtBoolean: gen.PropertyByName[s] := aArgs[i].VBoolean;
  69. vtExtended: gen.PropertyByName[s] := aArgs[i].VExtended^;
  70. vtCurrency: gen.PropertyByName[s] := aArgs[i].VCurrency^;
  71. vtVariant: gen.PropertyByName[s] := aArgs[i].VVariant^;
  72. vtInt64: gen.PropertyByName[s] := aArgs[i].VInt64^;
  73. vtQWord: gen.PropertyByName[s] := aArgs[i].VQWord^;
  74. else
  75. raise Exception.Create('invalid variadic type');
  76. end;
  77. end;
  78. gen.GenerateCode(code);
  79. sl.LoadFromFile(ExpandFileName('testfiles\' + aResult));
  80. AssertEquals(sl.Text, code.Text);
  81. finally
  82. FreeAndNil(sl);
  83. FreeAndNil(code);
  84. FreeAndNil(shdr);
  85. end;
  86. end;
  87. procedure TShaderFileTestCase.DoTest(const aCode, aClass, aResult: String);
  88. begin
  89. DoTest(aCode, aClass, aResult, []);
  90. end;
  91. procedure TShaderFileTestCase.DoTest(const aCode, aResult: String; const aArgs: array of const);
  92. begin
  93. DoTest(aCode, '', aResult, aArgs);
  94. end;
  95. procedure TShaderFileTestCase.DoTest(const aCode, aResult: String);
  96. begin
  97. DoTest(aCode, '', aResult, []);
  98. end;
  99. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100. //TTestCase_IfElifElseEnd///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  101. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. procedure TTestCase_IfElifElseEnd.Simple_0;
  103. begin
  104. DoTest('code_IfElifElseEnd_Simple.shdr', 'result_IfElifElseEnd_Simple_0.shdr', ['TestProp', 0]);
  105. end;
  106. procedure TTestCase_IfElifElseEnd.Simple_1;
  107. begin
  108. DoTest('code_IfElifElseEnd_Simple.shdr', 'result_IfElifElseEnd_Simple_1.shdr', ['TestProp', 1]);
  109. end;
  110. procedure TTestCase_IfElifElseEnd.Simple_2;
  111. begin
  112. DoTest('code_IfElifElseEnd_Simple.shdr', 'result_IfElifElseEnd_Simple_2.shdr', ['TestProp', 2]);
  113. end;
  114. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  115. procedure TTestCase_IfElifElseEnd.Inline_0;
  116. begin
  117. DoTest('code_IfElifElseEnd_Inline.shdr', 'result_IfElifElseEnd_Inline_0.shdr', ['TestProp', 0]);
  118. end;
  119. procedure TTestCase_IfElifElseEnd.Inline_1;
  120. begin
  121. DoTest('code_IfElifElseEnd_Inline.shdr', 'result_IfElifElseEnd_Inline_1.shdr', ['TestProp', 1]);
  122. end;
  123. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  124. //TTestCase_MainSimple//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  126. procedure TTestCase_FuncProcMain.Main_Simple;
  127. begin
  128. DoTest('code_Main_Simple.shdr', 'result_Main_Simple.shdr');
  129. end;
  130. procedure TTestCase_FuncProcMain.Func_Simple_0;
  131. begin
  132. DoTest('code_Func_Simple.shdr', 'result_Func_Simple_0.shdr', ['TestProperty', 0]);
  133. end;
  134. procedure TTestCase_FuncProcMain.Func_Simple_1;
  135. begin
  136. DoTest('code_Func_Simple.shdr', 'result_Func_Simple_1.shdr', ['TestProperty', 1]);
  137. end;
  138. procedure TTestCase_FuncProcMain.Proc_Inline;
  139. begin
  140. DoTest('code_Proc_Inline.shdr', 'result_Proc_Inline.shdr');
  141. end;
  142. procedure TTestCase_FuncProcMain.Func_InlineSingleReturn;
  143. begin
  144. DoTest('code_Func_InlineSingleReturn.shdr', 'result_Func_InlineSingleReturn.shdr');
  145. end;
  146. procedure TTestCase_FuncProcMain.Func_InlineMultiReturn;
  147. begin
  148. DoTest('code_Func_InlineMultiReturn.shdr', 'result_Func_InlineMultiReturn.shdr');
  149. end;
  150. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  151. //TTestCase_Include/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  152. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  153. procedure TTestCase_Include.Include_Simple;
  154. begin
  155. DoTest('code_Include_Simple.shdr', 'result_Include_Simple.shdr');
  156. end;
  157. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  158. //TTestCase_Class///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  159. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  160. procedure TTestCase_Class.Simple;
  161. begin
  162. DoTest('code_Class_Simple.shdr', 'SimpleClass', 'result_Class_Simple.shdr');
  163. end;
  164. initialization
  165. RegisterTest(TTestCase_IfElifElseEnd);
  166. RegisterTest(TTestCase_FuncProcMain);
  167. RegisterTest(TTestCase_Include);
  168. RegisterTest(TTestCase_Class);
  169. end.