test.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. import test from 'ava'
  2. import { transform } from 'babel-core'
  3. const transpile = src => {
  4. return transform(src, {
  5. plugins: './index'
  6. }).code.trim()
  7. }
  8. const testTranspile = (title, code) => {
  9. test(title, t => {
  10. const compiled = transpile(code)
  11. t.snapshot(code, 'Initial code')
  12. t.snapshot(compiled, 'Compiled code')
  13. })
  14. }
  15. const testError = (title, code) => {
  16. test(title, t => {
  17. const error = t.throws(() => transpile(code), SyntaxError)
  18. t.snapshot(code, 'Initial code')
  19. t.snapshot(error.message, 'Error mesage')
  20. })
  21. }
  22. testError(
  23. 'Error: input[type={dynamic}, v-model]',
  24. `
  25. <input
  26. type={e}
  27. v-model={a.b}
  28. />
  29. `
  30. )
  31. testError(
  32. 'Error: input[v-model:invalidModifier]',
  33. `
  34. <input
  35. v-model:invalidModifier={a.b}
  36. />
  37. `
  38. )
  39. testError(
  40. 'Error: input[v-model, v-model]',
  41. `
  42. <input
  43. v-model={a.b}
  44. v-model={a.b}
  45. />
  46. `
  47. )
  48. testError(
  49. 'Error: input[v-model="string literal"]',
  50. `
  51. <input
  52. v-model="string literal"
  53. />
  54. `
  55. )
  56. testError(
  57. 'Error: input[v-model={identifier}]',
  58. `
  59. <input
  60. v-model={identifier}
  61. />
  62. `
  63. )
  64. testError(
  65. 'Error: h3',
  66. `
  67. <h3
  68. v-model={a.b}
  69. />
  70. `
  71. )
  72. testError(
  73. 'Error: select[v-model:trim]',
  74. `
  75. <select
  76. v-model:trim={a.b}
  77. />
  78. `
  79. )
  80. testError(
  81. 'Error: input[type="checkbox",v-model:trim]',
  82. `
  83. <input
  84. type="checkbox"
  85. v-model:trim={a.b}
  86. />
  87. `
  88. )
  89. testError(
  90. 'Error: input[type="radio",v-model:trim]',
  91. `
  92. <input
  93. type="radio"
  94. v-model:trim={a.b}
  95. />
  96. `
  97. )
  98. testError(
  99. 'Error: input[type="file",v-model]',
  100. `
  101. <input
  102. type="file"
  103. v-model={a.b}
  104. />
  105. `
  106. )
  107. testTranspile(
  108. 'Ignores namespaced attributes',
  109. `
  110. <input
  111. onClick:prevent={hey}
  112. />
  113. `
  114. )
  115. testTranspile(
  116. 'textarea[v-model]',
  117. `
  118. <textarea
  119. v-model={a.b}
  120. />
  121. `
  122. )
  123. testTranspile(
  124. 'input[v-model]',
  125. `
  126. <input
  127. v-model={a.b}
  128. />
  129. `
  130. )
  131. testTranspile(
  132. 'input[v-model={a.b[c.d[e]]}]',
  133. `
  134. <input
  135. v-model={a.b[c.d[e]]}
  136. />
  137. `
  138. )
  139. testTranspile(
  140. 'input[type="range", v-model]',
  141. `
  142. <input
  143. type="range"
  144. v-model={a.b}
  145. />
  146. `
  147. )
  148. testTranspile(
  149. 'input[v-model:lazy]',
  150. `
  151. <input
  152. v-model:lazy={a.b}
  153. />
  154. `
  155. )
  156. testTranspile(
  157. 'input[v-model:number]',
  158. `
  159. <input
  160. v-model:number={a.b}
  161. />
  162. `
  163. )
  164. testTranspile(
  165. 'input[v-model:trim]',
  166. `
  167. <input
  168. v-model:trim={a.b}
  169. />
  170. `
  171. )
  172. testTranspile(
  173. 'input[type="checkbox", v-model]',
  174. `
  175. <input
  176. type="checkbox"
  177. v-model={a.b}
  178. {...spreadForCoverage}
  179. />
  180. `
  181. )
  182. testTranspile(
  183. 'input[type="checkbox", value="forArray", true-value={{hello: true}}, false-value={{hello: false}}, v-model:number]',
  184. `
  185. <input
  186. type="checkbox"
  187. v-model:number={a.b}
  188. value="forArray"
  189. true-value={{hello: true}}
  190. false-value={{hello: false}}
  191. {...spreadForCoverage}
  192. />
  193. `
  194. )
  195. testTranspile(
  196. 'input[type="radio", v-model]',
  197. `
  198. <input
  199. type="radio"
  200. v-model={a.b}
  201. {...spreadForCoverage}
  202. />
  203. `
  204. )
  205. testTranspile(
  206. 'input[type="radio", value="101", v-model:number]',
  207. `
  208. <input
  209. type="radio"
  210. value="101"
  211. v-model:number={a.b}
  212. {...spreadForCoverage}
  213. />
  214. `
  215. )
  216. testTranspile(
  217. 'select',
  218. `
  219. <select
  220. v-model={a.b}
  221. />
  222. `
  223. )
  224. testTranspile(
  225. 'select[v-model:number]',
  226. `
  227. <select
  228. v-model:number={a.b}
  229. />
  230. `
  231. )
  232. testTranspile(
  233. 'custom-element[v-model]',
  234. `
  235. <custom-element
  236. v-model={a.b}
  237. />
  238. `
  239. )
  240. testTranspile(
  241. 'custom-element[v-model:trim]',
  242. `
  243. <custom-element
  244. v-model:trim={a.b}
  245. />
  246. `
  247. )
  248. testTranspile(
  249. 'custom-element[v-model:number]',
  250. `
  251. <custom-element
  252. v-model:number={a.b}
  253. />
  254. `
  255. )