import unittest
import sys
sys.path.append('../../')
from fluents import annotations

class AnnotationsTest(unittest.TestCase):

    def setUp(self):
        pass

    def testAddAnnotations(self):
        h = annotations.DictAnnotationHandler()
        annotations.set_dim_handler('go-terms', h)
        assert annotations.get_dim_handler('go-terms') == h
        assert annotations.get_dim_handler('foobar') == None

    def testGetDimAnnotations(self):
        h = annotations.DictAnnotationHandler()
        annotations.set_dim_handler('go-terms', h)
        d = {'GO:0': 'biological_process',
             'GO:1': 'foo',
             'GO:2': 'bar'}
        h.add_annotations('name', d)
        
        ann0 = annotations.get_dim_annotations('go-terms', 'name', [])
        assert ann0 == []

        ann1 = annotations.get_dim_annotations('go-terms', 'name', ['GO:0'])
        assert len(ann1) == 1
        assert ann1[0] == 'biological_process'

        ann2 = annotations.get_dim_annotations('go-terms', 'name', ['GO:1', 'baz'])
        assert len(ann2) == 2
        assert ann2 == ['foo', None]

    def testDictAnnotationHandler(self):
        h = annotations.DictAnnotationHandler()
        annotations.set_dim_handler('go-terms', h)
        d = {'GO:0': 'biological_process',
             'GO:1': 'foo',
             'GO:2': 'bar'}
        h.add_annotations('name', d)
        
        ann0 = h.get_annotations('name', [])
        assert ann0 == []
        
        ann1 = h.get_annotations('name', ['unexisting'])
        assert ann1 == [None]
        
        ann2 = h.get_annotations('name', ['unexisting'], 42)
        assert ann2 == [42]

        assert h.get_annotation_names() == ['name']

    def testReadAnnotationsFile(self):
        ann = annotations.read_annotations_file('../data/annotations.fann')
        assert ann != None
        assert ann == annotations.get_dim_handler('dim1')
        assert 'Ann1' in ann.get_annotation_names()
        assert 'Ann2' in ann.get_annotation_names()
        assert not ('Ann3' in ann.get_annotation_names())
        assert annotations.get_dim_annotations('dim1', 'Ann1', ['id1']) == ['11']

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