class LevelsTest(ut.TestCase):
    def setUp(self):
        self.dispatcher = Dispatcher('units.info', CONFIG, Session)

    def levels(self, *args):
        levels = []
        for objs in self.dispatcher.levels(*args):
            levels.append([obj.name for obj in objs])
        return levels

    def test_produces_correct_number_of_levels(self):
        deps = self.dispatcher.dependencies([pdbs.Loader])
        val = self.levels(deps, [], True)
        assert val == [['pdbs.info'], ['pdbs.obsolete']]

    def test_has_no_excluded_stages(self):
        deps = self.dispatcher.dependencies([pdbs.Loader])
        val = self.levels(deps, ['pdbs.obsolete'], [])
        assert ['pdbs.obsolete'] not in val
        assert val == [['pdbs.info']]

    def test_will_always_have_allowed_stages(self):
        deps = self.dispatcher.dependencies([pdbs.Loader])
        val = self.levels(deps, ['pdbs.obsolete'], ['pdbs.obsolete'])
        assert val == [['pdbs.info'], ['pdbs.obsolete']]
class DependenciesTest(ut.TestCase):
    def setUp(self):
        self.dispatcher = Dispatcher('units.info', CONFIG, Session)

    def test_it_can_compute_a_dependency_graph(self):
        val = self.dispatcher.dependencies([units.InfoLoader])
        assert val == {
            units.InfoLoader: set([down.Downloader, pdbs.InfoLoader]),
            pdbs.InfoLoader: set([]),
            down.Downloader: set([]),
        }

    def test_it_computes_dependencies_for_stage_container(self):
        val = self.dispatcher.dependencies([pdbs.Loader])
        assert val == {
            pdbs.InfoLoader: set([]),
            pdbs.ObsoleteLoader: set([pdbs.InfoLoader]),
        }

    def test_it_computes_dependencies_for_several(self):
        val = self.dispatcher.dependencies([pdbs.Loader, units.InfoLoader])
        assert val == {
            pdbs.InfoLoader: set([]),
            down.Downloader: set([]),
            pdbs.ObsoleteLoader: set([pdbs.InfoLoader]),
            units.InfoLoader: set([down.Downloader, pdbs.InfoLoader]),
        }

    def test_it_computes_dependencies_for_nested_containers(self):
        val = self.dispatcher.dependencies([ifes.Loader])
        assert val[ifes.InfoLoader] == set([
            units.InfoLoader,
            units.DistancesLoader,
            units.CenterLoader,
            units.RotationLoader,
            units.IncompleteLoader,
            units.CoordinateLoader,
            chains.InfoLoader,
            chains.SpeciesLoader,
            interactions.PairwiseLoader,
            interactions.FlankingLoader,
            interactions.SummaryLoader,
        ])