/test/ExposeTest.rb

https://gitlab.com/jorjpimm/bondage · Ruby · 409 lines · 305 code · 93 blank · 11 comment · 0 complexity · 0042a98c12e2e45d3d39ffbbf82e2c76 MD5 · raw file

  1. require_relative 'TestUtils.rb'
  2. require_relative "../parser/Library.rb"
  3. require_relative "../parser/Parser.rb"
  4. require_relative "../exposer/ClassExposer.rb"
  5. require 'test/unit'
  6. class TestExpose < Test::Unit::TestCase
  7. def setup
  8. @astTest = Library.new("AstTest", "test/testData/BasicAst")
  9. @astTest.addIncludePath(".")
  10. @astTest.addFile("BasicAst.h")
  11. @parentA = Library.new("ParentA", "test/testData/ParentA")
  12. @parentA.addIncludePath(".")
  13. @parentA.addFile("ParentA.h")
  14. @parentBManual = Library.new("ParentBManual", "test/testData/ParentB/ParentBManual")
  15. @parentB = Library.new("ParentB", "test/testData/ParentB")
  16. @parentB.addIncludePath(".")
  17. @parentB.addFile("ParentB.h")
  18. @parentB.addDependency(@parentA)
  19. @parentB.addDependency(@parentBManual)
  20. @enum = Library.new("Enum", "test/testData/Enum")
  21. @enum.addIncludePath(".")
  22. @enum.addFile("Enum.h")
  23. @functionsManual = Library.new("FunctionsManual", "test/testData/Functions/FunctionsManual")
  24. @functions = Library.new("Functions", "test/testData/Functions")
  25. @functions.addIncludePath(".")
  26. @functions.addFile("Functions.h")
  27. @functions.addDependency(@functionsManual)
  28. @ctors = Library.new("Constructors", "test/testData/Constructors")
  29. @ctors.addIncludePath(".")
  30. @ctors.addFile("Constructors.h")
  31. @vfun = Library.new("VirtualFunctions", "test/testData/VirtualFunctions")
  32. @vfun.addIncludePath(".")
  33. @vfun.addFile("VirtualFunctions.h")
  34. setupLibrary(@ctors)
  35. setupLibrary(@vfun)
  36. setupLibrary(@functions)
  37. setupLibrary(@enum)
  38. setupLibrary(@astTest)
  39. setupLibrary(@parentA)
  40. setupLibrary(@parentB)
  41. end
  42. def teardown
  43. cleanLibrary(@ctors)
  44. cleanLibrary(@vfun)
  45. cleanLibrary(@functions)
  46. cleanLibrary(@enum)
  47. cleanLibrary(@astTest)
  48. cleanLibrary(@parentA)
  49. cleanLibrary(@parentB)
  50. end
  51. def test_metaData
  52. exposer, visitor = exposeLibrary(@astTest)
  53. all = exposer.allMetaData
  54. exposed = exposer.exposedMetaData
  55. loaded = TypeDataSet.import(@astTest.autogenPath(:cpp), visitor.library)
  56. assert_equal 1, all.types.length
  57. assert_equal 1, all.fullTypes.length
  58. assert_equal 1, exposed.types.length
  59. assert_equal 1, exposed.fullTypes.length
  60. assert_equal 1, loaded.types.length
  61. assert_equal 1, loaded.fullTypes.length
  62. assert_equal true, all.fullyExposed?("::BasicAst::Foo")
  63. assert_equal true, all.partiallyExposed?("::BasicAst::Foo")
  64. assert_equal true, exposed.fullyExposed?("::BasicAst::Foo")
  65. assert_equal true, exposed.partiallyExposed?("::BasicAst::Foo")
  66. assert_equal true, loaded.fullyExposed?("::BasicAst::Foo")
  67. assert_equal true, loaded.partiallyExposed?("::BasicAst::Foo")
  68. end
  69. def test_exposer
  70. exposeLibrary(@astTest)
  71. end
  72. def test_parentingA
  73. # Generate parent A
  74. exposer, visitor = exposeLibrary(@parentA)
  75. assert_equal 3, exposer.exposedMetaData.fullTypes.length
  76. assert_equal 4, exposer.exposedMetaData.types.length
  77. assert_equal "::ParentA::G", exposer.exposedMetaData.fullTypes.keys[0]
  78. assert_equal "::ParentA::G", exposer.exposedMetaData.types.keys[0]
  79. assert_equal "::ParentA::B", exposer.exposedMetaData.fullTypes.keys[1]
  80. assert_equal "::ParentA::B", exposer.exposedMetaData.types.keys[1]
  81. assert_equal "::ParentA::E", exposer.exposedMetaData.types.keys[2]
  82. assert_equal "::ParentA::F", exposer.exposedMetaData.fullTypes.keys[2]
  83. assert_equal "::ParentA::F", exposer.exposedMetaData.types.keys[3]
  84. assert_equal "B", exposer.exposedMetaData.findClass("::ParentA::B").name
  85. assert_equal "E", exposer.exposedMetaData.findClass("::ParentA::E").name
  86. assert_equal "F", exposer.exposedMetaData.findClass("::ParentA::F").name
  87. assert_equal "G", exposer.exposedMetaData.findClass("::ParentA::G").name
  88. assert_equal true, exposer.exposedMetaData.findClass("::ParentA::B").isDerivable
  89. assert_equal true, exposer.exposedMetaData.findClass("::ParentA::E").isDerivable
  90. assert_equal true, exposer.exposedMetaData.findClass("::ParentA::F").isDerivable
  91. assert_equal false, exposer.exposedMetaData.findClass("::ParentA::G").isDerivable
  92. assert_equal nil, exposer.exposedMetaData.findClass("::ParentA::B").parentClass
  93. assert_equal nil, exposer.exposedMetaData.findClass("::ParentA::G").parentClass
  94. assert_equal "::ParentA::B", exposer.exposedMetaData.findClass("::ParentA::E").parentClass
  95. assert_equal "::ParentA::E", exposer.exposedMetaData.findClass("::ParentA::F").parentClass
  96. end
  97. def test_parentingB
  98. # Generate parent A
  99. exposeLibrary(@parentA)
  100. # Generate parent B
  101. exposer, visitor = exposeLibrary(@parentB)
  102. assert_equal 2, exposer.exposedMetaData.fullTypes.length
  103. assert_equal 6, exposer.exposedMetaData.types.length
  104. assert_equal "::ParentB::Y", exposer.exposedMetaData.types.keys[0]
  105. assert_equal "::ParentB::Y", exposer.exposedMetaData.fullTypes.keys[0]
  106. assert_equal "::ParentB::X", exposer.exposedMetaData.types.keys[1]
  107. assert_equal "::ParentB::V", exposer.exposedMetaData.types.keys[2]
  108. assert_equal "::ParentB::U", exposer.exposedMetaData.types.keys[3]
  109. assert_equal "::ParentB::S", exposer.exposedMetaData.types.keys[4]
  110. assert_equal "::ParentB::S", exposer.exposedMetaData.fullTypes.keys[1]
  111. assert_equal "::ParentB::R", exposer.exposedMetaData.types.keys[5]
  112. assert_equal "::ParentB::Q", exposer.exposedMetaData.findClass("::ParentB::R").parentClass
  113. assert_equal nil, exposer.exposedMetaData.findClass("::ParentB::S").parentClass
  114. assert_equal "::ParentA::B", exposer.exposedMetaData.findClass("::ParentB::U").parentClass
  115. assert_equal "::ParentA::E", exposer.exposedMetaData.findClass("::ParentB::V").parentClass
  116. assert_equal "::ParentA::F", exposer.exposedMetaData.findClass("::ParentB::X").parentClass
  117. assert_equal "::ParentA::E", exposer.exposedMetaData.findClass("::ParentB::Y").parentClass
  118. assert_equal "::ParentA::G", exposer.allMetaData.fullTypes.keys[0]
  119. assert_equal "::ParentA::G", exposer.allMetaData.types.keys[0]
  120. assert_equal "::ParentA::B", exposer.allMetaData.types.keys[1]
  121. assert_equal "::ParentA::B", exposer.allMetaData.fullTypes.keys[1]
  122. assert_equal "::ParentA::E", exposer.allMetaData.types.keys[2]
  123. assert_equal "::ParentA::F", exposer.allMetaData.fullTypes.keys[2]
  124. assert_equal "::ParentA::F", exposer.allMetaData.types.keys[3]
  125. assert_equal "::ParentB::Z", exposer.allMetaData.fullTypes.keys[3] # Manually exposed
  126. assert_equal "::ParentB::Z", exposer.allMetaData.types.keys[4] # Manually exposed
  127. assert_equal "::ParentB::Q", exposer.allMetaData.fullTypes.keys[4] # Manually exposed
  128. assert_equal "::ParentB::Q", exposer.allMetaData.types.keys[5] # Manually exposed
  129. assert_equal "::ParentB::Y", exposer.allMetaData.types.keys[6]
  130. assert_equal "::ParentB::Y", exposer.allMetaData.fullTypes.keys[5]
  131. assert_equal "::ParentB::X", exposer.allMetaData.types.keys[7]
  132. assert_equal "::ParentB::V", exposer.allMetaData.types.keys[8]
  133. assert_equal "::ParentB::U", exposer.allMetaData.types.keys[9]
  134. assert_equal "::ParentB::S", exposer.allMetaData.types.keys[10]
  135. assert_equal "::ParentB::S", exposer.allMetaData.fullTypes.keys[6]
  136. assert_equal "::ParentB::R", exposer.allMetaData.types.keys[11]
  137. assert_equal "::ParentB::Q",
  138. exposer.findParentClass(exposer.exposedMetaData.findClass("::ParentB::R").parsed)
  139. assert_equal "::ParentA::E",
  140. exposer.findParentClass(exposer.exposedMetaData.findClass("::ParentB::Y").parsed)
  141. end
  142. def test_enum
  143. # Generate Enum
  144. exposer, visitor = exposeLibrary(@enum)
  145. assert_equal 3, exposer.allMetaData.fullTypes.length
  146. assert_equal 3, exposer.exposedMetaData.fullTypes.length
  147. assert_equal 3, exposer.allMetaData.types.length
  148. assert_equal 3, exposer.exposedMetaData.types.length
  149. assert_equal "::Enum::ExposedClass", exposer.allMetaData.fullTypes.keys[0]
  150. assert_equal "::Enum::ExposedClass::ExposedEnum", exposer.allMetaData.fullTypes.keys[1]
  151. assert_equal "::Enum::ExposedEnumStatic", exposer.allMetaData.fullTypes.keys[2]
  152. nsEnum = exposer.allMetaData.fullTypes["::Enum::ExposedEnumStatic"].parsed
  153. assert_not_nil nsEnum
  154. assert_equal 3, nsEnum.members.length
  155. assert_equal 5, nsEnum.members["A"]
  156. assert_equal 10, nsEnum.members["B"]
  157. assert_equal 1, nsEnum.members["C"]
  158. classEnum = exposer.allMetaData.fullTypes["::Enum::ExposedClass::ExposedEnum"].parsed
  159. assert_not_nil classEnum
  160. assert_equal 3, classEnum.members.length
  161. assert_equal 0, classEnum.members["X"]
  162. assert_equal 1, classEnum.members["Y"]
  163. assert_equal 2, classEnum.members["Z"]
  164. cls = exposer.allMetaData.fullTypes["::Enum::ExposedClass"].parsed
  165. functions = exposer.findExposedFunctions(cls)
  166. assert_equal 2, functions.length
  167. fns1 = functions["fn1"]
  168. fns2 = functions["fn3"]
  169. assert_not_nil fns1
  170. assert_not_nil fns2
  171. fn1 = fns1[0]
  172. fn2 = fns2[0]
  173. assert_not_nil fn1
  174. assert_not_nil fn2
  175. assert_equal nil, fn1.returnType
  176. assert_equal nil, fn2.returnType
  177. assert_equal 1, fn1.arguments.length
  178. assert_equal 1, fn2.arguments.length
  179. assert_equal "::Enum::ExposedEnumStatic", fn1.arguments[0].type.fullyQualifiedName
  180. assert_equal "::Enum::ExposedClass::ExposedEnum", fn2.arguments[0].type.fullyQualifiedName
  181. end
  182. def test_functions
  183. # Generate Functions
  184. exposer, visitor = exposeLibrary(@functions)
  185. rootNs = visitor.getExposedNamespace()
  186. assert_not_nil rootNs
  187. assert_equal 3, rootNs.functions.length
  188. fns = exposer.findExposedFunctions(rootNs)
  189. assert_equal 2, fns.length
  190. expose1 = fns["testExpose1"]
  191. assert_equal 1, expose1.length
  192. assert_equal true, expose1[0].static
  193. assert_equal true, expose1[0].returnType.isLValueReference
  194. assert_equal true, expose1[0].returnType.pointeeType.isConstQualified
  195. assert_equal "::Functions::TestA", expose1[0].returnType.pointeeType.fullyQualifiedName
  196. assert_equal 2, expose1[0].arguments.length
  197. assert_equal "", expose1[0].arguments[0].name
  198. assert_equal true, expose1[0].arguments[0].type.isFloatingPoint()
  199. assert_equal "pork", expose1[0].arguments[1].name
  200. assert_equal true, expose1[0].arguments[1].type.isBoolean()
  201. assert_equal true, expose1[0].returnType.isLValueReference
  202. assert_equal true, expose1[0].returnType.pointeeType.isConstQualified
  203. assert_equal "::Functions::TestA", expose1[0].returnType.pointeeType.fullyQualifiedName
  204. expose2 = fns["testExpose2"]
  205. assert_equal 1, expose2.length
  206. expose2_1 = expose2[0]
  207. assert_equal true, expose2_1.static
  208. assert_equal true, expose2_1.returnType.isLValueReference
  209. assert_equal false, expose2_1.returnType.pointeeType.isConstQualified
  210. assert_equal "::Functions::TestA", expose1[0].returnType.pointeeType.fullyQualifiedName
  211. assert_equal 1, expose2_1.arguments.length
  212. assert_equal "a", expose2_1.arguments[0].name
  213. assert_equal true, expose2_1.arguments[0].type.isPointer()
  214. assert_equal "::Functions::TestA", expose2_1.arguments[0].type.pointeeType().fullyQualifiedName
  215. assert_equal 2, exposer.exposedMetaData.fullTypes.length
  216. assert_equal 3, exposer.exposedMetaData.types.length
  217. exposeHelper = exposer.exposedMetaData.fullTypes["::Functions::TestA"].parsed
  218. assert_not_nil exposeHelper
  219. exposedClass = exposer.exposedMetaData.fullTypes["::Functions::SomeClass"].parsed
  220. assert_not_nil exposedClass
  221. assert_equal 17, exposedClass.functions.length
  222. fns = exposer.findExposedFunctions(exposedClass)
  223. assert_equal 6, fns.length
  224. overloaded = fns["overloaded"]
  225. assert_equal 3, overloaded.length
  226. assert_not_nil fns["complex1"]
  227. assert_nil fns["complex2"]
  228. assert_not_nil fns["complex3"]
  229. assert_not_nil fns["complex4"]
  230. assert_nil fns["complex5"]
  231. assert_nil fns["complex6"]
  232. assert_nil fns["complex7"]
  233. assert_not_nil fns["complex8"]
  234. assert_nil fns["template1"]
  235. assert_not_nil fns["template2"]
  236. overloaded.each do |fn|
  237. assert_equal nil, fn.returnType
  238. end
  239. assert_equal 1, overloaded[0].arguments.length
  240. assert_equal 3, overloaded[1].arguments.length
  241. assert_equal 1, overloaded[2].arguments.length
  242. assert_equal false, overloaded[0].static
  243. assert_equal true, overloaded[0].arguments[0].type.isLValueReference
  244. assert_equal "::Functions::TestA", overloaded[0].arguments[0].type.pointeeType.fullyQualifiedName
  245. assert_equal false, overloaded[1].static
  246. assert_equal true, overloaded[1].arguments[0].type.isLValueReference
  247. assert_equal "::Functions::TestA", overloaded[0].arguments[0].type.pointeeType.fullyQualifiedName
  248. assert_equal true, overloaded[1].arguments[1].type.isSignedInteger
  249. assert_equal true, overloaded[1].arguments[2].type.isFloatingPoint
  250. assert_equal true, overloaded[2].static
  251. assert_equal true, overloaded[2].arguments[0].type.isPointer
  252. assert_equal "::Functions::TestA", overloaded[2].arguments[0].type.pointeeType.fullyQualifiedName
  253. end
  254. def test_constructors
  255. # Generate Constuctors
  256. exposer, visitor = exposeLibrary(@ctors)
  257. assert_equal 1, exposer.exposedMetaData.fullTypes.length
  258. ctor = exposer.exposedMetaData.findClass("::Constructors::Ctor").parsed
  259. assert_not_nil ctor
  260. fns = exposer.findExposedFunctions(ctor)
  261. assert_equal 1, fns.length
  262. ctor = fns["Ctor"]
  263. assert_not_nil ctor
  264. assert_equal 6, ctor.length
  265. assert_equal true, ctor[0].isConstructor
  266. assert_equal true, ctor[1].isConstructor
  267. assert_equal true, ctor[2].isConstructor
  268. assert_equal true, ctor[3].isConstructor
  269. assert_equal true, ctor[4].isConstructor
  270. assert_equal true, ctor[5].isConstructor
  271. assert_equal nil, ctor[0].returnType
  272. assert_equal nil, ctor[1].returnType
  273. assert_equal nil, ctor[2].returnType
  274. assert_equal nil, ctor[3].returnType
  275. assert_equal nil, ctor[4].returnType
  276. assert_equal nil, ctor[5].returnType
  277. assert_equal 0, ctor[0].arguments.length
  278. assert_equal 1, ctor[1].arguments.length
  279. assert_equal "int", ctor[1].arguments[0].type.name
  280. assert_equal 1, ctor[2].arguments.length
  281. assert_equal "float", ctor[2].arguments[0].type.name
  282. assert_equal 2, ctor[3].arguments.length
  283. assert_equal "double", ctor[3].arguments[0].type.name
  284. assert_equal "double", ctor[3].arguments[1].type.name
  285. assert_equal 1, ctor[4].arguments.length
  286. assert_equal true, ctor[4].arguments[0].type.isLValueReference
  287. assert_equal true, ctor[4].arguments[0].type.pointeeType.isConstQualified
  288. assert_equal "::Constructors::Ctor", ctor[4].arguments[0].type.pointeeType.fullyQualifiedName
  289. assert_equal true, ctor[4].isCopyConstructor
  290. assert_equal 1, ctor[5].arguments.length
  291. assert_equal false, ctor[5].arguments[0].type.isPointer
  292. assert_equal false, ctor[5].arguments[0].type.pointeeType.isConstQualified
  293. assert_equal "::Constructors::Ctor", ctor[5].arguments[0].type.pointeeType.fullyQualifiedName
  294. assert_equal false, ctor[5].isCopyConstructor
  295. end
  296. def test_virtualFunctions
  297. # Generate Virtual Functions
  298. exposer, visitor = exposeLibrary(@vfun)
  299. assert_equal 2, exposer.exposedMetaData.fullTypes.length
  300. a = exposer.exposedMetaData.findClass("::VirtualFunctions::A").parsed
  301. assert_not_nil a
  302. b = exposer.exposedMetaData.findClass("::VirtualFunctions::B").parsed
  303. assert_not_nil b
  304. aFns = exposer.findExposedFunctions(a)
  305. assert_equal 1, aFns.length
  306. assert_not_nil aFns["pork"]
  307. assert_equal 1, aFns["pork"].length
  308. bFns = exposer.findExposedFunctions(b)
  309. assert_equal 0, bFns.length
  310. assert_nil bFns["pork"]
  311. end
  312. end
  313. # abstract classes
  314. # const functions
  315. # variadic functions
  316. # const pod pointer - seemed to be exposed?