| Index: Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py
|
| diff --git a/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py b/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py
|
| index a7442044c83d0f5f6689af1509b516f9cc4ac6e7..6df53dac3bcf6c6d87158bc9baf8dcefc37ee4c2 100644
|
| --- a/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py
|
| +++ b/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py
|
| @@ -35,7 +35,6 @@
|
|
|
| # FIXME: Add a good test that tests UpdateIncludeState.
|
|
|
| -import codecs
|
| import os
|
| import random
|
| import re
|
| @@ -43,6 +42,7 @@ import webkitpy.thirdparty.unittest2 as unittest
|
| import cpp as cpp_style
|
| from cpp import CppChecker
|
| from ..filter import FilterConfiguration
|
| +from webkitpy.common.system.filesystem import FileSystem
|
|
|
| # This class works as an error collector and replaces cpp_style.Error
|
| # function for the unit tests. We also verify each category we see
|
| @@ -99,17 +99,6 @@ class ErrorCollector:
|
| sys.exit('FATAL ERROR: There are no tests for category "%s"' % category)
|
|
|
|
|
| -# This class is a lame mock of codecs. We do not verify filename, mode, or
|
| -# encoding, but for the current use case it is not needed.
|
| -class MockIo:
|
| - def __init__(self, mock_file):
|
| - self.mock_file = mock_file
|
| -
|
| - def open(self, unused_filename, unused_mode, unused_encoding, _): # NOLINT
|
| - # (lint doesn't like open as a method name)
|
| - return self.mock_file
|
| -
|
| -
|
| class CppFunctionsTest(unittest.TestCase):
|
|
|
| """Supports testing functions that do not need CppStyleTestBase."""
|
| @@ -246,16 +235,16 @@ class CppStyleTestBase(unittest.TestCase):
|
|
|
| # Helper function to avoid needing to explicitly pass confidence
|
| # in all the unit test calls to cpp_style.process_file_data().
|
| - def process_file_data(self, filename, file_extension, lines, error, unit_test_config={}):
|
| + def process_file_data(self, filename, file_extension, lines, error, fs=None):
|
| """Call cpp_style.process_file_data() with the min_confidence."""
|
| return cpp_style.process_file_data(filename, file_extension, lines,
|
| - error, self.min_confidence, unit_test_config)
|
| + error, self.min_confidence, fs)
|
|
|
| - def perform_lint(self, code, filename, basic_error_rules, unit_test_config={}, lines_to_check=None):
|
| + def perform_lint(self, code, filename, basic_error_rules, fs=None, lines_to_check=None):
|
| error_collector = ErrorCollector(self.assertTrue, FilterConfiguration(basic_error_rules), lines_to_check)
|
| lines = code.split('\n')
|
| extension = filename.split('.')[1]
|
| - self.process_file_data(filename, extension, lines, error_collector, unit_test_config)
|
| + self.process_file_data(filename, extension, lines, error_collector, fs)
|
| return error_collector.results()
|
|
|
| # Perform lint on single line of input and return the error message.
|
| @@ -304,17 +293,15 @@ class CppStyleTestBase(unittest.TestCase):
|
| return self.perform_lint(code, 'test.cpp', basic_error_rules)
|
|
|
| # Only include what you use errors.
|
| - def perform_include_what_you_use(self, code, filename='foo.h', io=codecs):
|
| + def perform_include_what_you_use(self, code, filename='foo.h', fs=None):
|
| basic_error_rules = ('-',
|
| '+build/include_what_you_use')
|
| - unit_test_config = {cpp_style.INCLUDE_IO_INJECTION_KEY: io}
|
| - return self.perform_lint(code, filename, basic_error_rules, unit_test_config)
|
| + return self.perform_lint(code, filename, basic_error_rules, fs)
|
|
|
| - def perform_avoid_static_cast_of_objects(self, code, filename='foo.cpp', io=codecs):
|
| + def perform_avoid_static_cast_of_objects(self, code, filename='foo.cpp', fs=None):
|
| basic_error_rules = ('-',
|
| '+runtime/casting')
|
| - unit_test_config = {cpp_style.INCLUDE_IO_INJECTION_KEY: io}
|
| - return self.perform_lint(code, filename, basic_error_rules, unit_test_config)
|
| + return self.perform_lint(code, filename, basic_error_rules, fs)
|
|
|
| # Perform lint and compare the error message with "expected_message".
|
| def assert_lint(self, code, expected_message, file_name='foo.cpp'):
|
| @@ -773,21 +760,41 @@ class CppStyleTest(CppStyleTestBase):
|
| # Tests for static_cast readability.
|
| def test_static_cast_on_objects_with_toFoo(self):
|
| mock_header_contents = ['inline Foo* toFoo(Bar* bar)']
|
| - message = self.perform_avoid_static_cast_of_objects(
|
| - 'Foo* x = static_cast<Foo*>(bar);',
|
| - filename='casting.cpp',
|
| - io=MockIo(mock_header_contents))
|
| - self.assertEqual(message, 'static_cast of class objects is not allowed. Use toFoo defined in Foo.h.'
|
| - ' [runtime/casting] [4]')
|
| + fs = FileSystem()
|
| + orig_read_text_file_fn = fs.read_text_file
|
| +
|
| + def mock_read_text_file_fn(path):
|
| + return mock_header_contents
|
| +
|
| + try:
|
| + fs.read_text_file = mock_read_text_file_fn
|
| + message = self.perform_avoid_static_cast_of_objects(
|
| + 'Foo* x = static_cast<Foo*>(bar);',
|
| + filename='casting.cpp',
|
| + fs=fs)
|
| + self.assertEqual(message, 'static_cast of class objects is not allowed. Use toFoo defined in Foo.h.'
|
| + ' [runtime/casting] [4]')
|
| + finally:
|
| + fs.read_text_file = orig_read_text_file_fn
|
|
|
| def test_static_cast_on_objects_without_toFoo(self):
|
| mock_header_contents = ['inline FooBar* toFooBar(Bar* bar)']
|
| - message = self.perform_avoid_static_cast_of_objects(
|
| - 'Foo* x = static_cast<Foo*>(bar);',
|
| - filename='casting.cpp',
|
| - io=MockIo(mock_header_contents))
|
| - self.assertEqual(message, 'static_cast of class objects is not allowed. Add toFoo in Foo.h and use it instead.'
|
| - ' [runtime/casting] [4]')
|
| + fs = FileSystem()
|
| + orig_read_text_file_fn = fs.read_text_file
|
| +
|
| + def mock_read_text_file_fn(path):
|
| + return mock_header_contents
|
| +
|
| + try:
|
| + fs.read_text_file = mock_read_text_file_fn
|
| + message = self.perform_avoid_static_cast_of_objects(
|
| + 'Foo* x = static_cast<Foo*>(bar);',
|
| + filename='casting.cpp',
|
| + fs=fs)
|
| + self.assertEqual(message, 'static_cast of class objects is not allowed. Add toFoo in Foo.h and use it instead.'
|
| + ' [runtime/casting] [4]')
|
| + finally:
|
| + fs.read_text_file = orig_read_text_file_fn
|
|
|
| # We cannot test this functionality because of difference of
|
| # function definitions. Anyway, we may never enable this.
|
| @@ -1014,43 +1021,53 @@ class CppStyleTest(CppStyleTestBase):
|
|
|
| # Test the UpdateIncludeState code path.
|
| mock_header_contents = ['#include "blah/foo.h"', '#include "blah/bar.h"']
|
| - message = self.perform_include_what_you_use(
|
| - '#include "config.h"\n'
|
| - '#include "blah/a.h"\n',
|
| - filename='blah/a.cpp',
|
| - io=MockIo(mock_header_contents))
|
| - self.assertEqual(message, '')
|
| -
|
| - mock_header_contents = ['#include <set>']
|
| - message = self.perform_include_what_you_use(
|
| - '''#include "config.h"
|
| - #include "blah/a.h"
|
| -
|
| - std::set<int> foo;''',
|
| - filename='blah/a.cpp',
|
| - io=MockIo(mock_header_contents))
|
| - self.assertEqual(message, '')
|
| -
|
| - # If there's just a .cpp and the header can't be found then it's ok.
|
| - message = self.perform_include_what_you_use(
|
| - '''#include "config.h"
|
| - #include "blah/a.h"
|
| -
|
| - std::set<int> foo;''',
|
| - filename='blah/a.cpp')
|
| - self.assertEqual(message, '')
|
| -
|
| - # Make sure we find the headers with relative paths.
|
| - mock_header_contents = ['']
|
| - message = self.perform_include_what_you_use(
|
| - '''#include "config.h"
|
| - #include "%s%sa.h"
|
| -
|
| - std::set<int> foo;''' % (os.path.basename(os.getcwd()), os.path.sep),
|
| - filename='a.cpp',
|
| - io=MockIo(mock_header_contents))
|
| - self.assertEqual(message, 'Add #include <set> for set<> '
|
| - '[build/include_what_you_use] [4]')
|
| + fs = FileSystem()
|
| + orig_read_text_file_fn = fs.read_text_file
|
| +
|
| + def mock_read_text_file_fn(path):
|
| + return mock_header_contents
|
| +
|
| + try:
|
| + fs.read_text_file = mock_read_text_file_fn
|
| + message = self.perform_include_what_you_use(
|
| + '#include "config.h"\n'
|
| + '#include "blah/a.h"\n',
|
| + filename='blah/a.cpp',
|
| + fs=fs)
|
| + self.assertEqual(message, '')
|
| +
|
| + mock_header_contents = ['#include <set>']
|
| + message = self.perform_include_what_you_use(
|
| + '''#include "config.h"
|
| + #include "blah/a.h"
|
| +
|
| + std::set<int> foo;''',
|
| + filename='blah/a.cpp',
|
| + fs=fs)
|
| + self.assertEqual(message, '')
|
| +
|
| + # If there's just a .cpp and the header can't be found then it's ok.
|
| + message = self.perform_include_what_you_use(
|
| + '''#include "config.h"
|
| + #include "blah/a.h"
|
| +
|
| + std::set<int> foo;''',
|
| + filename='blah/a.cpp')
|
| + self.assertEqual(message, '')
|
| +
|
| + # Make sure we find the headers with relative paths.
|
| + mock_header_contents = ['']
|
| + message = self.perform_include_what_you_use(
|
| + '''#include "config.h"
|
| + #include "%s%sa.h"
|
| +
|
| + std::set<int> foo;''' % (os.path.basename(os.getcwd()), os.path.sep),
|
| + filename='a.cpp',
|
| + fs=fs)
|
| + self.assertEqual(message, 'Add #include <set> for set<> '
|
| + '[build/include_what_you_use] [4]')
|
| + finally:
|
| + fs.read_text_file = orig_read_text_file_fn
|
|
|
| def test_files_belong_to_same_module(self):
|
| f = cpp_style.files_belong_to_same_module
|
|
|