test_tslint_handler.vader
1 Before: 2 Save g:ale_typescript_tslint_ignore_empty_files 3 4 unlet! g:ale_typescript_tslint_ignore_empty_files 5 unlet! b:ale_typescript_tslint_ignore_empty_files 6 7 runtime ale_linters/typescript/tslint.vim 8 9 call ale#test#SetDirectory('/testplugin/test/handler') 10 11 After: 12 Restore 13 14 unlet! b:ale_typescript_tslint_ignore_empty_files 15 unlet! b:relative_to_root 16 unlet! b:tempname_suffix 17 unlet! b:relative_tempname 18 19 call ale#test#RestoreDirectory() 20 call ale#linter#Reset() 21 22 Execute(The tslint handler should parse lines correctly): 23 call ale#test#SetFilename('app/test.ts') 24 25 AssertEqual 26 \ [ 27 \ { 28 \ 'lnum': 1, 29 \ 'col': 15, 30 \ 'filename': ale#path#Simplify(expand('%:p:h') . '/test.ts'), 31 \ 'end_lnum': 1, 32 \ 'type': 'E', 33 \ 'end_col': 15, 34 \ 'text': 'Missing semicolon', 35 \ 'code': 'semicolon', 36 \ }, 37 \ { 38 \ 'lnum': 2, 39 \ 'col': 8, 40 \ 'filename': ale#path#Simplify(expand('%:p:h') . '/test.ts'), 41 \ 'end_lnum': 3, 42 \ 'type': 'W', 43 \ 'end_col': 12, 44 \ 'text': 'Something else', 45 \ }, 46 \ { 47 \ 'lnum': 2, 48 \ 'col': 8, 49 \ 'filename': ale#path#Simplify(expand('%:p:h') . '/something-else.ts'), 50 \ 'end_lnum': 3, 51 \ 'type': 'W', 52 \ 'end_col': 12, 53 \ 'text': 'Something else', 54 \ 'code': 'something', 55 \ }, 56 \ { 57 \ 'lnum': 31, 58 \ 'col': 9, 59 \ 'filename': ale#path#Simplify(expand('%:p:h') . '/test.ts'), 60 \ 'end_lnum': 31, 61 \ 'type': 'E', 62 \ 'end_col': 20, 63 \ 'text': 'Calls to console.log are not allowed.', 64 \ 'code': 'no-console', 65 \ }, 66 \ ] , 67 \ ale_linters#typescript#tslint#Handle(bufnr(''), [json_encode([ 68 \ { 69 \ 'endPosition': { 70 \ 'character': 14, 71 \ 'line': 0, 72 \ 'position': 1000 73 \ }, 74 \ 'failure': 'Missing semicolon', 75 \ 'fix': { 76 \ 'innerLength': 0, 77 \ 'innerStart': 14, 78 \ 'innerText': ';' 79 \ }, 80 \ 'name': 'test.ts', 81 \ 'ruleName': 'semicolon', 82 \ 'ruleSeverity': 'ERROR', 83 \ 'startPosition': { 84 \ 'character': 14, 85 \ 'line': 0, 86 \ 'position': 1000 87 \ } 88 \ }, 89 \ { 90 \ 'endPosition': { 91 \ 'character': 11, 92 \ 'line': 2, 93 \ 'position': 1000 94 \ }, 95 \ 'failure': 'Something else', 96 \ 'fix': { 97 \ 'innerLength': 0, 98 \ 'innerStart': 14, 99 \ 'innerText': ';' 100 \ }, 101 \ 'name': 'test.ts', 102 \ 'ruleSeverity': 'WARNING', 103 \ 'startPosition': { 104 \ 'character': 7, 105 \ 'line': 1, 106 \ 'position': 1000 107 \ } 108 \ }, 109 \ { 110 \ 'endPosition': { 111 \ 'character': 11, 112 \ 'line': 2, 113 \ 'position': 22 114 \ }, 115 \ 'failure': 'Something else', 116 \ 'fix': { 117 \ 'innerLength': 0, 118 \ 'innerStart': 14, 119 \ 'innerText': ';' 120 \ }, 121 \ 'name': 'something-else.ts', 122 \ 'ruleName': 'something', 123 \ 'ruleSeverity': 'WARNING', 124 \ 'startPosition': { 125 \ 'character': 7, 126 \ 'line': 1, 127 \ 'position': 14 128 \ } 129 \ }, 130 \ { 131 \ "endPosition": { 132 \ "character": 19, 133 \ "line": 30, 134 \ "position": 14590 135 \ }, 136 \ "failure": "Calls to console.log are not allowed.", 137 \ 'name': 'test.ts', 138 \ "ruleName": "no-console", 139 \ "startPosition": { 140 \ "character": 8, 141 \ "line": 30, 142 \ "position": 14579 143 \ } 144 \ }, 145 \])]) 146 147 Execute(The tslint handler should handle empty output): 148 AssertEqual 149 \ [], 150 \ ale_linters#typescript#tslint#Handle(bufnr(''), []) 151 152 Execute(The tslint handler report errors for empty files by default): 153 call ale#test#SetFilename('app/test.ts') 154 155 AssertEqual 156 \ [ 157 \ { 158 \ 'lnum': 2, 159 \ 'col': 1, 160 \ 'filename': ale#path#Simplify(expand('%:p:h') . '/test.ts'), 161 \ 'end_lnum': 2, 162 \ 'type': 'E', 163 \ 'end_col': 1, 164 \ 'text': 'Consecutive blank lines are forbidden', 165 \ 'code': 'no-consecutive-blank-lines', 166 \ }, 167 \ ], 168 \ ale_linters#typescript#tslint#Handle(bufnr(''), [json_encode([{ 169 \ 'endPosition': { 170 \ 'character': 0, 171 \ 'line': 1, 172 \ 'position': 1 173 \ }, 174 \ 'failure': 'Consecutive blank lines are forbidden', 175 \ 'fix': [{ 176 \ 'innerStart': 0, 177 \ 'innerLength': 1, 178 \ 'innerText': '' 179 \ }], 180 \ 'name': 'test.ts', 181 \ 'ruleName': 'no-consecutive-blank-lines', 182 \ 'ruleSeverity': 'ERROR', 183 \ 'startPosition': { 184 \ 'character': 0, 185 \ 'line': 1, 186 \ 'position': 1 187 \ } 188 \ }])]) 189 190 Execute(The tslint handler should not report errors for empty files when the ignore option is on): 191 let b:ale_typescript_tslint_ignore_empty_files = 1 192 call ale#test#SetFilename('app/test.ts') 193 194 AssertEqual 195 \ [ 196 \ ], 197 \ ale_linters#typescript#tslint#Handle(bufnr(''), [json_encode([{ 198 \ 'endPosition': { 199 \ 'character': 0, 200 \ 'line': 1, 201 \ 'position': 1 202 \ }, 203 \ 'failure': 'Consecutive blank lines are forbidden', 204 \ 'fix': [{ 205 \ 'innerStart': 0, 206 \ 'innerLength': 1, 207 \ 'innerText': '' 208 \ }], 209 \ 'name': 'test.ts', 210 \ 'ruleName': 'no-consecutive-blank-lines', 211 \ 'ruleSeverity': 'ERROR', 212 \ 'startPosition': { 213 \ 'character': 0, 214 \ 'line': 1, 215 \ 'position': 1 216 \ } 217 \ }])]) 218 219 Given typescript(A file with extra blank lines): 220 const x = 3 221 222 223 const y = 4 224 225 Execute(The tslint handler should report errors when the ignore option is on, but the file is not empty): 226 let b:ale_typescript_tslint_ignore_empty_files = 1 227 call ale#test#SetFilename('app/test.ts') 228 229 AssertEqual 230 \ [ 231 \ { 232 \ 'lnum': 2, 233 \ 'col': 1, 234 \ 'filename': ale#path#Simplify(expand('%:p:h') . '/test.ts'), 235 \ 'end_lnum': 2, 236 \ 'type': 'E', 237 \ 'end_col': 1, 238 \ 'text': 'Consecutive blank lines are forbidden', 239 \ 'code': 'no-consecutive-blank-lines', 240 \ }, 241 \ ], 242 \ ale_linters#typescript#tslint#Handle(bufnr(''), [json_encode([{ 243 \ 'endPosition': { 244 \ 'character': 0, 245 \ 'line': 1, 246 \ 'position': 1 247 \ }, 248 \ 'failure': 'Consecutive blank lines are forbidden', 249 \ 'fix': [{ 250 \ 'innerStart': 0, 251 \ 'innerLength': 1, 252 \ 'innerText': '' 253 \ }], 254 \ 'name': 'test.ts', 255 \ 'ruleName': 'no-consecutive-blank-lines', 256 \ 'ruleSeverity': 'ERROR', 257 \ 'startPosition': { 258 \ 'character': 0, 259 \ 'line': 1, 260 \ 'position': 1 261 \ } 262 \ }])]) 263 264 Execute(The tslint handler should not report no-implicit-dependencies errors): 265 call ale#test#SetFilename('app/test.ts') 266 267 AssertEqual 268 \ [ 269 \ ], 270 \ ale_linters#typescript#tslint#Handle(bufnr(''), [json_encode([{ 271 \ 'endPosition': { 272 \ 'character': 0, 273 \ 'line': 1, 274 \ 'position': 1 275 \ }, 276 \ 'failure': 'this is ignored', 277 \ 'name': 'test.ts', 278 \ 'ruleName': 'no-implicit-dependencies', 279 \ 'ruleSeverity': 'ERROR', 280 \ 'startPosition': { 281 \ 'character': 0, 282 \ 'line': 1, 283 \ 'position': 1 284 \ }, 285 \ }])]) 286 287 Execute(The tslint handler should set filename keys for temporary files): 288 " The temporary filename below is hacked into being a relative path so we can 289 " test that we resolve the temporary filename first. 290 let b:relative_to_root = substitute(expand('%:p'), '\v[^/\\]*([/\\])[^/\\]*', '../', 'g') 291 let b:tempname_suffix = substitute(tempname(), '^\v([A-Z]:)?[/\\]', '', '') 292 let b:relative_tempname = substitute(b:relative_to_root . b:tempname_suffix, '\\', '/', 'g') 293 294 AssertEqual 295 \ [ 296 \ {'lnum': 47, 'col': 1, 'code': 'curly', 'end_lnum': 47, 'type': 'E', 'end_col': 26, 'text': 'if statements must be braced'}, 297 \ ], 298 \ ale_linters#typescript#tslint#Handle(bufnr(''), [json_encode([ 299 \ { 300 \ 'endPosition': { 301 \ 'character':25, 302 \ 'line':46, 303 \ 'position':1383, 304 \ }, 305 \ 'failure': 'if statements must be braced', 306 \ 'name': b:relative_tempname, 307 \ 'ruleName': 'curly', 308 \ 'ruleSeverity':'ERROR', 309 \ 'startPosition': { 310 \ 'character':0, 311 \ 'line':46, 312 \ 'position':1358, 313 \ } 314 \ }, 315 \ ])])