def test_module_with_a_single_attribute(self):

        ast_node = ast.parse('x = 1')
        module   = Module.from_ast_node(ast_node=ast_node, filename='test.py')

        self.assertChildren({'x' : Attribute}, module)

        return
    def test_module_with_a_single_function(self):

        ast_node = ast.parse('def bar(): pass')
        module   = Module.from_ast_node(ast_node=ast_node, filename='test.py')

        self.assertChildren({'bar' : Function}, module)

        return
    def test_module_with_a_single_klass(self):

        ast_node = ast.parse('class Foo(object): pass')
        module   = Module.from_ast_node(ast_node=ast_node, filename='test.py')

        self.assertChildren({'Foo' : Klass}, module)

        return
    def test_module_with_a_docstring(self):

        ast_node = ast.parse('""" This is a docstring! """')
        module   = Module.from_ast_node(ast_node=ast_node, filename='test.py')
        
        self.assertEqual('This is a docstring! ', module.doc)
        self.assertEqual(0, len(module.children))

        return
    def _create_module(self, code):
        """ Create a 'Module' instance from the given code.

        Return a module AST node.

        """

        ast_node = ast.parse(code)
        module = Module.from_ast_node(ast_node=ast_node, filename="test.py")

        return module
    def test_module_scope_function(self):

        ast_node = ast.parse('def foo(): """ A function! """')
        module   = Module.from_ast_node(ast_node=ast_node, filename='test.py')
        function = module.get_child_named('foo')

        self.assertTrue(isinstance(function, Function))
        self.assertEqual(module, function.parent)
        self.assertEqual(module, function.module)
        self.assertEqual(1, function.lineno)
        self.assertEqual('A function! ', function.doc)
        
        return
    def test_empty_module(self):

        ast_node = ast.parse('')
        module   = Module.from_ast_node(ast_node=ast_node, filename='test.py')
        
        self.assertEqual(None, module.parent)
        self.assertEqual(None, module.module)
        self.assertEqual('test', module.dotted_name)
        self.assertEqual('test', module.name)
        self.assertEqual(None, module.doc)
        self.assertEqual(0, len(module.children))

        return
    def test_method(self):

        ast_node = ast.parse('class Foo():\n def bar(self): """ A method! """')
        module   = Module.from_ast_node(ast_node=ast_node, filename='test.py')
        klass    = module.get_child_named('Foo')
        method   = klass.get_child_named('bar')

        self.assertEqual(Function, type(method))
        self.assertEqual(klass, method.parent)
        self.assertEqual(module, method.module)
        self.assertEqual(2, method.lineno)
        self.assertEqual('A method! ', method.doc)
        
        return
    def test_module_with_multiple_attributes(self):

        ast_node = ast.parse('x, y, z = 1; a = 2')
        module   = Module.from_ast_node(ast_node=ast_node, filename='test.py')

        self.assertChildren(
            {
                'x' : Attribute,
                'y' : Attribute,
                'z' : Attribute,
                'a' : Attribute
            },

            module
        )

        return
    def test_example_module(self):

        ast_node = ast.parse(EXAMPLE_MODULE)
        module   = Module.from_ast_node(ast_node=ast_node, filename='test.py')
        
        self.assertChildren(
            {
                'Dino'       : Klass,
                'Person'     : Klass,
                'frobnicate' : Function,
                'town_name'  : Attribute,

                # Imports
                'HasTraits'  : Attribute,
                'Int'        : Attribute,
                'Str'        : Attribute,
            },

            module
        )

        return