def test_calculate_depends_for_topological_order(self):
        def create_mock(name, rundeps):
            m = Mock()
            m.name = name
            m.builddeps = []
            m.buildtooldeps = []
            m.rundeps = rundeps
            m.exports = []
            return m

        mockproject1 = _ProjectDecorator(create_mock('n1', []), 'p1')
        mockproject2 = _ProjectDecorator(create_mock('n2', []), 'p2')
        mockproject3 = _ProjectDecorator(create_mock('n3', []), 'p3')
        mockproject4 = _ProjectDecorator(create_mock('n4', []), 'p4')
        mockproject5 = _ProjectDecorator(create_mock('n5', [mockproject4]), 'p5')
        mockproject6 = _ProjectDecorator(create_mock('n6', [mockproject5]), 'p6')
        mockproject7 = _ProjectDecorator(create_mock('n7', []), 'p7')

        mockproject = Mock()
        mockproject.builddeps = [mockproject1, mockproject2]
        mockproject.buildtooldeps = [mockproject3, mockproject6]
        mockproject.rundeps = [mockproject7]
        mockproject.exports = []

        pd = _ProjectDecorator(mockproject, 'foo/bar')
        # 2 and 3 as external dependencies
        projects = {mockproject1.name: mockproject1,
                    mockproject4.name: mockproject4,
                    mockproject5.name: mockproject5,
                    mockproject6.name: mockproject6}

        pd.calculate_depends_for_topological_order(projects)
        self.assertEqual(set([mockproject1.name, mockproject4.name, mockproject5.name, mockproject6.name]), pd.depends_for_topological_order)
    def test_project_decorator_init(self):

        mockproject = Mock()

        mockexport = Mock()
        mockexport.tagname = 'message_generator'
        mockexport.content = 'foolang'
        mockproject.exports = [mockexport]

        pd = _ProjectDecorator(mockproject, 'foo/bar')
        self.assertEqual(mockproject.name, pd.name)
        self.assertEqual('foo/bar', pd.path)
        self.assertFalse(pd.is_metaproject)
        self.assertEqual(mockexport.content, pd.message_generator)
        self.assertIsNotNone(str(pd))