Execute (ale#util#GetMatches should return matches for many lines):
  AssertEqual
  \ [
  \   [
  \     '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]',
  \     '47',
  \     '14',
  \     'Missing trailing comma.',
  \     'Warning/comma-dangle',
  \     '',
  \     '',
  \     '',
  \     '',
  \     '',
  \   ],
  \   [
  \     '/path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]',
  \     '56',
  \     '41',
  \     'Missing semicolon.',
  \     'Error/semi',
  \     '',
  \     '',
  \     '',
  \     '',
  \     '',
  \   ],
  \ ],
  \ ale#util#GetMatches(
  \   [
  \     '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]',
  \     '/path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]',
  \   ],
  \   [
  \     '^.*:\(\d\+\):\(\d\+\): \(.\+\) \[\(.\+\)\]$',
  \   ]
  \ )

Execute (ale#util#GetMatches should accept a string for a single pattern):
  AssertEqual
  \ [
  \   [
  \     '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]',
  \     '47',
  \     '14',
  \     'Missing trailing comma.',
  \     'Warning/comma-dangle',
  \     '',
  \     '',
  \     '',
  \     '',
  \     '',
  \   ],
  \   [
  \     '/path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]',
  \     '56',
  \     '41',
  \     'Missing semicolon.',
  \     'Error/semi',
  \     '',
  \     '',
  \     '',
  \     '',
  \     '',
  \   ],
  \ ],
  \ ale#util#GetMatches(
  \   [
  \     '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]',
  \     '/path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]',
  \   ],
  \   '^.*:\(\d\+\):\(\d\+\): \(.\+\) \[\(.\+\)\]$'
  \ )

Execute (ale#util#MapMatches should map matches):
  AssertEqual
  \ [
  \   '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]',
  \   '/path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]',
  \ ],
  \ ale#util#MapMatches(
  \   [
  \     '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]',
  \     '/path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]',
  \   ],
  \   '^.*:\(\d\+\):\(\d\+\): \(.\+\) \[\(.\+\)\]$',
  \   {match -> match[0]}
  \ )

Execute (ale#util#GetMatches should accept a single line as a string):
  AssertEqual
  \ [
  \   [
  \     '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]',
  \     '47',
  \     '14',
  \     'Missing trailing comma.',
  \     'Warning/comma-dangle',
  \     '',
  \     '',
  \     '',
  \     '',
  \     '',
  \   ],
  \ ],
  \ ale#util#GetMatches(
  \   '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]',
  \   [
  \     '^.*:\(\d\+\):\(\d\+\): \(.\+\) \[\(.\+\)\]$',
  \   ]
  \ )

Execute (ale#util#GetMatches should match multiple patterns correctly):
  AssertEqual
  \ [
  \   [
  \     '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]',
  \     '47',
  \     '14',
  \     'Missing trailing comma.',
  \     'Warning/comma-dangle',
  \     '',
  \     '',
  \     '',
  \     '',
  \     '',
  \   ],
  \   [
  \     '/path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]',
  \     '56',
  \     '41',
  \     'Missing semicolon.',
  \     'Error/semi',
  \     '',
  \     '',
  \     '',
  \     '',
  \     '',
  \   ],
  \   [
  \     '/path/to/some-filename.js:13:3: Parsing error: Unexpected token',
  \     '13',
  \     '3',
  \     'Parsing error: Unexpected token',
  \     '',
  \     '',
  \     '',
  \     '',
  \     '',
  \     '',
  \   ],
  \ ],
  \ ale#util#GetMatches(
  \   [
  \     '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]',
  \     '/path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]',
  \     '/path/to/some-filename.js:13:3: Parsing error: Unexpected token',
  \   ],
  \   [
  \     '^.*:\(\d\+\):\(\d\+\): \(.\+\) \[\(.\+\)\]$',
  \     '^.*:\(\d\+\):\(\d\+\): \(.\+\)$',
  \   ]
  \ )
