Files
neovim/test/functional/api/compatibility_spec.lua
Rui Abreu Ferreira f25797f869 api: Nvim version, API level #5386
The API level is disconnected from the NVIM version. The API metadata
holds the current API level, and the lowest backwards-compatible level
supported by this instance.

Release 0.1.6 will be the first release reporting the Nvim version and
API level.

    metadata['version'] = {
      major: 0,
      minor: 1,
      patch: 6,
      prerelease: true,
      api_level: 1,
      api_compatible: 0,
    }

The API level may remain unchanged across Neovim releases if the API has
not changed.

When changing the API the CMake variable NVIM_API_PRERELEASE is set to
true, and  NVIM_API_CURRENT/NVIM_API_COMPATIBILITY are incremented
accordingly.

The functional tests check the API table against fixtures of past
versions of Neovim. It compares all the functions in the old table with
the new one, it does ignore some metadata attributes that do not alter
the function signature or were removed since 0.1.5.  Currently the only
fixture is 0.mpack, generated from Neovim 0.1.5 with nvim --api-info.
2016-10-26 14:23:50 +02:00

66 lines
1.9 KiB
Lua

local helpers = require('test.functional.helpers')(after_each)
local lfs = require('lfs')
local mpack = require('mpack')
local clear, eq, neq = helpers.clear, helpers.eq, helpers.neq
local read_mpack_file = function(fname)
local fd = io.open(fname, 'rb')
local data = fd:read('*a')
fd:close()
local unpack = mpack.Unpacker()
return unpack(data)
end
-- ignore metadata in API function spec
local remove_function_metadata = function(fspec)
fspec['can_fail'] = nil
fspec['async'] = nil
fspec['method'] = nil
fspec['since'] = nil
fspec['deprecated_since'] = nil
fspec['receives_channel_id'] = nil
for idx,_ in ipairs(fspec['parameters']) do
fspec['parameters'][idx][2] = ''
end
end
clear()
local api_level = helpers.call('api_info')['api_level']
describe('api compatibility', function()
before_each(clear)
it("version metadata is sane", function()
local info = helpers.call('api_info')
local current = info['api_level']['current']
local compatibility = info['api_level']['compatibility']
neq(current, nil)
neq(compatibility, nil)
assert(current >= compatibility)
end)
for ver = api_level['compatibility'], api_level['current'] do
local path = 'test/functional/fixtures/api-info/' .. tostring(ver) .. '.mpack'
it('are backwards compatible with api level '..ver, function()
if lfs.attributes(path,"mode") ~= "file" then
pending("No fixture found, skipping test")
return
end
local old_api = read_mpack_file(path)
local api = helpers.call('api_info')
for _, fspec in ipairs(old_api['functions']) do
remove_function_metadata(fspec)
for _, fspec_new in ipairs(api['functions']) do
if fspec['name'] == fspec_new['name'] then
remove_function_metadata(fspec_new)
eq(fspec, fspec_new)
end
end
end
end)
end
end)