1 #!/usr/bin/env python 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. 5 6 from cpp_type_generator import CppTypeGenerator 7 from json_schema import CachedLoad 8 import model 9 import unittest 10 11 from collections import defaultdict 12 13 class _FakeSchemaLoader(object): 14 def __init__(self, model): 15 self._model = model 16 17 def ResolveType(self, type_name, default): 18 parts = type_name.rsplit('.', 1) 19 if len(parts) == 1: 20 return default if type_name in default.types else None 21 return self._model.namespaces[parts[0]] 22 23 class CppTypeGeneratorTest(unittest.TestCase): 24 def setUp(self): 25 self.models = defaultdict(model.Model) 26 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], 38 'path/to/tabs.json') 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') 51 52 def testGenerateIncludesAndForwardDeclarations(self): 53 m = model.Model() 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)) 57 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' 62 'struct Tab;\n' 63 '}', 64 manager.GenerateForwardDeclarations().Render()) 65 manager = CppTypeGenerator(self.models.get('permissions'), 66 _FakeSchemaLoader(m)) 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'), 71 _FakeSchemaLoader(m)) 72 self.assertEquals('', manager.GenerateIncludes().Render()) 73 74 def testGenerateIncludesAndForwardDeclarationsDependencies(self): 75 m = model.Model() 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, 83 _FakeSchemaLoader(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' 89 '}\n' 90 'namespace font_settings {\n' 91 '}', 92 manager.GenerateForwardDeclarations().Render()) 93 94 def testGetCppTypeSimple(self): 95 manager = CppTypeGenerator(self.models.get('tabs'), _FakeSchemaLoader(None)) 96 self.assertEquals( 97 'int', 98 manager.GetCppType(self.tabs.types['Tab'].properties['id'].type_)) 99 self.assertEquals( 100 'std::string', 101 manager.GetCppType(self.tabs.types['Tab'].properties['status'].type_)) 102 self.assertEquals( 103 'bool', 104 manager.GetCppType(self.tabs.types['Tab'].properties['selected'].type_)) 105 106 def testStringAsType(self): 107 manager = CppTypeGenerator(self.models.get('font_settings'), 108 _FakeSchemaLoader(None)) 109 self.assertEquals( 110 'std::string', 111 manager.GetCppType(self.font_settings.types['FakeStringType'])) 112 113 def testArrayAsType(self): 114 manager = CppTypeGenerator(self.models.get('browser_action'), 115 _FakeSchemaLoader(None)) 116 self.assertEquals( 117 'std::vector<int>', 118 manager.GetCppType(self.browser_action.types['ColorArray'])) 119 120 def testGetCppTypeArray(self): 121 manager = CppTypeGenerator(self.models.get('windows'), 122 _FakeSchemaLoader(None)) 123 self.assertEquals( 124 'std::vector<linked_ptr<Window> >', 125 manager.GetCppType( 126 self.windows.functions['getAll'].callback.params[0].type_)) 127 manager = CppTypeGenerator(self.models.get('permissions'), 128 _FakeSchemaLoader(None)) 129 self.assertEquals( 130 'std::vector<std::string>', 131 manager.GetCppType( 132 self.permissions.types['Permissions'].properties['origins'].type_)) 133 134 def testGetCppTypeLocalRef(self): 135 manager = CppTypeGenerator(self.models.get('tabs'), _FakeSchemaLoader(None)) 136 self.assertEquals( 137 'Tab', 138 manager.GetCppType(self.tabs.functions['get'].callback.params[0].type_)) 139 140 def testGetCppTypeIncludedRef(self): 141 m = model.Model() 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)) 145 self.assertEquals( 146 'std::vector<linked_ptr<tabs::Tab> >', 147 manager.GetCppType( 148 self.windows.types['Window'].properties['tabs'].type_)) 149 150 def testGetCppTypeWithPadForGeneric(self): 151 manager = CppTypeGenerator(self.models.get('permissions'), 152 _FakeSchemaLoader(None)) 153 self.assertEquals('std::vector<std::string>', 154 manager.GetCppType( 155 self.permissions.types['Permissions'].properties['origins'].type_, 156 is_in_container=False)) 157 self.assertEquals('linked_ptr<std::vector<std::string> >', 158 manager.GetCppType( 159 self.permissions.types['Permissions'].properties['origins'].type_, 160 is_in_container=True)) 161 self.assertEquals('bool', 162 manager.GetCppType( 163 self.permissions.functions['contains'].callback.params[0].type_, 164 is_in_container=True)) 165 166 if __name__ == '__main__': 167 unittest.main() 168