diff --git a/.github/workflows/emacs-test.yml b/.github/workflows/emacs-test.yml index aa41e7b61..4a62a3ae7 100644 --- a/.github/workflows/emacs-test.yml +++ b/.github/workflows/emacs-test.yml @@ -11,7 +11,7 @@ on: jobs: test: - name: Test PSES with Emacs via Eglot + name: Test via Eglot runs-on: ubuntu-latest steps: - name: Checkout repository diff --git a/.github/workflows/vim-test.yml b/.github/workflows/vim-test.yml new file mode 100644 index 000000000..5dcf11f88 --- /dev/null +++ b/.github/workflows/vim-test.yml @@ -0,0 +1,53 @@ +name: "Vim" + +on: + push: + branches: [ main ] + tags: [ v* ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ main ] + paths-ignore: [ '**/*.md' ] + +jobs: + test: + name: Test via LanguageClient-neovim + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Build PSES + shell: pwsh + run: tools/azurePipelinesBuild.ps1 + + - name: Install Vim + uses: rhysd/action-setup-vim@v1 + id: vim + + - name: Checkout vim-ps1 + uses: actions/checkout@v3 + with: + repository: PProvost/vim-ps1 + path: vim-ps1 + + - name: Checkout LanguageClient-neovim + uses: actions/checkout@v3 + with: + repository: autozimu/LanguageClient-neovim + path: LanguageClient-neovim + + - name: Install LanguageClient-neovim + run: ./install.sh + working-directory: LanguageClient-neovim + + - name: Checkout Themis + uses: actions/checkout@v3 + with: + repository: thinca/vim-themis + path: vim-themis + + - name: Run Themis + env: + THEMIS_VIM: ${{ steps.vim.outputs.executable }} + run: ./vim-themis/bin/themis ./test/vim-test.vim diff --git a/test/.themisrc b/test/.themisrc new file mode 100644 index 000000000..d684e00fa --- /dev/null +++ b/test/.themisrc @@ -0,0 +1,6 @@ +filetype plugin on + +let g:repo_root = fnamemodify(expand(''), ':h:h') + +call themis#option('runtimepath', g:repo_root . '/LanguageClient-neovim') +call themis#option('runtimepath', g:repo_root . '/vim-ps1') diff --git a/test/vim-test.ps1 b/test/vim-test.ps1 new file mode 100644 index 000000000..8175124cc --- /dev/null +++ b/test/vim-test.ps1 @@ -0,0 +1 @@ +function Do-Work {} diff --git a/test/vim-test.vim b/test/vim-test.vim new file mode 100644 index 000000000..05c8919fd --- /dev/null +++ b/test/vim-test.vim @@ -0,0 +1,44 @@ +let s:suite = themis#suite('pses') +let s:assert = themis#helper('assert') + +function s:suite.before() + let l:pses_path = g:repo_root . '/module' + let g:LanguageClient_serverCommands = { + \ 'ps1': ['pwsh', '-NoLogo', '-NoProfile', '-Command', + \ l:pses_path . '/PowerShellEditorServices/Start-EditorServices.ps1', + \ '-HostName', 'vim', '-HostProfileId', 'vim', '-HostVersion', '1.0.0', + \ '-BundledModulesPath', l:pses_path, '-Stdio', + \ '-LogPath', g:repo_root . '/pses.log', '-LogLevel', 'Diagnostic', + \ '-SessionDetailsPath', g:repo_root . '/pses_session.json' ] + \ } + let g:LanguageClient_serverStderr = 'DEBUG' + let g:LanguageClient_loggingFile = g:repo_root . '/LanguageClient.log' + let g:LanguageClient_serverStderr = g:repo_root . '/LanguageServer.log' +endfunction + +function s:suite.has_language_client() + call s:assert.includes(&runtimepath, g:repo_root . '/LanguageClient-neovim') + call s:assert.cmd_exists('LanguageClientStart') + call s:assert.not_empty(g:LanguageClient_serverCommands) + call s:assert.true(LanguageClient#HasCommand('ps1')) +endfunction + +function s:suite.analyzes_powershell_file() + view test/vim-test.ps1 " This must not use quotes! + + let l:bufnr = bufnr('vim-test.ps1$') + call s:assert.not_equal(l:bufnr, -1) + let l:bufinfo = getbufinfo(l:bufnr)[0] + + call s:assert.equal(l:bufinfo.name, g:repo_root . '/test/vim-test.ps1') + call s:assert.includes(getbufline(l:bufinfo.name, 1), 'function Do-Work {}') + " TODO: This shouldn't be necessary, vim-ps1 works locally but not in CI. + call setbufvar(l:bufinfo.bufnr, '&filetype', 'ps1') + call s:assert.equal(getbufvar(l:bufinfo.bufnr, '&filetype'), 'ps1') + + execute 'LanguageClientStart' + execute 'sleep' 5 + call s:assert.equal(getbufvar(l:bufinfo.name, 'LanguageClient_isServerRunning'), 1) + call s:assert.equal(getbufvar(l:bufinfo.name, 'LanguageClient_projectRoot'), g:repo_root) + call s:assert.equal(getbufvar(l:bufinfo.name, 'LanguageClient_statusLineDiagnosticsCounts'), {'E': 0, 'W': 1, 'H': 0, 'I': 0}) +endfunction