#! /usr/bin/env python
from nexson import NexsonProxy
from nexson.test.support.pathmap import get_test_path_mapper
import unittest

pathmap = get_test_path_mapper()

class TestProxy(unittest.TestCase):
    def setUp(self):
        blob = pathmap.nexson_obj('9/v1.2.json')
        self.np = NexsonProxy(nexson=blob)

    def testGetters(self):
        self.assertIs(self.np.get_tree('bogus'), None)
        self.assertIsNot(self.np.get_tree('tree1'), None)
        self.assertIs(self.np.get_tree('otu123'), None)
        self.assertIs(self.np.get_otu('bogus'), None)
        self.assertIs(self.np.get_otu('tree1'), None)
        self.assertIsNot(self.np.get_otu('otu123'), None)

    def testCaching(self):
        f = self.np.get_tree('tree1')
        s = self.np.get_tree('tree1')
        self.assertIs(f, s)
        fn = f.get_node('node247')
        sn = s.get_node('node247')
        self.assertIs(fn, sn)
        fo = self.np.get_otu('otu123')
        so = sn.otu
        self.assertIs(fo, so)

    def testTreeIter(self):
        ntp = self.np.get_tree('tree1')
        nbi = ntp['nodeById']
        ebi = ntp['edgeBySourceId']
        ks = set(nbi.keys())
        its = set()
        edge_less = None
        for node in ntp:
            its.add(node.node_id)
            self.assertIs(node.node, nbi[node.node_id])
            if node.edge is None:
                self.assertIs(edge_less, None)
                edge_less = node.node_id
            else:
                s = node.edge['@source']
                ed = ebi[s]
                self.assertIs(node.edge, ed[node.edge_id])
        self.assertEqual(ntp['^ot:rootNodeId'], edge_less)
        self.assertEqual(ks, its)


if __name__ == "__main__":
    unittest.main()
