ShaderBuilderUtilityTests.cpp 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzTest/AzTest.h>
  9. #include <AzCore/UnitTest/TestTypes.h>
  10. #include "Common/ShaderBuilderTestFixture.h"
  11. #include <ShaderBuilderUtility.h>
  12. namespace UnitTest
  13. {
  14. using namespace AZ;
  15. // The main purpose of this class is to test ShaderBuilderUtility functions
  16. class ShaderBuilderUtilityTests : public ShaderBuilderTestFixture
  17. {
  18. }; // class ShaderBuilderUtilityTests
  19. void ExpectHasIncludeFile(const AZStd::vector<AZStd::string> fileList, bool shouldExist, const char* filePath)
  20. {
  21. //We must normalize because internally AZ::ShaderBuilder::ShaderBuilderUtility::IncludedFilesParser
  22. // always returns normalized paths.
  23. AZStd::string filePathNormalized(filePath);
  24. AzFramework::StringFunc::Path::Normalize(filePathNormalized);
  25. auto it = AZStd::find(fileList.begin(), fileList.end(), filePathNormalized);
  26. if (shouldExist)
  27. {
  28. EXPECT_TRUE(it != fileList.end()) << "Could not find path '" << filePath << "' in the include list.";
  29. }
  30. else
  31. {
  32. EXPECT_TRUE(it == fileList.end()) << "Path '" << filePath << "' should not be in the include list.";
  33. }
  34. }
  35. TEST_F(ShaderBuilderUtilityTests, IncludedFilesParser_ParseStringAndGetIncludedFiles)
  36. {
  37. AZStd::string haystack(
  38. R"(
  39. Some content to parse
  40. #include <valid_file1.azsli>
  41. // #include <valid_file2.azsli>
  42. blah # include "valid_file3.azsli"
  43. bar include <a\dire-ctory\invalid-file4.azsli>
  44. foo # include "a/directory/valid-file5.azsli"
  45. # include <a\dire-ctory\valid-file6.azsli>
  46. #includ "a\dire-ctory\invalid-file7.azsli"
  47. #include <..\Relative\Path\To\File.azsi>
  48. #include <C:\Absolute\Path\To\File.azsi>
  49. )"
  50. );
  51. AZ::ShaderBuilder::ShaderBuilderUtility::IncludedFilesParser includedFilesParser;
  52. auto fileList = includedFilesParser.ParseStringAndGetIncludedFiles(haystack);
  53. EXPECT_EQ(fileList.size(), 7);
  54. ExpectHasIncludeFile(fileList, true, "valid_file1.azsli");
  55. ExpectHasIncludeFile(fileList, true, "valid_file2.azsli");
  56. ExpectHasIncludeFile(fileList, true, "valid_file3.azsli");
  57. ExpectHasIncludeFile(fileList, false, "a\\dire-ctory\\invalid-file4.azsli");
  58. ExpectHasIncludeFile(fileList, true, "a\\directory\\valid-file5.azsli");
  59. ExpectHasIncludeFile(fileList, true, "a\\dire-ctory\\valid-file6.azsli");
  60. ExpectHasIncludeFile(fileList, false, "a\\dire-ctory\\invalid-file7.azsli");
  61. ExpectHasIncludeFile(fileList, true, "C:\\Absolute\\Path\\To\\File.azsi");
  62. ExpectHasIncludeFile(fileList, true, "..\\Relative\\Path\\To\\File.azsi");
  63. }
  64. TEST_F(ShaderBuilderUtilityTests, IncludedFilesParser_HandleMaterialPipelineMacro)
  65. {
  66. // This is a temporary solution to support material pipeline where the include path is specified in a #define and
  67. // later included like #include MATERIAL_TYPE_AZSLI_FILE_PATH
  68. AZStd::string haystack(
  69. R"(
  70. #define MATERIAL_TYPE_AZSLI_FILE_PATH "D:\o3de\Gems\Atom\TestData\TestData\Materials\Types\MaterialPipelineTest_Animated.azsli"
  71. #include "D:\o3de\Gems\Atom\Feature\Common\Assets\Materials\Pipelines\LowEndPipeline\ForwardPass_BaseLighting.azsli"
  72. )"
  73. );
  74. AZ::ShaderBuilder::ShaderBuilderUtility::IncludedFilesParser includedFilesParser;
  75. auto fileList = includedFilesParser.ParseStringAndGetIncludedFiles(haystack);
  76. EXPECT_EQ(fileList.size(), 2);
  77. ExpectHasIncludeFile(fileList, true, R"(D:\o3de\Gems\Atom\TestData\TestData\Materials\Types\MaterialPipelineTest_Animated.azsli)");
  78. ExpectHasIncludeFile(fileList, true, R"(D:\o3de\Gems\Atom\Feature\Common\Assets\Materials\Pipelines\LowEndPipeline\ForwardPass_BaseLighting.azsli)");
  79. }
  80. } //namespace UnitTest
  81. //AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);