https://github.com/fenderglass/Ragout
Tip revision: d3f213f733f5d80a62f00d4967b26edb7a06ba72 authored by Mikhail Kolmogorov on 22 March 2015, 19:11:36 UTC
1.1 release
1.1 release
Tip revision: d3f213f
treetest.py
import unittest
import lexer
import parser
from tree import *
from tree import _TreeBuilder
class BuilderTest(unittest.TestCase):
''' Test of the _TreeBuilder (and Leaf and Tree) class. '''
def testTreeBuilding(self):
''' Test that the tree builder constructs trees correctly when
parsed. '''
l = lexer.Lexer("(('foo' : 0.1, 'bar' : 1.0) : 2, baz)")
handler = _TreeBuilder()
p = parser._Parser(l,handler)
p.parse()
t = handler.get_result()
self.assertEqual(len(t.get_edges()),2)
(t1,b1,l1), (t2,b2,l2) = t.get_edges()
self.assertEqual(len(t1.get_edges()),2)
self.assertEqual(l1, 2.0)
self.assertEqual(t2.__class__, Leaf)
self.assertEqual(l2, None)
self.assertEqual(t.leaves_identifiers, ['foo','bar','baz'])
class TestParseTree(unittest.TestCase):
''' Test of the parse_tree() function. '''
def testTreeStructure(self):
''' Test that a parsed tree has the right structure. '''
t = parse_tree("(('foo' : 0.1, 'bar' : 1.0) : 2, baz)")
self.assertEqual(len(t.get_edges()),2)
(t1,b1,l1), (t2,b2,l2) = t.get_edges()
self.assertEqual(len(t1.get_edges()),2)
self.assertEqual(l1, 2.0)
self.assertEqual(t2.__class__, Leaf)
self.assertEqual(l2, None)
self.assertEqual(t.leaves_identifiers, ['foo','bar','baz'])
def testSpecialCases(self):
''' Test that we can parse some special cases of trees. '''
tree = parse_tree("(B,(A,C,E),D);")
self.assertEqual(tree.leaves_identifiers,['B','A','C','E','D'])
tree = parse_tree("(,(,,),);")
self.assertEqual(tree.leaves_identifiers,['']*5)
# underscores are considered empty leaf names!
tree = parse_tree("(_,(_,_,_),_);")
self.assertEqual(tree.leaves_identifiers,['']*5)
# the rest is just checking that we do not crash on this input...
parse_tree("""
(
('Chimp':0.052625,
'Human':0.042375):0.007875,
'Gorilla':0.060125,
('Gibbon':0.124833,
'Orangutan':0.0971667):0.038875
);
""")
parse_tree("""
(
('Chimp':0.052625,
'Human':0.042375) 0.71 : 0.007875,
'Gorilla':0.060125,
('Gibbon':0.124833,
'Orangutan':0.0971667) 1.00 :0.038875
);
""")
class TreeTest(unittest.TestCase):
''' Test of the Tree (and Leaf and _TreeBuilder) class. '''
def testProperties(self):
''' Test that the tree properties lets us extract the right
information. '''
t = parse_tree('((A,B),C);')
self.assertEqual(t.leaves_identifiers, ['A','B','C'])
self.assertNotEqual(t.leaves, ['A','B','C'])
self.assertEqual(len(t.edges), 2)
(n1,_,_), (n2,_,_) = t.edges
self.assertEqual(type(n1), Tree)
self.assertEqual(type(n2), Leaf)
self.assertEqual(n2.identifier, 'C')
class TestFunctions(unittest.TestCase):
''' Test of the module-level functions. '''
def testAddParentLink(self):
''' Test the add_parent_links() function. '''
t = parse_tree('((A,B),C);')
add_parent_links(t)
self.assertEqual([str(l.parent) for l in t.leaves],
["('A', 'B')", "('A', 'B')", "(('A', 'B'), 'C')"])
def testLabel(self):
''' Test if trees with labels are parsed correctly. '''
t = parse_tree("(('A', 'B')label, 'C')")
self.assertEqual(str(t), "(('A', 'B')label, 'C')")
t = parse_tree("(('A', 'B')label, 'C')treelabel")
self.assertEqual(t.identifier, "treelabel")
t = parse_tree("(('A', 'B')label, 'C')1")
self.assertEqual(t.identifier, "1")
def testAddDistanceFromRoot(self):
''' Test the add_distance_from_root() function. '''
t = parse_tree('((A,B),C);')
add_distance_from_root(t)
self.assertEqual([l.distance_from_root for l in t.leaves],[0,0,0])
t = parse_tree('((A:2,B:3):1,C:6);')
add_distance_from_root(t)
self.assertEqual([l.distance_from_root for l in t.leaves],[3,4,6])
test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(BuilderTest))
test_suite.addTest(unittest.makeSuite(TestParseTree))
test_suite.addTest(unittest.makeSuite(TreeTest))
test_suite.addTest(unittest.makeSuite(TestFunctions))
if __name__ == '__main__':
unittest.TextTestRunner(verbosity=2).run(test_suite)
# from tree import TreeVisitor
# def relabel(tree):
# "Relabel the tree's leaves."
# # visitor pattern.
# class V(TreeVisitor):
# def __init__(self):
# self.count = 0
# def visit_leaf(self,leaf):
# leaf.identifier = str(self.count)
# self.count += 1
# # let visitor traverse tree
# tree.dfs_traverse(V())
#
# relabel(t)
# print t