· 5 years ago · Feb 26, 2020, 07:12 PM
1import typing as tp
2
3import dataclasses
4import copy
5
6import typing as tp
7
8import pytest
9
10
11from .common_type_2 import convert_to_common_type
12
13
14@dataclasses.dataclass
15class Case:
16 values: tp.List[tp.Any]
17 converted_values: tp.List[tp.Any]
18 common_type: type
19
20 def __str__(self) -> str:
21 return "convert_{}".format(self.values)
22
23
24TEST_CASES = [
25 Case(
26 values=["ozon.ru", ["amazon.com", "vk.com"], ("py.manytask.ru", "yandex.ru"), None, ""],
27 converted_values=[["ozon.ru"], ["amazon.com", "vk.com"], ["py.manytask.ru", "yandex.ru"], [], []],
28 common_type=list
29 ),
30 Case(
31 values=["ozon.ru", "amazon.com", "py.manytask.ru", None, ""],
32 converted_values=["ozon.ru", "amazon.com", "py.manytask.ru", "", ""],
33 common_type=str
34 ),
35 Case(
36 values=[122334, [121223, 9389384], (123223, 4384934), None, ""],
37 converted_values=[[122334], [121223, 9389384], [123223, 4384934], [], []],
38 common_type=list
39 ),
40 Case(
41 values=[122334, (121223, 9389384), (123223, 4384934), None, ""],
42 converted_values=[[122334], [121223, 9389384], [123223, 4384934], [], []],
43 common_type=list
44 ),
45 Case(
46 values=[True, (True, False), None, ""],
47 converted_values=[[True], [True, False], [], []],
48 common_type=list
49 ),
50 Case(
51 values=[122334, "", 4384934, None, ""],
52 converted_values=[122334, 0, 4384934, 0, 0],
53 common_type=int
54 ),
55 Case(
56 values=[15, 10.75, 2, None, ""],
57 converted_values=[15.0, 10.75, 2.0, 0.0, 0.0],
58 common_type=float
59 ),
60 Case(
61 values=[15, 2, None, ""],
62 converted_values=[15, 2, 0, 0],
63 common_type=int
64 ),
65 Case(
66 values=[2.0, None, ""],
67 converted_values=[2.0, 0.0, 0.0],
68 common_type=float
69 ),
70 Case(
71 values=[False, 0, True, "", None],
72 converted_values=[False, False, True, False, False],
73 common_type=bool
74 ),
75 Case(
76 values=[1, 1, 1, "", True],
77 converted_values=[True, True, True, False, True],
78 common_type=bool
79 ),
80 Case(
81 values=[None, "", None, None],
82 converted_values=["", "", "", ""],
83 common_type=str
84 ),
85 Case(
86 values=[None],
87 converted_values=[""],
88 common_type=str
89 ),
90 Case(
91 values=[None, None, None, None],
92 converted_values=["", "", "", ""],
93 common_type=str
94 ),
95 Case(
96 values=[False, False, False],
97 converted_values=[False, False, False],
98 common_type=bool
99 ),
100 Case(
101 values=[0, None, ""],
102 converted_values=[0, 0, 0],
103 common_type=int
104 )
105]
106
107
108@pytest.mark.parametrize('t', TEST_CASES, ids=str)
109def test_convert_to_common_type(t: Case) -> None:
110 values_copy = copy.deepcopy(t.values)
111 converted_values = convert_to_common_type(values_copy)
112
113 assert t.values == values_copy, "You shouldn't change inputs"
114 assert converted_values == t.converted_values
115 for value in converted_values:
116 assert type(value) == t.common_type
117
118
119def convert_to_common_type(data: tp.List[tp.Any]) -> tp.List[tp.Any]:
120 """
121 Takes list of multiple types' elements and convert each element to common type according to given rules
122 :param data: list of multiple types' elements
123 :return: list with elements converted to common type
124 """
125 type_order = [bool, int, float, ]
126 max_type = bool
127 for elem in data:
128 if elem: