2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
6 from cpp_type_generator import CppTypeGenerator
7 from json_schema import CachedLoad
11 from collections import defaultdict
13 class _FakeSchemaLoader(object):
14 def __init__(self, model):
17 def ResolveType(self, type_name, default):
18 parts = type_name.rsplit('.', 1)
20 return default if type_name in default.types else None
21 return self._model.namespaces[parts[0]]
23 class CppTypeGeneratorTest(unittest.TestCase):
25 self.models = defaultdict(model.Model)
27 self.forbidden_json = CachedLoad('test/forbidden.json')
28 self.forbidden = self.models['forbidden'].AddNamespace(
29 self.forbidden_json[0], 'path/to/forbidden.json')
30 self.permissions_json = CachedLoad('test/permissions.json')
31 self.permissions = self.models['permissions'].AddNamespace(
32 self.permissions_json[0], 'path/to/permissions.json')
33 self.windows_json = CachedLoad('test/windows.json')
34 self.windows = self.models['windows'].AddNamespace(self.windows_json[0],
35 'path/to/window.json')
36 self.tabs_json = CachedLoad('test/tabs.json')
37 self.tabs = self.models['tabs'].AddNamespace(self.tabs_json[0],
39 self.browser_action_json = CachedLoad('test/browser_action.json')
40 self.browser_action = self.models['browser_action'].AddNamespace(
41 self.browser_action_json[0], 'path/to/browser_action.json')
42 self.font_settings_json = CachedLoad('test/font_settings.json')
43 self.font_settings = self.models['font_settings'].AddNamespace(
44 self.font_settings_json[0], 'path/to/font_settings.json')
45 self.dependency_tester_json = CachedLoad('test/dependency_tester.json')
46 self.dependency_tester = self.models['dependency_tester'].AddNamespace(
47 self.dependency_tester_json[0], 'path/to/dependency_tester.json')
48 self.content_settings_json = CachedLoad('test/content_settings.json')
49 self.content_settings = self.models['content_settings'].AddNamespace(
50 self.content_settings_json[0], 'path/to/content_settings.json')
52 def testGenerateIncludesAndForwardDeclarations(self):
54 m.AddNamespace(self.windows_json[0], 'path/to/windows.json')
55 m.AddNamespace(self.tabs_json[0], 'path/to/tabs.json')
56 manager = CppTypeGenerator(m, _FakeSchemaLoader(m))
58 self.assertEquals('', manager.GenerateIncludes().Render())
59 self.assertEquals('#include "path/to/tabs.h"',
60 manager.GenerateIncludes(include_soft=True).Render())
61 self.assertEquals('namespace tabs {\n'
64 manager.GenerateForwardDeclarations().Render())
65 manager = CppTypeGenerator(self.models.get('permissions'),
67 self.assertEquals('', manager.GenerateIncludes().Render())
68 self.assertEquals('', manager.GenerateIncludes().Render())
69 self.assertEquals('', manager.GenerateForwardDeclarations().Render())
70 manager = CppTypeGenerator(self.models.get('content_settings'),
72 self.assertEquals('', manager.GenerateIncludes().Render())
74 def testGenerateIncludesAndForwardDeclarationsDependencies(self):
76 # Insert 'font_settings' before 'browser_action' in order to test that
77 # CppTypeGenerator sorts them properly.
78 m.AddNamespace(self.font_settings_json[0], 'path/to/font_settings.json')
79 m.AddNamespace(self.browser_action_json[0], 'path/to/browser_action.json')
80 dependency_tester = m.AddNamespace(self.dependency_tester_json[0],
81 'path/to/dependency_tester.json')
82 manager = CppTypeGenerator(m,
84 default_namespace=dependency_tester)
85 self.assertEquals('#include "path/to/browser_action.h"\n'
86 '#include "path/to/font_settings.h"',
87 manager.GenerateIncludes().Render())
88 self.assertEquals('namespace browser_action {\n'
90 'namespace font_settings {\n'
92 manager.GenerateForwardDeclarations().Render())
94 def testGetCppTypeSimple(self):
95 manager = CppTypeGenerator(self.models.get('tabs'), _FakeSchemaLoader(None))
98 manager.GetCppType(self.tabs.types['Tab'].properties['id'].type_))
101 manager.GetCppType(self.tabs.types['Tab'].properties['status'].type_))
104 manager.GetCppType(self.tabs.types['Tab'].properties['selected'].type_))
106 def testStringAsType(self):
107 manager = CppTypeGenerator(self.models.get('font_settings'),
108 _FakeSchemaLoader(None))
111 manager.GetCppType(self.font_settings.types['FakeStringType']))
113 def testArrayAsType(self):
114 manager = CppTypeGenerator(self.models.get('browser_action'),
115 _FakeSchemaLoader(None))
118 manager.GetCppType(self.browser_action.types['ColorArray']))
120 def testGetCppTypeArray(self):
121 manager = CppTypeGenerator(self.models.get('windows'),
122 _FakeSchemaLoader(None))
124 'std::vector<linked_ptr<Window> >',
126 self.windows.functions['getAll'].callback.params[0].type_))
127 manager = CppTypeGenerator(self.models.get('permissions'),
128 _FakeSchemaLoader(None))
130 'std::vector<std::string>',
132 self.permissions.types['Permissions'].properties['origins'].type_))
134 def testGetCppTypeLocalRef(self):
135 manager = CppTypeGenerator(self.models.get('tabs'), _FakeSchemaLoader(None))
138 manager.GetCppType(self.tabs.functions['get'].callback.params[0].type_))
140 def testGetCppTypeIncludedRef(self):
142 m.AddNamespace(self.windows_json[0], 'path/to/windows.json')
143 m.AddNamespace(self.tabs_json[0], 'path/to/tabs.json')
144 manager = CppTypeGenerator(m, _FakeSchemaLoader(m))
146 'std::vector<linked_ptr<tabs::Tab> >',
148 self.windows.types['Window'].properties['tabs'].type_))
150 def testGetCppTypeWithPadForGeneric(self):
151 manager = CppTypeGenerator(self.models.get('permissions'),
152 _FakeSchemaLoader(None))
153 self.assertEquals('std::vector<std::string>',
155 self.permissions.types['Permissions'].properties['origins'].type_,
156 is_in_container=False))
157 self.assertEquals('linked_ptr<std::vector<std::string> >',
159 self.permissions.types['Permissions'].properties['origins'].type_,
160 is_in_container=True))
161 self.assertEquals('bool',
163 self.permissions.functions['contains'].callback.params[0].type_,
164 is_in_container=True))
166 if __name__ == '__main__':