123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #!/usr/bin/env python
- #
- # Copyright 2009 The Closure Library Authors. All Rights Reserved.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS-IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- """Unit test for depstree."""
- __author__ = 'nnaze@google.com (Nathan Naze)'
- import unittest
- import depstree
- def _GetProvides(sources):
- """Get all namespaces provided by a collection of sources."""
- provides = set()
- for source in sources:
- provides.update(source.provides)
- return provides
- class MockSource(object):
- """Mock Source file."""
- def __init__(self, provides, requires):
- self.provides = set(provides)
- self.requires = set(requires)
- def __repr__(self):
- return 'MockSource %s' % self.provides
- class DepsTreeTestCase(unittest.TestCase):
- """Unit test for DepsTree. Tests several common situations and errors."""
- def AssertValidDependencies(self, deps_list):
- """Validates a dependency list.
- Asserts that a dependency list is valid: For every source in the list,
- ensure that every require is provided by a source earlier in the list.
- Args:
- deps_list: A list of sources that should be in dependency order.
- """
- for i in range(len(deps_list)):
- source = deps_list[i]
- previous_provides = _GetProvides(deps_list[:i])
- for require in source.requires:
- self.assertTrue(
- require in previous_provides,
- 'Namespace "%s" not provided before required by %s' % (
- require, source))
- def testSimpleDepsTree(self):
- a = MockSource(['A'], ['B', 'C'])
- b = MockSource(['B'], [])
- c = MockSource(['C'], ['D'])
- d = MockSource(['D'], ['E'])
- e = MockSource(['E'], [])
- tree = depstree.DepsTree([a, b, c, d, e])
- self.AssertValidDependencies(tree.GetDependencies('A'))
- self.AssertValidDependencies(tree.GetDependencies('B'))
- self.AssertValidDependencies(tree.GetDependencies('C'))
- self.AssertValidDependencies(tree.GetDependencies('D'))
- self.AssertValidDependencies(tree.GetDependencies('E'))
- def testCircularDependency(self):
- # Circular deps
- a = MockSource(['A'], ['B'])
- b = MockSource(['B'], ['C'])
- c = MockSource(['C'], ['A'])
- tree = depstree.DepsTree([a, b, c])
- self.assertRaises(depstree.CircularDependencyError,
- tree.GetDependencies, 'A')
- def testRequiresUndefinedNamespace(self):
- a = MockSource(['A'], ['B'])
- b = MockSource(['B'], ['C'])
- c = MockSource(['C'], ['D']) # But there is no D.
- def MakeDepsTree():
- return depstree.DepsTree([a, b, c])
- self.assertRaises(depstree.NamespaceNotFoundError, MakeDepsTree)
- def testDepsForMissingNamespace(self):
- a = MockSource(['A'], ['B'])
- b = MockSource(['B'], [])
- tree = depstree.DepsTree([a, b])
- # There is no C.
- self.assertRaises(depstree.NamespaceNotFoundError,
- tree.GetDependencies, 'C')
- def testMultipleRequires(self):
- a = MockSource(['A'], ['B'])
- b = MockSource(['B'], ['C'])
- c = MockSource(['C'], [])
- d = MockSource(['D'], ['B'])
- tree = depstree.DepsTree([a, b, c, d])
- self.AssertValidDependencies(tree.GetDependencies(['D', 'A']))
- if __name__ == '__main__':
- unittest.main()
|