function! Normal(s)
  execute 'silent!' 'normal' a:s
endfunction

describe 'textobj#user#map'
  before
    new
  end

  after
    close!
  end

  it 'defines key mappings to use text objects'
    call textobj#user#map('datetime', {
    \   'time1': {
    \     'select': ['<buffer> aT', '<buffer> iT', '<buffer> <C-x>y'],
    \     'move-n': '<buffer> j',
    \   }
    \ })
    Expect maparg('aT', 'n') ==# ''
    Expect maparg('aT', 'o') ==# '<Plug>(textobj-datetime-time1)'
    Expect maparg('aT', 's') ==# ''
    Expect maparg('aT', 'x') ==# '<Plug>(textobj-datetime-time1)'
    Expect maparg('iT', 'n') ==# ''
    Expect maparg('iT', 'o') ==# '<Plug>(textobj-datetime-time1)'
    Expect maparg('iT', 's') ==# ''
    Expect maparg('iT', 'x') ==# '<Plug>(textobj-datetime-time1)'
    Expect maparg('<C-x>y', 'n') ==# ''
    Expect maparg('<C-x>y', 'o') ==# '<Plug>(textobj-datetime-time1)'
    Expect maparg('<C-x>y', 's') ==# '<Plug>(textobj-datetime-time1)'
    Expect maparg('<C-x>y', 'x') ==# '<Plug>(textobj-datetime-time1)'
    Expect maparg('j', 'n') ==# '<Plug>(textobj-datetime-time1-n)'
    Expect maparg('j', 'o') ==# '<Plug>(textobj-datetime-time1-n)'
    Expect maparg('j', 's') ==# ''
    Expect maparg('j', 'x') ==# '<Plug>(textobj-datetime-time1-n)'
  end

  it 'defines failsafe key mappings for unexisting text objects'
    Expect maparg('<Plug>(textobj-datetime-time2)', 'o') == ''
    Expect maparg('<Plug>(textobj-datetime-time2)', 's') == ''
    Expect maparg('<Plug>(textobj-datetime-time2)', 'x') == ''

    call textobj#user#map('datetime', {
    \   'time2': {
    \     'select': ['<buffer> aT', '<buffer> iT'],
    \   }
    \ })

    Expect maparg('<Plug>(textobj-datetime-time2)', 'o') != ''
    Expect maparg('<Plug>(textobj-datetime-time2)', 's') != ''
    Expect maparg('<Plug>(textobj-datetime-time2)', 'x') != ''

    Expect expr { Normal("vaT\<Esc>") } to_throw 'Text object.*not defined'
    Expect expr { Normal("daT") } to_throw 'Text object.*not defined'

    noremap <buffer> <Plug>(textobj-datetime-time2)  <Nop>

    Expect expr { Normal("vaT\<Esc>") } not to_throw
    Expect expr { Normal("daT") } not to_throw
  end

  it 'does not define failsafe key mappings for existing text objects'
    noremap <buffer> <Plug>(textobj-datetime-time3)  <Nop>

    call textobj#user#map('datetime', {
    \   'time3': {
    \     'select': ['<buffer> aT', '<buffer> iT'],
    \   }
    \ })

    Expect expr { Normal("vaT\<Esc>") } not to_throw
    Expect expr { Normal("daT") } not to_throw
  end
end