model-checkbox.spec.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. import Vue from 'vue'
  2. describe('Directive v-model checkbox', () => {
  3. it('should work', done => {
  4. const vm = new Vue({
  5. data: {
  6. test: true
  7. },
  8. template: '<input type="checkbox" v-model="test">'
  9. }).$mount()
  10. document.body.appendChild(vm.$el)
  11. expect(vm.$el.checked).toBe(true)
  12. vm.test = false
  13. waitForUpdate(function () {
  14. expect(vm.$el.checked).toBe(false)
  15. expect(vm.test).toBe(false)
  16. vm.$el.click()
  17. expect(vm.$el.checked).toBe(true)
  18. expect(vm.test).toBe(true)
  19. }).then(() => {
  20. document.body.removeChild(vm.$el)
  21. }).then(done)
  22. })
  23. it('should respect value bindings', done => {
  24. const vm = new Vue({
  25. data: {
  26. test: 1,
  27. a: 1,
  28. b: 2
  29. },
  30. template: '<input type="checkbox" v-model="test" :true-value="a" :false-value="b">'
  31. }).$mount()
  32. document.body.appendChild(vm.$el)
  33. expect(vm.$el.checked).toBe(true)
  34. vm.$el.click()
  35. expect(vm.$el.checked).toBe(false)
  36. expect(vm.test).toBe(2)
  37. vm.$el.click()
  38. expect(vm.$el.checked).toBe(true)
  39. expect(vm.test).toBe(1)
  40. vm.test = 2
  41. waitForUpdate(() => {
  42. expect(vm.$el.checked).toBe(false)
  43. vm.test = 1
  44. }).then(() => {
  45. expect(vm.$el.checked).toBe(true)
  46. document.body.removeChild(vm.$el)
  47. }).then(done)
  48. })
  49. it('bind to Array value', done => {
  50. const vm = new Vue({
  51. data: {
  52. test: ['1']
  53. },
  54. template: `
  55. <div>
  56. <input type="checkbox" v-model="test" value="1">
  57. <input type="checkbox" v-model="test" value="2">
  58. </div>
  59. `
  60. }).$mount()
  61. document.body.appendChild(vm.$el)
  62. expect(vm.$el.children[0].checked).toBe(true)
  63. expect(vm.$el.children[1].checked).toBe(false)
  64. vm.$el.children[0].click()
  65. expect(vm.test.length).toBe(0)
  66. vm.$el.children[1].click()
  67. expect(vm.test).toEqual(['2'])
  68. vm.$el.children[0].click()
  69. expect(vm.test).toEqual(['2', '1'])
  70. vm.test = ['1']
  71. waitForUpdate(() => {
  72. expect(vm.$el.children[0].checked).toBe(true)
  73. expect(vm.$el.children[1].checked).toBe(false)
  74. }).then(done)
  75. })
  76. it('bind to Array value with value bindings', done => {
  77. const vm = new Vue({
  78. data: {
  79. test: [1]
  80. },
  81. template: `
  82. <div>
  83. <input type="checkbox" v-model="test" :value="1">
  84. <input type="checkbox" v-model="test" :value="2">
  85. </div>
  86. `
  87. }).$mount()
  88. document.body.appendChild(vm.$el)
  89. expect(vm.$el.children[0].checked).toBe(true)
  90. expect(vm.$el.children[1].checked).toBe(false)
  91. vm.$el.children[0].click()
  92. expect(vm.test.length).toBe(0)
  93. vm.$el.children[1].click()
  94. expect(vm.test).toEqual([2])
  95. vm.$el.children[0].click()
  96. expect(vm.test).toEqual([2, 1])
  97. vm.test = [1]
  98. waitForUpdate(() => {
  99. expect(vm.$el.children[0].checked).toBe(true)
  100. expect(vm.$el.children[1].checked).toBe(false)
  101. }).then(done)
  102. })
  103. it('bind to Array value with value bindings (object loose equal)', done => {
  104. const vm = new Vue({
  105. data: {
  106. test: [{ a: 1 }]
  107. },
  108. template: `
  109. <div>
  110. <input type="checkbox" v-model="test" :value="{ a: 1 }">
  111. <input type="checkbox" v-model="test" :value="{ a: 2 }">
  112. </div>
  113. `
  114. }).$mount()
  115. document.body.appendChild(vm.$el)
  116. expect(vm.$el.children[0].checked).toBe(true)
  117. expect(vm.$el.children[1].checked).toBe(false)
  118. vm.$el.children[0].click()
  119. expect(vm.test.length).toBe(0)
  120. vm.$el.children[1].click()
  121. expect(vm.test).toEqual([{ a: 2 }])
  122. vm.$el.children[0].click()
  123. expect(vm.test).toEqual([{ a: 2 }, { a: 1 }])
  124. vm.test = [{ a: 1 }]
  125. waitForUpdate(() => {
  126. expect(vm.$el.children[0].checked).toBe(true)
  127. expect(vm.$el.children[1].checked).toBe(false)
  128. }).then(done)
  129. })
  130. it('.number modifier', () => {
  131. const vm = new Vue({
  132. data: {
  133. test: [],
  134. check: true
  135. },
  136. template: `
  137. <div>
  138. <input type="checkbox" v-model.number="test" value="1">
  139. <input type="checkbox" v-model="test" value="2">
  140. <input type="checkbox" v-model.number="check">
  141. </div>
  142. `
  143. }).$mount()
  144. document.body.appendChild(vm.$el)
  145. var checkboxInputs = vm.$el.getElementsByTagName('input')
  146. expect(checkboxInputs[0].checked).toBe(false)
  147. expect(checkboxInputs[1].checked).toBe(false)
  148. expect(checkboxInputs[2].checked).toBe(true)
  149. checkboxInputs[0].click()
  150. checkboxInputs[1].click()
  151. checkboxInputs[2].click()
  152. expect(vm.test).toEqual([1, '2'])
  153. expect(vm.check).toEqual(false)
  154. })
  155. it('should respect different primitive type value', (done) => {
  156. const vm = new Vue({
  157. data: {
  158. test: [0]
  159. },
  160. template:
  161. '<div>' +
  162. '<input type="checkbox" value="" v-model="test">' +
  163. '<input type="checkbox" value="0" v-model="test">' +
  164. '<input type="checkbox" value="1" v-model="test">' +
  165. '<input type="checkbox" value="false" v-model="test">' +
  166. '<input type="checkbox" value="true" v-model="test">' +
  167. '</div>'
  168. }).$mount()
  169. var checkboxInput = vm.$el.children
  170. expect(checkboxInput[0].checked).toBe(false)
  171. expect(checkboxInput[1].checked).toBe(true)
  172. expect(checkboxInput[2].checked).toBe(false)
  173. expect(checkboxInput[3].checked).toBe(false)
  174. expect(checkboxInput[4].checked).toBe(false)
  175. vm.test = [1]
  176. waitForUpdate(() => {
  177. expect(checkboxInput[0].checked).toBe(false)
  178. expect(checkboxInput[1].checked).toBe(false)
  179. expect(checkboxInput[2].checked).toBe(true)
  180. expect(checkboxInput[3].checked).toBe(false)
  181. expect(checkboxInput[4].checked).toBe(false)
  182. vm.test = ['']
  183. }).then(() => {
  184. expect(checkboxInput[0].checked).toBe(true)
  185. expect(checkboxInput[1].checked).toBe(false)
  186. expect(checkboxInput[2].checked).toBe(false)
  187. expect(checkboxInput[3].checked).toBe(false)
  188. expect(checkboxInput[4].checked).toBe(false)
  189. vm.test = [false]
  190. }).then(() => {
  191. expect(checkboxInput[0].checked).toBe(false)
  192. expect(checkboxInput[1].checked).toBe(false)
  193. expect(checkboxInput[2].checked).toBe(false)
  194. expect(checkboxInput[3].checked).toBe(true)
  195. expect(checkboxInput[4].checked).toBe(false)
  196. vm.test = [true]
  197. }).then(() => {
  198. expect(checkboxInput[0].checked).toBe(false)
  199. expect(checkboxInput[1].checked).toBe(false)
  200. expect(checkboxInput[2].checked).toBe(false)
  201. expect(checkboxInput[3].checked).toBe(false)
  202. expect(checkboxInput[4].checked).toBe(true)
  203. vm.test = ['', 0, 1, false, true]
  204. }).then(() => {
  205. expect(checkboxInput[0].checked).toBe(true)
  206. expect(checkboxInput[1].checked).toBe(true)
  207. expect(checkboxInput[2].checked).toBe(true)
  208. expect(checkboxInput[3].checked).toBe(true)
  209. expect(checkboxInput[4].checked).toBe(true)
  210. }).then(done)
  211. })
  212. it('warn inline checked', () => {
  213. const vm = new Vue({
  214. template: `<input type="checkbox" v-model="test" checked>`,
  215. data: {
  216. test: false
  217. }
  218. }).$mount()
  219. expect(vm.$el.checked).toBe(false)
  220. expect('inline checked attributes will be ignored when using v-model').toHaveBeenWarned()
  221. })
  222. })