summaryrefslogtreecommitdiffstats
path: root/googlemock/scripts/generator/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'googlemock/scripts/generator/cpp')
-rwxr-xr-xgooglemock/scripts/generator/cpp/ast.py3
-rwxr-xr-xgooglemock/scripts/generator/cpp/gmock_class.py12
-rwxr-xr-xgooglemock/scripts/generator/cpp/gmock_class_test.py24
3 files changed, 30 insertions, 9 deletions
diff --git a/googlemock/scripts/generator/cpp/ast.py b/googlemock/scripts/generator/cpp/ast.py
index cc9f89aa..db20de49 100755
--- a/googlemock/scripts/generator/cpp/ast.py
+++ b/googlemock/scripts/generator/cpp/ast.py
@@ -36,6 +36,7 @@ except ImportError:
# Python 2.x
import __builtin__ as builtins
+import collections
import sys
import traceback
@@ -1433,7 +1434,7 @@ class AstBuilder(object):
pass # Not needed yet.
def _GetTemplatedTypes(self):
- result = {}
+ result = collections.OrderedDict()
tokens = list(self._GetMatchingChar('<', '>'))
len_tokens = len(tokens) - 1 # Ignore trailing '>'.
i = 0
diff --git a/googlemock/scripts/generator/cpp/gmock_class.py b/googlemock/scripts/generator/cpp/gmock_class.py
index 488cc153..3e21022b 100755
--- a/googlemock/scripts/generator/cpp/gmock_class.py
+++ b/googlemock/scripts/generator/cpp/gmock_class.py
@@ -132,7 +132,8 @@ def _GenerateMethods(output_lines, source, class_node):
args = []
for p in node.parameters:
arg = _GenerateArg(source[p.start:p.end])
- args.append(_EscapeForMacro(arg))
+ if arg != 'void':
+ args.append(_EscapeForMacro(arg))
# Create the mock method definition.
output_lines.extend([
@@ -159,12 +160,13 @@ def _GenerateMocks(filename, source, ast_list, desired_class_names):
# Add template args for templated classes.
if class_node.templated_types:
- # TODO(paulchang): The AST doesn't preserve template argument order,
- # so we have to make up names here.
# TODO(paulchang): Handle non-type template arguments (e.g.
# template<typename T, int N>).
- template_arg_count = len(class_node.templated_types.keys())
- template_args = ['T%d' % n for n in range(template_arg_count)]
+
+ # class_node.templated_types is an OrderedDict from strings to a tuples.
+ # The key is the name of the template, and the value is
+ # (type_name, default). Both type_name and default could be None.
+ template_args = class_node.templated_types.keys()
template_decls = ['typename ' + arg for arg in template_args]
lines.append('template <' + ', '.join(template_decls) + '>')
parent_name += '<' + ', '.join(template_args) + '>'
diff --git a/googlemock/scripts/generator/cpp/gmock_class_test.py b/googlemock/scripts/generator/cpp/gmock_class_test.py
index 527182cc..eff475f4 100755
--- a/googlemock/scripts/generator/cpp/gmock_class_test.py
+++ b/googlemock/scripts/generator/cpp/gmock_class_test.py
@@ -156,7 +156,7 @@ class Foo {
};
"""
self.assertEqualIgnoreLeadingWhitespace(
- 'MOCK_METHOD(int, Bar, (void), (override));',
+ 'MOCK_METHOD(int, Bar, (), (override));',
self.GenerateMethodSource(source))
def testStrangeNewlineInParameter(self):
@@ -428,8 +428,8 @@ class Test {
};
"""
expected = """\
-template <typename T0, typename T1>
-class MockTest : public Test<T0, T1> {
+template <typename S, typename T>
+class MockTest : public Test<S, T> {
public:
MOCK_METHOD(void, Foo, (), (override));
};
@@ -454,6 +454,24 @@ MOCK_METHOD(void, Bar, (const FooType& test_arg), (override));
self.assertEqualIgnoreLeadingWhitespace(expected,
self.GenerateMocks(source))
+ def testTemplatedClassWithTemplatedArguments(self):
+ source = """
+template <typename S, typename T, typename U, typename V, typename W>
+class Test {
+ public:
+ virtual U Foo(T some_arg);
+};
+"""
+ expected = """\
+template <typename S, typename T, typename U, typename V, typename W>
+class MockTest : public Test<S, T, U, V, W> {
+public:
+MOCK_METHOD(U, Foo, (T some_arg), (override));
+};
+"""
+ self.assertEqualIgnoreLeadingWhitespace(expected,
+ self.GenerateMocks(source))
+
def testTemplateInATemplateTypedefWithComma(self):
source = """
class Test {
OpenPOWER on IntegriCloud