diff options
author | Aryeh Leib Taurog <git@aryehleib.com> | 2019-01-01 20:42:06 +0200 |
---|---|---|
committer | Aryeh Leib Taurog <git@aryehleib.com> | 2019-01-04 09:55:35 +0200 |
commit | ba38688dffd846a633ae2c076441927c864ffd5f (patch) | |
tree | a2080bd09ece34726d8e8d5d5643bcaeec9ac565 | |
parent | bbf02d837e3a501c6acaca51b257672198d35591 (diff) | |
download | ale-ba38688dffd846a633ae2c076441927c864ffd5f.zip |
support tests/ with elm 0.19.0
With earlier elm versions, a separate package file is maintained for
tests, which when properly configured enabled the compiler to find what
it needed to compile the tests. Under elm 0.19, test dependencies are
managed in the top-level package file, so `elm make` will fail on the
tests. `elm-test make` is required in this case.
See https://github.com/elm-explorations/test/issues/64
-rw-r--r-- | ale_linters/elm/make.vim | 66 | ||||
-rw-r--r-- | test/command_callback/test_elm_make_command_callback.vader | 32 | ||||
-rw-r--r-- | test/elm-test-files/newapp/elm.json (renamed from test/elm-test-files/app/elm.json) | 0 | ||||
-rw-r--r-- | test/elm-test-files/newapp/node_modules/.bin/elm (renamed from test/elm-test-files/app/node_modules/.bin/elm) | 0 | ||||
-rw-r--r-- | test/elm-test-files/newapp/node_modules/.bin/elm-test (renamed from test/elm-test-files/app/filetest.elm) | 0 | ||||
-rw-r--r-- | test/elm-test-files/newapp/src/Main.elm | 0 | ||||
-rw-r--r-- | test/elm-test-files/newapp/tests/TestSuite.elm | 0 | ||||
-rw-r--r-- | test/elm-test-files/oldapp/elm-package.json | 0 | ||||
-rw-r--r-- | test/elm-test-files/oldapp/node_modules/.bin/elm | 0 | ||||
-rw-r--r-- | test/elm-test-files/oldapp/node_modules/.bin/elm-test | 0 | ||||
-rw-r--r-- | test/elm-test-files/oldapp/src/Main.elm | 0 | ||||
-rw-r--r-- | test/elm-test-files/oldapp/tests/TestSuite.elm | 0 |
12 files changed, 84 insertions, 14 deletions
diff --git a/ale_linters/elm/make.vim b/ale_linters/elm/make.vim index ddea983f..a6884750 100644 --- a/ale_linters/elm/make.vim +++ b/ale_linters/elm/make.vim @@ -137,9 +137,7 @@ function! ale_linters#elm#make#ParseMessageItem(item) abort endif endfunction -" Return the command to execute the linter in the projects directory. -" If it doesn't, then this will fail when imports are needed. -function! ale_linters#elm#make#GetCommand(buffer) abort +function! ale_linters#elm#make#GetPackageFile(buffer) abort let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm.json') if empty(l:elm_json) @@ -147,10 +145,55 @@ function! ale_linters#elm#make#GetCommand(buffer) abort let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm-package.json') endif + return l:elm_json +endfunction + +function! ale_linters#elm#make#IsVersionGte19(buffer) abort + let l:elm_json = ale_linters#elm#make#GetPackageFile(a:buffer) + + if l:elm_json =~# '-package' + return 0 + else + return 1 + endif +endfunction + +function! ale_linters#elm#make#GetRootDir(buffer) abort + let l:elm_json = ale_linters#elm#make#GetPackageFile(a:buffer) + if empty(l:elm_json) + return '' + else + return fnamemodify(l:elm_json, ':p:h') + endif +endfunction + +function! ale_linters#elm#make#IsTest(buffer) abort + let l:root_dir = ale_linters#elm#make#GetRootDir(a:buffer) + + if empty(l:root_dir) + return 0 + endif + + let l:tests_dir = join([l:root_dir, 'tests', ''], has('win32') ? '\' : '/') + + let l:buffer_path = fnamemodify(bufname(a:buffer), ':p') + + if match(l:buffer_path, l:tests_dir) == 0 + return 1 + else + return 0 + endif +endfunction + +" Return the command to execute the linter in the projects directory. +" If it doesn't, then this will fail when imports are needed. +function! ale_linters#elm#make#GetCommand(buffer) abort + let l:root_dir = ale_linters#elm#make#GetRootDir(a:buffer) + + if empty(l:root_dir) let l:dir_set_cmd = '' else - let l:root_dir = fnamemodify(l:elm_json, ':p:h') let l:dir_set_cmd = 'cd ' . ale#Escape(l:root_dir) . ' && ' endif @@ -161,11 +204,20 @@ function! ale_linters#elm#make#GetCommand(buffer) abort return l:dir_set_cmd . '%e make --report=json --output=/dev/null %t' endfunction +function! ale_linters#elm#make#GetExecutable(buffer) abort + let l:is_test = ale_linters#elm#make#IsTest(a:buffer) + let l:is_v19 = ale_linters#elm#make#IsVersionGte19(a:buffer) + + if l:is_test && l:is_v19 + return ale#node#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm-test']) + else + return ale#node#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm']) + endif +endfunction + call ale#linter#Define('elm', { \ 'name': 'make', -\ 'executable_callback': ale#node#FindExecutableFunc('elm_make', [ -\ 'node_modules/.bin/elm', -\ ]), +\ 'executable_callback': 'ale_linters#elm#make#GetExecutable', \ 'output_stream': 'both', \ 'command_callback': 'ale_linters#elm#make#GetCommand', \ 'callback': 'ale_linters#elm#make#Handle' diff --git a/test/command_callback/test_elm_make_command_callback.vader b/test/command_callback/test_elm_make_command_callback.vader index 9e3ce214..6400e187 100644 --- a/test/command_callback/test_elm_make_command_callback.vader +++ b/test/command_callback/test_elm_make_command_callback.vader @@ -7,29 +7,47 @@ After: call ale#assert#TearDownLinterTest() Execute(should get valid executable with default params): - call ale#test#SetFilename('../elm-test-files/app/testfile.elm') + call ale#test#SetFilename('../elm-test-files/newapp/src/Main.elm') - let g:executable = ale#path#Simplify(g:dir . '/../elm-test-files/app/node_modules/.bin/elm') + let g:executable = ale#path#Simplify(g:dir . '/../elm-test-files/newapp/node_modules/.bin/elm') AssertLinter g:executable, - \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/app')) . ' && ' + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/newapp')) . ' && ' + \ . ale#Escape(g:executable) . ' make --report=json --output=/dev/null %t' + +Execute(should get elm-test executable for test code with elm >= 0.19): + call ale#test#SetFilename('../elm-test-files/newapp/tests/TestSuite.elm') + + let g:executable = ale#path#Simplify(g:dir . '/../elm-test-files/newapp/node_modules/.bin/elm-test') + + AssertLinter g:executable, + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/newapp')) . ' && ' + \ . ale#Escape(g:executable) . ' make --report=json --output=/dev/null %t' + +Execute(should get plain elm executable for test code with elm < 0.19): + call ale#test#SetFilename('../elm-test-files/oldapp/tests/TestSuite.elm') + + let g:executable = ale#path#Simplify(g:dir . '/../elm-test-files/oldapp/node_modules/.bin/elm') + + AssertLinter g:executable, + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/oldapp')) . ' && ' \ . ale#Escape(g:executable) . ' make --report=json --output=/dev/null %t' Execute(should get valid executable with 'use_global' params): let g:ale_elm_make_use_global = 1 - call ale#test#SetFilename('../elm-test-files/app/testfile.elm') + call ale#test#SetFilename('../elm-test-files/newapp/src/Main.elm') AssertLinter 'elm', - \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/app')) . ' && ' + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/newapp')) . ' && ' \ . ale#Escape('elm') . ' make --report=json --output=/dev/null %t' Execute(should get valid executable with 'use_global' and 'executable' params): let g:ale_elm_make_executable = 'other-elm' let g:ale_elm_make_use_global = 1 - call ale#test#SetFilename('../elm-test-files/app/testfile.elm') + call ale#test#SetFilename('../elm-test-files/newapp/src/Main.elm') AssertLinter 'other-elm', - \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/app')) . ' && ' + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/newapp')) . ' && ' \ . ale#Escape('other-elm') . ' make --report=json --output=/dev/null %t' diff --git a/test/elm-test-files/app/elm.json b/test/elm-test-files/newapp/elm.json index e69de29b..e69de29b 100644 --- a/test/elm-test-files/app/elm.json +++ b/test/elm-test-files/newapp/elm.json diff --git a/test/elm-test-files/app/node_modules/.bin/elm b/test/elm-test-files/newapp/node_modules/.bin/elm index e69de29b..e69de29b 100644 --- a/test/elm-test-files/app/node_modules/.bin/elm +++ b/test/elm-test-files/newapp/node_modules/.bin/elm diff --git a/test/elm-test-files/app/filetest.elm b/test/elm-test-files/newapp/node_modules/.bin/elm-test index e69de29b..e69de29b 100644 --- a/test/elm-test-files/app/filetest.elm +++ b/test/elm-test-files/newapp/node_modules/.bin/elm-test diff --git a/test/elm-test-files/newapp/src/Main.elm b/test/elm-test-files/newapp/src/Main.elm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/elm-test-files/newapp/src/Main.elm diff --git a/test/elm-test-files/newapp/tests/TestSuite.elm b/test/elm-test-files/newapp/tests/TestSuite.elm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/elm-test-files/newapp/tests/TestSuite.elm diff --git a/test/elm-test-files/oldapp/elm-package.json b/test/elm-test-files/oldapp/elm-package.json new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/elm-test-files/oldapp/elm-package.json diff --git a/test/elm-test-files/oldapp/node_modules/.bin/elm b/test/elm-test-files/oldapp/node_modules/.bin/elm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/elm-test-files/oldapp/node_modules/.bin/elm diff --git a/test/elm-test-files/oldapp/node_modules/.bin/elm-test b/test/elm-test-files/oldapp/node_modules/.bin/elm-test new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/elm-test-files/oldapp/node_modules/.bin/elm-test diff --git a/test/elm-test-files/oldapp/src/Main.elm b/test/elm-test-files/oldapp/src/Main.elm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/elm-test-files/oldapp/src/Main.elm diff --git a/test/elm-test-files/oldapp/tests/TestSuite.elm b/test/elm-test-files/oldapp/tests/TestSuite.elm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/elm-test-files/oldapp/tests/TestSuite.elm |