Index: cpplint/cpplint_unittest.py |
=================================================================== |
--- cpplint/cpplint_unittest.py (revision 42) |
+++ cpplint/cpplint_unittest.py (working copy) |
@@ -46,22 +46,22 @@ |
# is in cpplint._ERROR_CATEGORIES, to help keep that list up to date. |
class ErrorCollector: |
# These are a global list, covering all categories seen ever. |
- _ERROR_CATEGORIES = [x.strip() # get rid of leading whitespace |
- for x in cpplint._ERROR_CATEGORIES.split()] |
+ _ERROR_CATEGORIES = cpplint._ERROR_CATEGORIES |
_SEEN_ERROR_CATEGORIES = {} |
def __init__(self, assert_fn): |
"""assert_fn: a function to call when we notice a problem.""" |
self._assert_fn = assert_fn |
self._errors = [] |
+ cpplint.ResetNolintSuppressions() |
- def __call__(self, unused_filename, unused_linenum, |
+ def __call__(self, unused_filename, linenum, |
category, confidence, message): |
self._assert_fn(category in self._ERROR_CATEGORIES, |
'Message "%s" has category "%s",' |
' which is not in _ERROR_CATEGORIES' % (message, category)) |
self._SEEN_ERROR_CATEGORIES[category] = 1 |
- if cpplint._ShouldPrintError(category, confidence): |
+ if cpplint._ShouldPrintError(category, confidence, linenum): |
self._errors.append('%s [%s] [%d]' % (message, category, confidence)) |
def Results(self): |
@@ -295,6 +295,38 @@ |
'// Read https://g' + ('o' * 60) + 'gle.com/' , |
'') |
+ # Test error suppression annotations. |
+ def testErrorSuppression(self): |
+ # Two errors on same line: |
+ self.TestLint( |
+ 'long a = (int64) 65;', |
+ ['Using C-style cast. Use static_cast<int64>(...) instead' |
+ ' [readability/casting] [4]', |
+ 'Use int16/int64/etc, rather than the C type long' |
+ ' [runtime/int] [4]', |
+ ]) |
+ # One category of error suppressed: |
+ self.TestLint( |
+ 'long a = (int64) 65; // NOLINT(runtime/int)', |
+ 'Using C-style cast. Use static_cast<int64>(...) instead' |
+ ' [readability/casting] [4]') |
+ # All categories suppressed: (two aliases) |
+ self.TestLint('long a = (int64) 65; // NOLINT', '') |
+ self.TestLint('long a = (int64) 65; // NOLINT(*)', '') |
+ # Malformed NOLINT directive: |
+ self.TestLint( |
+ 'long a = 65; // NOLINT(foo)', |
+ ['Unknown NOLINT error category: foo' |
+ ' [readability/nolint] [5]', |
+ 'Use int16/int64/etc, rather than the C type long [runtime/int] [4]', |
+ ]) |
+ # Irrelevant NOLINT directive has no effect: |
+ self.TestLint( |
+ 'long a = 65; // NOLINT(readability/casting)', |
+ 'Use int16/int64/etc, rather than the C type long' |
+ ' [runtime/int] [4]') |
+ |
+ |
# Test Variable Declarations. |
def testVariableDeclarations(self): |
self.TestLint( |
@@ -578,6 +610,12 @@ |
'void a(const string &foobar);', |
'Add #include <string> for string [build/include_what_you_use] [4]') |
self.TestIncludeWhatYouUse( |
+ 'void a(const std::string &foobar);', |
+ 'Add #include <string> for string [build/include_what_you_use] [4]') |
+ self.TestIncludeWhatYouUse( |
+ 'void a(const my::string &foobar);', |
+ '') # Avoid false positives on strings in other namespaces. |
+ self.TestIncludeWhatYouUse( |
'''#include "base/foobar.h" |
bool foobar = swap(0,1); |
''', |
@@ -1627,9 +1665,9 @@ |
def testLabel(self): |
self.TestLint('public:', |
'Labels should always be indented at least one space. ' |
- 'If this is a member-initializer list in a constructor, ' |
- 'the colon should be on the line after the definition ' |
- 'header. [whitespace/labels] [4]') |
+ 'If this is a member-initializer list in a constructor or ' |
+ 'the base class list in a class definition, the colon should ' |
+ 'be on the following line. [whitespace/labels] [4]') |
self.TestLint(' public:', '') |
self.TestLint(' public:', '') |
self.TestLint(' public:', '') |
@@ -1974,6 +2012,16 @@ |
' [build/header_guard] [5]' % expected_guard), |
error_collector.ResultList()) |
+ # Special case for flymake |
+ error_collector = ErrorCollector(self.assert_) |
+ cpplint.ProcessFileData('mydir/foo_flymake.h', |
+ 'h', [], error_collector) |
+ self.assertEquals( |
+ 1, |
+ error_collector.ResultList().count( |
+ 'No #ifndef header guard found, suggested CPP variable is: %s' |
+ ' [build/header_guard] [5]' % expected_guard), |
+ error_collector.ResultList()) |
def testBuildInclude(self): |
# Test that include statements have slashes in them. |
@@ -2728,9 +2776,10 @@ |
public Foo { |
virtual void goo(); |
};''', |
- 'Labels should always be indented at least one space. If this is a ' |
- 'member-initializer list in a constructor, the colon should be on the ' |
- 'line after the definition header. [whitespace/labels] [4]') |
+ 'Labels should always be indented at least one space. ' |
+ 'If this is a member-initializer list in a constructor or ' |
+ 'the base class list in a class definition, the colon should ' |
+ 'be on the following line. [whitespace/labels] [4]') |
def testNoDestructorWhenVirtualNeeded(self): |
self.TestMultiLineLintRE( |
@@ -2808,6 +2857,13 @@ |
'The class Foo probably needs a virtual destructor due to having ' |
'virtual method(s), one declared at line 2. [runtime/virtual] [4]']) |
+ def testSnprintfSize(self): |
+ self.TestLint('vsnprintf(NULL, 0, format)', '') |
+ self.TestLint('snprintf(fisk, 1, format)', |
+ 'If you can, use sizeof(fisk) instead of 1 as the 2nd arg ' |
+ 'to snprintf. [runtime/printf] [3]') |
+ |
+ |
# pylint: disable-msg=C6409 |
def setUp(): |
""" Runs before all tests are executed. |