version_spec.lua (19604B)
1 local t = require('test.testutil') 2 local n = require('test.functional.testnvim')() 3 4 local clear = n.clear 5 local eq = t.eq 6 local ok = t.ok 7 local exec_lua = n.exec_lua 8 local matches = t.matches 9 local pcall_err = t.pcall_err 10 local fn = n.fn 11 12 local function v(ver) 13 return vim.version._version(ver) 14 end 15 16 describe('version', function() 17 it('package', function() 18 clear() 19 eq({ major = 42, minor = 3, patch = 99 }, exec_lua("return vim.version.parse('v42.3.99')")) 20 end) 21 22 it('version() returns Nvim version', function() 23 local expected = fn.api_info().version 24 local actual = exec_lua('return vim.version()') 25 eq(expected.major, actual.major) 26 eq(expected.minor, actual.minor) 27 eq(expected.patch, actual.patch) 28 eq(expected.prerelease and 'dev' or nil, actual.prerelease) 29 30 -- tostring() #23863 31 matches([[%d+%.%d+%.%d+]], exec_lua('return tostring(vim.version())')) 32 end) 33 34 describe('_version()', function() 35 local tests = { 36 ['v1.2.3'] = { major = 1, minor = 2, patch = 3 }, 37 ['v1.2'] = { major = 1, minor = 2, patch = 0 }, 38 ['v1.2.3-prerelease'] = { major = 1, minor = 2, patch = 3, prerelease = 'prerelease' }, 39 ['v1.2-prerelease'] = { major = 1, minor = 2, patch = 0, prerelease = 'prerelease' }, 40 ['v1.2.3-prerelease+build'] = { 41 major = 1, 42 minor = 2, 43 patch = 3, 44 prerelease = 'prerelease', 45 build = 'build', 46 }, 47 ['1.2.3+build'] = { major = 1, minor = 2, patch = 3, build = 'build' }, 48 } 49 for input, output in pairs(tests) do 50 it('parses ' .. input, function() 51 eq(output, v(input)) 52 end) 53 end 54 end) 55 56 describe('range', function() 57 local tests = { 58 ['1.2.3'] = { from = { 1, 2, 3 }, to = { 1, 2, 3 } }, 59 ['1.2'] = { from = { 1, 2, 0 }, to = { 1, 3, 0 } }, 60 ['=1.2.3'] = { from = { 1, 2, 3 }, to = { 1, 2, 3 } }, 61 ['>1.2.3'] = { from = '1.2.4-0' }, 62 ['>=1.2.3'] = { from = { 1, 2, 3 } }, 63 ['<1.2.3'] = { from = { 0, 0, 0 }, to = { 1, 2, 3 } }, 64 ['<=1.2.3'] = { from = { 0, 0, 0 }, to = '1.2.4-0' }, 65 ['~1.2.3'] = { from = { 1, 2, 3 }, to = { 1, 3, 0 } }, 66 ['^1.2.3'] = { from = { 1, 2, 3 }, to = { 2, 0, 0 } }, 67 ['^0.2.3'] = { from = { 0, 2, 3 }, to = { 0, 3, 0 } }, 68 ['^0.0.1'] = { from = { 0, 0, 1 }, to = { 0, 0, 2 } }, 69 ['^1.2'] = { from = { 1, 2, 0 }, to = { 2, 0, 0 } }, 70 ['~1.2'] = { from = { 1, 2, 0 }, to = { 1, 3, 0 } }, 71 ['~1'] = { from = { 1, 0, 0 }, to = { 2, 0, 0 } }, 72 ['^1'] = { from = { 1, 0, 0 }, to = { 2, 0, 0 } }, 73 ['1.*'] = { from = { 1, 0, 0 }, to = { 2, 0, 0 } }, 74 ['1'] = { from = { 1, 0, 0 }, to = { 2, 0, 0 } }, 75 ['1.x'] = { from = { 1, 0, 0 }, to = { 2, 0, 0 } }, 76 ['1.2.x'] = { from = { 1, 2, 0 }, to = { 1, 3, 0 } }, 77 ['1.2.*'] = { from = { 1, 2, 0 }, to = { 1, 3, 0 } }, 78 ['*'] = { from = { 0, 0, 0 } }, 79 ['1.2 - 2.3.0'] = { from = { 1, 2, 0 }, to = { 2, 3, 0 } }, 80 ['1.2.3 - 2.3.4'] = { from = { 1, 2, 3 }, to = { 2, 3, 4 } }, 81 ['1.2.3 - 2'] = { from = { 1, 2, 3 }, to = { 3, 0, 0 } }, 82 } 83 for input, output in pairs(tests) do 84 output.from = v(output.from) 85 output.to = output.to and v(output.to) 86 local range = vim.version.range(input) 87 88 it('parses ' .. input, function() 89 eq(output, range) 90 end) 91 92 it('tostring() ' .. input, function() 93 eq(type(tostring(range)), 'string') 94 eq(vim.version.range(tostring(range)), range) 95 end) 96 97 it('[from] in range ' .. input, function() 98 assert(range:has(output.from)) 99 end) 100 101 it('[from-1] not in range ' .. input, function() 102 local lower = vim.deepcopy(range.from) 103 lower.major = lower.major - 1 104 assert(not range:has(lower)) 105 end) 106 107 it('[to] not in range ' .. input .. ' to:' .. tostring(range.to), function() 108 if range.to and range.to ~= range.from then 109 assert(not (range.to < range.to)) 110 assert(not range:has(range.to)) 111 end 112 end) 113 114 it('[to] in range ' .. input .. ' to:' .. tostring(range.to), function() 115 if range.to and range.to == range.from then 116 assert(range:has(range.to)) 117 end 118 end) 119 end 120 121 it('handles prerelease', function() 122 assert(not vim.version.range('1.2.3'):has('1.2.3-alpha')) 123 assert(vim.version.range('1.2.3-alpha'):has('1.2.3-alpha')) 124 assert(not vim.version.range('1.2.3-alpha'):has('1.2.3-beta')) 125 assert(vim.version.range('>0.10'):has('0.12.0-dev')) 126 assert(not vim.version.range('>=0.12'):has('0.12.0-dev')) 127 128 assert(not vim.version.range('<=1.2.3'):has('1.2.4-alpha')) 129 assert(not vim.version.range('<=1.2.3-0'):has('1.2.3')) 130 assert(not vim.version.range('<=1.2.3-alpha'):has('1.2.3')) 131 assert(not vim.version.range('<=1.2.3-1'):has('1.2.4-0')) 132 assert(vim.version.range('<=1.2.3-0'):has('1.2.3-0')) 133 assert(vim.version.range('<=1.2.3-alpha'):has('1.2.3-alpha')) 134 135 assert(vim.version.range('>1.2.3'):has('1.2.4-0')) 136 assert(vim.version.range('>1.2.3'):has('1.2.4-alpha')) 137 assert(vim.version.range('>1.2.3-0'):has('1.2.3-1')) 138 139 local range_alpha = vim.version.range('1.2.3-alpha') 140 eq(vim.version.range(tostring(range_alpha)), range_alpha) 141 end) 142 143 it('returns nil with empty version', function() 144 eq(vim.version.parse(''), nil) 145 end) 146 end) 147 148 describe('intersect', function() 149 local check = function(input, output) 150 local r1 = vim.version.range(input[1]) 151 local r2 = vim.version.range(input[2]) 152 if output == nil then 153 eq(vim.version.intersect(r1, r2), nil) 154 eq(vim.version.intersect(r2, r1), nil) 155 else 156 local ref = vim.version.range(output) 157 eq(vim.version.intersect(r1, r2), ref) 158 eq(vim.version.intersect(r2, r1), ref) 159 end 160 end 161 162 it('returns biggest common range', function() 163 check({ '>=1.2.3', '>=2.0.0' }, '>=2.0.0') 164 check({ '>=1.2.3', '>=1.3.0' }, '>=1.3.0') 165 check({ '>=1.2.3', '>=1.2.4' }, '>=1.2.4') 166 check({ '>=1.2.3', '>=1.2.3' }, '>=1.2.3') 167 check({ '>=1.2.3', '>1.2.4' }, '>1.2.4') 168 check({ '>=1.2.3', '>1.2.3' }, '>1.2.3') 169 check({ '>=1.2.3', '>1.2.2' }, '>=1.2.3') 170 check({ '>1.2.3', '>1.2.4' }, '>1.2.4') 171 check({ '>1.2.3', '>1.2.3' }, '>1.2.3') 172 173 check({ '>=1.2.3', '1.2.0 - 1.2.2' }, nil) 174 check({ '>=1.2.3', '1.2.0 - 1.2.2' }, nil) 175 check({ '>=1.2.3', '1.2.0 - 1.2.3' }, nil) 176 check({ '>=1.2.3', '1.2.0 - 1.2.4' }, '1.2.3 - 1.2.4') 177 check({ '>=1.2.3', '1.2.3 - 1.2.4' }, '1.2.3 - 1.2.4') 178 check({ '>=1.2.3', '1.2.4 - 1.3.0' }, '1.2.4 - 1.3.0') 179 check({ '>1.2.3', '1.2.0 - 1.2.2' }, nil) 180 check({ '>1.2.3', '1.2.0 - 1.2.2' }, nil) 181 check({ '>1.2.3', '1.2.0 - 1.2.3' }, nil) 182 check({ '>1.2.3', '1.2.0 - 1.2.4' }, '1.2.4-0 - 1.2.4') 183 check({ '>1.2.3', '1.2.3 - 1.2.4' }, '1.2.4-0 - 1.2.4') 184 check({ '>1.2.3', '1.2.4 - 1.3.0' }, '1.2.4 - 1.3.0') 185 186 check({ '>=1.2.3', '=1.2.4' }, '=1.2.4') 187 check({ '>=1.2.3', '=1.2.3' }, '=1.2.3') 188 check({ '>=1.2.3', '=1.2.2' }, nil) 189 check({ '>1.2.3', '=1.2.4' }, '=1.2.4') 190 check({ '>1.2.3', '=1.2.3' }, nil) 191 check({ '>1.2.3', '=1.2.2' }, nil) 192 193 check({ '>=1.2.3', '<=1.3.0' }, '1.2.3 - 1.3.1-0') 194 check({ '>=1.2.3', '<1.3.0' }, '1.2.3 - 1.3.0') 195 check({ '>=1.2.3', '<=1.2.3' }, '1.2.3 - 1.2.4-0') -- A better result would be '=1.2.3' 196 check({ '>=1.2.3', '<1.2.3' }, nil) 197 check({ '>=1.2.3', '<=1.2.2' }, nil) 198 check({ '>=1.2.3', '<1.2.2' }, nil) 199 check({ '>1.2.3', '<=1.3.0' }, '1.2.4-0 - 1.3.1-0') 200 check({ '>1.2.3', '<1.3.0' }, '1.2.4-0 - 1.3.0') 201 check({ '>1.2.3', '<=1.2.3' }, nil) 202 check({ '>1.2.3', '<1.2.3' }, nil) 203 check({ '>1.2.3', '<=1.2.2' }, nil) 204 check({ '>1.2.3', '<1.2.2' }, nil) 205 206 check({ '1.2.3 - 1.3.0', '1.3.1 - 1.4.0' }, nil) 207 check({ '1.2.3 - 1.3.0', '1.3.0 - 1.4.0' }, nil) 208 check({ '1.2.3 - 1.3.0', '1.2.4 - 1.4.0' }, '1.2.4 - 1.3.0') 209 check({ '1.2.3 - 1.3.0', '1.2.3 - 1.4.0' }, '1.2.3 - 1.3.0') 210 check({ '1.2.3 - 1.3.0', '1.2.2 - 1.4.0' }, '1.2.3 - 1.3.0') 211 check({ '1.2.3 - 1.3.0', '1.2.4 - 1.3.0' }, '1.2.4 - 1.3.0') 212 check({ '1.2.3 - 1.3.0', '1.2.3 - 1.3.0' }, '1.2.3 - 1.3.0') 213 214 check({ '1.2.3 - 1.3.0', '=1.4.0' }, nil) 215 check({ '1.2.3 - 1.3.0', '=1.3.0' }, nil) 216 check({ '1.2.3 - 1.3.0', '=1.2.4' }, '=1.2.4') 217 check({ '1.2.3 - 1.3.0', '=1.2.3' }, '=1.2.3') 218 check({ '1.2.3 - 1.3.0', '=1.2.2' }, nil) 219 220 check({ '1.2.3 - 1.3.0', '<=1.4.0' }, '1.2.3 - 1.3.0') 221 check({ '1.2.3 - 1.3.0', '<1.4.0' }, '1.2.3 - 1.3.0') 222 check({ '1.2.3 - 1.3.0', '<=1.3.0' }, '1.2.3 - 1.3.0') 223 check({ '1.2.3 - 1.3.0', '<1.3.0' }, '1.2.3 - 1.3.0') 224 check({ '1.2.3 - 1.3.0', '<=1.2.4' }, '1.2.3 - 1.2.5-0') 225 check({ '1.2.3 - 1.3.0', '<1.2.5' }, '1.2.3 - 1.2.5') 226 check({ '1.2.3 - 1.3.0', '<=1.2.3' }, '1.2.3 - 1.2.4-0') -- A better result would be '=1.2.3' 227 check({ '1.2.3 - 1.3.0', '<1.2.3' }, nil) 228 check({ '1.2.3 - 1.3.0', '<=1.2.2' }, nil) 229 check({ '1.2.3 - 1.3.0', '<1.2.2' }, nil) 230 231 check({ '=1.2.3', '=1.2.4' }, nil) 232 check({ '=1.2.3', '=1.2.3' }, '=1.2.3') 233 234 check({ '=1.2.3', '<1.2.3' }, nil) 235 check({ '<=1.2.2', '=1.2.3' }, nil) 236 237 check({ '=1.2.3', '<=1.3.0' }, '=1.2.3') 238 check({ '=1.2.3', '<1.3.0' }, '=1.2.3') 239 check({ '=1.2.3', '<=1.2.3' }, '=1.2.3') 240 check({ '=1.2.3', '<1.2.3' }, nil) 241 check({ '=1.2.3', '<=1.2.2' }, nil) 242 check({ '=1.2.3', '<1.2.2' }, nil) 243 244 check({ '<=1.2.3', '<=1.3.0' }, '<=1.2.3') 245 check({ '<=1.2.3', '<1.3.0' }, '<=1.2.3') 246 check({ '<=1.2.3', '<=1.2.3' }, '<=1.2.3') 247 check({ '<=1.2.3', '<1.2.3' }, '<1.2.3') 248 check({ '<=1.2.3', '<=1.2.2' }, '<=1.2.2') 249 check({ '<=1.2.3', '<1.2.2' }, '<1.2.2') 250 check({ '<1.2.3', '<=1.3.0' }, '<1.2.3') 251 check({ '<1.2.3', '<1.3.0' }, '<1.2.3') 252 check({ '<1.2.3', '<=1.2.3' }, '<1.2.3') 253 check({ '<1.2.3', '<1.2.3' }, '<1.2.3') 254 check({ '<1.2.3', '<=1.2.2' }, '<=1.2.2') 255 check({ '<1.2.3', '<1.2.2' }, '<1.2.2') 256 257 -- Selective coverage of ranges with pre-releases 258 check({ '>=1.2.3-0', '>=1.2.3-1' }, '>=1.2.3-1') 259 check({ '>=1.2.3-alpha', '>=1.2.3-beta' }, '>=1.2.3-beta') 260 check({ '>=1.2.3-0', '>=1.2.3-alpha' }, '>=1.2.3-alpha') 261 check({ '>=1.2.3-0', '<1.2.3' }, '1.2.3-0 - 1.2.3') 262 check({ '>=1.2.3-0', '<1.2.3-1' }, '1.2.3-0 - 1.2.3-1') 263 check({ '>=1.2.3-alpha', '<1.2.3-beta' }, '1.2.3-alpha - 1.2.3-beta') 264 check({ '>=1.2.3-0', '1.2.2 - 1.2.3' }, '1.2.3-0 - 1.2.3') 265 check({ '>=1.2.3-0', '<=1.2.2' }, nil) 266 267 check({ '<=1.2.3-0', '>=1.2.3' }, nil) 268 check({ '<=1.2.3-0', '=1.2.3' }, nil) 269 check({ '>=1.2.3-0', '<1.2.3-2' }, '1.2.3-0 - 1.2.3-2') 270 end) 271 end) 272 273 describe('cmp()', function() 274 local testcases = { 275 { v1 = 'v0.0.99', v2 = 'v9.0.0', want = -1 }, 276 { v1 = 'v0.4.0', v2 = 'v0.9.99', want = -1 }, 277 { v1 = 'v0.2.8', v2 = 'v1.0.9', want = -1 }, 278 { v1 = 'v0.0.0', v2 = 'v0.0.0', want = 0 }, 279 { v1 = 'v9.0.0', v2 = 'v0.9.0', want = 1 }, 280 { v1 = 'v0.9.0', v2 = 'v0.0.0', want = 1 }, 281 { v1 = 'v0.0.9', v2 = 'v0.0.0', want = 1 }, 282 { v1 = 'v0.0.9+aaa', v2 = 'v0.0.9+bbb', want = 0 }, 283 284 -- prerelease 💩 https://semver.org/#spec-item-11 285 { v1 = 'v1.0.0-alpha', v2 = 'v1.0.0', want = -1 }, 286 { v1 = '1.0.0', v2 = '1.0.0-alpha', want = 1 }, 287 { v1 = '1.0.0-2', v2 = '1.0.0-1', want = 1 }, 288 { v1 = '1.0.0-2', v2 = '1.0.0-9', want = -1 }, 289 { v1 = '1.0.0-2', v2 = '1.0.0-2.0', want = -1 }, 290 { v1 = '1.0.0-2.0', v2 = '1.0.0-2', want = 1 }, 291 { v1 = '1.0.0-2.0', v2 = '1.0.0-2.0', want = 0 }, 292 { v1 = '1.0.0-alpha', v2 = '1.0.0-alpha', want = 0 }, 293 -- Per semver spec, prereleases have alphabetical ordering. 294 { v1 = '1.0.0-alpha', v2 = '1.0.0-beta', want = -1 }, 295 { v1 = '1.0.0-beta', v2 = '1.0.0-alpha', want = 1 }, 296 { v1 = '1.0.0-alpha', v2 = '1.0.0-alpha.1', want = -1 }, 297 { v1 = '1.0.0-alpha.1', v2 = '1.0.0-alpha', want = 1 }, 298 { v1 = '1.0.0-alpha.beta', v2 = '1.0.0-alpha', want = 1 }, 299 { v1 = '1.0.0-alpha', v2 = '1.0.0-alpha.beta', want = -1 }, 300 { v1 = '1.0.0-alpha.beta', v2 = '1.0.0-beta', want = -1 }, 301 { v1 = '1.0.0-beta.2', v2 = '1.0.0-beta.11', want = -1 }, 302 { v1 = '1.0.0-beta.20', v2 = '1.0.0-beta.11', want = 1 }, 303 { v1 = '1.0.0-alpha.20', v2 = '1.0.0-beta.11', want = -1 }, 304 { v1 = '1.0.0-a.01.x.3', v2 = '1.0.0-a.1.x.003', want = 0 }, 305 { v1 = 'v0.9.0-dev-92+9', v2 = 'v0.9.0-dev-120+3', want = -1 }, 306 } 307 for _, tc in ipairs(testcases) do 308 local msg = function(s) 309 return ('v1 %s v2'):format(s == 0 and '==' or (s == 1 and '>' or '<')) 310 end 311 it(string.format('(v1 = %s, v2 = %s)', tc.v1, tc.v2), function() 312 local rv = vim.version.cmp(tc.v1, tc.v2, { strict = true }) 313 ok(tc.want == rv, msg(tc.want), msg(rv)) 314 end) 315 end 316 end) 317 318 describe('parse()', function() 319 describe('strict=true', function() 320 local testcases = { 321 { 322 desc = 'Nvim version', 323 version = 'v0.9.0-dev-1233+g210120dde81e', 324 want = { 325 major = 0, 326 minor = 9, 327 patch = 0, 328 prerelease = 'dev-1233', 329 build = 'g210120dde81e', 330 }, 331 }, 332 { 333 desc = 'no v', 334 version = '10.20.123', 335 want = { major = 10, minor = 20, patch = 123, prerelease = nil, build = nil }, 336 }, 337 { 338 desc = 'with v', 339 version = 'v1.2.3', 340 want = { major = 1, minor = 2, patch = 3 }, 341 }, 342 { 343 desc = 'prerelease', 344 version = '1.2.3-alpha', 345 want = { major = 1, minor = 2, patch = 3, prerelease = 'alpha' }, 346 }, 347 { 348 desc = 'prerelease.x', 349 version = '1.2.3-alpha.1', 350 want = { major = 1, minor = 2, patch = 3, prerelease = 'alpha.1' }, 351 }, 352 { 353 desc = 'build.x', 354 version = '1.2.3+build.15', 355 want = { major = 1, minor = 2, patch = 3, build = 'build.15' }, 356 }, 357 { 358 desc = 'prerelease and build', 359 version = '1.2.3-rc1+build.15', 360 want = { major = 1, minor = 2, patch = 3, prerelease = 'rc1', build = 'build.15' }, 361 }, 362 } 363 for _, tc in ipairs(testcases) do 364 it(string.format('%q: version = %q', tc.desc, tc.version), function() 365 eq(tc.want, vim.version.parse(tc.version)) 366 end) 367 end 368 end) 369 370 describe('strict=false', function() 371 local testcases = { 372 { version = '1.2', want = { major = 1, minor = 2, patch = 0 } }, 373 { version = '1', want = { major = 1, minor = 0, patch = 0 } }, 374 { version = '1.1-0', want = { major = 1, minor = 1, patch = 0, prerelease = '0' } }, 375 { version = '1-1.0', want = { major = 1, minor = 0, patch = 0, prerelease = '1.0' } }, 376 { version = 'v1.2.3 ', want = { major = 1, minor = 2, patch = 3 } }, 377 { version = ' v1.2.3', want = { major = 1, minor = 2, patch = 3 } }, 378 { version = 'tmux 3.2a', want = { major = 3, minor = 2, patch = 0 } }, 379 } 380 for _, tc in ipairs(testcases) do 381 it(string.format('version = %q', tc.version), function() 382 eq(tc.want, vim.version.parse(tc.version, { strict = false })) 383 end) 384 end 385 end) 386 387 describe('invalid semver', function() 388 local testcases = { 389 { version = 'foo' }, 390 { version = '' }, 391 { version = '0.0.0.' }, 392 { version = '.0.0.0' }, 393 { version = '-1.0.0' }, 394 { version = '0.-1.0' }, 395 { version = '0.0.-1' }, 396 { version = 'foobar1.2.3' }, 397 { version = '1.2.3foobar' }, 398 { version = '1.2.3-%?' }, 399 { version = '1.2.3+%?' }, 400 { version = '1.2.3+build.0-rc1' }, 401 { version = '3.2a' }, 402 { version = 'tmux 3.2a' }, 403 } 404 405 local function quote_empty(s) 406 return tostring(s) == '' and '""' or tostring(s) 407 end 408 409 for _, tc in ipairs(testcases) do 410 it(quote_empty(tc.version), function() 411 eq(nil, vim.version.parse(tc.version, { strict = true })) 412 end) 413 end 414 end) 415 416 describe('invalid shape', function() 417 local testcases = { 418 { desc = 'no parameters' }, 419 { desc = 'nil', version = nil }, 420 { desc = 'number', version = 0 }, 421 { desc = 'float', version = 0.01 }, 422 { desc = 'table', version = {} }, 423 } 424 for _, tc in ipairs(testcases) do 425 it(string.format('(%s): %s', tc.desc, tostring(tc.version)), function() 426 local expected = string.format( 427 type(tc.version) == 'string' and 'invalid version: "%s"' or 'invalid version: %s', 428 tostring(tc.version) 429 ) 430 matches(expected, pcall_err(vim.version.parse, tc.version, { strict = true })) 431 end) 432 end 433 end) 434 end) 435 436 it('relational metamethods (== < >)', function() 437 assert(v('v1.2.3') == v('1.2.3')) 438 assert(not (v('v1.2.3') < v('1.2.3'))) 439 assert(v('v1.2.3') > v('1.2.3-prerelease')) 440 assert(v('v1.2.3-alpha') < v('1.2.3-beta')) 441 assert(v('v1.2.3-prerelease') < v('1.2.3')) 442 assert(v('v1.2.3') >= v('1.2.3')) 443 assert(v('v1.2.3') >= v('1.0.3')) 444 assert(v('v1.2.3') >= v('1.2.2')) 445 assert(v('v1.2.3') > v('1.2.2')) 446 assert(v('v1.2.3') > v('1.0.3')) 447 eq(vim.version.last({ v('1.2.3'), v('2.0.0') }), v('2.0.0')) 448 eq(vim.version.last({ v('2.0.0'), v('1.2.3') }), v('2.0.0')) 449 end) 450 451 it('le()', function() 452 eq(true, vim.version.le('1', '1')) 453 eq(true, vim.version.le({ 3, 1, 4 }, '3.1.4')) 454 eq(true, vim.version.le('1', '2')) 455 eq(true, vim.version.le({ 0, 7, 4 }, { 3 })) 456 eq(false, vim.version.le({ 3 }, { 0, 7, 4 })) 457 eq(false, vim.version.le({ major = 3, minor = 3, patch = 0 }, { 3, 2, 0 })) 458 eq(false, vim.version.le('2', '1')) 459 end) 460 461 it('lt()', function() 462 eq(false, vim.version.lt('1', '1')) 463 eq(false, vim.version.lt({ 3, 1, 4 }, '3.1.4')) 464 eq(true, vim.version.lt('1', '2')) 465 eq(true, vim.version.lt({ 0, 7, 4 }, { 3 })) 466 eq(false, vim.version.lt({ 3 }, { 0, 7, 4 })) 467 eq(false, vim.version.lt({ major = 3, minor = 3, patch = 0 }, { 3, 2, 0 })) 468 eq(false, vim.version.lt('2', '1')) 469 end) 470 471 it('ge()', function() 472 eq(true, vim.version.ge('1', '1')) 473 eq(true, vim.version.ge({ 3, 1, 4 }, '3.1.4')) 474 eq(true, vim.version.ge('2', '1')) 475 eq(true, vim.version.ge({ 3 }, { 0, 7, 4 })) 476 eq(true, vim.version.ge({ major = 3, minor = 3, patch = 0 }, { 3, 2, 0 })) 477 eq(false, vim.version.ge('1', '2')) 478 eq(false, vim.version.ge({ 0, 7, 4 }, { 3 })) 479 end) 480 481 it('gt()', function() 482 eq(false, vim.version.gt('1', '1')) 483 eq(false, vim.version.gt({ 3, 1, 4 }, '3.1.4')) 484 eq(true, vim.version.gt('2', '1')) 485 eq(true, vim.version.gt({ 3 }, { 0, 7, 4 })) 486 eq(true, vim.version.gt({ major = 3, minor = 3, patch = 0 }, { 3, 2, 0 })) 487 eq(false, vim.version.gt('1', '2')) 488 eq(false, vim.version.gt({ 0, 7, 4 }, { 3 })) 489 end) 490 491 it('eq()', function() 492 eq(true, vim.version.eq('2', '2')) 493 eq(true, vim.version.eq({ 3, 1, 0 }, '3.1.0')) 494 eq(true, vim.version.eq({ major = 3, minor = 3, patch = 0 }, { 3, 3, 0 })) 495 eq(false, vim.version.eq('2', '3')) 496 497 -- semver: v3 == v3.0 == v3.0.0 498 eq(true, vim.version.eq('3', { 3, 0, 0 })) 499 eq(true, vim.version.eq({ 3, 0 }, { 3 })) 500 eq(true, vim.version.eq({ 3, 0, 0 }, { 3 })) 501 end) 502 end)