summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAryeh Leib Taurog <git@aryehleib.com>2019-01-01 20:42:06 +0200
committerAryeh Leib Taurog <git@aryehleib.com>2019-01-04 09:55:35 +0200
commitba38688dffd846a633ae2c076441927c864ffd5f (patch)
treea2080bd09ece34726d8e8d5d5643bcaeec9ac565
parentbbf02d837e3a501c6acaca51b257672198d35591 (diff)
downloadale-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.vim66
-rw-r--r--test/command_callback/test_elm_make_command_callback.vader32
-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.elm0
-rw-r--r--test/elm-test-files/newapp/tests/TestSuite.elm0
-rw-r--r--test/elm-test-files/oldapp/elm-package.json0
-rw-r--r--test/elm-test-files/oldapp/node_modules/.bin/elm0
-rw-r--r--test/elm-test-files/oldapp/node_modules/.bin/elm-test0
-rw-r--r--test/elm-test-files/oldapp/src/Main.elm0
-rw-r--r--test/elm-test-files/oldapp/tests/TestSuite.elm0
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