Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(602)

Side by Side Diff: cpplint/cpplint_unittest.py

Issue 1697023: Update cpplint.py to #150:... (Closed) Base URL: http://google-styleguide.googlecode.com/svn/trunk/
Patch Set: Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cpplint/cpplint.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python2.4 1 #!/usr/bin/python2.4
2 # -*- coding: utf-8; -*- 2 # -*- coding: utf-8; -*-
3 # 3 #
4 # Copyright (c) 2009 Google Inc. All rights reserved. 4 # Copyright (c) 2009 Google Inc. All rights reserved.
5 # 5 #
6 # Redistribution and use in source and binary forms, with or without 6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions are 7 # modification, are permitted provided that the following conditions are
8 # met: 8 # met:
9 # 9 #
10 # * Redistributions of source code must retain the above copyright 10 # * Redistributions of source code must retain the above copyright
(...skipping 28 matching lines...) Expand all
39 import re 39 import re
40 import unittest 40 import unittest
41 import cpplint 41 import cpplint
42 42
43 43
44 # This class works as an error collector and replaces cpplint.Error 44 # This class works as an error collector and replaces cpplint.Error
45 # function for the unit tests. We also verify each category we see 45 # function for the unit tests. We also verify each category we see
46 # is in cpplint._ERROR_CATEGORIES, to help keep that list up to date. 46 # is in cpplint._ERROR_CATEGORIES, to help keep that list up to date.
47 class ErrorCollector: 47 class ErrorCollector:
48 # These are a global list, covering all categories seen ever. 48 # These are a global list, covering all categories seen ever.
49 _ERROR_CATEGORIES = [x.strip() # get rid of leading whitespace 49 _ERROR_CATEGORIES = cpplint._ERROR_CATEGORIES
50 for x in cpplint._ERROR_CATEGORIES.split()]
51 _SEEN_ERROR_CATEGORIES = {} 50 _SEEN_ERROR_CATEGORIES = {}
52 51
53 def __init__(self, assert_fn): 52 def __init__(self, assert_fn):
54 """assert_fn: a function to call when we notice a problem.""" 53 """assert_fn: a function to call when we notice a problem."""
55 self._assert_fn = assert_fn 54 self._assert_fn = assert_fn
56 self._errors = [] 55 self._errors = []
56 cpplint.ResetNolintSuppressions()
57 57
58 def __call__(self, unused_filename, unused_linenum, 58 def __call__(self, unused_filename, linenum,
59 category, confidence, message): 59 category, confidence, message):
60 self._assert_fn(category in self._ERROR_CATEGORIES, 60 self._assert_fn(category in self._ERROR_CATEGORIES,
61 'Message "%s" has category "%s",' 61 'Message "%s" has category "%s",'
62 ' which is not in _ERROR_CATEGORIES' % (message, category)) 62 ' which is not in _ERROR_CATEGORIES' % (message, category))
63 self._SEEN_ERROR_CATEGORIES[category] = 1 63 self._SEEN_ERROR_CATEGORIES[category] = 1
64 if cpplint._ShouldPrintError(category, confidence): 64 if cpplint._ShouldPrintError(category, confidence, linenum):
65 self._errors.append('%s [%s] [%d]' % (message, category, confidence)) 65 self._errors.append('%s [%s] [%d]' % (message, category, confidence))
66 66
67 def Results(self): 67 def Results(self):
68 if len(self._errors) < 2: 68 if len(self._errors) < 2:
69 return ''.join(self._errors) # Most tests expect to have a string. 69 return ''.join(self._errors) # Most tests expect to have a string.
70 else: 70 else:
71 return self._errors # Let's give a list if there is more than one. 71 return self._errors # Let's give a list if there is more than one.
72 72
73 def ResultList(self): 73 def ResultList(self):
74 return self._errors 74 return self._errors
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 '// https://g' + ('o' * 100) + 'gle.com/', 288 '// https://g' + ('o' * 100) + 'gle.com/',
289 '') 289 '')
290 self.TestLint( 290 self.TestLint(
291 '// https://g' + ('o' * 60) + 'gle.com/ and some comments', 291 '// https://g' + ('o' * 60) + 'gle.com/ and some comments',
292 'Lines should be <= 80 characters long' 292 'Lines should be <= 80 characters long'
293 ' [whitespace/line_length] [2]') 293 ' [whitespace/line_length] [2]')
294 self.TestLint( 294 self.TestLint(
295 '// Read https://g' + ('o' * 60) + 'gle.com/' , 295 '// Read https://g' + ('o' * 60) + 'gle.com/' ,
296 '') 296 '')
297 297
298 # Test error suppression annotations.
299 def testErrorSuppression(self):
300 # Two errors on same line:
301 self.TestLint(
302 'long a = (int64) 65;',
303 ['Using C-style cast. Use static_cast<int64>(...) instead'
304 ' [readability/casting] [4]',
305 'Use int16/int64/etc, rather than the C type long'
306 ' [runtime/int] [4]',
307 ])
308 # One category of error suppressed:
309 self.TestLint(
310 'long a = (int64) 65; // NOLINT(runtime/int)',
311 'Using C-style cast. Use static_cast<int64>(...) instead'
312 ' [readability/casting] [4]')
313 # All categories suppressed: (two aliases)
314 self.TestLint('long a = (int64) 65; // NOLINT', '')
315 self.TestLint('long a = (int64) 65; // NOLINT(*)', '')
316 # Malformed NOLINT directive:
317 self.TestLint(
318 'long a = 65; // NOLINT(foo)',
319 ['Unknown NOLINT error category: foo'
320 ' [readability/nolint] [5]',
321 'Use int16/int64/etc, rather than the C type long [runtime/int] [4]',
322 ])
323 # Irrelevant NOLINT directive has no effect:
324 self.TestLint(
325 'long a = 65; // NOLINT(readability/casting)',
326 'Use int16/int64/etc, rather than the C type long'
327 ' [runtime/int] [4]')
328
329
298 # Test Variable Declarations. 330 # Test Variable Declarations.
299 def testVariableDeclarations(self): 331 def testVariableDeclarations(self):
300 self.TestLint( 332 self.TestLint(
301 'long a = 65;', 333 'long a = 65;',
302 'Use int16/int64/etc, rather than the C type long' 334 'Use int16/int64/etc, rather than the C type long'
303 ' [runtime/int] [4]') 335 ' [runtime/int] [4]')
304 self.TestLint( 336 self.TestLint(
305 'long double b = 65.0;', 337 'long double b = 65.0;',
306 '') 338 '')
307 self.TestLint( 339 self.TestLint(
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 ' [build/include_what_you_use] [4]') 603 ' [build/include_what_you_use] [4]')
572 self.TestIncludeWhatYouUse( 604 self.TestIncludeWhatYouUse(
573 '''#include "base/foobar.h" 605 '''#include "base/foobar.h"
574 bool foobar = min<int>(0,1); 606 bool foobar = min<int>(0,1);
575 ''', 607 ''',
576 'Add #include <algorithm> for min [build/include_what_you_use] [4]') 608 'Add #include <algorithm> for min [build/include_what_you_use] [4]')
577 self.TestIncludeWhatYouUse( 609 self.TestIncludeWhatYouUse(
578 'void a(const string &foobar);', 610 'void a(const string &foobar);',
579 'Add #include <string> for string [build/include_what_you_use] [4]') 611 'Add #include <string> for string [build/include_what_you_use] [4]')
580 self.TestIncludeWhatYouUse( 612 self.TestIncludeWhatYouUse(
613 'void a(const std::string &foobar);',
614 'Add #include <string> for string [build/include_what_you_use] [4]')
615 self.TestIncludeWhatYouUse(
616 'void a(const my::string &foobar);',
617 '') # Avoid false positives on strings in other namespaces.
618 self.TestIncludeWhatYouUse(
581 '''#include "base/foobar.h" 619 '''#include "base/foobar.h"
582 bool foobar = swap(0,1); 620 bool foobar = swap(0,1);
583 ''', 621 ''',
584 'Add #include <algorithm> for swap [build/include_what_you_use] [4]') 622 'Add #include <algorithm> for swap [build/include_what_you_use] [4]')
585 self.TestIncludeWhatYouUse( 623 self.TestIncludeWhatYouUse(
586 '''#include "base/foobar.h" 624 '''#include "base/foobar.h"
587 bool foobar = transform(a.begin(), a.end(), b.start(), Foo); 625 bool foobar = transform(a.begin(), a.end(), b.start(), Foo);
588 ''', 626 ''',
589 'Add #include <algorithm> for transform ' 627 'Add #include <algorithm> for transform '
590 '[build/include_what_you_use] [4]') 628 '[build/include_what_you_use] [4]')
(...skipping 1029 matching lines...) Expand 10 before | Expand all | Expand 10 after
1620 self.TestLint(' char* one_space_indent = "public:";', 1658 self.TestLint(' char* one_space_indent = "public:";',
1621 'Weird number of spaces at line-start. ' 1659 'Weird number of spaces at line-start. '
1622 'Are you using a 2-space indent? [whitespace/indent] [3]') 1660 'Are you using a 2-space indent? [whitespace/indent] [3]')
1623 self.TestLint(' public:', '') 1661 self.TestLint(' public:', '')
1624 self.TestLint(' public:', '') 1662 self.TestLint(' public:', '')
1625 self.TestLint(' public:', '') 1663 self.TestLint(' public:', '')
1626 1664
1627 def testLabel(self): 1665 def testLabel(self):
1628 self.TestLint('public:', 1666 self.TestLint('public:',
1629 'Labels should always be indented at least one space. ' 1667 'Labels should always be indented at least one space. '
1630 'If this is a member-initializer list in a constructor, ' 1668 'If this is a member-initializer list in a constructor or '
1631 'the colon should be on the line after the definition ' 1669 'the base class list in a class definition, the colon should '
1632 'header. [whitespace/labels] [4]') 1670 'be on the following line. [whitespace/labels] [4]')
1633 self.TestLint(' public:', '') 1671 self.TestLint(' public:', '')
1634 self.TestLint(' public:', '') 1672 self.TestLint(' public:', '')
1635 self.TestLint(' public:', '') 1673 self.TestLint(' public:', '')
1636 self.TestLint(' public:', '') 1674 self.TestLint(' public:', '')
1637 self.TestLint(' public:', '') 1675 self.TestLint(' public:', '')
1638 1676
1639 def testNotALabel(self): 1677 def testNotALabel(self):
1640 self.TestLint('MyVeryLongNamespace::MyVeryLongClassName::', '') 1678 self.TestLint('MyVeryLongNamespace::MyVeryLongClassName::', '')
1641 1679
1642 def testTab(self): 1680 def testTab(self):
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
1967 '#ifndef header guard has wrong style, please use: %s' 2005 '#ifndef header guard has wrong style, please use: %s'
1968 ' [build/header_guard] [5]' % expected_guard), 2006 ' [build/header_guard] [5]' % expected_guard),
1969 error_collector.ResultList()) 2007 error_collector.ResultList())
1970 self.assertEquals( 2008 self.assertEquals(
1971 0, 2009 0,
1972 error_collector.ResultList().count( 2010 error_collector.ResultList().count(
1973 '#endif line should be "#endif // %s"' 2011 '#endif line should be "#endif // %s"'
1974 ' [build/header_guard] [5]' % expected_guard), 2012 ' [build/header_guard] [5]' % expected_guard),
1975 error_collector.ResultList()) 2013 error_collector.ResultList())
1976 2014
2015 # Special case for flymake
2016 error_collector = ErrorCollector(self.assert_)
2017 cpplint.ProcessFileData('mydir/foo_flymake.h',
2018 'h', [], error_collector)
2019 self.assertEquals(
2020 1,
2021 error_collector.ResultList().count(
2022 'No #ifndef header guard found, suggested CPP variable is: %s'
2023 ' [build/header_guard] [5]' % expected_guard),
2024 error_collector.ResultList())
1977 2025
1978 def testBuildInclude(self): 2026 def testBuildInclude(self):
1979 # Test that include statements have slashes in them. 2027 # Test that include statements have slashes in them.
1980 self.TestLint('#include "foo.h"', 2028 self.TestLint('#include "foo.h"',
1981 'Include the directory when naming .h files' 2029 'Include the directory when naming .h files'
1982 ' [build/include] [4]') 2030 ' [build/include] [4]')
1983 2031
1984 def testBuildPrintfFormat(self): 2032 def testBuildPrintfFormat(self):
1985 self.TestLint( 2033 self.TestLint(
1986 r'printf("\%%d", value);', 2034 r'printf("\%%d", value);',
(...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after
2721 virtual void goo(); 2769 virtual void goo();
2722 };''', 2770 };''',
2723 '') 2771 '')
2724 2772
2725 self.TestMultiLineLint( 2773 self.TestMultiLineLint(
2726 # Line-ending : 2774 # Line-ending :
2727 '''class Goo : 2775 '''class Goo :
2728 public Foo { 2776 public Foo {
2729 virtual void goo(); 2777 virtual void goo();
2730 };''', 2778 };''',
2731 'Labels should always be indented at least one space. If this is a ' 2779 'Labels should always be indented at least one space. '
2732 'member-initializer list in a constructor, the colon should be on the ' 2780 'If this is a member-initializer list in a constructor or '
2733 'line after the definition header. [whitespace/labels] [4]') 2781 'the base class list in a class definition, the colon should '
2782 'be on the following line. [whitespace/labels] [4]')
2734 2783
2735 def testNoDestructorWhenVirtualNeeded(self): 2784 def testNoDestructorWhenVirtualNeeded(self):
2736 self.TestMultiLineLintRE( 2785 self.TestMultiLineLintRE(
2737 '''class Foo { 2786 '''class Foo {
2738 virtual void foo(); 2787 virtual void foo();
2739 };''', 2788 };''',
2740 'The class Foo probably needs a virtual destructor') 2789 'The class Foo probably needs a virtual destructor')
2741 2790
2742 def testDestructorNonVirtualWhenVirtualNeeded(self): 2791 def testDestructorNonVirtualWhenVirtualNeeded(self):
2743 self.TestMultiLineLintRE( 2792 self.TestMultiLineLintRE(
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2801 self.TestMultiLineLint( 2850 self.TestMultiLineLint(
2802 '''class Foo 2851 '''class Foo
2803 { 2852 {
2804 virtual void foo(); 2853 virtual void foo();
2805 };''', 2854 };''',
2806 ['{ should almost always be at the end of the previous line ' 2855 ['{ should almost always be at the end of the previous line '
2807 '[whitespace/braces] [4]', 2856 '[whitespace/braces] [4]',
2808 'The class Foo probably needs a virtual destructor due to having ' 2857 'The class Foo probably needs a virtual destructor due to having '
2809 'virtual method(s), one declared at line 2. [runtime/virtual] [4]']) 2858 'virtual method(s), one declared at line 2. [runtime/virtual] [4]'])
2810 2859
2860 def testSnprintfSize(self):
2861 self.TestLint('vsnprintf(NULL, 0, format)', '')
2862 self.TestLint('snprintf(fisk, 1, format)',
2863 'If you can, use sizeof(fisk) instead of 1 as the 2nd arg '
2864 'to snprintf. [runtime/printf] [3]')
2865
2866
2811 # pylint: disable-msg=C6409 2867 # pylint: disable-msg=C6409
2812 def setUp(): 2868 def setUp():
2813 """ Runs before all tests are executed. 2869 """ Runs before all tests are executed.
2814 """ 2870 """
2815 # Enable all filters, so we don't miss anything that is off by default. 2871 # Enable all filters, so we don't miss anything that is off by default.
2816 cpplint._DEFAULT_FILTERS = [] 2872 cpplint._DEFAULT_FILTERS = []
2817 cpplint._cpplint_state.SetFilters('') 2873 cpplint._cpplint_state.SetFilters('')
2818 2874
2819 2875
2820 # pylint: disable-msg=C6409 2876 # pylint: disable-msg=C6409
(...skipping 18 matching lines...) Expand all
2839 # we're running the full test suite: if we only run one test, 2895 # we're running the full test suite: if we only run one test,
2840 # obviously we're not going to see all the error categories. So we 2896 # obviously we're not going to see all the error categories. So we
2841 # only run VerifyAllCategoriesAreSeen() when no commandline flags 2897 # only run VerifyAllCategoriesAreSeen() when no commandline flags
2842 # are passed in. 2898 # are passed in.
2843 global _run_verifyallcategoriesseen 2899 global _run_verifyallcategoriesseen
2844 _run_verifyallcategoriesseen = (len(sys.argv) == 1) 2900 _run_verifyallcategoriesseen = (len(sys.argv) == 1)
2845 2901
2846 setUp() 2902 setUp()
2847 unittest.main() 2903 unittest.main()
2848 tearDown() 2904 tearDown()
OLDNEW
« no previous file with comments | « cpplint/cpplint.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698