let s:suite = themis#suite('popen')
let s:assert = themis#helper('assert')

function! s:suite.popen2() abort
  if !vimproc#util#is_windows() && !executable('ls')
    call s:assert.skip('ls command is not installed.')
    return
  endif

  if vimproc#util#is_windows()
    let cmd = ['cmd', '/c', 'DIR', '/B']
  else
    let cmd = ['ls']
  endif
  let sub = vimproc#popen2(cmd)
  let res = ''
  while !sub.stdout.eof
    let res .= sub.stdout.read()
  endwhile
  " Newline conversion.
  let res = substitute(res, '\r\n', '\n', 'g')

  call s:assert.true(sub.is_valid)

  let [cond, status] = sub.waitpid()

  call s:assert.equals(cond, 'exit')

  call s:assert.equals(status, 0)

  call s:assert.false(sub.is_valid)

  call s:assert.equals(res, system(join(cmd)))

  unlet cmd
  unlet sub

  if vimproc#util#is_windows()
    let cmd = ['cmd', '/c', 'DIR', '/B', '/A']
  else
    let cmd = ['ls', '-la']
  endif
  let sub = vimproc#popen2(cmd)
  let res = ''
  while !sub.stdout.eof
    let res .= sub.stdout.read()
  endwhile
  " Newline conversion.
  let res = substitute(res, '\r\n', '\n', 'g')

  call s:assert.true(sub.is_valid)

  let [cond, status] = sub.waitpid()

  call s:assert.equals(cond, 'exit')

  call s:assert.equals(status, 0)

  call s:assert.false(sub.is_valid)

  call s:assert.equals(res, system(join(cmd)))

  unlet cmd
  unlet sub
endfunction

function! s:suite.popen3() abort
  if vimproc#util#is_windows()
    let cmd = ['cmd', '/c', 'DIR', '/B']
  else
    let cmd = ['ls']
  endif
  let sub = vimproc#popen3(cmd)
  let res = ''
  while !sub.stdout.eof
    let res .= sub.stdout.read()
  endwhile
  " Newline conversion.
  let res = substitute(res, '\r\n', '\n', 'g')

  call s:assert.true(sub.is_valid)

  let [cond, status] = sub.waitpid()

  call s:assert.equals(cond, 'exit')

  call s:assert.equals(status, 0)

  call s:assert.false(sub.is_valid)

  call s:assert.equals(res, system(join(cmd)))

  unlet cmd
  unlet sub
endfunction

function! s:suite.redirection1() abort
  let output = vimproc#system('echo "foo" > test.txt | echo "bar"')
  call s:assert.equals(output, "bar\n")
  sleep 3
  call s:assert.equals(readfile('test.txt'), ['foo'])
  if filereadable('test.txt')
    call delete('test.txt')
  endif
endfunction

function! s:suite.redirection2() abort
  let sub = vimproc#ptyopen('echo "foo" > test.txt | echo "bar"')
  let res = ''
  while !sub.stdout.eof
    let res .= sub.stdout.read()
  endwhile
  " Newline conversion.
  let res = substitute(res, '\r\n', '\n', 'g')
  sleep 3
  call s:assert.equals(readfile('test.txt'), ['foo'])
  if filereadable('test.txt')
    call delete('test.txt')
  endif
endfunction

" vim:foldmethod=marker:fen: