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 6import idl_schema 7import unittest 8 9def getFunction(schema, name): 10 for item in schema['functions']: 11 if item['name'] == name: 12 return item 13 raise KeyError('Missing function %s' % name) 14 15 16def getParams(schema, name): 17 function = getFunction(schema, name) 18 return function['parameters'] 19 20 21def getReturns(schema, name): 22 function = getFunction(schema, name) 23 return function['returns'] 24 25 26def getType(schema, id): 27 for item in schema['types']: 28 if item['id'] == id: 29 return item 30 31 32class IdlSchemaTest(unittest.TestCase): 33 def setUp(self): 34 loaded = idl_schema.Load('test/idl_basics.idl') 35 self.assertEquals(1, len(loaded)) 36 self.assertEquals('idl_basics', loaded[0]['namespace']) 37 self.idl_basics = loaded[0] 38 39 def testSimpleCallbacks(self): 40 schema = self.idl_basics 41 expected = [{'type':'function', 'name':'cb', 'parameters':[]}] 42 self.assertEquals(expected, getParams(schema, 'function4')) 43 44 expected = [{'type':'function', 'name':'cb', 45 'parameters':[{'name':'x', 'type':'integer'}]}] 46 self.assertEquals(expected, getParams(schema, 'function5')) 47 48 expected = [{'type':'function', 'name':'cb', 49 'parameters':[{'name':'arg', '$ref':'MyType1'}]}] 50 self.assertEquals(expected, getParams(schema, 'function6')) 51 52 def testCallbackWithArrayArgument(self): 53 schema = self.idl_basics 54 expected = [{'type':'function', 'name':'cb', 55 'parameters':[{'name':'arg', 'type':'array', 56 'items':{'$ref':'MyType2'}}]}] 57 self.assertEquals(expected, getParams(schema, 'function12')) 58 59 60 def testArrayOfCallbacks(self): 61 schema = idl_schema.Load('test/idl_callback_arrays.idl')[0] 62 expected = [{'type':'array', 'name':'callbacks', 63 'items':{'type':'function', 'name':'MyCallback', 64 'parameters':[{'type':'integer', 'name':'x'}]}}] 65 self.assertEquals(expected, getParams(schema, 'whatever')) 66 67 def testLegalValues(self): 68 self.assertEquals({ 69 'x': {'name': 'x', 'type': 'integer', 'enum': [1,2], 70 'description': 'This comment tests "double-quotes".'}, 71 'y': {'name': 'y', 'type': 'string'}, 72 'z': {'name': 'z', 'type': 'string'}, 73 'a': {'name': 'a', 'type': 'string'}, 74 'b': {'name': 'b', 'type': 'string'}, 75 'c': {'name': 'c', 'type': 'string'}}, 76 getType(self.idl_basics, 'MyType1')['properties']) 77 78 def testMemberOrdering(self): 79 self.assertEquals( 80 ['x', 'y', 'z', 'a', 'b', 'c'], 81 getType(self.idl_basics, 'MyType1')['properties'].keys()) 82 83 def testEnum(self): 84 schema = self.idl_basics 85 expected = {'enum': [{'name': 'name1', 'description': 'comment1'}, 86 {'name': 'name2'}], 87 'description': 'Enum description', 88 'type': 'string', 'id': 'EnumType'} 89 self.assertEquals(expected, getType(schema, expected['id'])) 90 91 expected = [{'name':'type', '$ref':'EnumType'}, 92 {'type':'function', 'name':'cb', 93 'parameters':[{'name':'type', '$ref':'EnumType'}]}] 94 self.assertEquals(expected, getParams(schema, 'function13')) 95 96 expected = [{'items': {'$ref': 'EnumType'}, 'name': 'types', 97 'type': 'array'}] 98 self.assertEquals(expected, getParams(schema, 'function14')) 99 100 def testNoCompile(self): 101 schema = self.idl_basics 102 func = getFunction(schema, 'function15') 103 self.assertTrue(func is not None) 104 self.assertTrue(func['nocompile']) 105 106 def testNoDocOnEnum(self): 107 schema = self.idl_basics 108 enum_with_nodoc = getType(schema, 'EnumTypeWithNoDoc') 109 self.assertTrue(enum_with_nodoc is not None) 110 self.assertTrue(enum_with_nodoc['nodoc']) 111 112 def testInternalNamespace(self): 113 idl_basics = self.idl_basics 114 self.assertEquals('idl_basics', idl_basics['namespace']) 115 self.assertTrue(idl_basics['internal']) 116 self.assertFalse(idl_basics['nodoc']) 117 118 def testReturnTypes(self): 119 schema = self.idl_basics 120 self.assertEquals({'name': 'function19', 'type': 'integer'}, 121 getReturns(schema, 'function19')) 122 self.assertEquals({'name': 'function20', '$ref': 'MyType1', 123 'optional': True}, 124 getReturns(schema, 'function20')) 125 self.assertEquals({'name': 'function21', 'type': 'array', 126 'items': {'$ref': 'MyType1'}}, 127 getReturns(schema, 'function21')) 128 self.assertEquals({'name': 'function22', '$ref': 'EnumType', 129 'optional': True}, 130 getReturns(schema, 'function22')) 131 self.assertEquals({'name': 'function23', 'type': 'array', 132 'items': {'$ref': 'EnumType'}}, 133 getReturns(schema, 'function23')) 134 135 def testChromeOSPlatformsNamespace(self): 136 schema = idl_schema.Load('test/idl_namespace_chromeos.idl')[0] 137 self.assertEquals('idl_namespace_chromeos', schema['namespace']) 138 expected = ['chromeos'] 139 self.assertEquals(expected, schema['platforms']) 140 141 def testAllPlatformsNamespace(self): 142 schema = idl_schema.Load('test/idl_namespace_all_platforms.idl')[0] 143 self.assertEquals('idl_namespace_all_platforms', schema['namespace']) 144 expected = ['chromeos', 'chromeos_touch', 'linux', 'mac', 'win'] 145 self.assertEquals(expected, schema['platforms']) 146 147 def testNonSpecificPlatformsNamespace(self): 148 schema = idl_schema.Load('test/idl_namespace_non_specific_platforms.idl')[0] 149 self.assertEquals('idl_namespace_non_specific_platforms', 150 schema['namespace']) 151 expected = None 152 self.assertEquals(expected, schema['platforms']) 153 154 def testSpecificImplementNamespace(self): 155 schema = idl_schema.Load('test/idl_namespace_specific_implement.idl')[0] 156 self.assertEquals('idl_namespace_specific_implement', 157 schema['namespace']) 158 expected = 'idl_namespace_specific_implement.idl' 159 self.assertEquals(expected, schema['compiler_options']['implemented_in']) 160 161 def testSpecificImplementOnChromeOSNamespace(self): 162 schema = idl_schema.Load( 163 'test/idl_namespace_specific_implement_chromeos.idl')[0] 164 self.assertEquals('idl_namespace_specific_implement_chromeos', 165 schema['namespace']) 166 expected_implemented_path = 'idl_namespace_specific_implement_chromeos.idl' 167 expected_platform = ['chromeos'] 168 self.assertEquals(expected_implemented_path, 169 schema['compiler_options']['implemented_in']) 170 self.assertEquals(expected_platform, schema['platforms']) 171 172 def testCallbackComment(self): 173 schema = self.idl_basics 174 self.assertEquals('A comment on a callback.', 175 getParams(schema, 'function16')[0]['description']) 176 self.assertEquals( 177 'A parameter.', 178 getParams(schema, 'function16')[0]['parameters'][0]['description']) 179 self.assertEquals( 180 'Just a parameter comment, with no comment on the callback.', 181 getParams(schema, 'function17')[0]['parameters'][0]['description']) 182 self.assertEquals( 183 'Override callback comment.', 184 getParams(schema, 'function18')[0]['description']) 185 186 def testFunctionComment(self): 187 schema = self.idl_basics 188 func = getFunction(schema, 'function3') 189 self.assertEquals(('This comment should appear in the documentation, ' 190 'despite occupying multiple lines.'), 191 func['description']) 192 self.assertEquals( 193 [{'description': ('So should this comment about the argument. ' 194 '<em>HTML</em> is fine too.'), 195 'name': 'arg', 196 '$ref': 'MyType1'}], 197 func['parameters']) 198 func = getFunction(schema, 'function4') 199 self.assertEquals(('This tests if "double-quotes" are escaped correctly.' 200 '<br/><br/> It also tests a comment with two newlines.'), 201 func['description']) 202 203 def testReservedWords(self): 204 schema = idl_schema.Load('test/idl_reserved_words.idl')[0] 205 206 foo_type = getType(schema, 'Foo') 207 self.assertEquals([{'name': 'float'}, {'name': 'DOMString'}], 208 foo_type['enum']) 209 210 enum_type = getType(schema, 'enum') 211 self.assertEquals([{'name': 'callback'}, {'name': 'namespace'}], 212 enum_type['enum']) 213 214 dictionary = getType(schema, 'dictionary') 215 self.assertEquals('integer', dictionary['properties']['long']['type']) 216 217 mytype = getType(schema, 'MyType') 218 self.assertEquals('string', mytype['properties']['interface']['type']) 219 220 params = getParams(schema, 'static') 221 self.assertEquals('Foo', params[0]['$ref']) 222 self.assertEquals('enum', params[1]['$ref']) 223 224 225if __name__ == '__main__': 226 unittest.main() 227