import { mount } from '@vue/test-utils'
import { asyncExpect } from '@/tests/utils'
import Radio from '../Radio'
import RadioGroup from '../Group'
describe('Radio', () => {
  function createRadioGroup (props, listeners = {}) {
    return {
      props: ['value'],
      render () {
        const groupProps = { ...props }
        if (this.value !== undefined) {
          groupProps.value = this.value
        }
        return (
          
            A
            B
            C
          
        )
      },
    }
  }
  function createRadioGroupByOption () {
    const options = [
      { label: 'A', value: 'A' },
      { label: 'B', value: 'B' },
      { label: 'C', value: 'C' },
    ]
    return {
      render () {
        return (
          
        )
      },
    }
  }
  it('responses hover events', () => {
    const onMouseEnter = jest.fn()
    const onMouseLeave = jest.fn()
    const wrapper = mount({
      render () {
        return (
          
            
          
        )
      },
    })
    wrapper.trigger('mouseenter')
    expect(onMouseEnter).toHaveBeenCalled()
    wrapper.trigger('mouseleave')
    expect(onMouseLeave).toHaveBeenCalled()
  })
  it('fire change events when value changes', async () => {
    const onChange = jest.fn()
    const props = {}
    const wrapper = mount(
      createRadioGroup(props, {
        change: onChange,
      }),
      { sync: false }
    )
    let radios = null
    await asyncExpect(() => {
      radios = wrapper.findAll('input')
      // uncontrolled component
      wrapper.vm.$refs.radioGroup.stateValue = 'B'
      // wrapper.setData({ value: 'B' })
      radios.at(0).trigger('change')
      expect(onChange.mock.calls.length).toBe(1)
    })
    await asyncExpect(() => {
      expect(wrapper.html()).toMatchSnapshot()
    })
    await asyncExpect(() => {
      // controlled component
      wrapper.setProps({ value: 'A' })
      radios.at(1).trigger('change')
      expect(onChange.mock.calls.length).toBe(2)
    })
    await asyncExpect(() => {
      expect(wrapper.html()).toMatchSnapshot()
    })
  })
  // it('won\'t fire change events when value not changes', async () => {
  //   const onChange = jest.fn()
  //   const wrapper = mount(
  //     createRadioGroup({}, {
  //       change: onChange,
  //     }),
  //     { sync: false }
  //   )
  //   const radios = wrapper.findAll('input')
  //   await asyncExpect(() => {
  //     // uncontrolled component
  //     wrapper.vm.$refs.radioGroup.stateValue = 'B'
  //     radios.at(1).trigger('change')
  //     expect(onChange.mock.calls.length).toBe(0)
  //   })
  //   await asyncExpect(() => {
  //   }, 0)
  //   // // controlled component
  //   // wrapper.setProps({ value: 'A' })
  //   // radios.at(0).trigger('change')
  //   // expect(onChange.mock.calls.length).toBe(0)
  // })
  it('optional should correct render', () => {
    const wrapper = mount(
      createRadioGroupByOption()
    )
    const radios = wrapper.findAll('input')
    expect(radios.length).toBe(3)
  })
  it('all children should have a name property', () => {
    const GROUP_NAME = 'radiogroup'
    const wrapper = mount(
      createRadioGroup({ name: GROUP_NAME })
    )
    expect(wrapper.html()).toMatchSnapshot()
    expect(wrapper.findAll('input[type="radio"]').wrappers.forEach((el) => {
      expect(el.element.name).toEqual(GROUP_NAME)
    }))
  })
})