summaryrefslogtreecommitdiff
path: root/test/base/test_dependency.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2009-06-10 21:18:24 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2009-06-10 21:18:24 +0000
commit45cec095b4904ba71425d2fe18c143982dd08f43 (patch)
treeaf5e540fdcbf1cb2a3337157d69d4b40be010fa8 /test/base/test_dependency.py
parent698a3c1ac665e7cd2ef8d5ad3ebf51b7fe6661f4 (diff)
downloadsqlalchemy-45cec095b4904ba71425d2fe18c143982dd08f43.tar.gz
- unit tests have been migrated from unittest to nose.
See README.unittests for information on how to run the tests. [ticket:970]
Diffstat (limited to 'test/base/test_dependency.py')
-rw-r--r--test/base/test_dependency.py186
1 files changed, 186 insertions, 0 deletions
diff --git a/test/base/test_dependency.py b/test/base/test_dependency.py
new file mode 100644
index 000000000..0457d552a
--- /dev/null
+++ b/test/base/test_dependency.py
@@ -0,0 +1,186 @@
+import sqlalchemy.topological as topological
+from sqlalchemy.test import TestBase
+
+
+class DependencySortTest(TestBase):
+ def assert_sort(self, tuples, node, collection=None):
+ print str(node)
+ def assert_tuple(tuple, node):
+ if node[1]:
+ cycles = node[1]
+ else:
+ cycles = []
+ if tuple[0] is node[0] or tuple[0] in cycles:
+ tuple.pop()
+ if tuple[0] is node[0] or tuple[0] in cycles:
+ return
+ elif len(tuple) > 1 and tuple[1] is node[0]:
+ assert False, "Tuple not in dependency tree: " + str(tuple) + " " + str(node)
+ for c in node[2]:
+ assert_tuple(tuple, c)
+
+ for tuple in tuples:
+ assert_tuple(list(tuple), node)
+
+ if collection is None:
+ collection = set()
+ items = set()
+ def assert_unique(n):
+ for item in [i for i in n[1] or [n[0]]]:
+ assert item not in items, node
+ items.add(item)
+ if item in collection:
+ collection.remove(item)
+ for item in n[2]:
+ assert_unique(item)
+ assert_unique(node)
+ assert len(collection) == 0
+
+ def testsort(self):
+ rootnode = 'root'
+ node2 = 'node2'
+ node3 = 'node3'
+ node4 = 'node4'
+ subnode1 = 'subnode1'
+ subnode2 = 'subnode2'
+ subnode3 = 'subnode3'
+ subnode4 = 'subnode4'
+ subsubnode1 = 'subsubnode1'
+ tuples = [
+ (subnode3, subsubnode1),
+ (node2, subnode1),
+ (node2, subnode2),
+ (rootnode, node2),
+ (rootnode, node3),
+ (rootnode, node4),
+ (node4, subnode3),
+ (node4, subnode4)
+ ]
+ head = topological.sort_as_tree(tuples, [])
+ self.assert_sort(tuples, head)
+
+ def testsort2(self):
+ node1 = 'node1'
+ node2 = 'node2'
+ node3 = 'node3'
+ node4 = 'node4'
+ node5 = 'node5'
+ node6 = 'node6'
+ node7 = 'node7'
+ tuples = [
+ (node1, node2),
+ (node3, node4),
+ (node4, node5),
+ (node5, node6),
+ (node6, node2)
+ ]
+ head = topological.sort_as_tree(tuples, [node7])
+ self.assert_sort(tuples, head, [node7])
+
+ def testsort3(self):
+ ['Mapper|Keyword|keywords,Mapper|IKAssociation|itemkeywords', 'Mapper|Item|items,Mapper|IKAssociation|itemkeywords']
+ node1 = 'keywords'
+ node2 = 'itemkeyowrds'
+ node3 = 'items'
+ tuples = [
+ (node1, node2),
+ (node3, node2),
+ (node1,node3)
+ ]
+ head1 = topological.sort_as_tree(tuples, [node1, node2, node3])
+ head2 = topological.sort_as_tree(tuples, [node3, node1, node2])
+ head3 = topological.sort_as_tree(tuples, [node3, node2, node1])
+
+ # TODO: figure out a "node == node2" function
+ #self.assert_(str(head1) == str(head2) == str(head3))
+ print "\n" + str(head1)
+ print "\n" + str(head2)
+ print "\n" + str(head3)
+
+ def testsort4(self):
+ node1 = 'keywords'
+ node2 = 'itemkeyowrds'
+ node3 = 'items'
+ node4 = 'hoho'
+ tuples = [
+ (node1, node2),
+ (node4, node1),
+ (node1, node3),
+ (node3, node2)
+ ]
+ head = topological.sort_as_tree(tuples, [])
+ self.assert_sort(tuples, head)
+
+ def testsort5(self):
+ # this one, depenending on the weather,
+ node1 = 'node1' #'00B94190'
+ node2 = 'node2' #'00B94990'
+ node3 = 'node3' #'00B9A9B0'
+ node4 = 'node4' #'00B4F210'
+ tuples = [
+ (node4, node1),
+ (node1, node2),
+ (node4, node3),
+ (node2, node3),
+ (node4, node2),
+ (node3, node3)
+ ]
+ allitems = [
+ node1,
+ node2,
+ node3,
+ node4
+ ]
+ head = topological.sort_as_tree(tuples, allitems, with_cycles=True)
+ self.assert_sort(tuples, head)
+
+ def testcircular(self):
+ node1 = 'node1'
+ node2 = 'node2'
+ node3 = 'node3'
+ node4 = 'node4'
+ node5 = 'node5'
+ tuples = [
+ (node4, node5),
+ (node5, node4),
+ (node1, node2),
+ (node2, node3),
+ (node3, node1),
+ (node4, node1)
+ ]
+ allitems = [node1, node2, node3, node4]
+ head = topological.sort_as_tree(tuples, allitems, with_cycles=True)
+ self.assert_sort(tuples, head)
+
+ def testcircular2(self):
+ # this condition was arising from ticket:362
+ # and was not treated properly by topological sort
+ node1 = 'node1'
+ node2 = 'node2'
+ node3 = 'node3'
+ node4 = 'node4'
+ tuples = [
+ (node1, node2),
+ (node3, node1),
+ (node2, node4),
+ (node3, node2),
+ (node2, node3)
+ ]
+ head = topological.sort_as_tree(tuples, [], with_cycles=True)
+ self.assert_sort(tuples, head)
+
+ def testcircular3(self):
+ question, issue, providerservice, answer, provider = "Question", "Issue", "ProviderService", "Answer", "Provider"
+
+ tuples = [(question, issue), (providerservice, issue), (provider, question), (question, provider), (providerservice, question), (provider, providerservice), (question, answer), (issue, question)]
+
+ head = topological.sort_as_tree(tuples, [], with_cycles=True)
+ self.assert_sort(tuples, head)
+
+ def testbigsort(self):
+ tuples = []
+ for i in range(0,1500, 2):
+ tuples.append((i, i+1))
+ head = topological.sort_as_tree(tuples, [])
+
+