|
1
|
|
|
from typing import Type |
|
2
|
|
|
from unittest import TestCase |
|
3
|
|
|
|
|
4
|
|
|
from typish import common_ancestor, common_ancestor_of_types, NoneType |
|
5
|
|
|
|
|
6
|
|
|
|
|
7
|
|
|
class A: pass |
|
8
|
|
|
class B(A): pass |
|
9
|
|
|
class C(B): pass |
|
10
|
|
|
class D(C): pass |
|
11
|
|
|
class E(D): pass |
|
12
|
|
|
|
|
13
|
|
|
|
|
14
|
|
|
class TestCommonAncestor(TestCase): |
|
15
|
|
|
def test_common_ancestor(self): |
|
16
|
|
|
self.assertEqual(C, common_ancestor(E(), C(), D(), E())) |
|
17
|
|
|
self.assertEqual(B, common_ancestor(E(), C(), D(), E(), B())) |
|
18
|
|
|
self.assertEqual(object, common_ancestor(E(), C(), D(), E(), B(), 42)) |
|
19
|
|
|
|
|
20
|
|
|
def test_common_ancestor_of_types(self): |
|
21
|
|
|
self.assertEqual(C, common_ancestor_of_types(E, C, D, E)) |
|
22
|
|
|
self.assertEqual(object, common_ancestor_of_types(int, str)) |
|
23
|
|
|
common_ancestor_of_types(list, tuple) |
|
24
|
|
|
|
|
25
|
|
|
def test_common_ancestor_of_typing_types(self): |
|
26
|
|
|
self.assertEqual(type, common_ancestor_of_types(Type[int], Type[str])) |
|
27
|
|
|
|
|
28
|
|
|
def test_common_acestor_of_collections(self): |
|
29
|
|
|
self.assertEqual(list, common_ancestor([1, 2, 3], ['a', 'b', 'c'])) |
|
30
|
|
|
|
|
31
|
|
|
def test_special_args(self): |
|
32
|
|
|
self.assertEqual(NoneType, common_ancestor(None, None)) |
|
33
|
|
|
self.assertEqual(int, common_ancestor(42)) |
|
34
|
|
|
|
|
35
|
|
|
def test_invalid(self): |
|
36
|
|
|
with self.assertRaises(TypeError): |
|
37
|
|
|
common_ancestor() |
|
38
|
|
|
|