summaryrefslogtreecommitdiff
path: root/tests/test_util_typing.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_util_typing.py')
-rw-r--r--tests/test_util_typing.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/tests/test_util_typing.py b/tests/test_util_typing.py
new file mode 100644
index 000000000..9a225f0f1
--- /dev/null
+++ b/tests/test_util_typing.py
@@ -0,0 +1,98 @@
+"""
+ test_util_typing
+ ~~~~~~~~~~~~~~~~
+
+ Tests util.typing functions.
+
+ :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import sys
+from numbers import Integral
+from typing import Any, Dict, List, TypeVar, Union, Callable, Tuple, Optional
+
+from sphinx.util.typing import stringify
+
+
+class MyClass1:
+ pass
+
+
+class MyClass2(MyClass1):
+ __qualname__ = '<MyClass2>'
+
+
+def test_stringify():
+ assert stringify(int) == "int"
+ assert stringify(str) == "str"
+ assert stringify(None) == "None"
+ assert stringify(Integral) == "numbers.Integral"
+ assert stringify(Any) == "Any"
+
+
+def test_stringify_type_hints_containers():
+ assert stringify(List) == "List"
+ assert stringify(Dict) == "Dict"
+ assert stringify(List[int]) == "List[int]"
+ assert stringify(List[str]) == "List[str]"
+ assert stringify(Dict[str, float]) == "Dict[str, float]"
+ assert stringify(Tuple[str, str, str]) == "Tuple[str, str, str]"
+ assert stringify(Tuple[str, ...]) == "Tuple[str, ...]"
+ assert stringify(List[Dict[str, Tuple]]) == "List[Dict[str, Tuple]]"
+
+
+def test_stringify_type_hints_string():
+ assert stringify("int") == "int"
+ assert stringify("str") == "str"
+ assert stringify(List["int"]) == "List[int]"
+ assert stringify("Tuple[str]") == "Tuple[str]"
+ assert stringify("unknown") == "unknown"
+
+
+def test_stringify_type_hints_Callable():
+ assert stringify(Callable) == "Callable"
+
+ if sys.version_info >= (3, 7):
+ assert stringify(Callable[[str], int]) == "Callable[[str], int]"
+ assert stringify(Callable[..., int]) == "Callable[[...], int]"
+ else:
+ assert stringify(Callable[[str], int]) == "Callable[str, int]"
+ assert stringify(Callable[..., int]) == "Callable[..., int]"
+
+
+def test_stringify_type_hints_Union():
+ assert stringify(Optional[int]) == "Optional[int]"
+ assert stringify(Union[str, None]) == "Optional[str]"
+ assert stringify(Union[int, str]) == "Union[int, str]"
+
+ if sys.version_info >= (3, 7):
+ assert stringify(Union[int, Integral]) == "Union[int, numbers.Integral]"
+ assert (stringify(Union[MyClass1, MyClass2]) ==
+ "Union[test_util_typing.MyClass1, test_util_typing.<MyClass2>]")
+ else:
+ assert stringify(Union[int, Integral]) == "numbers.Integral"
+ assert stringify(Union[MyClass1, MyClass2]) == "test_util_typing.MyClass1"
+
+
+def test_stringify_type_hints_typevars():
+ T = TypeVar('T')
+ T_co = TypeVar('T_co', covariant=True)
+ T_contra = TypeVar('T_contra', contravariant=True)
+
+ assert stringify(T) == "T"
+ assert stringify(T_co) == "T_co"
+ assert stringify(T_contra) == "T_contra"
+ assert stringify(List[T]) == "List[T]"
+
+
+def test_stringify_type_hints_custom_class():
+ assert stringify(MyClass1) == "test_util_typing.MyClass1"
+ assert stringify(MyClass2) == "test_util_typing.<MyClass2>"
+
+
+def test_stringify_type_hints_alias():
+ MyStr = str
+ MyTuple = Tuple[str, str]
+ assert stringify(MyStr) == "str"
+ assert stringify(MyTuple) == "Tuple[str, str]" # type: ignore