Describe gina#custom
  Before all
    let scheme = 'status'
    let pattern = '/\%(branch\|tag\)'
  End

  After all
    %bwipeout!
    call gina#custom#clear()
  End

  Before
    %bwipeout!
    call gina#custom#clear()
  End

  Describe #preference({scheme} [, {readonly}])
    It returns a preference for {scheme} as readonly (copied)
      let preference = gina#custom#preference(scheme)
      Assert Equals(preference, {
            \ 'action': {
            \   'aliases': [],
            \   'shortens': [],
            \ },
            \ 'mapping': {
            \   'mappings': [],
            \ },
            \ 'command': {
            \   'options': [],
            \   'origin': scheme,
            \   'raw': 0,
            \ },
            \ 'executes': [],
            \})
      " Overwrite
      let preference.action = {}
      let preference.mapping = ['foo']
      " Nothing should be changed
      let preference = gina#custom#preference(scheme)
      Assert Equals(preference, {
            \ 'action': {
            \   'aliases': [],
            \   'shortens': [],
            \ },
            \ 'mapping': {
            \   'mappings': [],
            \ },
            \ 'command': {
            \   'options': [],
            \   'origin': scheme,
            \   'raw': 0,
            \ },
            \ 'executes': [],
            \})
    End

    It returns a preference for {scheme}
      let preference = gina#custom#preference(scheme, 0)
      Assert Equals(preference, {
            \ 'action': {
            \   'aliases': [],
            \   'shortens': [],
            \ },
            \ 'mapping': {
            \   'mappings': [],
            \ },
            \ 'command': {
            \   'options': [],
            \   'origin': scheme,
            \   'raw': 0,
            \ },
            \ 'executes': [],
            \})
      " Overwrite
      let preference.action = {}
      let preference.mapping = ['foo']
      " Should be changed
      let preference = gina#custom#preference(scheme)
      Assert Equals(preference, {
            \ 'action': {},
            \ 'mapping': ['foo'],
            \ 'command': {
            \   'options': [],
            \   'origin': scheme,
            \   'raw': 0,
            \ },
            \ 'executes': [],
            \})
    End
  End

  Describe #preferences({scheme})
    It returns preferences for {scheme}
      Assert Equals(gina#custom#preferences(scheme), [{
            \ 'action': {
            \   'aliases': [],
            \   'shortens': [],
            \ },
            \ 'mapping': {
            \   'mappings': [],
            \ },
            \ 'command': {
            \   'options': [],
            \   'origin': scheme,
            \   'raw': 0,
            \ },
            \ 'executes': [],
            \}])
      let preferences = gina#custom#preferences('status')
      Assert Equals(len(preferences), 1)
      let preferences = gina#custom#preferences('branch')
      Assert Equals(len(preferences), 1)
      let preferences = gina#custom#preferences('tag')
      Assert Equals(len(preferences), 1)

      let preference = gina#custom#preference(scheme, 0)
      let preference.__remarks = scheme
      let preference = gina#custom#preference(pattern, 0)
      let preference.__remarks = pattern

      let preferences = gina#custom#preferences('status')
      Assert Equals(len(preferences), 1)
      Assert Equals(preferences[0].__remarks, scheme)
      let preferences = gina#custom#preferences('branch')
      Assert Equals(len(preferences), 2)
      Assert Equals(preferences[0].__remarks, pattern)
      let preferences = gina#custom#preferences('tag')
      Assert Equals(len(preferences), 2)
      Assert Equals(preferences[0].__remarks, pattern)
    End
  End

  Describe #execute({scheme}, {expr})
    It executes {expr} on a {scheme} buffer
      call gina#custom#execute(scheme, 'setlocal winfixwidth')
      setlocal winfixwidth&
      GinaSync branch
      Assert Equals(&winfixwidth, 0)
      %bwipeout!
      setlocal winfixwidth&
      GinaSync status
      Assert Equals(&winfixwidth, 1)
      %bwipeout!
      setlocal winfixwidth&
      GinaSync tag
      Assert Equals(&winfixwidth, 0)
    End

    It executes {expr} on buffers which matches with {scheme}
      call gina#custom#execute(pattern, 'setlocal winfixwidth')
      setlocal winfixwidth&
      GinaSync branch
      Assert Equals(&winfixwidth, 1)
      %bwipeout!
      setlocal winfixwidth&
      GinaSync status
      Assert Equals(&winfixwidth, 0)
      %bwipeout!
      setlocal winfixwidth&
      GinaSync tag
      Assert Equals(&winfixwidth, 1)
    End
  End
End