require('spec.helpers') local buffer = require('pending.buffer') local config = require('pending.config') local store = require('pending.store') local buffer = require('pending.buffer') describe('complete', function() local tmpdir local s local complete = require('pending.complete') before_each(function() tmpdir = vim.fn.tempname() vim.fn.mkdir(tmpdir, 'p') config.reset() s = store.new(tmpdir .. '/tasks.json') s:load() buffer.set_store(s) end) after_each(function() vim.fn.delete(tmpdir, 'rf') config.reset() buffer.set_store(nil) end) describe('findstart', function() it('returns column after colon for cat: prefix', function() local bufnr = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { '- [ ] task cat:Wo' }) vim.api.nvim_set_current_buf(bufnr) vim.api.nvim_win_set_cursor(0, { 1, 16 }) local result = complete.omnifunc(1, '') assert.are.equal(15, result) vim.api.nvim_buf_delete(bufnr, { force = true }) end) it('returns column after colon for due: prefix', function() local bufnr = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { '- [ ] task due:to' }) vim.api.nvim_set_current_buf(bufnr) vim.api.nvim_win_set_cursor(0, { 1, 16 }) local result = complete.omnifunc(1, '') assert.are.equal(15, result) vim.api.nvim_buf_delete(bufnr, { force = true }) end) it('returns column after colon for rec: prefix', function() local bufnr = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { '- [ ] task rec:we' }) vim.api.nvim_set_current_buf(bufnr) vim.api.nvim_win_set_cursor(0, { 1, 16 }) local result = complete.omnifunc(1, '') assert.are.equal(15, result) vim.api.nvim_buf_delete(bufnr, { force = true }) end) it('returns -1 for non-token position', function() local bufnr = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { '- [ ] some task ' }) vim.api.nvim_set_current_buf(bufnr) vim.api.nvim_win_set_cursor(0, { 1, 14 }) local result = complete.omnifunc(1, '') assert.are.equal(-1, result) vim.api.nvim_buf_delete(bufnr, { force = true }) end) end) describe('completions', function() it('returns existing categories for cat:', function() s:add({ description = 'A', category = 'Work' }) s:add({ description = 'B', category = 'Home' }) s:add({ description = 'C', category = 'Work' }) local bufnr = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { '- [ ] task cat: x' }) vim.api.nvim_set_current_buf(bufnr) vim.api.nvim_win_set_cursor(0, { 1, 15 }) complete.omnifunc(1, '') local result = complete.omnifunc(0, '') local words = {} for _, item in ipairs(result) do table.insert(words, item.word) end assert.is_true(vim.tbl_contains(words, 'Work')) assert.is_true(vim.tbl_contains(words, 'Home')) vim.api.nvim_buf_delete(bufnr, { force = true }) end) it('filters categories by base', function() s:add({ description = 'A', category = 'Work' }) s:add({ description = 'B', category = 'Home' }) local bufnr = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { '- [ ] task cat:W' }) vim.api.nvim_set_current_buf(bufnr) vim.api.nvim_win_set_cursor(0, { 1, 15 }) complete.omnifunc(1, '') local result = complete.omnifunc(0, 'W') assert.are.equal(1, #result) assert.are.equal('Work', result[1].word) vim.api.nvim_buf_delete(bufnr, { force = true }) end) it('returns named dates for due:', function() local bufnr = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { '- [ ] task due: x' }) vim.api.nvim_set_current_buf(bufnr) vim.api.nvim_win_set_cursor(0, { 1, 15 }) complete.omnifunc(1, '') local result = complete.omnifunc(0, '') assert.is_true(#result > 0) local words = {} for _, item in ipairs(result) do table.insert(words, item.word) end assert.is_true(vim.tbl_contains(words, 'today')) assert.is_true(vim.tbl_contains(words, 'tomorrow')) assert.is_true(vim.tbl_contains(words, 'eom')) vim.api.nvim_buf_delete(bufnr, { force = true }) end) it('filters dates by base prefix', function() local bufnr = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { '- [ ] task due:to' }) vim.api.nvim_set_current_buf(bufnr) vim.api.nvim_win_set_cursor(0, { 1, 16 }) complete.omnifunc(1, '') local result = complete.omnifunc(0, 'to') local words = {} for _, item in ipairs(result) do table.insert(words, item.word) end assert.is_true(vim.tbl_contains(words, 'today')) assert.is_true(vim.tbl_contains(words, 'tomorrow')) assert.is_false(vim.tbl_contains(words, 'eom')) vim.api.nvim_buf_delete(bufnr, { force = true }) end) it('returns recurrence shorthands for rec:', function() local bufnr = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { '- [ ] task rec: x' }) vim.api.nvim_set_current_buf(bufnr) vim.api.nvim_win_set_cursor(0, { 1, 15 }) complete.omnifunc(1, '') local result = complete.omnifunc(0, '') assert.is_true(#result > 0) local words = {} for _, item in ipairs(result) do table.insert(words, item.word) end assert.is_true(vim.tbl_contains(words, 'daily')) assert.is_true(vim.tbl_contains(words, 'weekly')) assert.is_true(vim.tbl_contains(words, '!weekly')) vim.api.nvim_buf_delete(bufnr, { force = true }) end) it('filters recurrence by base prefix', function() local bufnr = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { '- [ ] task rec:we' }) vim.api.nvim_set_current_buf(bufnr) vim.api.nvim_win_set_cursor(0, { 1, 16 }) complete.omnifunc(1, '') local result = complete.omnifunc(0, 'we') local words = {} for _, item in ipairs(result) do table.insert(words, item.word) end assert.is_true(vim.tbl_contains(words, 'weekly')) assert.is_true(vim.tbl_contains(words, 'weekdays')) assert.is_false(vim.tbl_contains(words, 'daily')) vim.api.nvim_buf_delete(bufnr, { force = true }) end) end) end)