You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sphinx-autoapi/tests/python/test_parser.py

135 lines
3.7 KiB
Python

# coding=utf8
"""Test Python parser"""
import sys
import unittest
from textwrap import dedent
import astroid
import pytest
from autoapi.mappers.python.parser import Parser
if sys.version_info < (3, 0):
from StringIO import StringIO
else:
from io import StringIO
class PythonParserTests(unittest.TestCase):
def parse(self, source):
node = astroid.extract_node(source)
return Parser().parse(node)
def test_parses_basic_file(self):
source = """
def foo(bar):
pass
"""
data = self.parse(source)[0]
self.assertEqual(data["name"], "foo")
self.assertEqual(data["type"], "function")
def test_parses_all(self):
source = """
__all__ = ['Foo', 5.0]
"""
data = self.parse(source)[0]
self.assertEqual(data["name"], "__all__")
self.assertEqual(data["value"], ["Foo", 5.0])
def test_parses_all_multiline(self):
source = """
__all__ = [
'foo',
'bar',
]
"""
data = self.parse(source)[0]
self.assertEqual(data["value"], ["foo", "bar"])
def test_parses_name(self):
source = "foo.bar"
self.assertEqual(self.parse(source), {})
def test_parses_list(self):
name = "__all__"
value = [1, 2, 3, 4]
source = "{} = {}".format(name, value)
data = self.parse(source)[0]
self.assertEqual(data["name"], name)
self.assertEqual(data["value"], value)
def test_parses_nested_list(self):
name = "__all__"
value = [[1, 2], [3, 4]]
source = "{} = {}".format(name, value)
data = self.parse(source)[0]
self.assertEqual(data["name"], name)
self.assertEqual(data["value"], value)
def test_arguments(self):
"""Argument parsing of source"""
source = (
"def foobar(self, bar, baz=42, foo=True,\n"
" *args, **kwargs):\n"
' "This is a docstring"\n'
" return True\n"
)
data = self.parse(source)[0]
self.assertEqual(data["args"], "self, bar, baz=42, foo=True, *args, **kwargs")
def test_advanced_arguments(self):
"""Advanced argument parsing"""
source = (
'def foobar(self, a, b, c=42, d="string", e=(1,2),\n'
' f={"a": True}, g=None, h=[1,2,3,4],\n'
" i=dict(a=True), j=False, *args, **kwargs):\n"
' "This is a docstring"\n'
" return True\n"
)
data = self.parse(source)[0]
self.assertEqual(
data["args"],
", ".join(
[
"self",
"a",
"b",
"c=42",
"d='string'",
"e=(1, 2)",
"f={'a': True}",
"g=None",
"h=[1, 2, 3, 4]",
"i=dict(a=True)",
"j=False",
"*args",
"**kwargs",
]
),
)
def test_dict_key_assignment(self):
"""Ignore assignment to dictionary entries."""
source = """
MY_DICT = {} #@
if condition:
MY_DICT['key'] = 'value'
MY_DICT['key2'] = 'value2'
"""
data = self.parse(source)[0]
self.assertEqual(data["name"], "MY_DICT")
def test_list_index_assignment(self):
"""Ignore assignment to indexes."""
source = """
COLOUR = [255, 128, 0] #@
if condition:
COLOUR[1] = 255
COLOUR[2] = 255
"""
data = self.parse(source)[0]
self.assertEqual(data["name"], "COLOUR")