tjsffi.nim 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. discard """
  2. output: '''
  3. true
  4. true
  5. true
  6. true
  7. true
  8. true
  9. true
  10. true
  11. true
  12. true
  13. true
  14. true
  15. true
  16. true
  17. true
  18. true
  19. 3
  20. 2
  21. 12
  22. Event { name: 'click: test' }
  23. Event { name: 'reloaded: test' }
  24. Event { name: 'updates: test' }
  25. true
  26. true
  27. true
  28. true
  29. true
  30. true
  31. true
  32. '''
  33. """
  34. import jsffi, jsconsole
  35. # Tests for JsObject
  36. # Test JsObject []= and []
  37. block:
  38. proc test(): bool =
  39. let obj = newJsObject()
  40. var working = true
  41. obj["a"] = 11
  42. obj["b"] = "test"
  43. obj["c"] = "test".cstring
  44. working = working and obj["a"].to(int) == 11
  45. working = working and obj["c"].to(cstring) == "test".cstring
  46. working
  47. echo test()
  48. # Test JsObject .= and .
  49. block:
  50. proc test(): bool =
  51. let obj = newJsObject()
  52. var working = true
  53. obj.a = 11
  54. obj.b = "test"
  55. obj.c = "test".cstring
  56. obj.`$!&` = 42
  57. obj.`while` = 99
  58. working = working and obj.a.to(int) == 11
  59. working = working and obj.b.to(string) == "test"
  60. working = working and obj.c.to(cstring) == "test".cstring
  61. working = working and obj.`$!&`.to(int) == 42
  62. working = working and obj.`while`.to(int) == 99
  63. working
  64. echo test()
  65. # Test JsObject .()
  66. block:
  67. proc test(): bool =
  68. let obj = newJsObject()
  69. obj.`?!$` = proc(x, y, z: int, t: cstring): cstring = t & $(x + y + z)
  70. obj.`?!$`(1, 2, 3, "Result is: ").to(cstring) == cstring"Result is: 6"
  71. echo test()
  72. # Test JsObject []()
  73. block:
  74. proc test(): bool =
  75. let obj = newJsObject()
  76. obj.a = proc(x, y, z: int, t: string): string = t & $(x + y + z)
  77. let call = obj["a"].to(proc(x, y, z: int, t: string): string)
  78. call(1, 2, 3, "Result is: ") == "Result is: 6"
  79. echo test()
  80. # Test JsObject Iterators
  81. block:
  82. proc testPairs(): bool =
  83. let obj = newJsObject()
  84. var working = true
  85. obj.a = 10
  86. obj.b = 20
  87. obj.c = 30
  88. for k, v in obj.pairs:
  89. case $k
  90. of "a":
  91. working = working and v.to(int) == 10
  92. of "b":
  93. working = working and v.to(int) == 20
  94. of "c":
  95. working = working and v.to(int) == 30
  96. else:
  97. return false
  98. working
  99. proc testItems(): bool =
  100. let obj = newJsObject()
  101. var working = true
  102. obj.a = 10
  103. obj.b = 20
  104. obj.c = 30
  105. for v in obj.items:
  106. working = working and v.to(int) in [10, 20, 30]
  107. working
  108. proc testKeys(): bool =
  109. let obj = newJsObject()
  110. var working = true
  111. obj.a = 10
  112. obj.b = 20
  113. obj.c = 30
  114. for v in obj.keys:
  115. working = working and $v in ["a", "b", "c"]
  116. working
  117. proc test(): bool = testPairs() and testItems() and testKeys()
  118. echo test()
  119. # Test JsObject equality
  120. block:
  121. proc test(): bool =
  122. {. emit: "var comparison = {a: 22, b: 'test'};" .}
  123. var comparison {. importjs, nodecl .}: JsObject
  124. let obj = newJsObject()
  125. obj.a = 22
  126. obj.b = "test".cstring
  127. obj.a == comparison.a and obj.b == comparison.b
  128. echo test()
  129. # Test JsObject literal
  130. block:
  131. proc test(): bool =
  132. {. emit: "var comparison = {a: 22, b: 'test'};" .}
  133. var comparison {. importjs, nodecl .}: JsObject
  134. let obj = JsObject{ a: 22, b: "test".cstring }
  135. obj.a == comparison.a and obj.b == comparison.b
  136. echo test()
  137. # Tests for JsAssoc
  138. # Test JsAssoc []= and []
  139. block:
  140. proc test(): bool =
  141. let obj = newJsAssoc[int, int]()
  142. var working = true
  143. obj[1] = 11
  144. working = working and not compiles(obj["a"] = 11)
  145. working = working and not compiles(obj["a"])
  146. working = working and not compiles(obj[2] = "test")
  147. working = working and not compiles(obj[3] = "test".cstring)
  148. working = working and obj[1] == 11
  149. working
  150. echo test()
  151. # Test JsAssoc .= and .
  152. block:
  153. proc test(): bool =
  154. let obj = newJsAssoc[cstring, int]()
  155. var working = true
  156. obj.a = 11
  157. obj.`$!&` = 42
  158. working = working and not compiles(obj.b = "test")
  159. working = working and not compiles(obj.c = "test".cstring)
  160. working = working and obj.a == 11
  161. working = working and obj.`$!&` == 42
  162. working
  163. echo test()
  164. # Test JsAssoc .()
  165. block:
  166. proc test(): bool =
  167. let obj = newJsAssoc[cstring, proc(e: int): int]()
  168. obj.a = proc(e: int): int = e * e
  169. obj.a(10) == 100
  170. echo test()
  171. # Test JsAssoc []()
  172. block:
  173. proc test(): bool =
  174. let obj = newJsAssoc[cstring, proc(e: int): int]()
  175. obj.a = proc(e: int): int = e * e
  176. let call = obj["a"]
  177. call(10) == 100
  178. echo test()
  179. # Test JsAssoc Iterators
  180. block:
  181. proc testPairs(): bool =
  182. let obj = newJsAssoc[cstring, int]()
  183. var working = true
  184. obj.a = 10
  185. obj.b = 20
  186. obj.c = 30
  187. for k, v in obj.pairs:
  188. case $k
  189. of "a":
  190. working = working and v == 10
  191. of "b":
  192. working = working and v == 20
  193. of "c":
  194. working = working and v == 30
  195. else:
  196. return false
  197. working
  198. proc testItems(): bool =
  199. let obj = newJsAssoc[cstring, int]()
  200. var working = true
  201. obj.a = 10
  202. obj.b = 20
  203. obj.c = 30
  204. for v in obj.items:
  205. working = working and v in [10, 20, 30]
  206. working
  207. proc testKeys(): bool =
  208. let obj = newJsAssoc[cstring, int]()
  209. var working = true
  210. obj.a = 10
  211. obj.b = 20
  212. obj.c = 30
  213. for v in obj.keys:
  214. working = working and v in [cstring"a", cstring"b", cstring"c"]
  215. working
  216. proc test(): bool = testPairs() and testItems() and testKeys()
  217. echo test()
  218. # Test JsAssoc equality
  219. block:
  220. proc test(): bool =
  221. {. emit: "var comparison = {a: 22, b: 55};" .}
  222. var comparison {. importjs, nodecl .}: JsAssoc[cstring, int]
  223. let obj = newJsAssoc[cstring, int]()
  224. obj.a = 22
  225. obj.b = 55
  226. obj.a == comparison.a and obj.b == comparison.b
  227. echo test()
  228. # Test JsAssoc literal
  229. block:
  230. proc test(): bool =
  231. {. emit: "var comparison = {a: 22, b: 55};" .}
  232. var comparison {. importjs, nodecl .}: JsAssoc[cstring, int]
  233. let obj = JsAssoc[cstring, int]{ a: 22, b: 55 }
  234. var working = true
  235. working = working and
  236. compiles(JsAssoc[int, int]{ 1: 22, 2: 55 })
  237. working = working and
  238. comparison.a == obj.a and comparison.b == obj.b
  239. working = working and
  240. not compiles(JsAssoc[cstring, int]{ a: "test" })
  241. working
  242. echo test()
  243. # Tests for macros on non-JsRoot objects
  244. # Test lit
  245. block:
  246. type TestObject = object
  247. a: int
  248. b: cstring
  249. proc test(): bool =
  250. {. emit: "var comparison = {a: 1};" .}
  251. var comparison {. importjs, nodecl .}: TestObject
  252. let obj = TestObject{ a: 1 }
  253. obj == comparison
  254. echo test()
  255. # Test bindMethod
  256. block:
  257. type TestObject = object
  258. a: int
  259. onWhatever: proc(e: int): int
  260. proc handleWhatever(this: TestObject, e: int): int =
  261. e + this.a
  262. proc test(): bool =
  263. let obj = TestObject(a: 9, onWhatever: bindMethod(handleWhatever))
  264. obj.onWhatever(1) == 10
  265. echo test()
  266. block:
  267. {.emit: "function jsProc(n) { return n; }" .}
  268. proc jsProc(x: int32): JsObject {.importjs: "jsProc(#)".}
  269. proc test() =
  270. var x = jsProc(1)
  271. var y = jsProc(2)
  272. console.log x + y
  273. console.log ++x
  274. x += jsProc(10)
  275. console.log x
  276. test()
  277. block:
  278. {.emit:
  279. """
  280. function Event(name) { this.name = name; }
  281. function on(eventName, eventHandler) { eventHandler(new Event(eventName + ": test")); }
  282. var jslib = { "on": on, "subscribe": on };
  283. """
  284. .}
  285. type Event = object
  286. name: cstring
  287. proc on(event: cstring, handler: proc) {.importjs: "on(#,#)".}
  288. var jslib {.importjs: "jslib", nodecl.}: JsObject
  289. on("click") do (e: Event):
  290. console.log e
  291. jslib.on("reloaded") do:
  292. console.log jsarguments[0]
  293. # this test case is different from the above, because
  294. # `subscribe` is not overloaded in the current scope
  295. jslib.subscribe("updates"):
  296. console.log jsarguments[0]
  297. block:
  298. echo jsUndefined == jsNull
  299. echo jsUndefined == nil
  300. echo jsNull == nil
  301. echo jsUndefined.isNil
  302. echo jsNull.isNil
  303. echo jsNull.isNull
  304. echo jsUndefined.isUndefined