dub 0.2.2 → 0.6.6

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