1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 19:00:06 +08:00
SpaceVim/bundle/gina.vim/test/gina/core/buffer.vimspec

589 lines
20 KiB
Plaintext
Raw Normal View History

Describe gina#core#buffer
Before all
let Path = vital#gina#import('System.Filepath')
let is_windows = has('win32') || has('win64')
" columns: 120 in docker
let g:gina#core#locator#winwidth_threshold = 20
" lines: 23 in docker
let g:gina#core#locator#winheight_threshold = 10
End
After all
%bwipeout!
End
Before
%bwipeout!
End
Describe #bufname({git}, {scheme} [, {options}])
Before
let git = {'refname': 'valid'}
End
It returns a shortest path for the specified params
Assert Equals(gina#core#buffer#bufname(git, 'status'), 'gina://valid:status')
Assert Equals(gina#core#buffer#bufname(git, 'commit', {
\ 'params': ['amend'],
\}),
\'gina://valid:commit:amend'
\)
Assert Equals(gina#core#buffer#bufname(git, 'show', {
\ 'path': 'README.md',
\}),
\'gina://valid:show/:README.md'
\)
Assert Equals(gina#core#buffer#bufname(git, 'diff', {
\ 'rev': 'origin/HEAD',
\ 'path': 'README.md',
\}),
\'gina://valid:diff/origin/HEAD:README.md'
\)
Assert Equals(gina#core#buffer#bufname(git, 'changes', {
\ 'rev': 'origin/HEAD...',
\}),
\'gina://valid:changes/origin/HEAD...'
\)
End
It returns an Unix-like path (separate with '/' rather than '\') always
Assert Equals(gina#core#buffer#bufname(git, 'show', {
\ 'path': 'autoload\gina\core.vim',
\}),
\'gina://valid:show/:autoload/gina/core.vim'
\)
Assert Equals(gina#core#buffer#bufname(git, 'diff', {
\ 'rev': 'origin/HEAD',
\ 'path': 'autoload\gina\core.vim',
\}),
\'gina://valid:diff/origin/HEAD:autoload/gina/core.vim'
\)
End
End
Describe #parse({expr})
Before
let git = {'refname': 'valid'}
End
It returns an empty dictionary when {expr} is not built by gina#core#buffer#bufname()
Assert Equals(gina#core#buffer#parse('README.md'), {})
Assert Equals(gina#core#buffer#parse('autoload/gina/core.vim'), {})
End
It returns params of {expr} which has built by gina#core#buffer#bufname()
Assert Equals(gina#core#buffer#parse('gina://valid:status'), {
\ 'repo': 'valid',
\ 'scheme': 'status',
\ 'params': [],
\ 'rev': '',
\ 'treeish': '',
\})
Assert Equals(gina#core#buffer#parse('gina://valid:commit:amend'), {
\ 'repo': 'valid',
\ 'scheme': 'commit',
\ 'params': ['amend'],
\ 'rev': '',
\ 'treeish': '',
\})
Assert Equals(gina#core#buffer#parse('gina://valid:show/:README.md'), {
\ 'repo': 'valid',
\ 'scheme': 'show',
\ 'params': [],
\ 'rev': '',
\ 'path': 'README.md',
\ 'treeish': ':README.md',
\})
Assert Equals(gina#core#buffer#parse('gina://valid:diff/origin/HEAD:README.md:$'), {
\ 'repo': 'valid',
\ 'scheme': 'diff',
\ 'params': [],
\ 'rev': 'origin/HEAD',
\ 'path': 'README.md',
\ 'treeish': 'origin/HEAD:README.md',
\})
Assert Equals(gina#core#buffer#parse('gina://valid:changes/origin/HEAD...'), {
\ 'repo': 'valid',
\ 'scheme': 'changes',
\ 'params': [],
\ 'rev': 'origin/HEAD...',
\ 'treeish': 'origin/HEAD...',
\})
Assert Equals(gina#core#buffer#parse('gina://valid:show/:3:README.md'), {
\ 'repo': 'valid',
\ 'scheme': 'show',
\ 'params': [],
\ 'rev': ':3',
\ 'path': 'README.md',
\ 'treeish': ':3:README.md',
\})
End
It returns params of {expr} which has built by gina#core#buffer#bufname()
execute 'edit' 'gina://valid:status'
Assert Equals(gina#core#buffer#parse('%'), {
\ 'repo': 'valid',
\ 'scheme': 'status',
\ 'params': [],
\ 'rev': '',
\ 'treeish': '',
\})
End
End
Describe #param({expr}, {attr} [, {default}])
It throws an exception when unknown {attr} has specified
Throws /Unknown attribute/
\ gina#core#buffer#param('gina://valid:status', 'unknown')
End
It returns a value of an {attr} in params of {expr}
Assert Equals(gina#core#buffer#param('gina://valid:status', 'repo'), 'valid')
Assert Equals(gina#core#buffer#param('gina://valid:status', 'scheme'), 'status')
Assert Equals(gina#core#buffer#param('gina://valid:commit:amend', 'params'), ['amend'])
Assert Equals(gina#core#buffer#param('gina://valid:show/:README.md', 'path'), 'README.md')
Assert Equals(gina#core#buffer#param('gina://valid:diff/origin/HEAD:README.md:$', 'rev'), 'origin/HEAD')
Assert Equals(gina#core#buffer#param('gina://valid:changes/origin/HEAD...', 'rev'), 'origin/HEAD...')
End
It returns a correct default value of an {attr} when {expr} is invalid
Assert Equals(gina#core#buffer#param('README.md', 'repo'), '')
Assert Equals(gina#core#buffer#param('README.md', 'scheme'), '')
Assert Equals(gina#core#buffer#param('README.md', 'params'), [])
Assert Equals(gina#core#buffer#param('README.md', 'rev'), '')
Assert Equals(gina#core#buffer#param('README.md', 'path'), '')
End
It returns a specified default value of an {attr} when {expr} is invalid
Assert Equals(gina#core#buffer#param('README.md', 'repo', 'foo'), 'foo')
Assert Equals(gina#core#buffer#param('README.md', 'scheme', 'foo'), 'foo')
Assert Equals(gina#core#buffer#param('README.md', 'params', 'foo'), 'foo')
Assert Equals(gina#core#buffer#param('README.md', 'rev', 'foo'), 'foo')
Assert Equals(gina#core#buffer#param('README.md', 'path', 'foo'), 'foo')
End
End
Describe #open({bufname}, [, {options}])
It opens a new {bufname} buffer and return an informatio context
edit foo1
new foo2
let context = gina#core#buffer#open('foo3')
Assert Equals(winnr('$'), 2)
Assert Equals(bufname('%'), 'foo3')
Assert KeyExists(context, 'bufexists')
Assert KeyExists(context, 'bufloaded')
Assert KeyExists(context, 'bufname')
Assert KeyExists(context, 'bufnr')
Assert KeyExists(context, 'preview')
Assert Equals(context.bufexists, 0)
Assert Equals(context.bufloaded, 0)
Assert Equals(context.bufname, 'foo3')
Assert Equals(context.bufnr, bufnr('%'))
Assert Equals(context.preview, 0)
End
It focus a {bufname} buffer when exist and return an informatio context
edit foo1
new foo2
let context = gina#core#buffer#open('foo1')
Assert Equals(winnr('$'), 2)
Assert Equals(bufname('%'), 'foo1')
Assert KeyExists(context, 'bufexists')
Assert KeyExists(context, 'bufloaded')
Assert KeyExists(context, 'bufname')
Assert KeyExists(context, 'bufnr')
Assert KeyExists(context, 'preview')
Assert Equals(context.bufexists, 1)
Assert Equals(context.bufloaded, 1)
Assert Equals(context.bufname, 'foo1')
Assert Equals(context.bufnr, bufnr('%'))
Assert Equals(context.preview, 0)
End
Context Buffer name normalization
It remove leading/trailing whitespaces in {bufname}
let context = gina#core#buffer#open(' foo ')
Assert Equals(bufname('%'), 'foo')
End
It remove trailing : in {bufname}
let context = gina#core#buffer#open('foo:::')
Assert Equals(bufname('%'), 'foo')
End
It remove trailing / in {bufname}
let context = gina#core#buffer#open('foo///')
Assert Equals(bufname('%'), 'foo')
End
It remove trailing \ in {bufname}
let context = gina#core#buffer#open('foo\\\')
Assert Equals(bufname('%'), 'foo')
End
It recursively remove aboves
let context = gina#core#buffer#open(' foo :/\ :/\ :/\')
Assert Equals(bufname('%'), 'foo')
End
End
Context Anchoring before open
It does not moves focus before opening a new {bufname} if a current window is suitable for opening a buffer
edit foo1
new foo2
let context = gina#core#buffer#open('foo3')
Assert Equals(winnr('$'), 2)
Assert Equals(bufname(winbufnr(1)), 'foo3')
Assert Equals(bufname(winbufnr(2)), 'foo1')
End
It moves focus before opening a new {bufname} if a current window is too small (height) for opening a buffer
edit foo1
new foo2 | execute 'resize 1'
let context = gina#core#buffer#open('foo3')
Assert Equals(winnr('$'), 2)
Assert Equals(bufname(winbufnr(1)), 'foo2')
Assert Equals(bufname(winbufnr(2)), 'foo3')
End
It moves focus before opening a new {bufname} if a current window is too small (width) for opening a buffer
edit foo1
vnew foo2 | execute 'vertical resize 1'
let context = gina#core#buffer#open('foo3')
Assert Equals(winnr('$'), 2)
Assert Equals(bufname(winbufnr(1)), 'foo2')
Assert Equals(bufname(winbufnr(2)), 'foo3')
End
End
Context {options.mod}
It opens a new {bufname} with respecting {options.mods}
edit foo1
let options = {'opener': 'split'}
call gina#core#buffer#open('foo2', options)
Assert Equals(bufname(winbufnr(1)), 'foo2')
Assert Equals(bufname(winbufnr(2)), 'foo1')
let options.mods = 'botright'
call gina#core#buffer#open('foo3', options)
Assert Equals(bufname(winbufnr(1)), 'foo2')
Assert Equals(bufname(winbufnr(2)), 'foo1')
Assert Equals(bufname(winbufnr(3)), 'foo3')
End
End
Context {options.opener}
It opens a new {bufname} buffer with {options.opener}
edit foo1
call gina#core#buffer#open('foo2')
Assert Equals(winnr('$'), 1)
Assert Equals(bufname(winbufnr(1)), 'foo2')
let options = {'opener': 'split'}
call gina#core#buffer#open('foo3', options)
Assert Equals(winnr('$'), 2)
Assert Equals(bufname(winbufnr(1)), 'foo3')
Assert Equals(bufname(winbufnr(2)), 'foo2')
let options = {'opener': 'botright split'}
call gina#core#buffer#open('foo4', options)
Assert Equals(winnr('$'), 3)
Assert Equals(bufname(winbufnr(1)), 'foo3')
Assert Equals(bufname(winbufnr(2)), 'foo2')
Assert Equals(bufname(winbufnr(3)), 'foo4')
End
End
Context {options.cmdarg}
Context +cmd
Before
let filename = 'test/gina/_testdata/pluscmd.txt'
End
It starts at thel last line with "+"
call gina#core#buffer#open(filename, {
\ 'cmdarg': '+ '
\})
Assert Equals(line('.'), line('$'))
End
It starts at line {num} with "+{num}"
call gina#core#buffer#open(filename, {
\ 'cmdarg': '+10 '
\})
Assert Equals(line('.'), 10)
End
It starts at first line containig {pat} with "+/{pat}"
call gina#core#buffer#open(filename, {
\ 'cmdarg': '+/The\ following\ is '
\})
Assert Equals(line('.'), 6)
End
It execute {command} after opening the new file with +{command}
call gina#core#buffer#open(filename, {
\ 'cmdarg': '+setlocal\ filetype=vim '
\})
Assert Equals(&filetype, 'vim')
End
It is overwritten by {options.line} option
call gina#core#buffer#open(filename, {
\ 'cmdarg': '+10 ',
\ 'line': 20,
\})
Assert Equals(line('.'), 20)
End
End
Context ++cmd
It opens a new {bufname} with {cmdarg}
call gina#core#buffer#open('foo', {
\ 'cmdarg': '++enc=sjis ++ff=mac '
\})
Assert Equals(&fileencoding, 'sjis')
Assert Equals(&fileformat, 'mac')
End
It focus a new {bufname} with {cmdarg}
edit foo
Assert Equals(&fileencoding, '')
Assert Equals(&fileformat, is_windows ? 'dos' : 'unix')
call gina#core#buffer#open('foo', {
\ 'cmdarg': '++enc=sjis ++ff=mac '
\})
Assert Equals(&fileencoding, 'sjis')
Assert Equals(&fileformat, 'mac')
End
It opens a new {bufname} with {cmdarg} with {group}
call gina#core#buffer#open('foo', {
\ 'group': 'short',
\ 'cmdarg': '++enc=sjis ++ff=mac '
\})
Assert Equals(&fileencoding, 'sjis')
Assert Equals(&fileformat, 'mac')
End
It focus a new {bufname} with {cmdarg} with {group}
call gina#core#buffer#open('foo', {
\ 'group': 'short',
\})
Assert Equals(&fileencoding, '')
Assert Equals(&fileformat, is_windows ? 'dos' : 'unix')
call gina#core#buffer#open('foo', {
\ 'group': 'short',
\ 'cmdarg': '++enc=sjis ++ff=mac '
\})
Assert Equals(&fileencoding, 'sjis')
Assert Equals(&fileformat, 'mac')
End
End
End
Context {options.callback}
It throws an exception if a content of the buffer has modified by callback function
let callback = {}
function! callback.fn() abort
call append(0, ['This should not be allowed.'])
endfunction
Throws /A buffer content could not be modified by callback/
\ gina#core#buffer#open('foo', {'callback': callback})
End
It calls a callback funcion on a opened buffer in any case
let options = {}
let options.callback = {}
function! options.callback.fn() abort
let b:gina_core_buffer_called = 1
endfunction
let context = gina#core#buffer#open('foo1', options)
Assert Equals(bufnr('%'), context.bufnr)
Assert Equals(getbufvar(context.bufnr, 'gina_core_buffer_called'), 1)
let options.opener = 'pedit'
let context = gina#core#buffer#open('foo2', options)
Assert NotEquals(bufnr('%'), context.bufnr)
Assert Equals(getbufvar(context.bufnr, 'gina_core_buffer_called'), 1)
End
It calls a callback function on a focused buffer in any case
edit foo1
new foo2
let options = {}
let options.callback = {}
function! options.callback.fn() abort
let b:gina_core_buffer_called = 1
endfunction
let context = gina#core#buffer#open('foo1', options)
Assert Equals(bufnr('%'), context.bufnr)
Assert Equals(getbufvar(context.bufnr, 'gina_core_buffer_called'), 1)
bwipeout!
End
It calls a callback with {args}
let options = {}
let options.callback = {}
function! options.callback.fn(...) abort
let b:gina_core_buffer_called = a:000
endfunction
let options.callback.args = ['foo', 'bar']
let context = gina#core#buffer#open('foo1', options)
Assert Equals(b:gina_core_buffer_called, ['foo', 'bar'])
End
End
Context {options.group}
It reuses an opend window which opens a buffer with same {options.group}
edit foo1
call gina#core#buffer#open('foo2', {
\ 'opener': 'split',
\ 'group': 'short',
\})
Assert Equals(winnr('$'), 2)
Assert Equals(bufname(winbufnr(1)), 'foo2')
Assert Equals(bufname(winbufnr(2)), 'foo1')
call gina#core#buffer#open('foo3', {
\ 'opener': 'split',
\ 'group': 'short',
\})
Assert Equals(winnr('$'), 2)
Assert Equals(bufname(winbufnr(1)), 'foo3')
Assert Equals(bufname(winbufnr(2)), 'foo1')
End
End
Context jumps
Before
if !exists(':clearjumps')
Skip This Vim does not have :clearjumps so skip.
endif
End
It respects a native Vim's behavior for jumps for ':edit'
let opener = 'edit'
%bwipeout! | clearjumps
execute opener 'foo1'
let expect = split(execute('jumps'), '\r\?\n')
%bwipeout! | clearjumps
call gina#core#buffer#open('foo2', {
\ 'opener': opener,
\})
Assert Equals(split(execute('jumps'), '\r\?\n'), expect)
End
It respects a native Vim's behavior for jumps for ':new'
let opener = 'new'
%bwipeout! | clearjumps
execute opener 'foo1'
let expect = split(execute('jumps'), '\r\?\n')
%bwipeout! | clearjumps
call gina#core#buffer#open('foo2', {
\ 'opener': opener,
\})
Assert Equals(split(execute('jumps'), '\r\?\n'), expect)
End
It respects a native Vim's behavior for jumps for ':pedit'
let opener = 'pedit'
%bwipeout! | clearjumps
execute opener 'foo1'
let expect = split(execute('jumps'), '\r\?\n')
%bwipeout! | clearjumps
call gina#core#buffer#open('foo2', {
\ 'opener': opener,
\})
Assert Equals(split(execute('jumps'), '\r\?\n'), expect)
End
It respects a native Vim's behavior for jumps for ':tabedit'
let opener = 'tabedit'
%bwipeout! | clearjumps
execute opener 'foo1'
let expect = split(execute('jumps'), '\r\?\n')
%bwipeout! | clearjumps
call gina#core#buffer#open('foo2', {
\ 'opener': opener,
\})
Assert Equals(split(execute('jumps'), '\r\?\n'), expect)
End
End
End
Describe #focus({expr})
" NOTE:
" This feature is already tested in Vital.Vim.Window
End
Describe #assign_cmdarg([{cmdarg}])
It assigns &fileencoding if {cmdarg} has ++enc=xxxxx
edit foo
call gina#core#buffer#assign_cmdarg(' ++enc=utf-8')
Assert Equals(&fileencoding, 'utf-8')
Assert Equals(&fileformat, is_windows ? 'dos' : 'unix')
call gina#core#buffer#assign_cmdarg(' ++enc=cp1250')
Assert Equals(&fileencoding, 'cp1250')
Assert Equals(&fileformat, is_windows ? 'dos' : 'unix')
call gina#core#buffer#assign_cmdarg('')
Assert Equals(&fileencoding, 'cp1250')
Assert Equals(&fileformat, is_windows ? 'dos' : 'unix')
End
It assigns &fileformat if {cmdarg} has ++ff=xxxxx
edit foo
call gina#core#buffer#assign_cmdarg(' ++ff=unix')
Assert Equals(&fileencoding, '')
Assert Equals(&fileformat, 'unix')
call gina#core#buffer#assign_cmdarg(' ++ff=dos')
Assert Equals(&fileencoding, '')
Assert Equals(&fileformat, 'dos')
call gina#core#buffer#assign_cmdarg(' ++ff=mac')
Assert Equals(&fileencoding, '')
Assert Equals(&fileformat, 'mac')
call gina#core#buffer#assign_cmdarg('')
Assert Equals(&fileencoding, '')
Assert Equals(&fileformat, 'mac')
End
It assigns &fileencoding and &fileformat if {cmdarg} has ++enc=xxxxx and ++ff=xxxxx
edit foo
call gina#core#buffer#assign_cmdarg(' ++enc=utf-8 ++ff=unix')
Assert Equals(&fileencoding, 'utf-8')
Assert Equals(&fileformat, 'unix')
call gina#core#buffer#assign_cmdarg(' ++enc=cp1250 ++ff=dos')
Assert Equals(&fileencoding, 'cp1250')
Assert Equals(&fileformat, 'dos')
call gina#core#buffer#assign_cmdarg(' ++ff=mac ++enc=sjis')
Assert Equals(&fileencoding, 'sjis')
Assert Equals(&fileformat, 'mac')
call gina#core#buffer#assign_cmdarg('')
Assert Equals(&fileencoding, 'sjis')
Assert Equals(&fileformat, 'mac')
End
End
End