VerifierTest.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // VerifierTest.cpp //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. // //
  9. ///////////////////////////////////////////////////////////////////////////////
  10. #include <memory>
  11. #include <vector>
  12. #include <string>
  13. #include "dxc/Test/CompilationResult.h"
  14. #include "dxc/Test/HLSLTestData.h"
  15. #include <fstream>
  16. #ifdef _WIN32
  17. #include "WexTestClass.h"
  18. #define TEST_CLASS_DERIVATION
  19. #else
  20. #define TEST_CLASS_DERIVATION : public ::testing::Test
  21. #endif
  22. #include "dxc/Test/HlslTestUtils.h"
  23. using namespace std;
  24. // The test fixture.
  25. class VerifierTest TEST_CLASS_DERIVATION {
  26. public:
  27. BEGIN_TEST_CLASS(VerifierTest)
  28. TEST_CLASS_PROPERTY(L"Parallel", L"true")
  29. TEST_METHOD_PROPERTY(L"Priority", L"0")
  30. END_TEST_CLASS()
  31. TEST_METHOD(RunArrayIndexOutOfBounds)
  32. TEST_METHOD(RunArrayLength)
  33. TEST_METHOD(RunAttributes)
  34. TEST_METHOD(RunBuiltinTypesNoInheritance)
  35. TEST_METHOD(RunConstExpr)
  36. TEST_METHOD(RunConstAssign)
  37. TEST_METHOD(RunConstDefault)
  38. TEST_METHOD(RunConversionsBetweenTypeShapes)
  39. TEST_METHOD(RunConversionsNonNumericAggregates)
  40. TEST_METHOD(RunCppErrors)
  41. TEST_METHOD(RunCppErrorsHV2015)
  42. TEST_METHOD(RunCXX11Attributes)
  43. TEST_METHOD(RunEnums)
  44. TEST_METHOD(RunFunctions)
  45. TEST_METHOD(RunIncompleteType)
  46. TEST_METHOD(RunIndexingOperator)
  47. TEST_METHOD(RunIntrinsicExamples)
  48. TEST_METHOD(RunMatrixAssignments)
  49. TEST_METHOD(RunMatrixSyntax)
  50. TEST_METHOD(RunMatrixSyntaxExactPrecision)
  51. TEST_METHOD(RunMintypesPromotionWarnings)
  52. TEST_METHOD(RunMoreOperators)
  53. TEST_METHOD(RunObjectOperators)
  54. TEST_METHOD(RunPackReg)
  55. TEST_METHOD(RunRayTracings)
  56. TEST_METHOD(RunScalarAssignments)
  57. TEST_METHOD(RunScalarAssignmentsExactPrecision)
  58. TEST_METHOD(RunScalarOperatorsAssign)
  59. TEST_METHOD(RunScalarOperatorsAssignExactPrecision)
  60. TEST_METHOD(RunScalarOperators)
  61. TEST_METHOD(RunScalarOperatorsExactPrecision)
  62. TEST_METHOD(RunSizeof)
  63. TEST_METHOD(RunString)
  64. TEST_METHOD(RunStructAssignments)
  65. TEST_METHOD(RunSubobjects)
  66. TEST_METHOD(RunIncompleteArray)
  67. TEST_METHOD(RunTemplateChecks)
  68. TEST_METHOD(RunVarmodsSyntax)
  69. TEST_METHOD(RunVectorAssignments)
  70. TEST_METHOD(RunVectorSyntaxMix)
  71. TEST_METHOD(RunVectorSyntax)
  72. TEST_METHOD(RunVectorSyntaxExactPrecision)
  73. TEST_METHOD(RunTypemodsSyntax)
  74. TEST_METHOD(RunSemantics)
  75. TEST_METHOD(RunImplicitCasts)
  76. TEST_METHOD(RunDerivedToBaseCasts)
  77. TEST_METHOD(RunLiterals)
  78. TEST_METHOD(RunEffectsSyntax)
  79. TEST_METHOD(RunVectorConditional)
  80. TEST_METHOD(RunUint4Add3)
  81. TEST_METHOD(RunBadInclude)
  82. TEST_METHOD(RunWave)
  83. TEST_METHOD(RunBinopDims)
  84. void CheckVerifies(const wchar_t* path) {
  85. WEX::TestExecution::SetVerifyOutput verifySettings(WEX::TestExecution::VerifyOutputSettings::LogOnlyFailures);
  86. const char startMarker[] = "%clang_cc1";
  87. const char endMarker[] = "%s";
  88. char firstLine[200];
  89. memset(firstLine, 0, sizeof(firstLine));
  90. char* commandLine;
  91. //
  92. // Very simple processing for now.
  93. // See utils\lit\lit\TestRunner.py for the more thorough implementation.
  94. //
  95. // The first line for HLSL tests will always look like this:
  96. // // RUN: %clang_cc1 -fsyntax-only -Wno-unused-value -ffreestanding -verify %s
  97. //
  98. // We turn this into ' -fsyntax-only -Wno-unused-value -ffreestanding -verify ' by offseting after %clang_cc1
  99. // and chopping off everything after '%s'.
  100. //
  101. {
  102. ifstream infile(CW2A(path).m_psz);
  103. ASSERT_EQ(false, infile.bad());
  104. infile.getline(firstLine, _countof(firstLine));
  105. char* found = strstr(firstLine, startMarker);
  106. ASSERT_NE(nullptr, found);
  107. commandLine = found + strlen(startMarker);
  108. char* fileArgument = strstr(commandLine, endMarker);
  109. ASSERT_NE(nullptr, fileArgument);
  110. *fileArgument = '\0';
  111. }
  112. CW2A asciiPath(path);
  113. CompilationResult result = CompilationResult::CreateForCommandLine(commandLine, asciiPath);
  114. if (!result.ParseSucceeded()) {
  115. std::stringstream ss;
  116. ss << "for program " << asciiPath << " with errors:\n" << result.GetTextForErrors();
  117. CA2W pszW(ss.str().c_str());
  118. ::WEX::Logging::Log::Comment(pszW);
  119. }
  120. VERIFY_IS_TRUE(result.ParseSucceeded());
  121. }
  122. void CheckVerifiesHLSL(LPCWSTR name) {
  123. // Having a test per file makes it very easy to filter from the command line.
  124. CheckVerifies(hlsl_test::GetPathToHlslDataFile(name).c_str());
  125. }
  126. };
  127. TEST_F(VerifierTest, RunArrayIndexOutOfBounds) {
  128. CheckVerifiesHLSL(L"array-index-out-of-bounds.hlsl");
  129. CheckVerifiesHLSL(L"array-index-out-of-bounds-HV-2016.hlsl");
  130. }
  131. TEST_F(VerifierTest, RunArrayLength) {
  132. CheckVerifiesHLSL(L"array-length.hlsl");
  133. }
  134. TEST_F(VerifierTest, RunAttributes) {
  135. CheckVerifiesHLSL(L"attributes.hlsl");
  136. }
  137. TEST_F(VerifierTest, RunBuiltinTypesNoInheritance) {
  138. CheckVerifiesHLSL(L"builtin-types-no-inheritance.hlsl");
  139. }
  140. TEST_F(VerifierTest, RunConstExpr) {
  141. CheckVerifiesHLSL(L"const-expr.hlsl");
  142. }
  143. TEST_F(VerifierTest, RunConstAssign) {
  144. CheckVerifiesHLSL(L"const-assign.hlsl");
  145. }
  146. TEST_F(VerifierTest, RunConstDefault) {
  147. CheckVerifiesHLSL(L"const-default.hlsl");
  148. }
  149. TEST_F(VerifierTest, RunConversionsBetweenTypeShapes) {
  150. CheckVerifiesHLSL(L"conversions-between-type-shapes.hlsl");
  151. }
  152. TEST_F(VerifierTest, RunConversionsNonNumericAggregates) {
  153. CheckVerifiesHLSL(L"conversions-non-numeric-aggregates.hlsl");
  154. }
  155. TEST_F(VerifierTest, RunCppErrors) {
  156. CheckVerifiesHLSL(L"cpp-errors.hlsl");
  157. }
  158. TEST_F(VerifierTest, RunCppErrorsHV2015) {
  159. CheckVerifiesHLSL(L"cpp-errors-hv2015.hlsl");
  160. }
  161. TEST_F(VerifierTest, RunCXX11Attributes) {
  162. CheckVerifiesHLSL(L"cxx11-attributes.hlsl");
  163. }
  164. TEST_F(VerifierTest, RunEnums) {
  165. CheckVerifiesHLSL(L"enums.hlsl");
  166. }
  167. TEST_F(VerifierTest, RunFunctions) {
  168. CheckVerifiesHLSL(L"functions.hlsl");
  169. }
  170. TEST_F(VerifierTest, RunIncompleteType) {
  171. CheckVerifiesHLSL(L"incomplete-type.hlsl");
  172. }
  173. TEST_F(VerifierTest, RunIndexingOperator) {
  174. CheckVerifiesHLSL(L"indexing-operator.hlsl");
  175. }
  176. TEST_F(VerifierTest, RunIntrinsicExamples) {
  177. CheckVerifiesHLSL(L"intrinsic-examples.hlsl");
  178. }
  179. TEST_F(VerifierTest, RunMatrixAssignments) {
  180. CheckVerifiesHLSL(L"matrix-assignments.hlsl");
  181. }
  182. TEST_F(VerifierTest, RunMatrixSyntax) {
  183. CheckVerifiesHLSL(L"matrix-syntax.hlsl");
  184. }
  185. TEST_F(VerifierTest, RunMatrixSyntaxExactPrecision) {
  186. CheckVerifiesHLSL(L"matrix-syntax-exact-precision.hlsl");
  187. }
  188. TEST_F(VerifierTest, RunMintypesPromotionWarnings) {
  189. CheckVerifiesHLSL(L"mintypes-promotion-warnings.hlsl");
  190. }
  191. TEST_F(VerifierTest, RunMoreOperators) {
  192. CheckVerifiesHLSL(L"more-operators.hlsl");
  193. }
  194. TEST_F(VerifierTest, RunObjectOperators) {
  195. CheckVerifiesHLSL(L"object-operators.hlsl");
  196. }
  197. TEST_F(VerifierTest, RunPackReg) {
  198. CheckVerifiesHLSL(L"packreg.hlsl");
  199. }
  200. TEST_F(VerifierTest, RunRayTracings) {
  201. CheckVerifiesHLSL(L"raytracings.hlsl");
  202. }
  203. TEST_F(VerifierTest, RunScalarAssignments) {
  204. CheckVerifiesHLSL(L"scalar-assignments.hlsl");
  205. }
  206. TEST_F(VerifierTest, RunScalarAssignmentsExactPrecision) {
  207. CheckVerifiesHLSL(L"scalar-assignments-exact-precision.hlsl");
  208. }
  209. TEST_F(VerifierTest, RunScalarOperatorsAssign) {
  210. CheckVerifiesHLSL(L"scalar-operators-assign.hlsl");
  211. }
  212. TEST_F(VerifierTest, RunScalarOperatorsAssignExactPrecision) {
  213. CheckVerifiesHLSL(L"scalar-operators-assign-exact-precision.hlsl");
  214. }
  215. TEST_F(VerifierTest, RunScalarOperators) {
  216. CheckVerifiesHLSL(L"scalar-operators.hlsl");
  217. }
  218. TEST_F(VerifierTest, RunScalarOperatorsExactPrecision) {
  219. CheckVerifiesHLSL(L"scalar-operators-exact-precision.hlsl");
  220. }
  221. TEST_F(VerifierTest, RunSizeof) {
  222. CheckVerifiesHLSL(L"sizeof.hlsl");
  223. }
  224. TEST_F(VerifierTest, RunString) {
  225. CheckVerifiesHLSL(L"string.hlsl");
  226. }
  227. TEST_F(VerifierTest, RunStructAssignments) {
  228. CheckVerifiesHLSL(L"struct-assignments.hlsl");
  229. }
  230. TEST_F(VerifierTest, RunSubobjects) {
  231. CheckVerifiesHLSL(L"subobjects-syntax.hlsl");
  232. }
  233. TEST_F(VerifierTest, RunIncompleteArray) {
  234. CheckVerifiesHLSL(L"incomp_array_err.hlsl");
  235. }
  236. TEST_F(VerifierTest, RunTemplateChecks) {
  237. CheckVerifiesHLSL(L"template-checks.hlsl");
  238. }
  239. TEST_F(VerifierTest, RunVarmodsSyntax) {
  240. CheckVerifiesHLSL(L"varmods-syntax.hlsl");
  241. }
  242. TEST_F(VerifierTest, RunVectorAssignments) {
  243. CheckVerifiesHLSL(L"vector-assignments.hlsl");
  244. }
  245. TEST_F(VerifierTest, RunVectorSyntaxMix) {
  246. CheckVerifiesHLSL(L"vector-syntax-mix.hlsl");
  247. }
  248. TEST_F(VerifierTest, RunVectorSyntax) {
  249. CheckVerifiesHLSL(L"vector-syntax.hlsl");
  250. }
  251. TEST_F(VerifierTest, RunVectorSyntaxExactPrecision) {
  252. CheckVerifiesHLSL(L"vector-syntax-exact-precision.hlsl");
  253. }
  254. TEST_F(VerifierTest, RunTypemodsSyntax) {
  255. CheckVerifiesHLSL(L"typemods-syntax.hlsl");
  256. }
  257. TEST_F(VerifierTest, RunSemantics) {
  258. CheckVerifiesHLSL(L"semantics.hlsl");
  259. }
  260. TEST_F(VerifierTest, RunImplicitCasts) {
  261. CheckVerifiesHLSL(L"implicit-casts.hlsl");
  262. }
  263. TEST_F(VerifierTest, RunDerivedToBaseCasts) {
  264. CheckVerifiesHLSL(L"derived-to-base.hlsl");
  265. }
  266. TEST_F(VerifierTest, RunLiterals) {
  267. CheckVerifiesHLSL(L"literals.hlsl");
  268. }
  269. TEST_F(VerifierTest, RunEffectsSyntax) {
  270. CheckVerifiesHLSL(L"effects-syntax.hlsl");
  271. }
  272. TEST_F(VerifierTest, RunVectorConditional) {
  273. CheckVerifiesHLSL(L"vector-conditional.hlsl");
  274. }
  275. TEST_F(VerifierTest, RunUint4Add3) {
  276. CheckVerifiesHLSL(L"uint4_add3.hlsl");
  277. }
  278. TEST_F(VerifierTest, RunBadInclude) {
  279. CheckVerifiesHLSL(L"bad-include.hlsl");
  280. }
  281. TEST_F(VerifierTest, RunWave) {
  282. CheckVerifiesHLSL(L"wave.hlsl");
  283. }
  284. TEST_F(VerifierTest, RunBinopDims) {
  285. CheckVerifiesHLSL(L"binop-dims.hlsl");
  286. }