Execute (Setup):
  let g:dir = fnamemodify(g:vader_file, ':p:h')
  unlet! g:fzf_layout g:fzf_action g:fzf_history_dir
  Log 'Test directory: ' . g:dir
  Save &acd

Execute (fzf#run with dir option):
  let cwd = getcwd()
  let result = fzf#run({ 'options': '--filter=vdr', 'dir': g:dir })
  AssertEqual ['fzf.vader'], result
  AssertEqual getcwd(), cwd

  let result = sort(fzf#run({ 'options': '--filter e', 'dir': g:dir }))
  AssertEqual ['fzf.vader', 'test_go.rb'], result
  AssertEqual getcwd(), cwd

Execute (fzf#run with Funcref command):
  let g:ret = []
  function! g:FzfTest(e)
    call add(g:ret, a:e)
  endfunction
  let result = sort(fzf#run({ 'sink': function('g:FzfTest'), 'options': '--filter e', 'dir': g:dir }))
  AssertEqual ['fzf.vader', 'test_go.rb'], result
  AssertEqual ['fzf.vader', 'test_go.rb'], sort(g:ret)

Execute (fzf#run with string source):
  let result = sort(fzf#run({ 'source': 'echo hi', 'options': '-f i' }))
  AssertEqual ['hi'], result

Execute (fzf#run with list source):
  let result = sort(fzf#run({ 'source': ['hello', 'world'], 'options': '-f e' }))
  AssertEqual ['hello'], result
  let result = sort(fzf#run({ 'source': ['hello', 'world'], 'options': '-f o' }))
  AssertEqual ['hello', 'world'], result

Execute (fzf#run with string source):
  let result = sort(fzf#run({ 'source': 'echo hi', 'options': '-f i' }))
  AssertEqual ['hi'], result

Execute (fzf#run with dir option and noautochdir):
  set noacd
  let cwd = getcwd()
  call fzf#run({'source': ['/foobar'], 'sink': 'e', 'dir': '/tmp', 'options': '-1'})
  " No change in working directory
  AssertEqual cwd, getcwd()

  call fzf#run({'source': ['/foobar'], 'sink': 'tabe', 'dir': '/tmp', 'options': '-1'})
  AssertEqual cwd, getcwd()
  tabclose
  AssertEqual cwd, getcwd()

Execute (Incomplete fzf#run with dir option and autochdir):
  set acd
  let cwd = getcwd()
  call fzf#run({'source': [], 'sink': 'e', 'dir': '/tmp', 'options': '-0'})
  " No change in working directory even if &acd is set
  AssertEqual cwd, getcwd()

Execute (fzf#run with dir option and autochdir):
  set acd
  let cwd = getcwd()
  call fzf#run({'source': ['/foobar'], 'sink': 'e', 'dir': '/tmp', 'options': '-1'})
  " Working directory changed due to &acd
  AssertEqual '/', getcwd()

Execute (fzf#run with dir option and autochdir when final cwd is same as dir):
  set acd
  cd /tmp
  call fzf#run({'source': ['/foobar'], 'sink': 'e', 'dir': '/', 'options': '-1'})
  " Working directory changed due to &acd
  AssertEqual '/', getcwd()

Execute (fzf#wrap):
  AssertThrows fzf#wrap({'foo': 'bar'})

  let opts = fzf#wrap('foobar')
  Log opts
  AssertEqual '~40%', opts.down
  Assert opts.options =~ '--expect='
  Assert !has_key(opts, 'sink')
  Assert has_key(opts, 'sink*')

  let opts = fzf#wrap('foobar', {}, 0)
  Log opts
  AssertEqual '~40%', opts.down

  let opts = fzf#wrap('foobar', {}, 1)
  Log opts
  Assert !has_key(opts, 'down')

  let opts = fzf#wrap('foobar', {'down': '50%'})
  Log opts
  AssertEqual '50%', opts.down

  let opts = fzf#wrap('foobar', {'down': '50%'}, 1)
  Log opts
  Assert !has_key(opts, 'down')

  let opts = fzf#wrap('foobar', {'sink': 'e'})
  Log opts
  AssertEqual 'e', opts.sink
  Assert !has_key(opts, 'sink*')

  let opts = fzf#wrap('foobar', {'options': '--reverse'})
  Log opts
  Assert opts.options =~ '--expect='
  Assert opts.options =~ '--reverse'

  let g:fzf_layout = {'window': 'enew'}
  let opts = fzf#wrap('foobar')
  Log opts
  AssertEqual 'enew', opts.window

  let opts = fzf#wrap('foobar', {}, 1)
  Log opts
  Assert !has_key(opts, 'window')

  let opts = fzf#wrap('foobar', {'right': '50%'})
  Log opts
  Assert !has_key(opts, 'window')
  AssertEqual '50%', opts.right

  let opts = fzf#wrap('foobar', {'right': '50%'}, 1)
  Log opts
  Assert !has_key(opts, 'window')
  Assert !has_key(opts, 'right')

  let g:fzf_action = {'a': 'tabe'}
  let opts = fzf#wrap('foobar')
  Log opts
  Assert opts.options =~ '--expect=a'
  Assert !has_key(opts, 'sink')
  Assert has_key(opts, 'sink*')

  let opts = fzf#wrap('foobar', {'sink': 'e'})
  Log opts
  AssertEqual 'e', opts.sink
  Assert !has_key(opts, 'sink*')

  let g:fzf_history_dir = '/tmp'
  let opts = fzf#wrap('foobar', {'options': '--color light'})
  Log opts
  Assert opts.options =~ '--history /tmp/foobar'
  Assert opts.options =~ '--color light'

  let g:fzf_colors = { 'fg': ['fg', 'Error'] }
  let opts = fzf#wrap({})
  Assert opts.options =~ '^--color=fg:'

Execute (Cleanup):
  unlet g:dir
  Restore