2
0

options.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. Copyright (c) Contributors to the Open 3D Engine Project.
  5. For complete copyright and license terms please see the LICENSE at the root of this distribution.
  6. SPDX-License-Identifier: Apache-2.0 OR MIT
  7. """
  8. import sys
  9. import os
  10. sys.path.append("..")
  11. sys.path.append("../..")
  12. from clr import *
  13. import testfuncs
  14. def verifyOptionsEmission(thefile, compilerPath, silent):
  15. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--options"])
  16. if ok:
  17. predicates = []
  18. # check all references of func()
  19. predicates.append(lambda: j["ShaderOptions"][0]["defaultValue"] == "FakeT::One")
  20. predicates.append(lambda: j["ShaderOptions"][0]["name"] == "Fake1")
  21. predicates.append(lambda: j["ShaderOptions"][1]["defaultValue"] == "FakeT::Two")
  22. predicates.append(lambda: j["ShaderOptions"][1]["name"] == "Fake2")
  23. predicates.append(lambda: j["ShaderOptions"][2]["defaultValue"] == "FakeT::Three")
  24. predicates.append(lambda: j["ShaderOptions"][2]["name"] == "Fake3")
  25. predicates.append(lambda: j["ShaderOptions"][3]["defaultValue"] == "FakeT::Four")
  26. predicates.append(lambda: j["ShaderOptions"][3]["name"] == "Fake4")
  27. predicates.append(lambda: j["ShaderOptions"][4]["defaultValue"] == "FakeT::Five")
  28. predicates.append(lambda: j["ShaderOptions"][4]["name"] == "Fake5")
  29. # Currently the order of the options matches their order of declaration:
  30. for i in range(0, 15):
  31. predicates.append(lambda: j["ShaderOptions"][i]["order"] == i)
  32. # Some repetitive emissions
  33. for i in range(0, 11):
  34. predicates.append(lambda: j["ShaderOptions"][i]["type"] == "FakeT")
  35. predicates.append(lambda: j["ShaderOptions"][i]["keySize"] == 3)
  36. for i in range(5, 11):
  37. predicates.append(lambda: j["ShaderOptions"][i]["defaultValue"] == "FakeT::One")
  38. # Testing the key bit-packing and 32-bit alignment
  39. predicates.append(lambda: j["ShaderOptions"][0]["keyOffset"] == 0)
  40. predicates.append(lambda: j["ShaderOptions"][1]["keyOffset"] == 3)
  41. predicates.append(lambda: j["ShaderOptions"][2]["keyOffset"] == 6)
  42. predicates.append(lambda: j["ShaderOptions"][3]["keyOffset"] == 9)
  43. predicates.append(lambda: j["ShaderOptions"][4]["keyOffset"] == 12)
  44. predicates.append(lambda: j["ShaderOptions"][5]["keyOffset"] == 15)
  45. predicates.append(lambda: j["ShaderOptions"][6]["keyOffset"] == 18)
  46. predicates.append(lambda: j["ShaderOptions"][7]["keyOffset"] == 21)
  47. predicates.append(lambda: j["ShaderOptions"][8]["keyOffset"] == 24)
  48. predicates.append(lambda: j["ShaderOptions"][9]["keyOffset"] == 27)
  49. predicates.append(lambda: j["ShaderOptions"][10]["keyOffset"] == 32) # Notice the 32-bit alignment here!
  50. predicates.append(lambda: j["ShaderOptions"][11]["keyOffset"] == 35)
  51. predicates.append(lambda: j["ShaderOptions"][12]["defaultValue"] == "QualityT::High")
  52. predicates.append(lambda: j["ShaderOptions"][12]["name"] == "Quality")
  53. predicates.append(lambda: j["ShaderOptions"][12]["type"] == "QualityT")
  54. predicates.append(lambda: j["ShaderOptions"][12]["keyOffset"] == 38)
  55. predicates.append(lambda: j["ShaderOptions"][12]["keySize"] == 2)
  56. predicates.append(lambda: j["ShaderOptions"][13]["defaultValue"] == "Red")
  57. predicates.append(lambda: j["ShaderOptions"][13]["name"] == "Color")
  58. predicates.append(lambda: j["ShaderOptions"][13]["type"] == "ColorT")
  59. predicates.append(lambda: j["ShaderOptions"][13]["keyOffset"] == 40)
  60. predicates.append(lambda: j["ShaderOptions"][13]["keySize"] == 2)
  61. predicates.append(lambda: j["ShaderOptions"][14]["defaultValue"] == "true")
  62. predicates.append(lambda: j["ShaderOptions"][14]["name"] == "UseGI")
  63. predicates.append(lambda: j["ShaderOptions"][14]["type"] == "?bool")
  64. predicates.append(lambda: j["ShaderOptions"][14]["keyOffset"] == 42)
  65. predicates.append(lambda: j["ShaderOptions"][14]["keySize"] == 1)
  66. predicates.append(lambda: j["ShaderOptions"][15]["defaultValue"] == "42")
  67. predicates.append(lambda: j["ShaderOptions"][15]["name"] == "IntOption")
  68. predicates.append(lambda: j["ShaderOptions"][15]["type"] == "?int")
  69. predicates.append(lambda: j["ShaderOptions"][15]["keyOffset"] == 43)
  70. predicates.append(lambda: j["ShaderOptions"][15]["keySize"] == 6)
  71. predicates.append(lambda: j["ShaderOptions"][15]["range"] == True)
  72. predicates.append(lambda: j["ShaderOptions"][15]["values"][0] == "1")
  73. predicates.append(lambda: j["ShaderOptions"][15]["values"][1] == "64")
  74. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  75. ok = testfuncs.verifyAllPredicates(predicates, j)
  76. return True if ok else False
  77. def verifyOptionsEmissionIntegerRanges(thefile, compilerPath, silent):
  78. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--options"])
  79. if ok:
  80. predicates = []
  81. # check all references of func()
  82. for i in range(0, 2):
  83. predicates.append(lambda: j["ShaderOptions"][i]["type"] == "?int")
  84. predicates.append(lambda: j["ShaderOptions"][i]["range"] == True)
  85. predicates.append(lambda: j["ShaderOptions"][0]["defaultValue"] == "42")
  86. predicates.append(lambda: j["ShaderOptions"][0]["name"] == "IntOptionA")
  87. predicates.append(lambda: j["ShaderOptions"][0]["keyOffset"] == 0)
  88. predicates.append(lambda: j["ShaderOptions"][0]["keySize"] == 6)
  89. predicates.append(lambda: j["ShaderOptions"][0]["values"][0] == "1")
  90. predicates.append(lambda: j["ShaderOptions"][0]["values"][1] == "64")
  91. predicates.append(lambda: j["ShaderOptions"][1]["defaultValue"] == "7")
  92. predicates.append(lambda: j["ShaderOptions"][1]["name"] == "IntOptionB")
  93. predicates.append(lambda: j["ShaderOptions"][1]["keyOffset"] == 6)
  94. predicates.append(lambda: j["ShaderOptions"][1]["keySize"] == 2)
  95. predicates.append(lambda: j["ShaderOptions"][1]["values"][0] == "5")
  96. predicates.append(lambda: j["ShaderOptions"][1]["values"][1] == "8")
  97. predicates.append(lambda: j["ShaderOptions"][2]["defaultValue"] == "9")
  98. predicates.append(lambda: j["ShaderOptions"][2]["name"] == "IntOptionC")
  99. predicates.append(lambda: j["ShaderOptions"][2]["keyOffset"] == 8)
  100. predicates.append(lambda: j["ShaderOptions"][2]["keySize"] == 3)
  101. predicates.append(lambda: j["ShaderOptions"][2]["values"][0] == "5")
  102. predicates.append(lambda: j["ShaderOptions"][2]["values"][1] == "9")
  103. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  104. ok = testfuncs.verifyAllPredicates(predicates, j)
  105. return True if ok else False
  106. def verifyFail(thefile, compilerPath, silent):
  107. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--options"])
  108. return True if not ok else False
  109. result = 0 # to define for sub-tests
  110. resultFailed = 0
  111. def doTests(compiler, silent, azdxcpath):
  112. global result
  113. global resultFailed
  114. # Working directory should have been set to this script's directory by the calling parent
  115. # You can get it once doTests() is called, but not during initialization of the module,
  116. # because at that time it will still be set to the working directory of the calling script
  117. workDir = os.getcwd()
  118. if verifyOptionsEmission(os.path.join(workDir, "../Emission/Variants.azsl"), compiler, silent) : result += 1
  119. else: resultFailed += 1
  120. if verifyOptionsEmissionIntegerRanges(os.path.join(workDir, "../Samples/VariantsRanges.azsl"), compiler, silent) : result += 1
  121. else: resultFailed += 1
  122. # These tests will fail
  123. if verifyFail(os.path.join(workDir, "../Samples/AsError/int-range-bad-max.azsl"), compiler, silent) : result += 1
  124. else: resultFailed += 1
  125. if verifyFail(os.path.join(workDir, "../Samples/AsError/int-range-bad-min.azsl"), compiler, silent) : result += 1
  126. else: resultFailed += 1
  127. if verifyFail(os.path.join(workDir, "../Samples/AsError/int-range-no-args.azsl"), compiler, silent) : result += 1
  128. else: resultFailed += 1
  129. if verifyFail(os.path.join(workDir, "../Samples/AsError/int-range-swapped.azsl"), compiler, silent) : result += 1
  130. else: resultFailed += 1
  131. if __name__ == "__main__":
  132. print ("please call from testapp.py")