Execute(GCC errors from included files should be parsed correctly): AssertEqual \ [ \ { \ 'lnum': 3, \ 'type': 'E', \ 'text': 'Problems were found in the header (See :ALEDetail)', \ 'detail': join([ \ 'broken.h:1:1: error: expected identifier or ''('' before ''{'' token', \ ' {{{', \ ' ^', \ ], "\n"), \ }, \ ], \ ale#handlers#gcc#HandleGCCFormat(347, [ \ 'In file included from :3:0:', \ 'broken.h:1:1: error: expected identifier or ''('' before ''{'' token', \ ' {{{', \ ' ^', \ ]) AssertEqual \ [ \ { \ 'lnum': 3, \ 'type': 'E', \ 'text': 'Problems were found in the header (See :ALEDetail)', \ 'detail': join([ \ 'b.h:1:1: error: expected identifier or ''('' before ''{'' token', \ ' {{{', \ ' ^', \ ], "\n"), \ }, \ ], \ ale#handlers#gcc#HandleGCCFormat(347, [ \ 'In file included from a.h:1:0,', \ ' from test.c:3:', \ 'b.h:1:1: error: expected identifier or ''('' before ''{'' token', \ ' {{{', \ ' ^', \ ]) AssertEqual \ [ \ { \ 'lnum': 3, \ 'type': 'E', \ 'text': 'Problems were found in the header (See :ALEDetail)', \ 'detail': join([ \ 'b.h:1:1: error: unknown type name ‘bad_type’', \ ' bad_type x;', \ ' ^', \ 'b.h:2:1: error: unknown type name ‘other_bad_type’', \ ' other_bad_type y;', \ ' ^', \ ], "\n"), \ }, \ ], \ ale#handlers#gcc#HandleGCCFormat(347, [ \ 'In file included from a.h:1:0,', \ ' from test.c:3:', \ 'b.h:1:1: error: unknown type name ‘bad_type’', \ ' bad_type x;', \ ' ^', \ 'b.h:2:1: error: unknown type name ‘other_bad_type’', \ ' other_bad_type y;', \ ' ^', \ ]) Execute(GCC versions should be parsed correctly): AssertEqual [4, 9, 1], ale#handlers#gcc#ParseGCCVersion([ \ 'g++ (GCC) 4.9.1 20140922 (Red Hat 4.9.1-10)', \]) AssertEqual [4, 8, 4], ale#handlers#gcc#ParseGCCVersion([ \ 'gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4', \ 'Copyright (C) 2013 Free Software Foundation, Inc.', \ 'This is free software; see the source for copying conditions. There is NO', \ 'warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.', \]) Execute(The GCC handler shouldn't complain about #pragma once for headers): silent file! test.h AssertEqual \ [], \ ale#handlers#gcc#HandleGCCFormat(347, [ \ ':1:1: warning: #pragma once in main file [enabled by default]', \ ]) silent file! test.hpp AssertEqual \ [], \ ale#handlers#gcc#HandleGCCFormat(347, [ \ ':1:1: warning: #pragma once in main file [enabled by default]', \ ]) Execute(The GCC handler should eliminate duplicated clang errors): AssertEqual \ [ \ {'lnum': 2, 'col': 10, 'type': 'E', 'text': '''a.h'' file not found'}, \ {'lnum': 4, 'col': 10, 'type': 'E', 'text': 'empty filename'}, \ ], \ ale#handlers#gcc#HandleGCCFormat(347, [ \ ':2:10: fatal error: ''a.h'' file not found', \ '#include "a.h"', \ ' ^~~~~', \ '', \ ':2:10: fatal error: ''a.h'' file not found', \ '#include "a.h"', \ ' ^~~~~', \ '', \ ':4:10: error: empty filename', \ '', \ ':4:10: error: empty filename', \ '#include ""', \ ' ^', \ '', \ ':4:10: error: empty filename', \ '#include ""', \ ' ^', \ ])