buffer: Forbid unletting b:changedtick

This commit is contained in:
ZyX
2017-02-20 22:45:37 +03:00
parent e2fbbb292f
commit 3277eff31a
2 changed files with 24 additions and 18 deletions

View File

@@ -1446,7 +1446,7 @@ static inline void buf_init_changedtick(buf_T *const buf)
dictitem_T *const changedtick_di = dictitem_alloc((char_u *)"changedtick"); dictitem_T *const changedtick_di = dictitem_alloc((char_u *)"changedtick");
// For some reason `islocked('b:changedtick')` should return 1. It does not // For some reason `islocked('b:changedtick')` should return 1. It does not
// do so for other read-only variables which are normally VAR_FIXED. // do so for other read-only variables which are normally VAR_FIXED.
changedtick_di->di_flags |= DI_FLAGS_LOCK|DI_FLAGS_FIX; changedtick_di->di_flags |= DI_FLAGS_RO|DI_FLAGS_LOCK|DI_FLAGS_FIX;
changedtick_di->di_tv = (typval_T) { changedtick_di->di_tv = (typval_T) {
.v_type = VAR_NUMBER, .v_type = VAR_NUMBER,
.v_lock = VAR_FIXED, .v_lock = VAR_FIXED,

View File

@@ -3,6 +3,7 @@ local helpers = require('test.functional.helpers')(after_each)
local curbufmeths = helpers.curbufmeths local curbufmeths = helpers.curbufmeths
local clear = helpers.clear local clear = helpers.clear
local eq = helpers.eq local eq = helpers.eq
local neq = helpers.neq
local eval = helpers.eval local eval = helpers.eval
local feed = helpers.feed local feed = helpers.feed
local funcs = helpers.funcs local funcs = helpers.funcs
@@ -57,13 +58,13 @@ describe('b:changedtick', function()
local ct = changedtick() local ct = changedtick()
local ctn = ct + 100500 local ctn = ct + 100500
eq(0, exc_exec('let d = b:')) eq(0, exc_exec('let d = b:'))
eq('\nE742: Cannot change value of b:changedtick', eq('\nE46: Cannot change read-only variable "b:changedtick"',
redir_exec('let b:changedtick = ' .. ctn)) redir_exec('let b:changedtick = ' .. ctn))
eq('\nE742: Cannot change value of b:["changedtick"] = ' .. ctn, eq('\nE46: Cannot change read-only variable "b:["changedtick"] = '..ctn..'"',
redir_exec('let b:["changedtick"] = ' .. ctn)) redir_exec('let b:["changedtick"] = ' .. ctn))
eq('\nE742: Cannot change value of b:.changedtick = ' .. ctn, eq('\nE46: Cannot change read-only variable "b:.changedtick = '..ctn..'"',
redir_exec('let b:.changedtick = ' .. ctn)) redir_exec('let b:.changedtick = ' .. ctn))
eq('\nE742: Cannot change value of d.changedtick = ' .. ctn, eq('\nE46: Cannot change read-only variable "d.changedtick = '..ctn..'"',
redir_exec('let d.changedtick = ' .. ctn)) redir_exec('let d.changedtick = ' .. ctn))
-- FIXME -- FIXME
-- eq({fales, ''}, -- eq({fales, ''},
@@ -71,24 +72,29 @@ describe('b:changedtick', function()
eq('\nE795: Cannot delete variable b:changedtick', eq('\nE795: Cannot delete variable b:changedtick',
redir_exec('unlet b:changedtick')) redir_exec('unlet b:changedtick'))
-- FIXME eq('\nE46: Cannot change read-only variable "b:.changedtick"',
-- eq('\nE795: Cannot delete variable b:.changedtick', redir_exec('unlet b:.changedtick'))
-- redir_exec('unlet b:.changedtick')) eq('\nE46: Cannot change read-only variable "b:["changedtick"]"',
-- eq('\nE795: Cannot delete variable b:["changedtick"]', redir_exec('unlet b:["changedtick"]'))
-- redir_exec('unlet b:["changedtick"]')) eq('\nE46: Cannot change read-only variable "d.changedtick"',
-- eq('\nE795: Cannot delete variable d.changedtick', redir_exec('unlet d.changedtick'))
-- redir_exec('unlet d.changedtick'))
-- FIXME -- FIXME
-- eq({}, -- eq({},
-- {pcall(curbufmeths.del_var, 'changedtick')}) -- {pcall(curbufmeths.del_var, 'changedtick')})
eq(ct, changedtick()) eq(ct, changedtick())
eq('\nE742: Cannot change value of b:["changedtick"] += ' .. ctn, eq('\nE46: Cannot change read-only variable "b:["changedtick"] += '..ctn..'"',
redir_exec('let b:["changedtick"] += ' .. ctn)) redir_exec('let b:["changedtick"] += ' .. ctn))
eq('\nE742: Cannot change value of b:["changedtick"] -= ' .. ctn, eq('\nE46: Cannot change read-only variable "b:["changedtick"] -= '..ctn..'"',
redir_exec('let b:["changedtick"] -= ' .. ctn)) redir_exec('let b:["changedtick"] -= ' .. ctn))
eq('\nE742: Cannot change value of b:["changedtick"] .= ' .. ctn, eq('\nE46: Cannot change read-only variable "b:["changedtick"] .= '..ctn..'"',
redir_exec('let b:["changedtick"] .= ' .. ctn)) redir_exec('let b:["changedtick"] .= ' .. ctn))
eq(ct, changedtick())
funcs.setline(1, 'hello')
eq(ct + 1, changedtick())
end) end)
it('is listed in :let output', function() it('is listed in :let output', function()
eq('\nb:changedtick #2', eq('\nb:changedtick #2',
@@ -101,13 +107,13 @@ describe('b:changedtick', function()
-- So test mostly checks that b:changedtick status does not change. -- So test mostly checks that b:changedtick status does not change.
eq(0, exc_exec('let d = b:')) eq(0, exc_exec('let d = b:'))
eq(1, funcs.islocked('b:changedtick')) eq(1, funcs.islocked('b:changedtick'))
eq(0, funcs.islocked('d.changedtick')) neq(1, funcs.islocked('d.changedtick'))
eq('\nE46: Cannot change read-only variable "b:changedtick"', eq('\nE46: Cannot change read-only variable "b:changedtick"',
redir_exec('unlockvar b:changedtick')) redir_exec('unlockvar b:changedtick'))
eq('', eq('\nE46: Cannot change read-only variable "d.changedtick"',
redir_exec('unlockvar d.changedtick')) redir_exec('unlockvar d.changedtick'))
eq(1, funcs.islocked('b:changedtick')) eq(1, funcs.islocked('b:changedtick'))
eq(0, funcs.islocked('d.changedtick')) neq(1, funcs.islocked('d.changedtick'))
end) end)
it('is being completed', function() it('is being completed', function()
feed(':echo b:<Tab><Home>let cmdline="<End>"<CR>') feed(':echo b:<Tab><Home>let cmdline="<End>"<CR>')