Commit 95a9bdd9 authored by Abseil Team's avatar Abseil Team Committed by Derek Mauro
Browse files

Googletest export

Use an OrderedDict to store templated_types in the AST so that gmock knows how to properly construct the templated Mock class.

This is necessary for functions that make use of the templated typename as an argument or return type.

PiperOrigin-RevId: 349405731
parent d7281311
...@@ -36,6 +36,7 @@ except ImportError: ...@@ -36,6 +36,7 @@ except ImportError:
# Python 2.x # Python 2.x
import __builtin__ as builtins import __builtin__ as builtins
import collections
import sys import sys
import traceback import traceback
...@@ -1433,7 +1434,7 @@ class AstBuilder(object): ...@@ -1433,7 +1434,7 @@ class AstBuilder(object):
pass # Not needed yet. pass # Not needed yet.
def _GetTemplatedTypes(self): def _GetTemplatedTypes(self):
result = {} result = collections.OrderedDict()
tokens = list(self._GetMatchingChar('<', '>')) tokens = list(self._GetMatchingChar('<', '>'))
len_tokens = len(tokens) - 1 # Ignore trailing '>'. len_tokens = len(tokens) - 1 # Ignore trailing '>'.
i = 0 i = 0
......
...@@ -159,12 +159,13 @@ def _GenerateMocks(filename, source, ast_list, desired_class_names): ...@@ -159,12 +159,13 @@ def _GenerateMocks(filename, source, ast_list, desired_class_names):
# Add template args for templated classes. # Add template args for templated classes.
if class_node.templated_types: 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. # TODO(paulchang): Handle non-type template arguments (e.g.
# template<typename T, int N>). # 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] template_decls = ['typename ' + arg for arg in template_args]
lines.append('template <' + ', '.join(template_decls) + '>') lines.append('template <' + ', '.join(template_decls) + '>')
parent_name += '<' + ', '.join(template_args) + '>' parent_name += '<' + ', '.join(template_args) + '>'
......
...@@ -428,8 +428,8 @@ class Test { ...@@ -428,8 +428,8 @@ class Test {
}; };
""" """
expected = """\ expected = """\
template <typename T0, typename T1> template <typename S, typename T>
class MockTest : public Test<T0, T1> { class MockTest : public Test<S, T> {
public: public:
MOCK_METHOD(void, Foo, (), (override)); MOCK_METHOD(void, Foo, (), (override));
}; };
...@@ -450,6 +450,24 @@ class MockTest : public Test { ...@@ -450,6 +450,24 @@ class MockTest : public Test {
public: public:
MOCK_METHOD(void, Bar, (const FooType& test_arg), (override)); 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.assertEqualIgnoreLeadingWhitespace(expected,
self.GenerateMocks(source)) self.GenerateMocks(source))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment