diff --git a/.github/workflows/default.yml b/.github/workflows/default.yml index 7f735c91..a32a69ab 100644 --- a/.github/workflows/default.yml +++ b/.github/workflows/default.yml @@ -3,9 +3,21 @@ name: default on: [push, pull_request] jobs: - x64-ubuntu: - name: X64-ubuntu - runs-on: ubuntu-20.04 + native: + name: native + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-20.04, macos-10.15] + include: + - os: ubuntu-20.04 + url: https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz + manager: sudo apt + packages: fd-find + - os: macos-10.15 + url: https://github.com/neovim/neovim/releases/download/nightly/nvim-macos.tar.gz + manager: brew + packages: fd steps: - uses: actions/checkout@v2 - run: date +%F > todays-date @@ -13,12 +25,22 @@ jobs: uses: actions/cache@v2 with: path: _neovim - key: ${{ runner.os }}-x64-${{ hashFiles('todays-date') }} + key: ${{ matrix.os }}-${{ hashFiles('todays-date') }} + + - name: Prepare + run: | + ${{ matrix.manager }} install ${{ matrix.packages }} + test -d _neovim || { + mkdir -p _neovim + curl -sL ${{ matrix.url }} | tar xzf - --strip-components=1 -C "${PWD}/_neovim" + } + git clone --depth 1 https://github.com/neovim/neovim - name: Run tests run: | - curl -OL https://raw.githubusercontent.com/norcalli/bot-ci/master/scripts/github-actions-setup.sh - source github-actions-setup.sh nightly-x64 + export PATH="${PWD}/_neovim/bin:${PATH}" + export VIM="${PWD}/_neovim/share/nvim/runtime" + nvim --version make test appimage-ubuntu: @@ -35,6 +57,7 @@ jobs: - name: Prepare run: | + sudo apt install fd-find test -d build || { mkdir -p build wget https://github.com/neovim/neovim/releases/download/nightly/nvim.appimage @@ -44,5 +67,5 @@ jobs: - name: Run tests run: | - export PATH="${PWD}/build/:${PATH}" - make test + export PATH="${PWD}/build/:${PATH}" + make test diff --git a/tests/plenary/job_spec.lua b/tests/plenary/job_spec.lua index b2395498..2c3dd1cb 100644 --- a/tests/plenary/job_spec.lua +++ b/tests/plenary/job_spec.lua @@ -237,11 +237,12 @@ describe('Job', function() end) it('should match larger systemlist', function() - local results = vim.fn.systemlist('find') + local results = vim.fn.systemlist('find .') local stdout_results = {} local job = Job:new { command = 'find', + args = { '.' }, on_stdout = function(_, line) table.insert(stdout_results, line) end } diff --git a/tests/plenary/scandir_spec.lua b/tests/plenary/scandir_spec.lua index 0450e730..40ac7bd3 100644 --- a/tests/plenary/scandir_spec.lua +++ b/tests/plenary/scandir_spec.lua @@ -1,4 +1,5 @@ local scan = require'plenary.scandir' +local Job = require'plenary.job' local eq = assert.are.same local contains = function(tbl, str) @@ -15,58 +16,164 @@ local contains_match = function(tbl, str) return false end +local compare_tables = function(expected, given, cwd) + local found = 0 + for _, v in ipairs(expected) do + for k, w in ipairs(given) do + if v == w:sub(#cwd + 2, -1) then + found = found + 1 + goto continue + end + end + ::continue:: + end + return found +end + +local fd_cmd = (function() + if 1 == vim.fn.executable('fd') then + return 'fd' + else + return 'fdfind' + end +end)() + describe('scandir', function() describe('can list all files recursive', function() it('with cwd', function() local dirs = scan.scan_dir('.') + local job_dirs = Job:new({ + command = fd_cmd, + args = { '.', '--type', 'f', '-I' }, + cwd = '.' + }):sync() eq('table', type(dirs)) eq(true, contains(dirs, './CHANGELOG.md')) eq(true, contains(dirs, './LICENSE')) eq(true, contains(dirs, './lua/plenary/job.lua')) eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + eq(table.getn(job_dirs), table.getn(dirs)) end) + -- TODO(conni2461): Doesn't run in ci + -- it('with homedir', function() + -- local dirs = scan.scan_dir(vim.fn.expand('~')) + -- local job_dirs = Job:new({ + -- command = fd_cmd, + -- args = { '.', '-I', '--type', 'f', '--type', 'l' }, + -- cwd = vim.fn.expand('~') + -- }):sync() + -- eq('table', type(dirs)) + -- eq(table.getn(job_dirs), table.getn(dirs)) + -- eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, vim.fn.expand('~'))) + -- end) + it('and callback gets called for each entry', function() local count = 0 local dirs = scan.scan_dir('.', { on_insert = function() count = count + 1 end }) + local job_dirs = Job:new({ + command = fd_cmd, + args = { '.', '--type', 'f', '-I' }, + cwd = '.' + }):sync() eq('table', type(dirs)) eq(true, contains(dirs, './CHANGELOG.md')) eq(true, contains(dirs, './LICENSE')) eq(true, contains(dirs, './lua/plenary/job.lua')) eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + eq(table.getn(job_dirs), table.getn(dirs)) + eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) eq(count, #dirs) + eq(count, #job_dirs) end) it('with multiple paths', function() local dirs = scan.scan_dir({ './lua' , './tests'}) + local job_dirs1 = Job:new({ + command = fd_cmd, + args = { '.', '--type', 'f', '-I' }, + cwd = './lua' } + ):sync() + + local job_dirs2 = Job:new({ + command = fd_cmd, + args = { '.', '--type', 'f', '-I' }, + cwd = './tests' + }):sync() + local job_dirs = {} + for _, v in ipairs(job_dirs1) do + table.insert(job_dirs, 'lua/' .. v) + end + for _, v in ipairs(job_dirs2) do + table.insert(job_dirs, 'tests/' .. v) + end + eq('table', type(dirs)) eq(true, contains(dirs, './lua/say.lua')) eq(true, contains(dirs, './lua/plenary/job.lua')) eq(true, contains(dirs, './tests/plenary/scandir_spec.lua')) eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + eq(table.getn(job_dirs), table.getn(dirs)) + eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) end) it('with hidden files', function() local dirs = scan.scan_dir('.', { hidden = true }) + local job_dirs = Job:new({ + command = fd_cmd, + args = { '.', '--type', 'f', '-I', '--hidden' }, + cwd = '.' + }):sync() eq('table', type(dirs)) eq(true, contains(dirs, './CHANGELOG.md')) eq(true, contains(dirs, './lua/plenary/job.lua')) eq(true, contains(dirs, './.gitignore')) eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + eq(table.getn(job_dirs), table.getn(dirs)) + eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) end) + -- TODO(conni2461): Doesn't run in ci + -- it('with hidden files in homedir', function() + -- local dirs = scan.scan_dir(vim.fn.expand('~'), { hidden = true }) + -- local job_dirs = Job:new({ + -- command = fd_cmd, + -- args = { '.', '--type', 'f', '--type', 'l', '-I', '--hidden', '--type' }, + -- cwd = vim.fn.expand('~') + -- }):sync() + -- eq('table', type(dirs)) + -- local in_range = false + -- if table.getn(job_dirs) + 10 > table.getn(dirs) and + -- table.getn(job_dirs) - 10 < table.getn(dirs) then + -- in_range = true + -- end + -- eq(true, in_range) + -- end) + it('with add directories', function() local dirs = scan.scan_dir('.', { add_dirs = true }) + local job_dirs = Job:new({ + command = fd_cmd, + args = { '.', '-I' }, + cwd = '.' + }):sync() eq('table', type(dirs)) eq(true, contains(dirs, './CHANGELOG.md')) eq(true, contains(dirs, './lua/plenary/job.lua')) eq(true, contains(dirs, './lua')) eq(true, contains(dirs, './tests')) eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + eq(table.getn(job_dirs), table.getn(dirs)) + eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) end) it('until depth 1 is reached', function() local dirs = scan.scan_dir('.', { depth = 1 }) + local job_dirs = Job:new({ + command = fd_cmd, + args = { '.', '--type', 'f', '--maxdepth', '1', '-I' }, + cwd = '.' + }):sync() eq('table', type(dirs)) eq(true, contains(dirs, './CHANGELOG.md')) eq(true, contains(dirs, './README.md')) @@ -74,32 +181,91 @@ describe('scandir', function() eq(false, contains(dirs, './lua/say.lua')) eq(false, contains(dirs, './lua/plenary/job.lua')) eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + eq(table.getn(job_dirs), table.getn(dirs)) + eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) end) it('until depth 1 is reached and with directories', function() local dirs = scan.scan_dir('.', { depth = 1, add_dirs = true }) + local job_dirs = Job:new({ + command = fd_cmd, + args = { '.', '--maxdepth', '1', '-I' }, + cwd = '.' + }):sync() + eq('table', type(dirs)) + eq(true, contains(dirs, './CHANGELOG.md')) + eq(true, contains(dirs, './README.md')) + eq(true, contains(dirs, './lua')) + eq(false, contains(dirs, './lua/say.lua')) + eq(false, contains(dirs, './lua/plenary/job.lua')) + eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + eq(table.getn(job_dirs), table.getn(dirs)) + eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) + end) + + it('until depth 1 is reached and with directories and hidden', function() + local dirs = scan.scan_dir('.', { depth = 1, add_dirs = true, hidden = true }) + local job_dirs = Job:new({ + command = fd_cmd, + args = { '.', '--maxdepth', '1', '--hidden', '-I' }, + cwd = '.' + }):sync() eq('table', type(dirs)) eq(true, contains(dirs, './CHANGELOG.md')) eq(true, contains(dirs, './README.md')) eq(true, contains(dirs, './lua')) + eq(true, contains(dirs, './.gitignore')) eq(false, contains(dirs, './lua/say.lua')) eq(false, contains(dirs, './lua/plenary/job.lua')) eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + eq(table.getn(job_dirs), table.getn(dirs)) + eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) end) it('until depth 2 is reached', function() local dirs = scan.scan_dir('.', { depth = 2 }) + local job_dirs = Job:new({ + command = fd_cmd, + args = { '.', '--type', 'f', '--maxdepth', '2', '-I' }, + cwd = '.' + }):sync() eq('table', type(dirs)) eq(true, contains(dirs, './CHANGELOG.md')) eq(true, contains(dirs, './README.md')) eq(true, contains(dirs, './lua/say.lua')) eq(false, contains(dirs, './lua/plenary/job.lua')) eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + eq(table.getn(job_dirs), table.getn(dirs)) + eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) + end) + + it('until depth 3 is reached and with directories and hidden', function() + local dirs = scan.scan_dir('.', { depth = 3, add_dirs = true, hidden = true }) + local job_dirs = Job:new({ + command = fd_cmd, + args = { '.', '--maxdepth', '3', '--hidden', '-I' }, + cwd = '.' + }):sync() + eq('table', type(dirs)) + eq(true, contains(dirs, './CHANGELOG.md')) + eq(true, contains(dirs, './README.md')) + eq(true, contains(dirs, './lua')) + eq(true, contains(dirs, './.gitignore')) + eq(true, contains(dirs, './lua/say.lua')) + eq(true, contains(dirs, './lua/plenary/job.lua')) + eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + eq(table.getn(job_dirs), table.getn(dirs)) + eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) end) it('with respect_gitignore', function() vim.cmd':silent !touch lua/test.so' local dirs = scan.scan_dir('.', { respect_gitignore = true }) + -- local job_dirs = Job:new({ + -- command = fd_cmd, + -- args = { '--type', 'f', '.' }, + -- cwd = '.' + -- }):sync() vim.cmd':silent !rm lua/test.so' eq('table', type(dirs)) eq(true, contains(dirs, './CHANGELOG.md')) @@ -107,17 +273,23 @@ describe('scandir', function() eq(true, contains(dirs, './lua/plenary/job.lua')) eq(false, contains(dirs, './lua/test.so')) eq(false, contains(dirs, './asdf/asdf/adsf.lua')) + -- eq(table.getn(job_dirs), table.getn(dirs)) + -- eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) end) it('with search pattern', function() - local dirs = scan.scan_dir('.', { search_pattern = 'filetype' }) + local dirs = scan.scan_dir('.', { search_pattern = 'scandir' }) + local job_dirs = Job:new({ + command = fd_cmd, + args = { 'scandir', '--type', 'f', '-I', '.' }, + cwd = '.' + }):sync() eq('table', type(dirs)) - eq(true, contains(dirs, './scripts/update_filetypes_from_github.lua')) - eq(true, contains(dirs, './lua/plenary/filetype.lua')) - eq(true, contains(dirs, './tests/plenary/filetype_spec.lua')) - eq(true, contains(dirs, './data/plenary/filetypes/base.lua')) - eq(true, contains(dirs, './data/plenary/filetypes/builtin.lua')) + eq(true, contains(dirs, './lua/plenary/scandir.lua')) + eq(true, contains(dirs, './tests/plenary/scandir_spec.lua')) eq(false, contains(dirs, './README.md')) + eq(table.getn(job_dirs), table.getn(dirs)) + eq(table.getn(job_dirs), compare_tables(job_dirs, dirs, '.')) end) end)