dub 0.2.2 → 0.6.3

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 +37 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +48 -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 +232 -0
  14. data/lib/dub/lua/class.cpp.erb +83 -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 +258 -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 +153 -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 +313 -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 +47 -0
  126. data/test/fixtures/app/xml/index.xsd +66 -0
  127. data/test/fixtures/app/xml/matrix_8h.xml +175 -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 +395 -0
  142. data/test/lua_function_gen_test.rb +195 -0
  143. data/test/namespace_test.rb +220 -0
  144. data/test/parser_test.rb +36 -0
  145. metadata +211 -275
  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,395 @@
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 'combine prefix and name in lib_name' do
26
+ assert_equal 'dub_Matrix', @class.lib_name
27
+ end
28
+
29
+ should 'combine prefix and name in id_name' do
30
+ assert_equal 'dub.Matrix', @class.id_name
31
+ end
32
+
33
+ should 'combine prefix and provided name in id_name' do
34
+ assert_equal 'dub.Foobar', @class.id_name('Foobar')
35
+ end
36
+
37
+ should 'use parent namespace in full_type' do
38
+ assert_equal 'dub::Matrix', @class.full_type
39
+ end
40
+
41
+ should 'return file and line on source' do
42
+ assert_match %r{app/include/matrix\.h:\d+}, @class.source
43
+ end
44
+
45
+ should 'return a list of class methods' do
46
+ assert_kind_of Array, @class.class_methods
47
+ end
48
+
49
+ context 'with a bound member list' do
50
+ setup do
51
+ Dub::Lua.bind(@class)
52
+ @list = @class.members.map {|m| m.name}
53
+ end
54
+
55
+ should 'remove destructor from member list' do
56
+ assert !@list.include?("~Matrix")
57
+ end
58
+
59
+ should 'remove constructor from member list' do
60
+ assert !@list.include?("Matrix")
61
+ end
62
+
63
+ should 'ignore template methods in member list' do
64
+ assert !@list.include?("give_me_tea")
65
+ end
66
+
67
+ should 'ignore members with templated arguments' do
68
+ # at least for now
69
+ assert @class[:mul].has_complex_arguments?
70
+ assert !@list.include?("mul")
71
+ assert_no_match %r{Matrix_mul}, @class.to_s
72
+ end
73
+
74
+ should 'ignore private members' do
75
+ assert !@list.include?("private_method")
76
+ end
77
+
78
+ should 'ignore protected members' do
79
+ assert !@list.include?("protected_method")
80
+ end
81
+
82
+ should 'ignore operator methods in member list' do
83
+ assert !@list.include?("operator size_t")
84
+ end
85
+
86
+ should 'ignore members returning native pointers' do
87
+ assert !@list.include?("ptr")
88
+ end
89
+ end
90
+
91
+ should 'return constructor with constructor' do
92
+ const = @class.constructor
93
+ assert_kind_of Dub::Function, const.first
94
+ end
95
+
96
+ should 'respond to destructor_name' do
97
+ assert_equal 'Matrix_destructor', @class.destructor_name
98
+ end
99
+
100
+ should 'respond to tostring_name' do
101
+ assert_equal 'Matrix__tostring', @class.tostring_name
102
+ end
103
+
104
+ should 'respond to constructor.method_name' do
105
+ assert_equal 'Matrix_Matrix', @class.constructor.method_name(0)
106
+ end
107
+
108
+ should 'find method with array index' do
109
+ assert_kind_of Dub::Function, @class[:rows]
110
+ end
111
+
112
+ should 'find static methods with array index' do
113
+ assert_kind_of Dub::Function, @class[:MakeMatrix]
114
+ end
115
+
116
+ should 'return header name on header' do
117
+ assert_equal 'matrix.h', @class.header
118
+ end
119
+
120
+ should 'return defined header if changed' do
121
+ klass = Dub.parse(fixture('app/xml/namespacedub.xml'))[:dub][:Matrix]
122
+ klass.header = 'opencv/cv.h'
123
+ assert_equal 'opencv/cv.h', klass.header
124
+ end
125
+
126
+ should 'know that it is not a template' do
127
+ assert !@class.template?
128
+ end
129
+
130
+ context 'bound to a generator' do
131
+ setup do
132
+ Dub::Lua.bind(@class)
133
+ end
134
+
135
+ should 'bind each member' do
136
+ assert_equal Dub::Lua.function_generator, @class.members.first.gen
137
+ end
138
+
139
+ should 'register constructor' do
140
+ assert_match %r{\{\s*\"Matrix\"\s*,\s*Matrix_Matrix\s*\}}, @class.to_s
141
+ end
142
+
143
+ should 'build constructor' do
144
+ result = @class.to_s
145
+ assert_match %r{static int Matrix_Matrix1\s*\(}, result
146
+ assert_match %r{static int Matrix_Matrix2\s*\(}, result
147
+ assert_match %r{static int Matrix_Matrix\s*\(}, result
148
+ end
149
+
150
+ should 'return new objects in constructors' do
151
+ @class = namespacecv_xml[:cv][:Mat]
152
+ Dub::Lua.bind(@class)
153
+ assert_match %r{lua_pushclass<Mat>.*"cv.Mat"}, @class.constructor.first.to_s
154
+ end
155
+
156
+ should 'include class header' do
157
+ assert_match %r{#include\s+"matrix.h"}, @class.to_s
158
+ end
159
+
160
+ should 'include helper header' do
161
+ assert_match %r{#include\s+"lua_cpp_helper.h"}, @class.to_s
162
+ end
163
+
164
+ should 'create Lua metatable with class name' do
165
+ assert_match %r{luaL_newmetatable\(L,\s*"dub.Matrix"\)}, @class.to_s
166
+ end
167
+
168
+ should 'not build template methods' do
169
+ assert_no_match %r{give_me_tea}, @class.to_s
170
+ end
171
+
172
+ should 'declare tostring' do
173
+ assert_match %r{__tostring}, @class.to_s
174
+ end
175
+
176
+ should 'use custom format if provided for tostring' do
177
+ @class.string_format = "%dx%d"
178
+ @class.string_args = "(*userdata)->rows, (*userdata)->cols"
179
+ assert_match %r{\(\*userdata\)->rows, \(\*userdata\)->cols}, @class.to_s
180
+ end
181
+
182
+ should 'use a default method for tostring if no custom string_format is provided' do
183
+ @class.string_format = nil
184
+ assert_match %r{<dub.Matrix: %p>}, @class.to_s
185
+ end
186
+
187
+ should 'implement tostring' do
188
+ assert_match %r{Matrix__tostring\(lua_State}, @class.to_s
189
+ end
190
+
191
+ context 'using a custom template' do
192
+ setup do
193
+ @class.gen.template_path = fixture('dummy_class.cpp.erb')
194
+ end
195
+
196
+ teardown do
197
+ @class.gen.template_path = nil
198
+ end
199
+
200
+ should 'use custom template to render function' do
201
+ assert_equal 'CLASS: Matrix', @class.to_s
202
+ end
203
+ end
204
+ end
205
+ end
206
+
207
+ context 'A template class' do
208
+ setup do
209
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
210
+ @class = namespacedub_xml[:dub].template_class(:TMat)
211
+ end
212
+
213
+ should 'know that it is a template' do
214
+ assert @class.template?
215
+ end
216
+
217
+ should 'return template parameters' do
218
+ assert_equal ['T'], @class.template_params
219
+ end
220
+ end
221
+
222
+ context 'A class defined from a template' do
223
+ setup do
224
+ @class = namespacecv_xml[:cv][:Size]
225
+ end
226
+
227
+ should 'replace template parameter in method arguments' do
228
+ Dub::Lua.bind(@class)
229
+ assert_match %r{int *_width}, @class.to_s
230
+ end
231
+
232
+ should 'register in the template for these types' do
233
+ @tclass = namespacecv_xml[:cv].template_class(:Size_)
234
+ assert_equal @class, @tclass.instanciations[['int']]
235
+ end
236
+
237
+ context 'with a bound member list' do
238
+ setup do
239
+ @class = namespacedub_xml[:dub][:FMatrix]
240
+ Dub::Lua.bind(@class)
241
+ @list = @class.members.map {|m| m.name}
242
+ end
243
+
244
+ should 'ignore template methods in member list' do
245
+ assert !@list.include?("give_me_tea")
246
+ end
247
+
248
+ should 'ignore template methods in member registration' do
249
+ assert_no_match %r{give_me_tea}, @class.gen.method_registration(@class)
250
+ end
251
+
252
+ should 'ignore template methods in method istanciation' do
253
+ assert_no_match %r{give_me_tea}, @class.to_s
254
+ end
255
+ end
256
+ end
257
+
258
+ # strangely, the bug does not show up with "FMatrix"
259
+ context 'Another class defined from a template' do
260
+ setup do
261
+ @class = namespacecv_xml[:cv][:Scalar]
262
+ end
263
+
264
+ context 'with a bound member list' do
265
+ setup do
266
+ Dub::Lua.bind(@class)
267
+ @list = @class.members.map {|m| m.name}
268
+ end
269
+
270
+ should 'ignore template methods in member list' do
271
+ assert !@list.include?("convertTo")
272
+ end
273
+
274
+ should 'ignore template methods in member registration' do
275
+ assert_no_match %r{convertTo}, @class.gen.method_registration(@class)
276
+ end
277
+
278
+ should 'ignore template methods in method istanciation' do
279
+ assert_no_match %r{convertTo}, @class.to_s
280
+ end
281
+ end
282
+ end
283
+
284
+ context 'A class with alias names' do
285
+ setup do
286
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
287
+ @class = namespacedub_xml[:dub][:FloatMat]
288
+ end
289
+
290
+ should 'return a list of these alias on alias_names' do
291
+ assert_equal ['FloatMat'], @class.alias_names
292
+ assert_equal 'FMatrix', @class.name
293
+ end
294
+
295
+ should 'find class from alias in namespace' do
296
+ assert_equal @class, namespacedub_xml[:dub][:FMatrix]
297
+ end
298
+
299
+ should 'use the shortest alias as main name' do
300
+ assert_equal 'Size', namespacecv_xml[:cv][:Size2i].name
301
+ end
302
+
303
+ should 'rename constructors to shortest name' do
304
+ assert_equal 'Size', namespacecv_xml[:cv][:Size].constructor.name
305
+ end
306
+
307
+ should 'parse arguments and evaluate types by resolving template params' do
308
+ size_class = namespacecv_xml[:cv][:Size]
309
+ Dub::Lua.bind(size_class)
310
+ assert_match %r{const Point \*pt}, size_class.constructor[5].to_s
311
+ end
312
+
313
+ context 'bound to a generator' do
314
+ setup do
315
+ Dub::Lua.bind(@class)
316
+ end
317
+
318
+ should 'register all alias_names' do
319
+ result = @class.to_s
320
+ assert_match %r{"FloatMat"\s*,\s*FMatrix_FMatrix}, result
321
+ assert_match %r{"FMatrix"\s*,\s*FMatrix_FMatrix}, result
322
+ assert_match %r{luaL_register\(L,\s*"dub".*FMatrix_namespace_methods}, result
323
+ end
324
+
325
+ should 'use the smallest name in method definition' do
326
+ assert_match %r{int FMatrix_FMatrix}, @class.to_s
327
+ end
328
+ end
329
+ end
330
+
331
+ context 'A class with overloaded methods' do
332
+ setup do
333
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
334
+ @class = namespacecv_xml[:cv][:Mat]
335
+ Dub::Lua.bind(@class)
336
+ end
337
+
338
+ should 'declare chooser' do
339
+ result = @class.gen.method_registration(@class)
340
+ assert_match %r{"diag"\s*,\s*Mat_diag\}}, result
341
+ assert_no_match %r{diag1}, result
342
+ end
343
+ end
344
+
345
+ context 'A class with overloaded static methods' do
346
+ setup do
347
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
348
+ @class = namespacecv_xml[:cv][:Mat]
349
+ Dub::Lua.bind(@class)
350
+ end
351
+
352
+ should 'declare chooser' do
353
+ result = @class.gen.namespace_methods_registration(@class)
354
+ assert_match %r{"Mat_zeros"\s*,\s*Mat_zeros\}}, result
355
+ assert_no_match %r{zeros1}, result
356
+ end
357
+ end
358
+
359
+ context 'A complex class' do
360
+ setup do
361
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
362
+ @class = namespacecv_xml[:cv][:Mat]
363
+ end
364
+
365
+ context 'bound to a generator' do
366
+ setup do
367
+ Dub::Lua.bind(@class)
368
+ end
369
+
370
+ should 'list all members on members' do
371
+ 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}
372
+ end
373
+ end
374
+ end
375
+
376
+ context 'A class with enums' do
377
+ setup do
378
+ # namespacecv_xml = Dub.parse(fixture('app/xml/namespacedub.xml'))
379
+ @class = namespacecv_xml[:cv][:Mat]
380
+ end
381
+
382
+ should 'respond true to has_enums' do
383
+ assert @class.has_constants?
384
+ end
385
+
386
+ should 'produce namespaced declarations' do
387
+ assert_match %r{\{"AUTO_STEP"\s*,\s*cv::Mat::AUTO_STEP\}}, Dub::Lua.class_generator.constants_registration(@class)
388
+ end
389
+
390
+ should 'find a list of enums' do
391
+ assert_equal %w{MAGIC_VAL AUTO_STEP CONTINUOUS_FLAG}, @class.enums
392
+ end
393
+ end
394
+
395
+ end
@@ -0,0 +1,195 @@
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
+ end
78
+ end
79
+
80
+ context 'A group of overloaded functions' do
81
+ setup do
82
+ # namespacecv_xml = Dub.parse(fixture('namespacecv.xml'))
83
+ @function_group = namespacecv_xml[:cv][:divide]
84
+ end
85
+
86
+ context 'bound to a Lua generator' do
87
+ setup do
88
+ Dub::Lua.bind(@function_group)
89
+ end
90
+
91
+ should 'return string content on to_s' do
92
+ assert_kind_of String, @function_group.to_s
93
+ end
94
+
95
+ should 'generate a static function returning an int' do
96
+ assert_match %r{static int cv_divide}, @function_group.to_s
97
+ end
98
+
99
+ should 'generate a static function returning an int for each overloaded function' do
100
+ bindings = @function_group.to_s
101
+ assert_match %r{static int cv_divide1}, bindings
102
+ assert_match %r{static int cv_divide2}, bindings
103
+ assert_match %r{static int cv_divide3}, bindings
104
+ assert_match %r{static int cv_divide4}, bindings
105
+ end
106
+
107
+ # should 'declare chooser' do
108
+ # assert_match %r{"divide",\s*cv_divide\}}, @group.to_s
109
+ # end
110
+ end
111
+ end
112
+
113
+ context 'A function with a custom class return value' do
114
+ setup do
115
+ # namespacecv_xml = Dub.parse(fixture('namespacecv.xml'))
116
+ @function = namespacecv_xml[:cv][:getRotationMatrix2D]
117
+ end
118
+
119
+ context 'bound to a Lua generator' do
120
+ setup do
121
+ Dub::Lua.bind(@function)
122
+ end
123
+
124
+ should 'call template push method' do
125
+ assert_match %r{lua_pushclass<Mat>\(\s*L\s*,\s*retval__\s*,\s*"cv.Mat"\s*\)}, @function.to_s
126
+ end
127
+ end
128
+ end
129
+
130
+ context 'A function with pointer parameters' do
131
+ setup do
132
+ # namespacecv_xml = Dub.parse(fixture('namespacecv.xml'))
133
+ @function = namespacecv_xml[:cv][:calcHist][0]
134
+ end
135
+
136
+ context 'bound to a Lua generator' do
137
+ setup do
138
+ Dub::Lua.bind(@function)
139
+ end
140
+
141
+ should 'use a DubArgPointer with the given type' do
142
+ assert_match %r{DubArgPointer<int>}, @function.to_s
143
+ end
144
+ end
145
+ end
146
+
147
+ context 'A member function bound to a Lua generator' do
148
+ setup do
149
+ @member = namespacedub_xml[:dub][:Matrix][:rows]
150
+ Dub::Lua.bind(@member)
151
+ end
152
+
153
+ should 'start by getting self' do
154
+ assert_match %r{self__\s*=\s*\*\(\(Matrix\*\*\)luaL_checkudata}, @member.to_s
155
+ end
156
+
157
+ should 'prefix call with self' do
158
+ assert_match %r{self__->rows\(}, @member.to_s
159
+ end
160
+ end
161
+
162
+ context 'A constructor bound to a Lua generator' do
163
+ setup do
164
+ @constructor = namespacedub_xml[:dub][:Matrix][:Matrix].first
165
+ Dub::Lua.bind(@constructor)
166
+ end
167
+
168
+ should 'use pushclass in constructor' do
169
+ result = @constructor.to_s
170
+ assert_match %r{lua_pushclass<Matrix>\s*\(L, retval__, \"dub.Matrix\"\s*\)}, result
171
+ end
172
+ end
173
+
174
+ context 'A function without return value' do
175
+ setup do
176
+ @function = namespacecv_xml[:cv][:blur]
177
+ end
178
+
179
+ context 'bound to a Lua generator' do
180
+ setup do
181
+ Dub::Lua.bind(@function)
182
+ end
183
+
184
+ should 'return 0' do
185
+ assert_match %r{return\s+0}, @function.to_s
186
+ end
187
+ end
188
+ end
189
+
190
+
191
+ end
192
+
193
+
194
+
195
+