dub 0.2.2 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dub might be problematic. Click here for more details.

Files changed (266) hide show
  1. data/.gitignore +8 -0
  2. data/History.txt +48 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +50 -0
  5. data/Rakefile +58 -0
  6. data/dub.gemspec +197 -0
  7. data/lib/dub/argument.rb +275 -0
  8. data/lib/dub/entities_unescape.rb +16 -0
  9. data/lib/dub/function.rb +163 -0
  10. data/lib/dub/function_group.rb +72 -0
  11. data/lib/dub/generator.rb +15 -0
  12. data/lib/dub/group.rb +24 -0
  13. data/lib/dub/klass.rb +244 -0
  14. data/lib/dub/lua/class.cpp.erb +84 -0
  15. data/lib/dub/lua/class_gen.rb +97 -0
  16. data/lib/dub/lua/function.cpp.erb +18 -0
  17. data/lib/dub/lua/function_gen.rb +265 -0
  18. data/lib/dub/lua/group.cpp.erb +9 -0
  19. data/lib/dub/lua/lua_cpp_helper.h +141 -0
  20. data/lib/dub/lua/namespace.cpp.erb +40 -0
  21. data/lib/dub/lua/namespace_gen.rb +88 -0
  22. data/lib/dub/lua.rb +24 -0
  23. data/lib/dub/member_extraction.rb +92 -0
  24. data/lib/dub/namespace.rb +277 -0
  25. data/lib/dub/parser.rb +46 -0
  26. data/lib/dub/templates/lua_template.erb +21 -0
  27. data/lib/dub/version.rb +3 -0
  28. data/lib/dub.rb +23 -20
  29. data/test/argument_test.rb +547 -0
  30. data/test/fixtures/app/CMakeLists.txt +54 -0
  31. data/test/fixtures/app/Doxyfile +1600 -0
  32. data/test/fixtures/app/bindings/all_lua.cpp +299 -0
  33. data/test/fixtures/app/include/matrix.h +157 -0
  34. data/test/fixtures/app/make_lua_bindings.rb +13 -0
  35. data/test/fixtures/app/vendor/lua/CMakeLists.txt +25 -0
  36. data/test/fixtures/app/vendor/lua/COPYRIGHT +34 -0
  37. data/test/fixtures/app/vendor/lua/HISTORY +183 -0
  38. data/test/fixtures/app/vendor/lua/INSTALL +99 -0
  39. data/test/fixtures/app/vendor/lua/Makefile +183 -0
  40. data/test/fixtures/app/vendor/lua/README +37 -0
  41. data/test/fixtures/app/vendor/lua/lapi.c +1080 -0
  42. data/test/fixtures/app/vendor/lua/lapi.h +16 -0
  43. data/test/fixtures/app/vendor/lua/lauxlib.c +653 -0
  44. data/test/fixtures/app/vendor/lua/lauxlib.h +174 -0
  45. data/test/fixtures/app/vendor/lua/lbaselib.c +643 -0
  46. data/test/fixtures/app/vendor/lua/lcode.c +839 -0
  47. data/test/fixtures/app/vendor/lua/lcode.h +76 -0
  48. data/test/fixtures/app/vendor/lua/ldblib.c +397 -0
  49. data/test/fixtures/app/vendor/lua/ldebug.c +622 -0
  50. data/test/fixtures/app/vendor/lua/ldebug.h +33 -0
  51. data/test/fixtures/app/vendor/lua/ldo.c +516 -0
  52. data/test/fixtures/app/vendor/lua/ldo.h +57 -0
  53. data/test/fixtures/app/vendor/lua/ldump.c +164 -0
  54. data/test/fixtures/app/vendor/lua/lfunc.c +174 -0
  55. data/test/fixtures/app/vendor/lua/lfunc.h +34 -0
  56. data/test/fixtures/app/vendor/lua/lgc.c +711 -0
  57. data/test/fixtures/app/vendor/lua/lgc.h +110 -0
  58. data/test/fixtures/app/vendor/lua/liblua.a +0 -0
  59. data/test/fixtures/app/vendor/lua/linit.c +38 -0
  60. data/test/fixtures/app/vendor/lua/liolib.c +532 -0
  61. data/test/fixtures/app/vendor/lua/llex.c +461 -0
  62. data/test/fixtures/app/vendor/lua/llex.h +81 -0
  63. data/test/fixtures/app/vendor/lua/llimits.h +128 -0
  64. data/test/fixtures/app/vendor/lua/lmathlib.c +263 -0
  65. data/test/fixtures/app/vendor/lua/lmem.c +86 -0
  66. data/test/fixtures/app/vendor/lua/lmem.h +49 -0
  67. data/test/fixtures/app/vendor/lua/loadlib.c +664 -0
  68. data/test/fixtures/app/vendor/lua/lobject.c +214 -0
  69. data/test/fixtures/app/vendor/lua/lobject.h +381 -0
  70. data/test/fixtures/app/vendor/lua/lopcodes.c +102 -0
  71. data/test/fixtures/app/vendor/lua/lopcodes.h +268 -0
  72. data/test/fixtures/app/vendor/lua/loslib.c +244 -0
  73. data/test/fixtures/app/vendor/lua/lparser.c +1337 -0
  74. data/test/fixtures/app/vendor/lua/lparser.h +82 -0
  75. data/test/fixtures/app/vendor/lua/lstate.c +214 -0
  76. data/test/fixtures/app/vendor/lua/lstate.h +168 -0
  77. data/test/fixtures/app/vendor/lua/lstring.c +111 -0
  78. data/test/fixtures/app/vendor/lua/lstring.h +31 -0
  79. data/test/fixtures/app/vendor/lua/lstrlib.c +868 -0
  80. data/test/fixtures/app/vendor/lua/ltable.c +588 -0
  81. data/test/fixtures/app/vendor/lua/ltable.h +40 -0
  82. data/test/fixtures/app/vendor/lua/ltablib.c +278 -0
  83. data/test/fixtures/app/vendor/lua/ltm.c +75 -0
  84. data/test/fixtures/app/vendor/lua/ltm.h +54 -0
  85. data/test/fixtures/app/vendor/lua/lua.c +695 -0
  86. data/test/fixtures/app/vendor/lua/lua.h +385 -0
  87. data/test/fixtures/app/vendor/lua/lua_dub_helper.h +77 -0
  88. data/test/fixtures/app/vendor/lua/luac +0 -0
  89. data/test/fixtures/app/vendor/lua/luac.c +200 -0
  90. data/test/fixtures/app/vendor/lua/luaconf.h +762 -0
  91. data/test/fixtures/app/vendor/lua/lualib.h +53 -0
  92. data/test/fixtures/app/vendor/lua/lundump.c +223 -0
  93. data/test/fixtures/app/vendor/lua/lundump.h +36 -0
  94. data/test/fixtures/app/vendor/lua/lvm.c +765 -0
  95. data/test/fixtures/app/vendor/lua/lvm.h +36 -0
  96. data/test/fixtures/app/vendor/lua/lzio.c +82 -0
  97. data/test/fixtures/app/vendor/lua/lzio.h +67 -0
  98. data/test/fixtures/app/vendor/lua/matrix.h +102 -0
  99. data/test/fixtures/app/vendor/lua/print.c +227 -0
  100. data/test/fixtures/app/vendor/lua/test/README +26 -0
  101. data/test/fixtures/app/vendor/lua/test/bisect.lua +27 -0
  102. data/test/fixtures/app/vendor/lua/test/cf.lua +16 -0
  103. data/test/fixtures/app/vendor/lua/test/echo.lua +5 -0
  104. data/test/fixtures/app/vendor/lua/test/env.lua +7 -0
  105. data/test/fixtures/app/vendor/lua/test/factorial.lua +32 -0
  106. data/test/fixtures/app/vendor/lua/test/fib.lua +40 -0
  107. data/test/fixtures/app/vendor/lua/test/fibfor.lua +13 -0
  108. data/test/fixtures/app/vendor/lua/test/globals.lua +13 -0
  109. data/test/fixtures/app/vendor/lua/test/hello.lua +3 -0
  110. data/test/fixtures/app/vendor/lua/test/life.lua +111 -0
  111. data/test/fixtures/app/vendor/lua/test/luac.lua +7 -0
  112. data/test/fixtures/app/vendor/lua/test/printf.lua +7 -0
  113. data/test/fixtures/app/vendor/lua/test/readonly.lua +12 -0
  114. data/test/fixtures/app/vendor/lua/test/sieve.lua +29 -0
  115. data/test/fixtures/app/vendor/lua/test/sort.lua +66 -0
  116. data/test/fixtures/app/vendor/lua/test/table.lua +12 -0
  117. data/test/fixtures/app/vendor/lua/test/trace-calls.lua +32 -0
  118. data/test/fixtures/app/vendor/lua/test/trace-globals.lua +38 -0
  119. data/test/fixtures/app/vendor/lua/test/xd.lua +14 -0
  120. data/test/fixtures/app/xml/classdub_1_1_matrix.xml +339 -0
  121. data/test/fixtures/app/xml/classdub_1_1_t_mat.xml +252 -0
  122. data/test/fixtures/app/xml/combine.xslt +15 -0
  123. data/test/fixtures/app/xml/compound.xsd +814 -0
  124. data/test/fixtures/app/xml/dir_53661a2bdeb1d55e60581a7e15deb763.xml +12 -0
  125. data/test/fixtures/app/xml/index.xml +48 -0
  126. data/test/fixtures/app/xml/index.xsd +66 -0
  127. data/test/fixtures/app/xml/matrix_8h.xml +179 -0
  128. data/test/fixtures/app/xml/namespacedub.xml +41 -0
  129. data/test/fixtures/classcv_1_1_mat.xml +1996 -0
  130. data/test/fixtures/classcv_1_1_point__.xml +341 -0
  131. data/test/fixtures/classcv_1_1_scalar__.xml +269 -0
  132. data/test/fixtures/classcv_1_1_size__.xml +270 -0
  133. data/test/fixtures/dummy_class.cpp.erb +1 -0
  134. data/test/fixtures/dummy_function.cpp.erb +1 -0
  135. data/test/fixtures/group___magic_type.xml +406 -0
  136. data/test/fixtures/namespacecv.xml +12659 -0
  137. data/test/function_group_test.rb +24 -0
  138. data/test/function_test.rb +395 -0
  139. data/test/group_test.rb +155 -0
  140. data/test/helper.rb +34 -0
  141. data/test/klass_test.rb +416 -0
  142. data/test/lua_function_gen_test.rb +215 -0
  143. data/test/namespace_test.rb +220 -0
  144. data/test/parser_test.rb +36 -0
  145. metadata +219 -276
  146. checksums.yaml +0 -7
  147. data/lib/open_api_sdk/analytics.rb +0 -99
  148. data/lib/open_api_sdk/domains.rb +0 -353
  149. data/lib/open_api_sdk/dub.rb +0 -88
  150. data/lib/open_api_sdk/links.rb +0 -766
  151. data/lib/open_api_sdk/metatags.rb +0 -54
  152. data/lib/open_api_sdk/models/operations/bulkcreatelinks_response.rb +0 -60
  153. data/lib/open_api_sdk/models/operations/bulkupdatelinks_requestbody.rb +0 -27
  154. data/lib/open_api_sdk/models/operations/bulkupdatelinks_response.rb +0 -60
  155. data/lib/open_api_sdk/models/operations/color.rb +0 -24
  156. data/lib/open_api_sdk/models/operations/createdomain_requestbody.rb +0 -33
  157. data/lib/open_api_sdk/models/operations/createdomain_response.rb +0 -60
  158. data/lib/open_api_sdk/models/operations/createlink_requestbody.rb +0 -95
  159. data/lib/open_api_sdk/models/operations/createlink_response.rb +0 -60
  160. data/lib/open_api_sdk/models/operations/createtag_requestbody.rb +0 -32
  161. data/lib/open_api_sdk/models/operations/createtag_response.rb +0 -60
  162. data/lib/open_api_sdk/models/operations/data.rb +0 -83
  163. data/lib/open_api_sdk/models/operations/deletedomain_request.rb +0 -24
  164. data/lib/open_api_sdk/models/operations/deletedomain_response.rb +0 -60
  165. data/lib/open_api_sdk/models/operations/deletedomain_responsebody.rb +0 -24
  166. data/lib/open_api_sdk/models/operations/deletelink_request.rb +0 -24
  167. data/lib/open_api_sdk/models/operations/deletelink_response.rb +0 -60
  168. data/lib/open_api_sdk/models/operations/deletelink_responsebody.rb +0 -24
  169. data/lib/open_api_sdk/models/operations/event.rb +0 -21
  170. data/lib/open_api_sdk/models/operations/getlinkinfo_request.rb +0 -33
  171. data/lib/open_api_sdk/models/operations/getlinkinfo_response.rb +0 -60
  172. data/lib/open_api_sdk/models/operations/getlinks_request.rb +0 -51
  173. data/lib/open_api_sdk/models/operations/getlinks_response.rb +0 -60
  174. data/lib/open_api_sdk/models/operations/getlinkscount_request.rb +0 -48
  175. data/lib/open_api_sdk/models/operations/getlinkscount_response.rb +0 -60
  176. data/lib/open_api_sdk/models/operations/getmetatags_request.rb +0 -24
  177. data/lib/open_api_sdk/models/operations/getmetatags_response.rb +0 -33
  178. data/lib/open_api_sdk/models/operations/getmetatags_responsebody.rb +0 -30
  179. data/lib/open_api_sdk/models/operations/getqrcode_request.rb +0 -39
  180. data/lib/open_api_sdk/models/operations/getqrcode_response.rb +0 -60
  181. data/lib/open_api_sdk/models/operations/gettags_response.rb +0 -60
  182. data/lib/open_api_sdk/models/operations/getworkspace_request.rb +0 -24
  183. data/lib/open_api_sdk/models/operations/getworkspace_response.rb +0 -60
  184. data/lib/open_api_sdk/models/operations/groupby.rb +0 -28
  185. data/lib/open_api_sdk/models/operations/interval.rb +0 -25
  186. data/lib/open_api_sdk/models/operations/level.rb +0 -21
  187. data/lib/open_api_sdk/models/operations/listdomains_response.rb +0 -60
  188. data/lib/open_api_sdk/models/operations/paymentprocessor.rb +0 -20
  189. data/lib/open_api_sdk/models/operations/requestbody.rb +0 -95
  190. data/lib/open_api_sdk/models/operations/retrieveanalytics_request.rb +0 -81
  191. data/lib/open_api_sdk/models/operations/retrieveanalytics_response.rb +0 -60
  192. data/lib/open_api_sdk/models/operations/sort.rb +0 -20
  193. data/lib/open_api_sdk/models/operations/trackcustomer_requestbody.rb +0 -33
  194. data/lib/open_api_sdk/models/operations/trackcustomer_response.rb +0 -60
  195. data/lib/open_api_sdk/models/operations/trackcustomer_responsebody.rb +0 -33
  196. data/lib/open_api_sdk/models/operations/tracklead_requestbody.rb +0 -42
  197. data/lib/open_api_sdk/models/operations/tracklead_response.rb +0 -60
  198. data/lib/open_api_sdk/models/operations/tracklead_responsebody.rb +0 -42
  199. data/lib/open_api_sdk/models/operations/tracksale_requestbody.rb +0 -42
  200. data/lib/open_api_sdk/models/operations/tracksale_response.rb +0 -60
  201. data/lib/open_api_sdk/models/operations/tracksale_responsebody.rb +0 -42
  202. data/lib/open_api_sdk/models/operations/updatedomain_request.rb +0 -27
  203. data/lib/open_api_sdk/models/operations/updatedomain_requestbody.rb +0 -33
  204. data/lib/open_api_sdk/models/operations/updatedomain_response.rb +0 -60
  205. data/lib/open_api_sdk/models/operations/updatelink_request.rb +0 -27
  206. data/lib/open_api_sdk/models/operations/updatelink_requestbody.rb +0 -95
  207. data/lib/open_api_sdk/models/operations/updatelink_response.rb +0 -60
  208. data/lib/open_api_sdk/models/operations/updatetag_color.rb +0 -24
  209. data/lib/open_api_sdk/models/operations/updatetag_request.rb +0 -27
  210. data/lib/open_api_sdk/models/operations/updatetag_requestbody.rb +0 -32
  211. data/lib/open_api_sdk/models/operations/updatetag_response.rb +0 -60
  212. data/lib/open_api_sdk/models/operations/updateworkspace_request.rb +0 -27
  213. data/lib/open_api_sdk/models/operations/updateworkspace_requestbody.rb +0 -27
  214. data/lib/open_api_sdk/models/operations/updateworkspace_response.rb +0 -60
  215. data/lib/open_api_sdk/models/operations/upsertlink_requestbody.rb +0 -95
  216. data/lib/open_api_sdk/models/operations/upsertlink_response.rb +0 -60
  217. data/lib/open_api_sdk/models/operations.rb +0 -74
  218. data/lib/open_api_sdk/models/shared/badrequest.rb +0 -24
  219. data/lib/open_api_sdk/models/shared/code.rb +0 -18
  220. data/lib/open_api_sdk/models/shared/color.rb +0 -24
  221. data/lib/open_api_sdk/models/shared/conflict.rb +0 -24
  222. data/lib/open_api_sdk/models/shared/conflict_code.rb +0 -18
  223. data/lib/open_api_sdk/models/shared/conflict_error.rb +0 -30
  224. data/lib/open_api_sdk/models/shared/countrycode.rb +0 -267
  225. data/lib/open_api_sdk/models/shared/domains.rb +0 -27
  226. data/lib/open_api_sdk/models/shared/domainschema.rb +0 -48
  227. data/lib/open_api_sdk/models/shared/error.rb +0 -30
  228. data/lib/open_api_sdk/models/shared/forbidden.rb +0 -24
  229. data/lib/open_api_sdk/models/shared/forbidden_code.rb +0 -18
  230. data/lib/open_api_sdk/models/shared/forbidden_error.rb +0 -30
  231. data/lib/open_api_sdk/models/shared/geo.rb +0 -771
  232. data/lib/open_api_sdk/models/shared/internalservererror.rb +0 -24
  233. data/lib/open_api_sdk/models/shared/internalservererror_code.rb +0 -18
  234. data/lib/open_api_sdk/models/shared/internalservererror_error.rb +0 -30
  235. data/lib/open_api_sdk/models/shared/inviteexpired.rb +0 -24
  236. data/lib/open_api_sdk/models/shared/inviteexpired_code.rb +0 -18
  237. data/lib/open_api_sdk/models/shared/inviteexpired_error.rb +0 -30
  238. data/lib/open_api_sdk/models/shared/linkgeotargeting.rb +0 -771
  239. data/lib/open_api_sdk/models/shared/linkschema.rb +0 -142
  240. data/lib/open_api_sdk/models/shared/notfound.rb +0 -24
  241. data/lib/open_api_sdk/models/shared/notfound_code.rb +0 -18
  242. data/lib/open_api_sdk/models/shared/notfound_error.rb +0 -30
  243. data/lib/open_api_sdk/models/shared/plan.rb +0 -24
  244. data/lib/open_api_sdk/models/shared/ratelimitexceeded.rb +0 -24
  245. data/lib/open_api_sdk/models/shared/ratelimitexceeded_code.rb +0 -18
  246. data/lib/open_api_sdk/models/shared/ratelimitexceeded_error.rb +0 -30
  247. data/lib/open_api_sdk/models/shared/role.rb +0 -19
  248. data/lib/open_api_sdk/models/shared/security.rb +0 -24
  249. data/lib/open_api_sdk/models/shared/tagschema.rb +0 -30
  250. data/lib/open_api_sdk/models/shared/unauthorized.rb +0 -24
  251. data/lib/open_api_sdk/models/shared/unauthorized_code.rb +0 -18
  252. data/lib/open_api_sdk/models/shared/unauthorized_error.rb +0 -30
  253. data/lib/open_api_sdk/models/shared/unprocessableentity.rb +0 -24
  254. data/lib/open_api_sdk/models/shared/unprocessableentity_code.rb +0 -18
  255. data/lib/open_api_sdk/models/shared/unprocessableentity_error.rb +0 -30
  256. data/lib/open_api_sdk/models/shared/users.rb +0 -24
  257. data/lib/open_api_sdk/models/shared/workspaceschema.rb +0 -81
  258. data/lib/open_api_sdk/models/shared.rb +0 -49
  259. data/lib/open_api_sdk/qr_codes.rb +0 -97
  260. data/lib/open_api_sdk/sdkconfiguration.rb +0 -52
  261. data/lib/open_api_sdk/tags.rb +0 -272
  262. data/lib/open_api_sdk/track.rb +0 -276
  263. data/lib/open_api_sdk/utils/metadata_fields.rb +0 -150
  264. data/lib/open_api_sdk/utils/t.rb +0 -59
  265. data/lib/open_api_sdk/utils/utils.rb +0 -772
  266. data/lib/open_api_sdk/workspaces.rb +0 -192
@@ -0,0 +1,416 @@
1
+ require 'helper'
2
+ require 'dub/lua'
3
+
4
+ class KlassTest < Test::Unit::TestCase
5
+
6
+ context 'A Klass' do
7
+ setup do
8
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
9
+ @class = namespacedub_xml[:dub][:Matrix]
10
+ end
11
+
12
+ should 'return a list of Functions with members' do
13
+ assert_kind_of Array, @class.members
14
+ assert_kind_of Dub::Function, @class.members.first
15
+ end
16
+
17
+ should 'return name with name' do
18
+ assert_equal 'Matrix', @class.name
19
+ end
20
+
21
+ should 'have namespace prefix' do
22
+ assert_equal 'dub', @class.prefix
23
+ end
24
+
25
+ should 'accept any attribute' do
26
+ assert_nothing_raised do
27
+ @class.foo = 'bar'
28
+ end
29
+ end
30
+
31
+ should 'store special attributes in opts' do
32
+ @class.foo = 'bar'
33
+ assert_equal 'bar', @class.opts[:foo]
34
+ end
35
+
36
+ should 'return value from opts on method missing' do
37
+ @class.foo = 'bar'
38
+ assert_equal 'bar', @class.foo
39
+ end
40
+
41
+ should 'use name as default in lib_name' do
42
+ assert_equal 'Matrix', @class.lib_name
43
+ end
44
+
45
+ should 'use lib_name if set in lib_name' do
46
+ @class.opts[:lib_name] = "dooMat"
47
+ assert_equal 'dooMat', @class.lib_name
48
+ end
49
+
50
+ should 'combine prefix and name in id_name' do
51
+ assert_equal 'dub.Matrix', @class.id_name
52
+ end
53
+
54
+ should 'combine prefix and provided name in id_name' do
55
+ assert_equal 'dub.Foobar', @class.id_name('Foobar')
56
+ end
57
+
58
+ should 'use parent namespace in full_type' do
59
+ assert_equal 'dub::Matrix', @class.full_type
60
+ end
61
+
62
+ should 'return file and line on source' do
63
+ assert_match %r{app/include/matrix\.h:\d+}, @class.source
64
+ end
65
+
66
+ should 'return a list of class methods' do
67
+ assert_kind_of Array, @class.class_methods
68
+ end
69
+
70
+ context 'with a bound member list' do
71
+ setup do
72
+ Dub::Lua.bind(@class)
73
+ @list = @class.members.map {|m| m.name}
74
+ end
75
+
76
+ should 'remove destructor from member list' do
77
+ assert !@list.include?("~Matrix")
78
+ end
79
+
80
+ should 'remove constructor from member list' do
81
+ assert !@list.include?("Matrix")
82
+ end
83
+
84
+ should 'ignore template methods in member list' do
85
+ assert !@list.include?("give_me_tea")
86
+ end
87
+
88
+ should 'ignore members with templated arguments' do
89
+ # at least for now
90
+ assert @class[:mul].has_complex_arguments?
91
+ assert !@list.include?("mul")
92
+ assert_no_match %r{Matrix_mul}, @class.to_s
93
+ end
94
+
95
+ should 'ignore private members' do
96
+ assert !@list.include?("private_method")
97
+ end
98
+
99
+ should 'ignore protected members' do
100
+ assert !@list.include?("protected_method")
101
+ end
102
+
103
+ should 'ignore operator methods in member list' do
104
+ assert !@list.include?("operator size_t")
105
+ end
106
+
107
+ should 'ignore members returning native pointers' do
108
+ assert !@list.include?("ptr")
109
+ end
110
+ end
111
+
112
+ should 'return constructor with constructor' do
113
+ const = @class.constructor
114
+ assert_kind_of Dub::Function, const.first
115
+ end
116
+
117
+ should 'respond to destructor_name' do
118
+ assert_equal 'Matrix_destructor', @class.destructor_name
119
+ end
120
+
121
+ should 'respond to tostring_name' do
122
+ assert_equal 'Matrix__tostring', @class.tostring_name
123
+ end
124
+
125
+ should 'respond to constructor.method_name' do
126
+ assert_equal 'Matrix_Matrix', @class.constructor.method_name(0)
127
+ end
128
+
129
+ should 'find method with array index' do
130
+ assert_kind_of Dub::Function, @class[:rows]
131
+ end
132
+
133
+ should 'find static methods with array index' do
134
+ assert_kind_of Dub::Function, @class[:MakeMatrix]
135
+ end
136
+
137
+ should 'return header name on header' do
138
+ assert_equal 'matrix.h', @class.header
139
+ end
140
+
141
+ should 'return defined header if changed' do
142
+ klass = Dub.parse(fixture('app/xml/namespacedub.xml'))[:dub][:Matrix]
143
+ klass.header = 'opencv/cv.h'
144
+ assert_equal 'opencv/cv.h', klass.header
145
+ end
146
+
147
+ should 'know that it is not a template' do
148
+ assert !@class.template?
149
+ end
150
+
151
+ context 'bound to a generator' do
152
+ setup do
153
+ Dub::Lua.bind(@class)
154
+ end
155
+
156
+ should 'bind each member' do
157
+ assert_equal Dub::Lua.function_generator, @class.members.first.gen
158
+ end
159
+
160
+ should 'register constructor' do
161
+ assert_match %r{\{\s*\"Matrix\"\s*,\s*Matrix_Matrix\s*\}}, @class.to_s
162
+ end
163
+
164
+ should 'build constructor' do
165
+ result = @class.to_s
166
+ assert_match %r{static int Matrix_Matrix1\s*\(}, result
167
+ assert_match %r{static int Matrix_Matrix2\s*\(}, result
168
+ assert_match %r{static int Matrix_Matrix\s*\(}, result
169
+ end
170
+
171
+ should 'return new objects in constructors' do
172
+ @class = namespacecv_xml[:cv][:Mat]
173
+ Dub::Lua.bind(@class)
174
+ assert_match %r{lua_pushclass<Mat>.*"cv.Mat"}, @class.constructor.first.to_s
175
+ end
176
+
177
+ should 'include class header' do
178
+ assert_match %r{#include\s+"matrix.h"}, @class.to_s
179
+ end
180
+
181
+ should 'include helper header' do
182
+ assert_match %r{#include\s+"lua_cpp_helper.h"}, @class.to_s
183
+ end
184
+
185
+ should 'create Lua metatable with class name' do
186
+ assert_match %r{luaL_newmetatable\(L,\s*"dub.Matrix"\)}, @class.to_s
187
+ end
188
+
189
+ should 'not build template methods' do
190
+ assert_no_match %r{give_me_tea}, @class.to_s
191
+ end
192
+
193
+ should 'declare tostring' do
194
+ assert_match %r{__tostring}, @class.to_s
195
+ end
196
+
197
+ should 'use custom format if provided for tostring' do
198
+ @class.string_format = "%dx%d"
199
+ @class.string_args = "(*userdata)->rows, (*userdata)->cols"
200
+ assert_match %r{\(\*userdata\)->rows, \(\*userdata\)->cols}, @class.to_s
201
+ end
202
+
203
+ should 'use a default method for tostring if no custom string_format is provided' do
204
+ @class.string_format = nil
205
+ assert_match %r{<dub.Matrix: %p>}, @class.to_s
206
+ end
207
+
208
+ should 'implement tostring' do
209
+ assert_match %r{Matrix__tostring\(lua_State}, @class.to_s
210
+ end
211
+
212
+ context 'using a custom template' do
213
+ setup do
214
+ @class.gen.template_path = fixture('dummy_class.cpp.erb')
215
+ end
216
+
217
+ teardown do
218
+ @class.gen.template_path = nil
219
+ end
220
+
221
+ should 'use custom template to render function' do
222
+ assert_equal 'CLASS: Matrix', @class.to_s
223
+ end
224
+ end
225
+ end
226
+ end
227
+
228
+ context 'A template class' do
229
+ setup do
230
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
231
+ @class = namespacedub_xml[:dub].template_class(:TMat)
232
+ end
233
+
234
+ should 'know that it is a template' do
235
+ assert @class.template?
236
+ end
237
+
238
+ should 'return template parameters' do
239
+ assert_equal ['T'], @class.template_params
240
+ end
241
+ end
242
+
243
+ context 'A class defined from a template' do
244
+ setup do
245
+ @class = namespacecv_xml[:cv][:Size]
246
+ end
247
+
248
+ should 'replace template parameter in method arguments' do
249
+ Dub::Lua.bind(@class)
250
+ assert_match %r{int *_width}, @class.to_s
251
+ end
252
+
253
+ should 'register in the template for these types' do
254
+ @tclass = namespacecv_xml[:cv].template_class(:Size_)
255
+ assert_equal @class, @tclass.instanciations[['int']]
256
+ end
257
+
258
+ context 'with a bound member list' do
259
+ setup do
260
+ @class = namespacedub_xml[:dub][:FMatrix]
261
+ Dub::Lua.bind(@class)
262
+ @list = @class.members.map {|m| m.name}
263
+ end
264
+
265
+ should 'ignore template methods in member list' do
266
+ assert !@list.include?("give_me_tea")
267
+ end
268
+
269
+ should 'ignore template methods in member registration' do
270
+ assert_no_match %r{give_me_tea}, @class.gen.method_registration(@class)
271
+ end
272
+
273
+ should 'ignore template methods in method istanciation' do
274
+ assert_no_match %r{give_me_tea}, @class.to_s
275
+ end
276
+ end
277
+ end
278
+
279
+ # strangely, the bug does not show up with "FMatrix"
280
+ context 'Another class defined from a template' do
281
+ setup do
282
+ @class = namespacecv_xml[:cv][:Scalar]
283
+ end
284
+
285
+ context 'with a bound member list' do
286
+ setup do
287
+ Dub::Lua.bind(@class)
288
+ @list = @class.members.map {|m| m.name}
289
+ end
290
+
291
+ should 'ignore template methods in member list' do
292
+ assert !@list.include?("convertTo")
293
+ end
294
+
295
+ should 'ignore template methods in member registration' do
296
+ assert_no_match %r{convertTo}, @class.gen.method_registration(@class)
297
+ end
298
+
299
+ should 'ignore template methods in method istanciation' do
300
+ assert_no_match %r{convertTo}, @class.to_s
301
+ end
302
+ end
303
+ end
304
+
305
+ context 'A class with alias names' do
306
+ setup do
307
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
308
+ @class = namespacedub_xml[:dub][:FloatMat]
309
+ end
310
+
311
+ should 'return a list of these alias on alias_names' do
312
+ assert_equal ['FloatMat'], @class.alias_names
313
+ assert_equal 'FMatrix', @class.name
314
+ end
315
+
316
+ should 'find class from alias in namespace' do
317
+ assert_equal @class, namespacedub_xml[:dub][:FMatrix]
318
+ end
319
+
320
+ should 'use the shortest alias as main name' do
321
+ assert_equal 'Size', namespacecv_xml[:cv][:Size2i].name
322
+ end
323
+
324
+ should 'rename constructors to shortest name' do
325
+ assert_equal 'Size', namespacecv_xml[:cv][:Size].constructor.name
326
+ end
327
+
328
+ should 'parse arguments and evaluate types by resolving template params' do
329
+ size_class = namespacecv_xml[:cv][:Size]
330
+ Dub::Lua.bind(size_class)
331
+ assert_match %r{const Point \*pt}, size_class.constructor[5].to_s
332
+ end
333
+
334
+ context 'bound to a generator' do
335
+ setup do
336
+ Dub::Lua.bind(@class)
337
+ end
338
+
339
+ should 'register all alias_names' do
340
+ result = @class.to_s
341
+ assert_match %r{"FloatMat"\s*,\s*FMatrix_FMatrix}, result
342
+ assert_match %r{"FMatrix"\s*,\s*FMatrix_FMatrix}, result
343
+ assert_match %r{luaL_register\(L,\s*"dub".*FMatrix_namespace_methods}, result
344
+ end
345
+
346
+ should 'use the smallest name in method definition' do
347
+ assert_match %r{int FMatrix_FMatrix}, @class.to_s
348
+ end
349
+ end
350
+ end
351
+
352
+ context 'A class with overloaded methods' do
353
+ setup do
354
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
355
+ @class = namespacecv_xml[:cv][:Mat]
356
+ Dub::Lua.bind(@class)
357
+ end
358
+
359
+ should 'declare chooser' do
360
+ result = @class.gen.method_registration(@class)
361
+ assert_match %r{"diag"\s*,\s*Mat_diag\}}, result
362
+ assert_no_match %r{diag1}, result
363
+ end
364
+ end
365
+
366
+ context 'A class with overloaded static methods' do
367
+ setup do
368
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
369
+ @class = namespacecv_xml[:cv][:Mat]
370
+ Dub::Lua.bind(@class)
371
+ end
372
+
373
+ should 'declare chooser' do
374
+ result = @class.gen.namespace_methods_registration(@class)
375
+ assert_match %r{"Mat_zeros"\s*,\s*Mat_zeros\}}, result
376
+ assert_no_match %r{zeros1}, result
377
+ end
378
+ end
379
+
380
+ context 'A complex class' do
381
+ setup do
382
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
383
+ @class = namespacecv_xml[:cv][:Mat]
384
+ end
385
+
386
+ context 'bound to a generator' do
387
+ setup do
388
+ Dub::Lua.bind(@class)
389
+ end
390
+
391
+ should 'list all members on members' do
392
+ assert_equal %w{addref adjustROI assignTo channels clone col colRange convertTo copyTo create cross depth diag dot elemSize elemSize1 empty eye isContinuous locateROI ones release reshape row rowRange setTo size step1 type zeros}, @class.members.map {|m| m.name}
393
+ end
394
+ end
395
+ end
396
+
397
+ context 'A class with enums' do
398
+ setup do
399
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
400
+ @class = namespacecv_xml[:cv][:Mat]
401
+ end
402
+
403
+ should 'respond true to has_enums' do
404
+ assert @class.has_constants?
405
+ end
406
+
407
+ should 'produce namespaced declarations' do
408
+ assert_match %r{\{"AUTO_STEP"\s*,\s*cv::Mat::AUTO_STEP\}}, Dub::Lua.class_generator.constants_registration(@class)
409
+ end
410
+
411
+ should 'find a list of enums' do
412
+ assert_equal %w{MAGIC_VAL AUTO_STEP CONTINUOUS_FLAG}, @class.enums
413
+ end
414
+ end
415
+
416
+ end
@@ -0,0 +1,215 @@
1
+ require 'helper'
2
+ require 'dub/lua'
3
+
4
+ class LuaFunctionGenTest < Test::Unit::TestCase
5
+ context 'A Lua generator' do
6
+ setup do
7
+ @generator = Dub::Lua
8
+ end
9
+
10
+ context 'with a function' do
11
+ setup do
12
+ # namespacecv_xml = Dub.parse(fixture('namespacecv.xml'))
13
+ @function = namespacecv_xml[:cv][:resize]
14
+ end
15
+
16
+ should 'return Function on bind' do
17
+ assert_kind_of Dub::Function, @generator.bind(@function)
18
+ end
19
+ end
20
+ end
21
+
22
+ context 'A Function' do
23
+ setup do
24
+ @function = namespacecv_xml[:cv][:resize]
25
+ end
26
+
27
+ context 'bound to a Lua generator' do
28
+ setup do
29
+ Dub::Lua.bind(@function)
30
+ @generator = Dub::Lua.function_generator
31
+ end
32
+
33
+
34
+ should 'return string on to_s' do
35
+ assert_kind_of String, @function.to_s
36
+ end
37
+
38
+ should 'generate a static function returning an int' do
39
+ assert_match %r{static int cv_resize}, @function.to_s
40
+ end
41
+
42
+ should 'insert code to check for an arguments on get_arg' do
43
+ assert_match /Mat.*\*\s*src\s*=\s*\*\(\(const\s+Mat\s+\*\*\)\s*luaL_checkudata\s*\(L,\s*1,\s*\"cv\.Mat\"\s*\)\)\s*;/,
44
+ @generator.get_arg(@function.arguments.first, 1) # 1 = first argument in Lua stack
45
+ end
46
+
47
+ context 'with default values' do
48
+ should 'verify stack size' do
49
+ assert_match /top__\s*<\s*6/, @generator.function(@function)
50
+ end
51
+ end
52
+
53
+ context 'in a class with a class as parameter' do
54
+ setup do
55
+ @function = namespacecv_xml[:cv][:Mat][:locateROI]
56
+ end
57
+
58
+ should 'use parameter class identifier' do
59
+ assert_match /Size\s*\*\*\)luaL_checkudata\s*\(L,\s*1,\s*\"cv\.Size\"\s*\)\)\s*;/,
60
+ @generator.get_arg(@function.arguments.first, 1) # 1 = first argument in Lua stack
61
+ end
62
+ end
63
+
64
+ context 'using a custom template' do
65
+ setup do
66
+ @generator.template_path = fixture('dummy_function.cpp.erb')
67
+ end
68
+
69
+ teardown do
70
+ @generator.template_path = nil
71
+ end
72
+
73
+ should 'use custom template to render function' do
74
+ assert_equal 'DUMMY: resize', @generator.function(@function)
75
+ end
76
+ end
77
+
78
+ context 'using a custom type' do
79
+ setup do
80
+ @generator.custom_type(/lua_State /) do |type_def, arg, stack_pos|
81
+ if type_def =~ /lua_State\s*\*\s*L/
82
+ ""
83
+ else
84
+ "#{type_def} = L;"
85
+ end
86
+ end
87
+ end
88
+
89
+ should 'use custom block to get arg type' do
90
+ method = @generator.function(namespacedub_xml[:dub][:Matrix][:lua_thing])
91
+ assert_match %r{int a = luaL_checkint\(L, 1\)}, method
92
+ assert_no_match %r{L\s*=}, method
93
+ assert_match %r{int b = luaL_checkint\(L, 3\)}, method
94
+ assert_match %r{lua_thing\(a, L, b\)}, method
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ context 'A group of overloaded functions' do
101
+ setup do
102
+ # namespacecv_xml = Dub.parse(fixture('namespacecv.xml'))
103
+ @function_group = namespacecv_xml[:cv][:divide]
104
+ end
105
+
106
+ context 'bound to a Lua generator' do
107
+ setup do
108
+ Dub::Lua.bind(@function_group)
109
+ end
110
+
111
+ should 'return string content on to_s' do
112
+ assert_kind_of String, @function_group.to_s
113
+ end
114
+
115
+ should 'generate a static function returning an int' do
116
+ assert_match %r{static int cv_divide}, @function_group.to_s
117
+ end
118
+
119
+ should 'generate a static function returning an int for each overloaded function' do
120
+ bindings = @function_group.to_s
121
+ assert_match %r{static int cv_divide1}, bindings
122
+ assert_match %r{static int cv_divide2}, bindings
123
+ assert_match %r{static int cv_divide3}, bindings
124
+ assert_match %r{static int cv_divide4}, bindings
125
+ end
126
+
127
+ # should 'declare chooser' do
128
+ # assert_match %r{"divide",\s*cv_divide\}}, @group.to_s
129
+ # end
130
+ end
131
+ end
132
+
133
+ context 'A function with a custom class return value' do
134
+ setup do
135
+ # namespacecv_xml = Dub.parse(fixture('namespacecv.xml'))
136
+ @function = namespacecv_xml[:cv][:getRotationMatrix2D]
137
+ end
138
+
139
+ context 'bound to a Lua generator' do
140
+ setup do
141
+ Dub::Lua.bind(@function)
142
+ end
143
+
144
+ should 'call template push method' do
145
+ assert_match %r{lua_pushclass<Mat>\(\s*L\s*,\s*retval__\s*,\s*"cv.Mat"\s*\)}, @function.to_s
146
+ end
147
+ end
148
+ end
149
+
150
+ context 'A function with pointer parameters' do
151
+ setup do
152
+ # namespacecv_xml = Dub.parse(fixture('namespacecv.xml'))
153
+ @function = namespacecv_xml[:cv][:calcHist][0]
154
+ end
155
+
156
+ context 'bound to a Lua generator' do
157
+ setup do
158
+ Dub::Lua.bind(@function)
159
+ end
160
+
161
+ should 'use a DubArgPointer with the given type' do
162
+ assert_match %r{DubArgPointer<int>}, @function.to_s
163
+ end
164
+ end
165
+ end
166
+
167
+ context 'A member function bound to a Lua generator' do
168
+ setup do
169
+ @member = namespacedub_xml[:dub][:Matrix][:rows]
170
+ Dub::Lua.bind(@member)
171
+ end
172
+
173
+ should 'start by getting self' do
174
+ assert_match %r{self__\s*=\s*\*\(\(Matrix\*\*\)luaL_checkudata}, @member.to_s
175
+ end
176
+
177
+ should 'prefix call with self' do
178
+ assert_match %r{self__->rows\(}, @member.to_s
179
+ end
180
+ end
181
+
182
+ context 'A constructor bound to a Lua generator' do
183
+ setup do
184
+ @constructor = namespacedub_xml[:dub][:Matrix][:Matrix].first
185
+ Dub::Lua.bind(@constructor)
186
+ end
187
+
188
+ should 'use pushclass in constructor' do
189
+ result = @constructor.to_s
190
+ assert_match %r{lua_pushclass<Matrix>\s*\(L, retval__, \"dub.Matrix\"\s*\)}, result
191
+ end
192
+ end
193
+
194
+ context 'A function without return value' do
195
+ setup do
196
+ @function = namespacecv_xml[:cv][:blur]
197
+ end
198
+
199
+ context 'bound to a Lua generator' do
200
+ setup do
201
+ Dub::Lua.bind(@function)
202
+ end
203
+
204
+ should 'return 0' do
205
+ assert_match %r{return\s+0}, @function.to_s
206
+ end
207
+ end
208
+ end
209
+
210
+
211
+ end
212
+
213
+
214
+
215
+