blob: 9baed1816761a8dd00144c9db21b816c48fd3874 [file] [log] [blame]
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# pylint: disable=import-error,print-statement,relative-import,protected-access
"""Unit tests for code_generator_web_agent_api.py."""
import unittest
from code_generator_web_agent_api import InterfaceContextBuilder
from code_generator_web_agent_api import STRING_INCLUDE_PATH
from code_generator_web_agent_api import TypeResolver
from idl_definitions import IdlAttribute
from idl_definitions import IdlOperation
from idl_types import IdlType
from idl_types import PRIMITIVE_TYPES
from idl_types import STRING_TYPES
# TODO(dglazkov): Convert to use actual objects, not stubs.
# See http://crbug.com/673214 for more details.
class IdlTestingHelper(object):
"""A collection of stub makers and helper utils to make testing code
generation easy."""
def make_stub_idl_attribute(self, name, return_type):
idl_attribute_stub = IdlAttribute()
idl_attribute_stub.name = name
idl_attribute_stub.idl_type = IdlType(return_type)
return idl_attribute_stub
def make_stub_idl_operation(self, name, return_type):
idl_operation_stub = IdlOperation()
idl_operation_stub.name = name
idl_operation_stub.idl_type = IdlType(return_type)
return idl_operation_stub
def make_stub_idl_type(self, base_type):
return IdlType(base_type)
def make_stub_interfaces_info(self, classes_to_paths):
result = {}
for class_name, path in classes_to_paths.iteritems():
result[class_name] = {'include_path': path}
return result
class TypeResolverTest(unittest.TestCase):
def test_includes_from_type_should_filter_primitive_types(self):
helper = IdlTestingHelper()
type_resolver = TypeResolver({})
for primitive_type in PRIMITIVE_TYPES:
idl_type = helper.make_stub_idl_type(primitive_type)
self.assertEqual(
type_resolver._includes_from_type(idl_type), set())
def test_includes_from_type_should_filter_void(self):
type_resolver = TypeResolver({})
helper = IdlTestingHelper()
idl_type = helper.make_stub_idl_type('void')
self.assertEqual(
type_resolver._includes_from_type(idl_type), set())
def test_includes_from_type_should_handle_string(self):
type_resolver = TypeResolver({})
helper = IdlTestingHelper()
for string_type in STRING_TYPES:
idl_type = helper.make_stub_idl_type(string_type)
self.assertEqual(
type_resolver._includes_from_type(idl_type),
set([STRING_INCLUDE_PATH]))
class InterfaceContextBuilderTest(unittest.TestCase):
def test_empty(self):
builder = InterfaceContextBuilder('test', TypeResolver({}))
self.assertEqual({'code_generator': 'test'}, builder.build())
def test_set_name(self):
helper = IdlTestingHelper()
builder = InterfaceContextBuilder(
'test', TypeResolver(helper.make_stub_interfaces_info({
'foo': 'path_to_foo',
})))
builder.set_class_name('foo')
self.assertEqual({
'code_generator': 'test',
'cpp_includes': set(['path_to_foo']),
'class_name': {
'snake_case': 'foo',
'macro_case': 'FOO',
'upper_camel_case': 'Foo'
},
}, builder.build())
def test_set_inheritance(self):
helper = IdlTestingHelper()
builder = InterfaceContextBuilder(
'test', TypeResolver(helper.make_stub_interfaces_info({
'foo': 'path_to_foo',
})))
builder.set_inheritance('foo')
self.assertEqual({
'base_class': 'foo',
'code_generator': 'test',
'header_includes': set(['path_to_foo']),
}, builder.build())
builder = InterfaceContextBuilder('test', TypeResolver({}))
builder.set_inheritance(None)
self.assertEqual({
'code_generator': 'test',
'header_includes': set(['platform/heap/Handle.h']),
}, builder.build())
def test_add_attribute(self):
helper = IdlTestingHelper()
builder = InterfaceContextBuilder(
'test', TypeResolver(helper.make_stub_interfaces_info({
'foo': 'path_to_foo',
'bar': 'path_to_bar'
})))
attribute = helper.make_stub_idl_attribute('foo', 'bar')
builder.add_attribute(attribute)
self.assertEqual({
'code_generator': 'test',
'cpp_includes': set(['path_to_bar']),
'attributes': [{'name': 'foo', 'return_type': 'bar'}],
}, builder.build())
def test_add_method(self):
helper = IdlTestingHelper()
builder = InterfaceContextBuilder(
'test', TypeResolver(helper.make_stub_interfaces_info({
'foo': 'path_to_foo',
'bar': 'path_to_bar'
})))
operation = helper.make_stub_idl_operation('foo', 'bar')
builder.add_operation(operation)
self.assertEqual({
'code_generator': 'test',
'cpp_includes': set(['path_to_bar']),
'methods': [{'name': 'foo', 'return_type': 'bar'}],
}, builder.build())