Describe gina#command#patch
  Before all
    let Path = vital#gina#import('System.Filepath')
    let slit1 = Slit(tempname(), 1)
    let filename1 = slit1.path('A/foo.txt')
    call slit1.write('A/foo.txt', [])
    call slit1.execute('add %s', slit1.path('A/foo.txt'))

    call slit1.write('A/foo.txt', ['1'])
    call slit1.execute('commit --quiet -am "First"')
    call slit1.write('A/foo.txt', ['2'])
    call slit1.execute('add %s', slit1.path('A/foo.txt'))
    call slit1.write('A/foo.txt', ['3'])
  End

  After all
    %bwipeout!
  End

  Before
    %bwipeout!
  End

  Describe Use cases
    It might be called without arguments
      execute 'edit' fnameescape(filename1)
      GinaSync patch
      Assert Equals(tabpagenr('$'), 2)
      Assert Equals(winnr('$'), 3)
      " Focused buffer
      Assert Equals(bufname('%'), printf('gina://%s:show/:A/foo.txt', slit1.refname))
      Assert Equals(getline(1, '$'), [
            \ '2',
            \])
      " topleft
      let bufnr = winbufnr(1)
      Assert Equals(bufname(bufnr), printf('gina://%s:show/HEAD:A/foo.txt', slit1.refname))
      Assert Equals(getbufline(bufnr, 1, '$'), [
            \ '1',
            \])
      " center
      let bufnr = winbufnr(2)
      Assert Equals(bufname('%'), printf('gina://%s:show/:A/foo.txt', slit1.refname))
      Assert Equals(getbufline(bufnr, 1, '$'), [
            \ '2',
            \])
      " botright
      let bufnr = winbufnr(3)
      Assert Equals(bufname(bufnr), filename1)
      Assert Equals(getbufline(bufnr, 1, '$'), [
            \ '3',
            \])

      " Patch should fail
      Assert Equals(split(execute('write'), '\r\?\n'), [
            \ '[gina] No difference between index and buffer',
            \])
      Assert Equals(slit1.execute('status --porcelain'), [
            \ 'MM A/foo.txt',
            \])

      " dor obtain changes from right
      normal dor
      Assert Equals(getline(1, '$'), [
            \ '3',
            \])
      " Patch should be able to perform and status become clear.
      Assert Equals(split(execute('write'), '\r\?\n'), [])
      Assert Equals(slit1.execute('status --porcelain'), [
            \ 'M  A/foo.txt',
            \])

      " dol obtain changes from left
      normal dol
      Assert Equals(getline(1, '$'), [
            \ '1',
            \])
      " Patch should be able to perform and status become clear.
      Assert Equals(split(execute('write'), '\r\?\n'), [])
      Assert Equals(slit1.execute('status --porcelain'), [
            \ ' M A/foo.txt',
            \])
    End
  End
End