Common library code for other vc*.nvim projects.

Expose compute_levels in fold logic and move tests here.

+150 -2
+2 -2
lua/vclib/fold.lua
··· 4 4 ---@param intervals Intervals 5 5 ---@param last_line integer 6 6 ---@return integer[] 7 - local function _compute_levels(intervals, context, last_line) 7 + function M.compute_levels(intervals, context, last_line) 8 8 local max_level = #context 9 9 10 10 local levels = {} ··· 61 61 vim.b.vclib_fold_changedtick = vim.b.changedtick 62 62 -- Update cached fold levels. 63 63 local last_line = vim.fn.line "$" 64 - vim.b.levels = _compute_levels(intervals, context, last_line) 64 + vim.b.levels = M.compute_levels(intervals, context, last_line) 65 65 end 66 66 end 67 67
+136
lua/vclib_tests/fold.lua
··· 1 + local M = {} 2 + 3 + local fold_lib = require "vclib.fold" 4 + local interval_lib = require "vclib.intervals" 5 + local testing = require "vclib.testing" 6 + 7 + M.fold_levels = { 8 + test_cases = { 9 + simple = { 10 + hunks = { 11 + { plus_start = 8, plus_count = 2, minus_start = -1, minus_count = -1 }, 12 + }, 13 + context = { 3 }, 14 + expected = { 15 + 1, -- 1| 16 + 1, -- 2| 17 + 1, -- 3| 18 + 1, -- 4| 19 + 0, -- 5| 3 20 + 0, -- 6| 2 21 + 0, -- 7| 1 22 + 0, -- 8| + 23 + 0, -- 9| + 24 + 0, -- 10| 1 25 + 0, -- 11| 2 26 + 0, -- 12| 3 27 + 1, -- 13| 28 + 1, -- 14| 29 + }, 30 + }, 31 + documentation_example = { 32 + hunks = { 33 + { plus_start = 8, plus_count = 2, minus_start = -1, minus_count = -1 }, 34 + }, 35 + context = { 1, 3 }, 36 + expected = { 37 + 2, -- 1| 38 + 2, -- 2| 39 + 2, -- 3| 40 + 2, -- 4| 41 + 1, -- 5| 3 42 + 1, -- 6| 2 43 + 0, -- 7| 1 44 + 0, -- 8| + 45 + 0, -- 9| + 46 + 0, -- 10| 1 47 + 1, -- 11| 2 48 + 1, -- 12| 3 49 + 2, -- 13| 50 + 2, -- 14| 51 + }, 52 + }, 53 + complicated_example = { 54 + hunks = { 55 + { plus_start = 2, plus_count = 1, minus_start = -1, minus_count = -1 }, 56 + { plus_start = 3, plus_count = 1, minus_start = -1, minus_count = -1 }, 57 + { plus_start = 5, plus_count = 1, minus_start = -1, minus_count = -1 }, 58 + { plus_start = 8, plus_count = 1, minus_start = -1, minus_count = -1 }, 59 + { plus_start = 12, plus_count = 1, minus_start = -1, minus_count = -1 }, 60 + { plus_start = 17, plus_count = 1, minus_start = -1, minus_count = -1 }, 61 + { plus_start = 23, plus_count = 1, minus_start = -1, minus_count = -1 }, 62 + { plus_start = 30, plus_count = 1, minus_start = -1, minus_count = -1 }, 63 + }, 64 + context = { 1, 2 }, 65 + expected = { 66 + 0, -- 1| 1 67 + 0, -- 2| + 68 + 0, -- 3| + 69 + 0, -- 4| 1 70 + 0, -- 5| + 71 + 0, -- 6| 1 72 + 0, -- 7| 1 73 + 0, -- 8| + 74 + 0, -- 9| 1 75 + 0, -- 10| 2 <-- special case, no use folding this 76 + 0, -- 11| 1 77 + 0, -- 12| + 78 + 0, -- 13| 1 79 + 1, -- 14| 2 80 + 1, -- 15| 2 81 + 0, -- 16| 1 82 + 0, -- 17| + 83 + 0, -- 18| 1 84 + 1, -- 19| 2 85 + 1, -- 20| 3 <-- special case, no use folding this 86 + 1, -- 21| 2 87 + 0, -- 22| 1 88 + 0, -- 23| + 89 + 0, -- 24| 1 90 + 1, -- 25| 2 91 + 2, -- 26| 3 92 + 2, -- 27| 3 93 + 1, -- 28| 2 94 + 0, -- 29| 1 95 + 0, -- 30| + 96 + }, 97 + }, 98 + edge_cases = { 99 + hunks = { 100 + { plus_start = 4, plus_count = 1, minus_start = -1, minus_count = -1 }, 101 + { plus_start = 10, plus_count = 1, minus_start = -1, minus_count = -1 }, 102 + }, 103 + context = { 2 }, 104 + expected = { 105 + 0, -- 1| 3 106 + 0, -- 2| 2 107 + 0, -- 3| 1 108 + 0, -- 4| + 109 + 0, -- 5| 1 110 + 0, -- 6| 2 111 + 0, -- 7| 3 112 + 0, -- 8| 2 113 + 0, -- 9| 1 114 + 0, -- 10| + 115 + 0, -- 11| 1 116 + 0, -- 12| 2 117 + 0, -- 13| 3 118 + }, 119 + }, 120 + }, 121 + test = function(case) 122 + local function convert(hunk) 123 + return { 124 + l = hunk.plus_start, 125 + r = hunk.plus_start + hunk.plus_count, 126 + data = nil, 127 + } 128 + end 129 + local intervals = interval_lib.from_list(case.hunks, convert) 130 + local levels = 131 + fold_lib.compute_levels(intervals, case.context, #case.expected) 132 + testing.assert_list_eq(levels, case.expected) 133 + end, 134 + } 135 + 136 + return M
+12
lua/vclib_tests/init.lua
··· 1 + local M = {} 2 + 3 + local testing = require "vclib.testing" 4 + 5 + function M.run() 6 + local test_modules = { 7 + "vclib_tests.fold", 8 + } 9 + testing.run_tests(test_modules) 10 + end 11 + 12 + return M