seenat.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  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. from clr import *
  12. import testfuncs
  13. def testVariables(thefile, compilerPath, silent):
  14. '''return number of successes'''
  15. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  16. if ok:
  17. predicates = []
  18. # check that there is global variable `a`
  19. predicates.append(lambda: symbols["Symbol '/a'"]['kind'] == 'Variable')
  20. predicates.append(lambda: symbols["Symbol '/a'"]['type']['core']['name'] == '?int')
  21. # and its only reference is at line 41
  22. predicates.append(lambda: len(symbols["Symbol '/a'"]['references']) == 1)
  23. predicates.append(lambda: symbols["Symbol '/a'"]['references'][0]['line'] == 42) # .. a + b;
  24. # now check global var `b`
  25. predicates.append(lambda: symbols["Symbol '/b'"]['kind'] == 'Variable')
  26. predicates.append(lambda: symbols["Symbol '/b'"]['type']['core']['name'] == '?int')
  27. predicates.append(lambda: set(symbols["Symbol '/b'"]['storage'].split()) == set(['static', 'const']))
  28. # it appears in 2 places:
  29. predicates.append(lambda: len(symbols["Symbol '/b'"]['references']) == 2)
  30. predicates.append(lambda: symbols["Symbol '/b'"]['references'][0]['line'] == 10) # c = b;
  31. predicates.append(lambda: symbols["Symbol '/b'"]['references'][1]['line'] == 42) # .. a + b;
  32. # check member variable `c`
  33. predicates.append(lambda: len(symbols["Symbol '/S/c'"]['references']) == 5)
  34. predicates.append(lambda: symbols["Symbol '/S/c'"]['references'][0]['line'] == 10) # c = b;
  35. predicates.append(lambda: symbols["Symbol '/S/c'"]['references'][1]['line'] == 11) # return c;
  36. predicates.append(lambda: symbols["Symbol '/S/c'"]['references'][2]['line'] == 30) # param.c;
  37. predicates.append(lambda: symbols["Symbol '/S/c'"]['references'][3]['line'] == 31) # param.c (first appearance)
  38. predicates.append(lambda: symbols["Symbol '/S/c'"]['references'][4]['line'] == 31) # param.c; (last appearance)
  39. # check deep nested `d`
  40. predicates.append(lambda: len(symbols["Symbol '/S/N/NN/NNN/d'"]['references']) == 2)
  41. predicates.append(lambda: symbols["Symbol '/S/N/NN/NNN/d'"]['references'][0]['line'] == 44) # the 's' in `if (s.n.nn.nnn.d)`
  42. predicates.append(lambda: symbols["Symbol '/S/N/NN/NNN/d'"]['references'][1]['line'] == 50) # on the right of assignment
  43. # check refs to global `s` of UDT
  44. predicates.append(lambda: symbols["Symbol '/s'"]['references'][0]['line'] == 36) # ref to ::s as passed to func(s)
  45. predicates.append(lambda: symbols["Symbol '/s'"]['references'][1]['line'] == 44) # ref to ::s in the s.n.nn... expression
  46. predicates.append(lambda: symbols["Symbol '/s'"]['references'][2]['line'] == 48) # ref to ::s in assignment RHS
  47. # check ref to local var `c`
  48. predicates.append(lambda: symbols["Symbol '/main()/c'"]['references'][0]['line'] == 41) # first assignment (LHS)
  49. # check refs to s1: (local var of type sampler)()
  50. predicates.append(lambda: symbols["Symbol '/main()/s1'"]['references'][0]['line'] == 53)
  51. predicates.append(lambda: symbols["Symbol '/main()/s1'"]['references'][0]['col'] == 33)
  52. # check refs to s2: (local var of type sampler)()
  53. predicates.append(lambda: symbols["Symbol '/main()/s2'"]['references'][0]['line'] == 57)
  54. predicates.append(lambda: symbols["Symbol '/main()/s2'"]['references'][0]['col'] == 42)
  55. # check refs to tex in the if scope
  56. predicates.append(lambda: symbols["Symbol '/main()/$bk1/tex'"]['references'][0]['line'] == 53)
  57. predicates.append(lambda: symbols["Symbol '/main()/$bk1/tex'"]['references'][0]['col'] == 21)
  58. # check refs to tex after the if scope
  59. predicates.append(lambda: symbols["Symbol '/main()/tex'"]['references'][0]['line'] == 57)
  60. predicates.append(lambda: symbols["Symbol '/main()/tex'"]['references'][0]['col'] == 31)
  61. if not silent: print (fg.CYAN+ style.BRIGHT+ "variable references verification..."+ style.RESET_ALL)
  62. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  63. if ok and not silent:
  64. print (style.BRIGHT+ "OK! "+ str(len(predicates)) + " variable references predicates verified."+ style.RESET_ALL)
  65. return ok
  66. def testFunctions(thefile, compilerPath, silent):
  67. '''return number of successes'''
  68. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  69. if ok:
  70. predicates = []
  71. # check all references of func()
  72. predicates.append(lambda: symbols["Symbol '/func()'"]['kind'] == 'Function')
  73. predicates.append(lambda: symbols["Symbol '/func()'"]['references'][0]['line'] == 1) # first declaration
  74. predicates.append(lambda: symbols["Symbol '/func()'"]['references'][1]['line'] == 5) # call in psmain
  75. predicates.append(lambda: symbols["Symbol '/func()'"]['references'][2]['line'] == 14) # re-declaration
  76. predicates.append(lambda: symbols["Symbol '/func()'"]['references'][3]['line'] == 25) # in typeof expression
  77. predicates.append(lambda: symbols["Symbol '/func()'"]['references'][4]['line'] == 26) # in switch condition expression
  78. predicates.append(lambda: symbols["Symbol '/func()'"]['references'][5]['line'] == 29) # call in assignment
  79. predicates.append(lambda: symbols["Symbol '/func()'"]['references'][6]['line'] == 35) # ref 7 in constructor
  80. # note that "nope" cases didn't appear as false positive references, otherwise they would have
  81. # disrupted the index.
  82. if not silent: print (fg.CYAN+ style.BRIGHT+ "functions references verification..."+ style.RESET_ALL)
  83. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  84. if ok and not silent:
  85. print (style.BRIGHT+ "OK! "+ str(len(predicates))+ " function references predicates verified."+ style.RESET_ALL)
  86. return ok
  87. def testMethods(thefile, compilerPath, silent):
  88. '''return number of successes'''
  89. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  90. if ok:
  91. predicates = []
  92. # let's verify that there is a free function with name f at global scope
  93. predicates.append(lambda: symbols["Symbol '/f(?int)'"]['kind'] == 'Function') # this is a symbol meant to lead the tool to possible confusion
  94. predicates.append(lambda: symbols["Symbol '/f(?int)'"]['line'] == 1)
  95. predicates.append(lambda: symbols["Symbol '/_(?int)'"]['kind'] == 'Function') # just there test function call expressions with minimal visual pollution
  96. predicates.append(lambda: symbols["Symbol '/_(?int)'"]['line'] == 2)
  97. # setup ok, let's see the references to the Parent/f family
  98. predicates.append(lambda: symbols["Symbol '/Parent/f(?int)'"]['kind'] == 'Function')
  99. predicates.append(lambda: len(symbols["Symbol '/Parent/f(?int)'"]['references']) <= 1) # one ref to itself max. since you can't call it directly.
  100. predicates.append(lambda: symbols["Symbol '/Parent/f(?int)'"]["has overriding children"][0]["name"] == "/Child/f(?int)") # one child does override
  101. # let's check the child also back-refers to this parent:
  102. predicates.append(lambda: symbols["Symbol '/Child/f(?int)'"]["is hiding base symbol"] == "/Parent/f(?int)")
  103. # let's checkout the references of this child:
  104. appearanceLines = [16, 21, 23, 24, 33, 34, 37] # as per comments in the file ref, ref2, ref3...
  105. for ii, line in enumerate(appearanceLines):
  106. predicates.append(lambda ii=ii, line=line: symbols["Symbol '/Child/f(?int)'"]['references'][ii]['line'] == line)
  107. if not silent: print (fg.CYAN+ style.BRIGHT+ "methods references verification..."+ style.RESET_ALL)
  108. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  109. if ok and not silent:
  110. print (style.BRIGHT+ "OK! "+ str(len(predicates))+ " methods references predicates verified."+ style.RESET_ALL)
  111. return ok
  112. def testStructs(thefile, compilerPath, silent):
  113. '''return number of successes'''
  114. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  115. if ok:
  116. predicates = []
  117. appearanceLines = [7, 12, 13, 15, 20, 29, 36, 40] # as per comments in the file ref, ref2, ref3...
  118. for ii, line in enumerate(appearanceLines):
  119. predicates.append(lambda ii=ii, line=line: symbols["Symbol '/S'"]['references'][ii]['line'] == line)
  120. if not silent: print (fg.CYAN+ style.BRIGHT+ "structs references verification..."+ style.RESET_ALL)
  121. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  122. if ok and not silent:
  123. print (style.BRIGHT+ "OK! "+ str(len(predicates))+ " structs references predicates verified."+ style.RESET_ALL)
  124. return ok
  125. def testSRGs(thefile, compilerPath, silent):
  126. '''return number of successes'''
  127. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  128. if ok:
  129. predicates = []
  130. # let's check MySRG
  131. appearances = [(24,5), (29,5), (29,24), (30,12), (31,14), (33,15), (35,17), (39,48), (41,19), (41,41)] # line:col
  132. for ii, lineCol in enumerate(appearances):
  133. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/MySRG'"]['references'][ii]['line'] == lineCol[0])
  134. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/MySRG'"]['references'][ii]['col'] == lineCol[1])
  135. # let's check Inner
  136. appearances = [(17,22), (24,12), (29,12), (30,19), (31,23)]
  137. for ii, lineCol in enumerate(appearances):
  138. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/MySRG/Inner'"]['references'][ii]['line'] == lineCol[0])
  139. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/MySRG/Inner'"]['references'][ii]['col'] == lineCol[1])
  140. # let's check m_mat
  141. appearances = [(30,26), (30,43), (41,57)]
  142. for ii, lineCol in enumerate(appearances):
  143. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/MySRG/Inner/m_mat'"]['references'][ii]['line'] == lineCol[0])
  144. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/MySRG/Inner/m_mat'"]['references'][ii]['col'] == lineCol[1])
  145. # check one appearance of Deep
  146. predicates.append(lambda: symbols["Symbol '/MySRG/Inner/Deep'"]['references'][0]['line'] == 32)
  147. predicates.append(lambda: symbols["Symbol '/MySRG/Inner/Deep'"]['references'][0]['col'] == 21)
  148. # check m_h (as a leaf)
  149. predicates.append(lambda: symbols["Symbol '/MySRG/Inner/Deep/m_h'"]['references'][0]['line'] == 32)
  150. predicates.append(lambda: symbols["Symbol '/MySRG/Inner/Deep/m_h'"]['references'][0]['col'] == 29)
  151. predicates.append(lambda: symbols["Symbol '/MySRG/Inner/Deep/m_h'"]['references'][1]['line'] == 32)
  152. predicates.append(lambda: symbols["Symbol '/MySRG/Inner/Deep/m_h'"]['references'][1]['col'] == 55)
  153. # check m_deep (as an instance declared from a type grammar rule)
  154. predicates.append(lambda: symbols["Symbol '/MySRG/Inner/m_deep'"]['references'][0]['line'] == 32)
  155. predicates.append(lambda: symbols["Symbol '/MySRG/Inner/m_deep'"]['references'][0]['col'] == 48)
  156. # check m_stb as a special type of data (structured buffer)
  157. predicates.append(lambda: symbols["Symbol '/MySRG/m_stb'"]['references'][0]['line'] == 29)
  158. predicates.append(lambda: symbols["Symbol '/MySRG/m_stb'"]['references'][0]['col'] == 31)
  159. predicates.append(lambda: symbols["Symbol '/MySRG/m_stb'"]['references'][1]['line'] == 41)
  160. predicates.append(lambda: symbols["Symbol '/MySRG/m_stb'"]['references'][1]['col'] == 48)
  161. # check ref to SData as a local variable type
  162. predicates.append(lambda: symbols["Symbol '/SData'"]['references'][0]['line'] == 36)
  163. predicates.append(lambda: symbols["Symbol '/SData'"]['references'][0]['col'] == 5)
  164. # check sampler ref line 34
  165. predicates.append(lambda: symbols["Symbol '/MySRG/m_sampler'"]['references'][0]['line'] == 35)
  166. # ref to d, clr, s
  167. predicates.append(lambda: symbols["Symbol '/main()/d'"]['references'][0]['line'] == 37)
  168. predicates.append(lambda: symbols["Symbol '/SData/clr'"]['references'][0]['line'] == 37)
  169. predicates.append(lambda: symbols["Symbol '/main()/s'"]['references'][0]['line'] == 37)
  170. # ref to f at the end
  171. predicates.append(lambda: symbols["Symbol '/main()/f'"]['references'][0]['line'] == 41)
  172. predicates.append(lambda: symbols["Symbol '/main()/f'"]['references'][0]['col'] == 31)
  173. # worldmatrix
  174. predicates.append(lambda: symbols["Symbol '/MySRG/m_worldMatrix'"]['references'][0]['line'] == 39)
  175. predicates.append(lambda: symbols["Symbol '/MySRG/m_worldMatrix'"]['references'][0]['col'] == 55)
  176. if not silent: print (fg.CYAN+ style.BRIGHT+ "SRG references verification..."+ style.RESET_ALL)
  177. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  178. if ok and not silent:
  179. print (style.BRIGHT+ "OK! "+ str(len(predicates))+ " SRG references predicates verified."+ style.RESET_ALL)
  180. return ok
  181. def testCBs(thefile, compilerPath, silent):
  182. '''return number of successes'''
  183. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  184. if ok:
  185. predicates = []
  186. # let's check that m_diffuseColor appears in the good places
  187. appearances = [(17,34), (26,48), (43,49), (45,38), (51,18)] # line:col
  188. for ii, lineCol in enumerate(appearances):
  189. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/MySRGOne/InnerStruct/m_diffuseColor'"]['references'][ii]['line'] == lineCol[0])
  190. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/MySRGOne/InnerStruct/m_diffuseColor'"]['references'][ii]['col'] == lineCol[1])
  191. # let's check the real materialConstants references
  192. appearances = [(17,16), (26,30), (42,29), (43,31), (44,49)] # line:col
  193. for ii, lineCol in enumerate(appearances):
  194. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/MySRGOne/materialConstants'"]['references'][ii]['line'] == lineCol[0])
  195. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/MySRGOne/materialConstants'"]['references'][ii]['col'] == lineCol[1])
  196. # let's check the global decoy main/materialConstants references
  197. appearances = [(41,5), (45,20), (48,17)] # line:col
  198. for ii, lineCol in enumerate(appearances):
  199. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/materialConstants'"]['references'][ii]['line'] == lineCol[0])
  200. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/materialConstants'"]['references'][ii]['col'] == lineCol[1])
  201. # let's check the local decoy main/materialConstants references
  202. appearances = [(47,19), (49,24)] # line:col
  203. for ii, lineCol in enumerate(appearances):
  204. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/main(?float2)/MySRGOne/materialConstants'"]['references'][ii]['line'] == lineCol[0])
  205. predicates.append(lambda ii=ii, lineCol=lineCol: symbols["Symbol '/main(?float2)/MySRGOne/materialConstants'"]['references'][ii]['col'] == lineCol[1])
  206. if not silent: print (fg.CYAN+ style.BRIGHT+ "CB references verification..."+ style.RESET_ALL)
  207. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  208. if ok and not silent:
  209. print (style.BRIGHT+ "OK! "+ str(len(predicates))+ " CB references verified."+ style.RESET_ALL)
  210. return ok
  211. # test Member Access Expression
  212. def testMAE(thefile, compilerPath, silent):
  213. '''return number of successes'''
  214. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  215. if ok:
  216. predicates = []
  217. predicates.append(lambda: symbols["Symbol '/A'"]['references'][0]['line'] == 8)
  218. predicates.append(lambda: symbols["Symbol '/A'"]['references'][0]['col'] == 5)
  219. predicates.append(lambda: symbols["Symbol '/A'"]['references'][1]['line'] == 9)
  220. predicates.append(lambda: symbols["Symbol '/A'"]['references'][1]['col'] == 7)
  221. if not silent: print (fg.CYAN+ style.BRIGHT+ "qualified-id verification..."+ style.RESET_ALL)
  222. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  223. if ok and not silent:
  224. print (style.BRIGHT+ "OK! "+ str(len(predicates))+ " qualified-id verified."+ style.RESET_ALL)
  225. return ok
  226. # test Deported Method definition test file
  227. def testDeported(thefile, compilerPath, silent):
  228. '''return number of successes'''
  229. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  230. if ok:
  231. predicates = []
  232. # check *
  233. predicates.append(lambda: symbols["Symbol '/Random/Next()'"]['line'] == 20)
  234. predicates.append(lambda: symbols["Symbol '/Random/Next()'"]['def line'] == 34)
  235. predicates.append(lambda: symbols["Symbol '/Random/Next()'"]['references'][0]['line'] == 20)
  236. predicates.append(lambda: symbols["Symbol '/Random/Next()'"]['references'][1]['line'] == 29)
  237. # check **
  238. predicates.append(lambda: symbols["Symbol '/Random/cur'"]['line'] == 23)
  239. predicates.append(lambda: symbols["Symbol '/Random/cur'"]['references'][0]['line'] == 28)
  240. predicates.append(lambda: symbols["Symbol '/Random/cur'"]['references'][1]['line'] == 38)
  241. # check ***
  242. predicates.append(lambda: symbols["Symbol '/Random/Init()'"]['line'] == 26)
  243. predicates.append(lambda: symbols["Symbol '/Random/Init()'"]['def line'] == 26)
  244. predicates.append(lambda: symbols["Symbol '/Random/Init()'"]['references'][0]['line'] == 37)
  245. predicates.append(lambda: symbols["Symbol '/Random/Init()'"]['references'][1]['line'] == 45)
  246. if not silent: print (fg.CYAN+ style.BRIGHT+ " deported-methods verification..."+ style.RESET_ALL)
  247. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  248. if ok and not silent:
  249. print (style.BRIGHT+ "OK! "+ str(len(predicates))+ " deported-methods verified."+ style.RESET_ALL)
  250. return ok
  251. # test typealias is registered and doesn't break the reference chain of other user defined types
  252. def testTypealias(thefile, compilerPath, silent):
  253. '''return number of successes'''
  254. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  255. if ok:
  256. predicates = []
  257. # check for the understanding of the access of the stuff variable through indirect structuredbuffer access
  258. predicates.append(lambda: symbols["Symbol '/PassVars/stuff'"]['references'][0]['line'] == 15)
  259. # check for registration of the alias itself
  260. predicates.append(lambda: symbols["Symbol '/StructBuf'"]['kind'] == 'TypeAlias')
  261. predicates.append(lambda: symbols["Symbol '/StructBuf'"]['canonical type']['generic']['name'] == '/PassVars')
  262. if not silent: print (fg.CYAN+ style.BRIGHT+ " alias predicates verification..."+ style.RESET_ALL)
  263. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  264. if ok and not silent:
  265. print (style.BRIGHT+ "OK! "+ str(len(predicates))+ " alias predicates verified."+ style.RESET_ALL)
  266. return ok
  267. def testFunctionOverloads(thefile, compilerPath, silent):
  268. '''return number of successes'''
  269. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  270. if ok:
  271. predicates = []
  272. predicates.append(lambda: symbols["Symbol '/MySRG/Metal'"]['kind'] == "Struct")
  273. predicates.append(lambda: symbols["Symbol '/MySRG/Barrel'"]['kind'] == "Struct")
  274. predicates.append(lambda: symbols["Symbol '/MySRG/Barrel'"]['kind'] == "Struct")
  275. predicates.append(lambda: symbols["Symbol '/MySRG/MakeMat(?float)'"]['kind'] == "Function")
  276. predicates.append(lambda: symbols["Symbol '/MySRG/MakeMat(?float)'"]['references'][0]['line'] == 53)
  277. predicates.append(lambda: symbols["Symbol '/MySRG/MakeMat(?float)'"]['references'][1]['line'] == 58)
  278. predicates.append(lambda: symbols["Symbol '/MySRG/MakeMat'"]['kind'] == 'OverloadSet')
  279. predicates.append(lambda: symbols["Symbol '/MySRG/MakeMat'"]['functions'][0] == '/MySRG/MakeMat(/MySRG/Metal)')
  280. predicates.append(lambda: symbols["Symbol '/MySRG/MakeMat'"]['functions'][1] == '/MySRG/MakeMat(?float)')
  281. predicates.append(lambda: not symbols["Symbol '/MySRG/MakeMat'"]['references'])
  282. predicates.append(lambda: symbols["Symbol '/MySRG/MakeMat(/MySRG/Metal)'"]['references'][0]['line'] == 55)
  283. # because of use of * multiply, azslc can't resolve the overload, so the set holds the reference
  284. predicates.append(lambda: symbols["Symbol '/MySRG/Luminosity'"]['references'][0]['line'] == 63)
  285. if not silent: print (fg.CYAN+ style.BRIGHT+ " overload predicates verification..."+ style.RESET_ALL)
  286. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  287. if ok and not silent:
  288. print (style.BRIGHT+ "OK! "+ str(len(predicates))+ " overload predicates verified."+ style.RESET_ALL)
  289. return ok
  290. def testUnnamedBlocks(thefile, compilerPath, silent):
  291. '''return number of successes'''
  292. symbols, ok = testfuncs.buildAndGetSymbols(thefile, compilerPath, silent)
  293. if ok:
  294. predicates = []
  295. predicates.append(lambda: symbols["Symbol '/S'"]['kind'] == "Class")
  296. predicates.append(lambda: symbols["Symbol '/S/i'"]['kind'] == "Variable")
  297. predicates.append(lambda: symbols["Symbol '/S/i'"]['references'][0]['line'] == 21)
  298. predicates.append(lambda: symbols["Symbol '/S/i'"]['references'][1]['line'] == 25)
  299. predicates.append(lambda: symbols["Symbol '/S/i'"]['references'][2]['line'] == 69)
  300. predicates.append(lambda: symbols["Symbol '/S/i'"]['references'][3]['line'] == 72)
  301. predicates.append(lambda: symbols["Symbol '/i'"]['kind'] == "Variable")
  302. predicates.append(lambda: symbols["Symbol '/i'"]['references'][0]['line'] == 16)
  303. predicates.append(lambda: symbols["Symbol '/i'"]['references'][1]['line'] == 18)
  304. predicates.append(lambda: symbols["Symbol '/i'"]['references'][2]['line'] == 29)
  305. predicates.append(lambda: symbols["Symbol '/i'"]['references'][3]['line'] == 70)
  306. predicates.append(lambda: symbols["Symbol '/f()/$bk0/i'"]['type']['core']['name'] == '?int')
  307. predicates.append(lambda: symbols["Symbol '/f()/$bk0/i'"]['line'] == 14)
  308. predicates.append(lambda: symbols["Symbol '/f()/$bk0/i'"]['references'][0]['line'] == 15)
  309. predicates.append(lambda: symbols["Symbol '/f()/i'"]['type']['core']['name'] == '?int')
  310. predicates.append(lambda: symbols["Symbol '/f()/i'"]['line'] == 23)
  311. predicates.append(lambda: symbols["Symbol '/f()/i'"]['references'][0]['line'] == 28)
  312. predicates.append(lambda: symbols["Symbol '/f()/i'"]['references'][1]['line'] == 58)
  313. predicates.append(lambda: symbols["Symbol '/f()/$sw1/$bk2/i'"]['line'] == 33)
  314. predicates.append(lambda: symbols["Symbol '/f()/$sw1/$bk2/i'"]['references'][0]['line'] == 34)
  315. predicates.append(lambda: symbols["Symbol '/f()/$sw1/i'"]['line'] == 37)
  316. predicates.append(lambda: symbols["Symbol '/f()/$sw1/i'"]['references'][0]['line'] == 40)
  317. predicates.append(lambda: symbols["Symbol '/f()/$for3/i'"]['line'] == 43)
  318. predicates.append(lambda: symbols["Symbol '/f()/$for3/i'"]['references'][0]['line'] == 43)
  319. predicates.append(lambda: symbols["Symbol '/f()/$for3/i'"]['references'][1]['line'] == 43)
  320. predicates.append(lambda: symbols["Symbol '/f()/$for3/i'"]['references'][2]['line'] == 45)
  321. predicates.append(lambda: symbols["Symbol '/f()/$for3/i'"]['references'][3]['line'] == 45)
  322. predicates.append(lambda: symbols["Symbol '/f()/$bk4/i'"]['line'] == 50)
  323. predicates.append(lambda: symbols["Symbol '/f()/$bk4/i'"]['references'][0]['line'] == 51)
  324. predicates.append(lambda: symbols["Symbol '/f()/$bk4/i'"]['references'][1]['line'] == 51)
  325. predicates.append(lambda: symbols["Symbol '/f()/$bk5/i'"]['line'] == 56)
  326. predicates.append(lambda: symbols["Symbol '/f()/$bk5/i'"]['references'][0]['line'] == 57)
  327. predicates.append(lambda: symbols["Symbol '/f()/$bk5/i'"]['references'][1]['line'] == 57)
  328. predicates.append(lambda: symbols["Symbol '/f()/$for6/i'"]['line'] == 60)
  329. predicates.append(lambda: symbols["Symbol '/f()/$for6/i'"]['references'][0]['line'] == 60)
  330. predicates.append(lambda: symbols["Symbol '/f()/$for6/i'"]['references'][1]['line'] == 60)
  331. predicates.append(lambda: symbols["Symbol '/f()/$for7/i'"]['line'] == 63)
  332. predicates.append(lambda: symbols["Symbol '/f()/$for7/i'"]['references'][0]['line'] == 63)
  333. predicates.append(lambda: symbols["Symbol '/f()/$for7/i'"]['references'][1]['line'] == 64)
  334. predicates.append(lambda: symbols["Symbol '/S/f()/j'"]['line'] == 75)
  335. if not silent: print (fg.CYAN+ style.BRIGHT+ " shadowed symbols predicates verification..."+ style.RESET_ALL)
  336. ok = testfuncs.verifyAllPredicates(predicates, symbols, silent)
  337. if ok and not silent:
  338. print (style.BRIGHT+ "OK! "+ str(len(predicates))+ " shadowed symbols predicates verified."+ style.RESET_ALL)
  339. return ok
  340. result = 0 # to define for sub-tests
  341. resultFailed = 0
  342. def doTests(compiler, silent, azdxcpath):
  343. global result
  344. global resultFailed
  345. # Working directory should have been set to this script's directory by the calling parent
  346. # You can get it once doTests() is called, but not during initialization of the module,
  347. # because at that time it will still be set to the working directory of the calling script
  348. workDir = os.getcwd()
  349. if not silent: print ("testing for variables...")
  350. if testVariables(os.path.join(workDir, "seenat-variables.azsl"), compiler, silent): result += 1
  351. else: resultFailed += 1
  352. if not silent: print ("testing for functions...")
  353. if testFunctions(os.path.join(workDir, "seenat-functions.azsl"), compiler, silent): result += 1
  354. else: resultFailed += 1
  355. if not silent: print ("testing for methods...")
  356. if testMethods(os.path.join(workDir, "seenat-methods.azsl"), compiler, silent): result += 1
  357. else: resultFailed += 1
  358. if not silent: print ("testing for structs...")
  359. if testStructs(os.path.join(workDir, "seenat-structs.azsl"), compiler, silent): result += 1
  360. else: resultFailed += 1
  361. if not silent: print ("testing for SRGs...")
  362. if testSRGs(os.path.join(workDir, "seenat-srgs.azsl"), compiler, silent): result += 1
  363. else: resultFailed += 1
  364. if not silent: print ("testing for constant buffers...")
  365. if testCBs(os.path.join(workDir, "seenat-cb.azsl"), compiler, silent): result += 1
  366. else: resultFailed += 1
  367. if not silent: print ("testing for qualification in member access expression RHS...")
  368. if testMAE(os.path.join(workDir, "seenat-MAE-qualifiedRHS.azsl"), compiler, silent): result += 1
  369. else: resultFailed += 1
  370. if not silent: print ("testing for deported methods...")
  371. if testDeported(os.path.join(workDir, "seenat-deported-methods.azsl"), compiler, silent): result += 1
  372. else: resultFailed += 1
  373. if not silent: print ("testing for type alias...")
  374. if testTypealias(os.path.join(workDir, "seenat-typedef.azsl"), compiler, silent): result += 1
  375. else: resultFailed += 1
  376. if not silent: print ("testing for function overloading...")
  377. if testFunctionOverloads(os.path.join(workDir, "seenat-function-overloads.azsl"), compiler, silent): result += 1
  378. else: resultFailed += 1
  379. if not silent: print ("testing for unnamed blocks...")
  380. if testUnnamedBlocks(os.path.join(workDir, "seenat-unnamed-blocks.azsl"), compiler, silent): result += 1
  381. else: resultFailed += 1
  382. if __name__ == "__main__":
  383. print ("please call from testapp.py")