/**
 * Copyright (c) Nicolas Gallagher.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

import createDOMProps from '..'

const createProps = (props) => createDOMProps(null, props)

describe('modules/createDOMProps', () => {
  describe('focus-related accessibility attributes', () => {
    test('with no accessibility props', () => {
      expect(createProps({})).toEqual({})
    })

    describe('"accessibilityRole" of "link"', () => {
      const accessibilityRole = 'link'

      test('default case', () => {
        expect(createProps({ accessibilityRole })).toEqual(
          expect.not.objectContaining({ tabIndex: '-1' })
        )
      })

      test('when "focusable" is true', () => {
        expect(createProps({ accessibilityRole, focusable: true })).toEqual(
          expect.not.objectContaining({ tabIndex: '-1' })
        )
      })

      test('when "focusable" is false', () => {
        expect(createProps({ accessibilityRole, focusable: false })).toEqual(
          expect.objectContaining({ tabIndex: '-1' })
        )
      })

      test('when "accessibilityDisabled" is true', () => {
        expect(createProps({ accessibilityRole, accessibilityDisabled: true })).toEqual(
          expect.objectContaining({ 'aria-disabled': true })
        )
      })

      test('when "disabled" is false', () => {
        expect(createProps({ accessibilityRole, accessibilityDisabled: false })).toEqual(
          expect.not.objectContaining({ tabIndex: '-1' })
        )
      })
    })

    const testFocusableRole = (accessibilityRole) => {
      test('default case', () => {
        expect(createProps({ accessibilityRole })).toEqual(
          expect.objectContaining({ tabIndex: '0' })
        )
      })

      test('when "focusable" is true', () => {
        expect(createProps({ accessibilityRole, focusable: true })).toEqual(
          expect.objectContaining({ tabIndex: '0' })
        )
      })

      test('when "focusable" is false', () => {
        expect(createProps({ accessibilityRole, focusable: false })).toEqual(
          expect.objectContaining({ tabIndex: '-1' })
        )
      })

      test('when "accessibilityDisabled" is true', () => {
        expect(createProps({ accessibilityRole, accessibilityDisabled: true })).toEqual(
          expect.objectContaining({ 'aria-disabled': true })
        )
      })

      test('when "accessibilityDisabled" is false', () => {
        expect(createProps({ accessibilityRole, accessibilityDisabled: false })).toEqual(
          expect.objectContaining({ tabIndex: '0' })
        )
      })
    }

    describe('"accessibilityRole" of "button"', () => {
      testFocusableRole('button')
    })

    describe('with unfocusable accessibilityRole', () => {
      test('when "focusable" is true', () => {
        expect(createProps({ focusable: true })).toEqual(
          expect.objectContaining({ tabIndex: '0' })
        )
      })

      test('when "focusable" is false', () => {
        expect(createProps({ focusable: false })).toEqual(
          expect.objectContaining({ tabIndex: '-1' })
        )
      })
    })
  })

  test('prop "accessibilityLabel" becomes "aria-label"', () => {
    const accessibilityLabel = 'accessibilityLabel'
    const props = createProps({ accessibilityLabel })
    expect(props['aria-label']).toEqual(accessibilityLabel)
  })

  test('prop "accessibilityLiveRegion" becomes "aria-live"', () => {
    const accessibilityLiveRegion = 'none'
    const props = createProps({ accessibilityLiveRegion })
    expect(props['aria-live']).toEqual('off')
  })

  test('prop "accessibilityRole" becomes "role"', () => {
    const accessibilityRole = 'button'
    const props = createProps({ accessibilityRole })
    expect(props.role).toEqual('button')
  })

  test('prop "className" is preserved', () => {
    const className = 'external-class-name'
    const props = createProps({ className })
    expect(props.className).toEqual(className)
  })

  test('prop "nativeID" becomes "id"', () => {
    const nativeID = 'Example.nativeID'
    const props = createProps({ nativeID })
    expect(props.id).toEqual(nativeID)
  })

  test('prop "testID" becomes "data-testid"', () => {
    const testID = 'Example.testID'
    const props = createProps({ testID })
    expect(props['data-testid']).toEqual(testID)
  })
})
