| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- import Vue from 'vue'
- describe('Directive v-model radio', () => {
- it('should work', done => {
- const vm = new Vue({
- data: {
- test: '1'
- },
- template: `
- <div>
- <input type="radio" value="1" v-model="test" name="test">
- <input type="radio" value="2" v-model="test" name="test">
- </div>
- `
- }).$mount()
- document.body.appendChild(vm.$el)
- expect(vm.$el.children[0].checked).toBe(true)
- expect(vm.$el.children[1].checked).toBe(false)
- vm.test = '2'
- waitForUpdate(() => {
- expect(vm.$el.children[0].checked).toBe(false)
- expect(vm.$el.children[1].checked).toBe(true)
- vm.$el.children[0].click()
- expect(vm.$el.children[0].checked).toBe(true)
- expect(vm.$el.children[1].checked).toBe(false)
- expect(vm.test).toBe('1')
- }).then(() => {
- document.body.removeChild(vm.$el)
- }).then(done)
- })
- it('should respect value bindings', done => {
- const vm = new Vue({
- data: {
- test: 1
- },
- template: `
- <div>
- <input type="radio" :value="1" v-model="test" name="test">
- <input type="radio" :value="2" v-model="test" name="test">
- </div>
- `
- }).$mount()
- document.body.appendChild(vm.$el)
- expect(vm.$el.children[0].checked).toBe(true)
- expect(vm.$el.children[1].checked).toBe(false)
- vm.test = 2
- waitForUpdate(() => {
- expect(vm.$el.children[0].checked).toBe(false)
- expect(vm.$el.children[1].checked).toBe(true)
- vm.$el.children[0].click()
- expect(vm.$el.children[0].checked).toBe(true)
- expect(vm.$el.children[1].checked).toBe(false)
- expect(vm.test).toBe(1)
- }).then(() => {
- document.body.removeChild(vm.$el)
- }).then(done)
- })
- it('should respect value bindings (object loose equal)', done => {
- const vm = new Vue({
- data: {
- test: { a: 1 }
- },
- template: `
- <div>
- <input type="radio" :value="{ a: 1 }" v-model="test" name="test">
- <input type="radio" :value="{ a: 2 }" v-model="test" name="test">
- </div>
- `
- }).$mount()
- document.body.appendChild(vm.$el)
- expect(vm.$el.children[0].checked).toBe(true)
- expect(vm.$el.children[1].checked).toBe(false)
- vm.test = { a: 2 }
- waitForUpdate(() => {
- expect(vm.$el.children[0].checked).toBe(false)
- expect(vm.$el.children[1].checked).toBe(true)
- vm.$el.children[0].click()
- expect(vm.$el.children[0].checked).toBe(true)
- expect(vm.$el.children[1].checked).toBe(false)
- expect(vm.test).toEqual({ a: 1 })
- }).then(() => {
- document.body.removeChild(vm.$el)
- }).then(done)
- })
- it('multiple radios ', (done) => {
- const spy = jasmine.createSpy()
- const vm = new Vue({
- data: {
- selections: ['a', '1'],
- radioList: [
- {
- name: 'questionA',
- data: ['a', 'b', 'c']
- },
- {
- name: 'questionB',
- data: ['1', '2']
- }
- ]
- },
- watch: {
- selections: spy
- },
- template:
- '<div>' +
- '<div v-for="(radioGroup, idx) in radioList">' +
- '<div>' +
- '<span v-for="(item, index) in radioGroup.data">' +
- '<input :name="radioGroup.name" type="radio" :value="item" v-model="selections[idx]" :id="idx"/>' +
- '<label>{{item}}</label>' +
- '</span>' +
- '</div>' +
- '</div>' +
- '</div>'
- }).$mount()
- document.body.appendChild(vm.$el)
- var inputs = vm.$el.getElementsByTagName('input')
- inputs[1].click()
- waitForUpdate(() => {
- expect(vm.selections).toEqual(['b', '1'])
- expect(spy).toHaveBeenCalled()
- }).then(done)
- })
- it('.number modifier', () => {
- const vm = new Vue({
- data: {
- test: 1
- },
- template: `
- <div>
- <input type="radio" value="1" v-model="test" name="test">
- <input type="radio" value="2" v-model.number="test" name="test">
- </div>
- `
- }).$mount()
- document.body.appendChild(vm.$el)
- expect(vm.$el.children[0].checked).toBe(true)
- expect(vm.$el.children[1].checked).toBe(false)
- vm.$el.children[1].click()
- expect(vm.$el.children[0].checked).toBe(false)
- expect(vm.$el.children[1].checked).toBe(true)
- expect(vm.test).toBe(2)
- })
- it('should respect different primitive type value', (done) => {
- const vm = new Vue({
- data: {
- test: 1
- },
- template:
- '<div>' +
- '<input type="radio" value="" v-model="test" name="test">' +
- '<input type="radio" value="0" v-model="test" name="test">' +
- '<input type="radio" value="1" v-model="test" name="test">' +
- '<input type="radio" value="false" v-model="test" name="test">' +
- '<input type="radio" value="true" v-model="test" name="test">' +
- '</div>'
- }).$mount()
- var radioboxInput = vm.$el.children
- expect(radioboxInput[0].checked).toBe(false)
- expect(radioboxInput[1].checked).toBe(false)
- expect(radioboxInput[2].checked).toBe(true)
- expect(radioboxInput[3].checked).toBe(false)
- expect(radioboxInput[4].checked).toBe(false)
- vm.test = 0
- waitForUpdate(() => {
- expect(radioboxInput[0].checked).toBe(false)
- expect(radioboxInput[1].checked).toBe(true)
- expect(radioboxInput[2].checked).toBe(false)
- expect(radioboxInput[3].checked).toBe(false)
- expect(radioboxInput[4].checked).toBe(false)
- vm.test = ''
- }).then(() => {
- expect(radioboxInput[0].checked).toBe(true)
- expect(radioboxInput[1].checked).toBe(false)
- expect(radioboxInput[2].checked).toBe(false)
- expect(radioboxInput[3].checked).toBe(false)
- expect(radioboxInput[4].checked).toBe(false)
- vm.test = false
- }).then(() => {
- expect(radioboxInput[0].checked).toBe(false)
- expect(radioboxInput[1].checked).toBe(false)
- expect(radioboxInput[2].checked).toBe(false)
- expect(radioboxInput[3].checked).toBe(true)
- expect(radioboxInput[4].checked).toBe(false)
- vm.test = true
- }).then(() => {
- expect(radioboxInput[0].checked).toBe(false)
- expect(radioboxInput[1].checked).toBe(false)
- expect(radioboxInput[2].checked).toBe(false)
- expect(radioboxInput[3].checked).toBe(false)
- expect(radioboxInput[4].checked).toBe(true)
- }).then(done)
- })
- // #4521
- it('should work with click event', (done) => {
- const vm = new Vue({
- data: {
- num: 1,
- checked: 1
- },
- template:
- '<div @click="add">' +
- 'click {{ num }}<input name="test" type="radio" value="1" v-model="checked"/>' +
- '<input name="test" type="radio" value="2" v-model="checked"/>' +
- '</div>',
- methods: {
- add: function () {
- this.num++
- }
- }
- }).$mount()
- document.body.appendChild(vm.$el)
- const radios = vm.$el.getElementsByTagName('input')
- radios[0].click()
- waitForUpdate(() => {
- expect(radios[0].checked).toBe(true)
- expect(radios[1].checked).toBe(false)
- expect(vm.num).toBe(2)
- radios[0].click()
- }).then(() => {
- expect(radios[0].checked).toBe(true)
- expect(radios[1].checked).toBe(false)
- expect(vm.num).toBe(3)
- radios[1].click()
- }).then(() => {
- expect(radios[0].checked).toBe(false)
- expect(radios[1].checked).toBe(true)
- expect(vm.num).toBe(4)
- }).then(done)
- })
- it('should get updated with model when in focus', (done) => {
- const vm = new Vue({
- data: {
- a: '2'
- },
- template: '<input type="radio" value="1" v-model="a"/>'
- }).$mount()
- document.body.appendChild(vm.$el)
- vm.$el.click()
- waitForUpdate(() => {
- expect(vm.$el.checked).toBe(true)
- vm.a = 2
- }).then(() => {
- expect(vm.$el.checked).toBe(false)
- }).then(done)
- })
- })
|