import unittest

from core.ConfigurationManager import BrainLoader
from core.Models import Brain
from core.Models import Event
from core.Models import Neuron
from core.Models import Order
from core.Models import Synapse


class TestBrainLoader(unittest.TestCase):

    def setUp(self):
        self.brain_to_test = "core/Tests/brains/brain_test.yml"
        self.expected_result = [
            {'signals': [{'order': 'test_order'}],
             'neurons': [{'say': {'message': ['test message']}}],
             'name': 'test'},
            {'signals': [{'order': 'test_order_2'}],
             'neurons': [{'say': {'message': ['test message']}}],
             'name': 'test2'},
            {'includes': ['included_brain_test.yml']},
            {'signals': [{'order': 'test_order_3'}],
             'neurons': [{'say': {'message': ['test message']}}],
             'name': 'test3'}
        ]

    # def test_get_yaml_config(self):
    #     """
    #     Test we can get a yaml config from the path
    #     """
    #     brain_loader = BrainLoader.Instance(file_path=self.brain_to_test)
    #     self.assertEqual(brain_loader.yaml_config, self.expected_result)
    #     del brain_loader
    #
    # def test_get_brain(self):
    #     """
    #     Test the class return a valid brain object
    #     """
    #
    #     neuron = Neuron(name='say', parameters={'message': ['test message']})
    #
    #     signal1 = Order(sentence="test_order")
    #     signal2 = Order(sentence="test_order_2")
    #     signal3 = Order(sentence="test_order_3")
    #
    #     synapse1 = Synapse(name="test", neurons=[neuron], signals=[signal1])
    #     synapse2 = Synapse(name="test2", neurons=[neuron], signals=[signal2])
    #     synapse3 = Synapse(name="test3", neurons=[neuron], signals=[signal3])
    #     synapses = [synapse1, synapse2, synapse3]
    #
    #     brain = Brain()
    #     brain.synapses = synapses
    #     brain.brain_file = self.brain_to_test
    #     brain.brain_yaml = self.expected_result
    #
    #     brain_loader = BrainLoader.Instance(file_path=self.brain_to_test)
    #     self.assertEqual(brain, brain_loader.brain)
    #     del brain_loader

    def test_get_neurons(self):
        neuron_list = [{'say': {'message': ['test message']}}]

        neuron = Neuron(name='say', parameters={'message': ['test message']})

        bl = BrainLoader.Instance(file_path=self.brain_to_test)
        neurons_from_brain_loader = bl._get_neurons(neuron_list)

        self.assertEqual([neuron], neurons_from_brain_loader)
        del bl

    def test_get_signals(self):
        signals = [{'order': 'test_order'}]

        signal = Order(sentence='test_order')

        bl = BrainLoader.Instance(file_path=self.brain_to_test)
        signals_from_brain_loader = bl._get_signals(signals)

        self.assertEqual([signal], signals_from_brain_loader)
        del bl

    def test_get_event_or_order_from_dict(self):

        order_object = Order(sentence="test_order")
        event_object = Event(period="0 7 * * *")

        dict_order = {'order': 'test_order'}
        dict_event = {'event': '0 7 * * *'}

        bl = BrainLoader.Instance(file_path=self.brain_to_test)
        order_from_bl = bl._get_event_or_order_from_dict(dict_order)
        event_from_bl = bl._get_event_or_order_from_dict(dict_event)

        self.assertEqual(order_from_bl, order_object)
        self.assertEqual(event_from_bl, event_object)
        del bl

    def test_singleton(self):
        bl1 = BrainLoader.Instance(file_path=self.brain_to_test)
        bl2 = BrainLoader.Instance(file_path=self.brain_to_test)

        self.assertTrue(bl1.brain is bl2.brain)
        del bl1
        del bl2

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