blob: e6d65af4c81c4218272ccd19b1c536701d5e6682 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2013 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.
import unittest
from api_schema_graph import APISchemaGraph, LookupResult
API_SCHEMA = [{
'namespace': 'tabs',
'properties': {
'lowercase': {
'properties': {
'one': { 'value': 1 },
'two': { 'description': 'just as bad as one' }
}
},
'TAB_PROPERTY_ONE': { 'value': 'magic' },
'TAB_PROPERTY_TWO': {}
},
'types': [
{
'id': 'Tab',
'properties': {
'id': {},
'url': {}
}
}
],
'functions': [
{
'name': 'get',
'parameters': [ { 'name': 'tab',
'type': 'object',
'description': 'gets stuff, never complains'
},
{ 'name': 'tabId' }
]
}
],
'events': [
{
'name': 'onActivated',
'parameters': [ {'name': 'activeInfo'} ]
},
{
'name': 'onUpdated',
'parameters': [ {'name': 'updateInfo'} ]
}
]
}]
class APISchemaGraphTest(unittest.TestCase):
def testLookup(self):
self._testAPISchema(APISchemaGraph(API_SCHEMA))
def testIsEmpty(self):
# A few assertions to make sure that Lookup works on empty sets.
empty_graph = APISchemaGraph({})
self.assertTrue(empty_graph.IsEmpty())
self.assertEqual(LookupResult(False, None),
empty_graph.Lookup('tabs', 'properties',
'TAB_PROPERTY_ONE'))
self.assertEqual(LookupResult(False, None),
empty_graph.Lookup('tabs', 'functions', 'get',
'parameters', 'tab'))
self.assertEqual(LookupResult(False, None),
empty_graph.Lookup('tabs', 'functions', 'get',
'parameters', 'tabId'))
self.assertEqual(LookupResult(False, None),
empty_graph.Lookup('tabs', 'events', 'onActivated',
'parameters', 'activeInfo'))
self.assertEqual(LookupResult(False, None),
empty_graph.Lookup('tabs', 'events', 'onUpdated',
'parameters', 'updateInfo'))
def testSubtractEmpty(self):
self._testAPISchema(
APISchemaGraph(API_SCHEMA).Subtract(APISchemaGraph({})))
def _testAPISchema(self, api_schema_graph):
self.assertEqual(LookupResult(True, None),
api_schema_graph.Lookup('tabs', 'properties',
'TAB_PROPERTY_ONE'))
self.assertEqual(LookupResult(True, None),
api_schema_graph.Lookup('tabs', 'types', 'Tab'))
self.assertEqual(LookupResult(True, None),
api_schema_graph.Lookup('tabs', 'functions', 'get',
'parameters', 'tab'))
self.assertEqual(LookupResult(True, None),
api_schema_graph.Lookup('tabs', 'functions', 'get',
'parameters', 'tabId'))
self.assertEqual(LookupResult(True, None),
api_schema_graph.Lookup('tabs', 'functions', 'get',
'parameters', 'tab', 'type'))
self.assertEqual(LookupResult(True, None),
api_schema_graph.Lookup('tabs', 'events',
'onActivated', 'parameters',
'activeInfo'))
self.assertEqual(LookupResult(True, None),
api_schema_graph.Lookup('tabs', 'events', 'onUpdated',
'parameters', 'updateInfo'))
self.assertEqual(LookupResult(True, None),
api_schema_graph.Lookup('tabs', 'properties',
'lowercase', 'properties',
'one', 'value'))
self.assertEqual(LookupResult(True, None),
api_schema_graph.Lookup('tabs', 'properties',
'lowercase', 'properties',
'two', 'description'))
self.assertEqual(LookupResult(False, None),
api_schema_graph.Lookup('windows'))
self.assertEqual(LookupResult(False, None),
api_schema_graph.Lookup('tabs', 'properties',
'TAB_PROPERTY_DEUX'))
self.assertEqual(LookupResult(False, None),
api_schema_graph.Lookup('tabs', 'events', 'onActivated',
'parameters', 'callback'))
self.assertEqual(LookupResult(False, None),
api_schema_graph.Lookup('tabs', 'functions', 'getById',
'parameters', 'tab'))
self.assertEqual(LookupResult(False, None),
api_schema_graph.Lookup('tabs', 'functions', 'get',
'parameters', 'type'))
self.assertEqual(LookupResult(False, None),
api_schema_graph.Lookup('tabs', 'properties',
'lowercase', 'properties',
'two', 'value'))
def testSubtractSelf(self):
self.assertTrue(
APISchemaGraph(API_SCHEMA).Subtract(APISchemaGraph(API_SCHEMA))
.IsEmpty())
def testSubtractDisjointSet(self):
difference = APISchemaGraph(API_SCHEMA).Subtract(APISchemaGraph({
'contextMenus': {
'properties': {
'CONTEXT_MENU_PROPERTY_ONE': {}
},
'types': {
'Menu': {
'properties': {
'id': {},
'width': {}
}
}
},
'functions': {
'get': {
'parameters': {
'callback': {}
}
}
},
'events': {
'onClicked': {
'parameters': {
'clickInfo': {}
}
},
'onUpdated': {
'parameters': {
'updateInfo': {}
}
}
}
}
}))
self.assertEqual(LookupResult(True, None),
difference.Lookup('tabs', 'properties',
'TAB_PROPERTY_ONE'))
self.assertEqual(LookupResult(True, None),
difference.Lookup('tabs', 'functions', 'get',
'parameters', 'tab'))
self.assertEqual(LookupResult(True, None),
difference.Lookup('tabs', 'events', 'onUpdated',
'parameters', 'updateInfo'))
self.assertEqual(LookupResult(True, None),
difference.Lookup('tabs', 'functions', 'get',
'parameters', 'tabId'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('contextMenus', 'properties',
'CONTEXT_MENU_PROPERTY_ONE'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('contextMenus', 'types', 'Menu'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('contextMenus', 'types', 'Menu',
'properties', 'id'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('contextMenus', 'functions'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('contextMenus', 'events', 'onClicked',
'parameters', 'clickInfo'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('contextMenus', 'events', 'onUpdated',
'parameters', 'updateInfo'))
def testSubtractSubset(self):
difference = APISchemaGraph(API_SCHEMA).Subtract(APISchemaGraph({
'tabs': {
'properties': {
'TAB_PROPERTY_ONE': { 'value': {} }
},
'functions': {
'get': {
'parameters': {
'tab': { 'name': {},
'type': {},
'description': {}
}
}
}
},
'events': {
'onUpdated': {
'parameters': {
'updateInfo': {
'name': {},
'properties': {
'tabId': {}
}
}
}
}
}
}
}))
self.assertEqual(LookupResult(True, None),
difference.Lookup('tabs'))
self.assertEqual(LookupResult(True, None),
difference.Lookup('tabs', 'properties',
'TAB_PROPERTY_TWO'))
self.assertEqual(LookupResult(True, None),
difference.Lookup('tabs', 'properties', 'lowercase',
'properties', 'two', 'description'))
self.assertEqual(LookupResult(True, None),
difference.Lookup('tabs', 'types', 'Tab', 'properties',
'url'))
self.assertEqual(LookupResult(True, None),
difference.Lookup('tabs', 'events', 'onActivated',
'parameters', 'activeInfo'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'events', 'onUpdated',
'parameters', 'updateInfo'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'properties',
'TAB_PROPERTY_ONE'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'properties',
'TAB_PROPERTY_ONE', 'value'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'functions', 'get',
'parameters', 'tab'))
def testSubtractSuperset(self):
difference = APISchemaGraph(API_SCHEMA).Subtract(APISchemaGraph({
'tabs': {
'namespace': {},
'properties': {
'lowercase': {
'properties': {
'one': { 'value': {} },
'two': { 'description': {} }
}
},
'TAB_PROPERTY_ONE': { 'value': {} },
'TAB_PROPERTY_TWO': {},
'TAB_PROPERTY_THREE': {}
},
'types': {
'Tab': {
'id': {},
'properties': {
'id': {},
'url': {}
}
},
'UpdateInfo': {}
},
'functions': {
'get': {
'name': {},
'parameters': {
'tab': { 'name': {},
'type': {},
'description': {}
},
'tabId': { 'name': {} }
}
},
'getById': {
'parameters': {
'tabId': {}
}
}
},
'events': {
'onActivated': {
'name': {},
'parameters': {
'activeInfo': { 'name': {} }
}
},
'onUpdated': {
'name': {},
'parameters': {
'updateInfo': { 'name': {} }
}
},
'onClicked': {
'name': {},
'parameters': {
'clickInfo': {}
}
}
}
}
}))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'properties',
'TAB_PROPERTY_TWO'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'properties'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'types', 'Tab', 'properties',
'url'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'types', 'Tab', 'properties',
'id'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'events', 'onUpdated',
'parameters', 'updateInfo'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'properties',
'TAB_PROPERTY_ONE'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('tabs', 'functions', 'get',
'parameters', 'tabId'))
self.assertEqual(LookupResult(False, None),
difference.Lookup('events', 'onUpdated', 'parameters',
'updateInfo'))
def testUpdate(self):
result = APISchemaGraph(API_SCHEMA)
to_add = APISchemaGraph({
'tabs': {
'properties': {
'TAB_PROPERTY_THREE': { 'description': 'better than two' },
'TAB_PROPERTY_FOUR': { 'value': 4 }
},
'functions': {
'get': {
'name': {},
'parameters': {
'tab': {
'type': {},
'name': {},
'description': {},
'surprise': {}
}
}
},
'getAllInWindow': {
'parameters': {
'windowId': { 'type': 'object' }
}
}
}
}
})
result.Update(to_add, lambda _: 'first')
# Looking up elements that were originally available in |result|. Because
# of this, no |annotation| object should be attached to the LookupResult
# object.
self.assertEqual(LookupResult(True, None),
result.Lookup('tabs'))
self.assertEqual(LookupResult(True, None),
result.Lookup('tabs', 'functions', 'get',
'parameters'))
self.assertEqual(LookupResult(True, None),
result.Lookup('tabs', 'properties',
'TAB_PROPERTY_ONE'))
self.assertEqual(LookupResult(True, None),
result.Lookup('tabs', 'properties',
'TAB_PROPERTY_ONE'))
self.assertEqual(LookupResult(True, None),
result.Lookup('tabs', 'functions', 'get',
'parameters', 'tabId'))
# Looking up elements that were just added to |result|.
self.assertEqual(LookupResult(True, 'first'),
result.Lookup('tabs', 'properties',
'TAB_PROPERTY_THREE'))
self.assertEqual(LookupResult(True, 'first'),
result.Lookup('tabs', 'properties',
'TAB_PROPERTY_FOUR'))
self.assertEqual(LookupResult(True, 'first'),
result.Lookup('tabs', 'functions', 'getAllInWindow',
'parameters', 'windowId'))
self.assertEqual(LookupResult(True, 'first'),
result.Lookup('tabs', 'functions', 'get', 'parameters',
'tab', 'surprise'))
to_add = APISchemaGraph({
'tabs': {
'properties': {
'TAB_PROPERTY_FIVE': { 'description': 'stayin\' alive' }
},
'functions': {
'getAllInWindow': {
'parameters': {
'callback': { 'type': 'function' }
}
}
}
}
})
result.Update(to_add, lambda _: 'second')
# Looking up the second group of elements added to |result|.
self.assertEqual(LookupResult(True, 'first'),
result.Lookup('tabs', 'properties',
'TAB_PROPERTY_FOUR'))
self.assertEqual(LookupResult(True, 'second'),
result.Lookup('tabs', 'properties',
'TAB_PROPERTY_FIVE'))
self.assertEqual(LookupResult(True, 'first'),
result.Lookup('tabs', 'functions',
'getAllInWindow', 'parameters',
'windowId'))
self.assertEqual(LookupResult(True, 'second'),
result.Lookup('tabs', 'functions',
'getAllInWindow', 'parameters',
'callback'))
self.assertEqual(LookupResult(True, 'first'),
result.Lookup('tabs', 'functions',
'getAllInWindow'))
if __name__ == '__main__':
unittest.main()