реализовал класс узла для графа зависимостей. Написал тест разрешения зависимостей для односвязанного графа

This commit is contained in:
rzaitov 2013-11-11 14:21:03 +04:00
parent 5293ab0aab
commit f415ff5df5
5 changed files with 83 additions and 0 deletions

View File

@ -0,0 +1,38 @@
class DependencyResolver:
def __init__(self):
pass
def resolve(self, unresolved):
assert unresolved is not None
resolved = []
while len(unresolved) > 0:
node = unresolved[0]
self.resolveNode(node, resolved, unresolved, [])
return resolved
def resolveNode(self, node, resolved, unresolved, seen):
assert node is not None
assert resolved is not None
assert seen is not None
seen.append(node)
for dependency in node.edges:
if dependency not in resolved:
self.guardNotCircularReference(node, dependency, seen)
self.resolveNode(dependency, resolved, unresolved, seen)
resolved.append(node)
unresolved.remove(node)
seen.remove(node)
def guardNotCircularReference(self, start, dependency, seen):
assert start is not None
assert dependency is not None
assert seen is not None
if dependency in seen:
raise Exception('Circular reference detected: {0} -> {1}'.format(start.name, dependency.name))

View File

@ -0,0 +1,12 @@
class Node:
def __init__(self, name):
assert name is not None
self.name = name
self.edges = []
def addEdge(self, node):
assert node is not None
assert node not in self.edges
self.edges.append(node)

View File

@ -0,0 +1 @@
__author__ = 'rzaitov'

View File

@ -0,0 +1 @@
__author__ = 'rzaitov'

View File

@ -0,0 +1,31 @@
import unittest
from Core.DependencyResolver.DependencyResolver import DependencyResolver
from Core.DependencyResolver.Node import Node
class TestDependencyResolver(unittest.TestCase):
def setUp(self):
self.resolver = DependencyResolver()
def test_OneConnectedness(self):
node1 = Node('node1')
node2 = Node('node2')
node3 = Node('node3')
node3.addEdge(node1)
node3.addEdge(node2)
node4 = Node('node4')
node4.addEdge(node3)
node4.addEdge(node1)
unresolved = [node4, node3, node2, node1]
resolved = self.resolver.resolve(unresolved)
self.assertEqual(4, len(resolved))
self.assertEqual(node1, resolved[0])
self.assertEqual(node2, resolved[1])
self.assertEqual(node3, resolved[2])
self.assertEqual(node4, resolved[3])