1
|
|
|
import pytest |
2
|
|
|
|
3
|
|
|
|
4
|
|
|
@pytest.fixture |
5
|
|
|
def assert_correct_signatures(tabular_operators): |
6
|
|
|
def _assert_correct_signatures(instance): |
7
|
|
|
interface_id = tabular_operators['reverse_dict'][type(instance)] |
8
|
|
|
expected_implemented_methods_names = tabular_operators['operators'][interface_id]['interface'].keys() |
9
|
|
|
assert all(callable(getattr(instance, member, None)) for member in expected_implemented_methods_names) |
10
|
|
|
return _assert_correct_signatures |
11
|
|
|
|
12
|
|
|
|
13
|
|
|
@pytest.fixture |
14
|
|
|
def assert_correct_delegate_behaviour(tabular_operators): |
15
|
|
|
def _assert_correct_delegate_behaviour(instance1, instance2): |
16
|
|
|
instance1_type = type(instance1) |
17
|
|
|
instance1_operator_id = tabular_operators['reverse_dict'][instance1_type] |
18
|
|
|
assert instance1_type == type(instance2) |
19
|
|
|
assert id(instance1._delegate) != id(instance2._delegate) |
20
|
|
|
for function in tabular_operators['operators'][instance1_operator_id]['interface']: |
21
|
|
|
# for function in tabular_interfaces_contracts[tabular_operators_reverse[instance1_type]]: |
22
|
|
|
assert id(getattr(instance1, function)) != id(getattr(instance2, function)) |
23
|
|
|
assert id(getattr(instance1._delegate, function)) != id(getattr(instance2._delegate, function)) |
24
|
|
|
return _assert_correct_delegate_behaviour |
25
|
|
|
|
26
|
|
|
|
27
|
|
|
@pytest.mark.parametrize('interface_id', [ |
28
|
|
|
('retriever'), |
29
|
|
|
('iterator'), |
30
|
|
|
('mutator'), |
31
|
|
|
]) |
32
|
|
|
def test_tabular_interfaces2(interface_id, tabular_operators, assert_correct_signatures, assert_correct_delegate_behaviour): |
33
|
|
|
operator_instance1, operator_instance2 = tuple(tabular_operators['operators'][_interface_id]['class']() for _interface_id in [interface_id] * 2) |
34
|
|
|
|
35
|
|
|
assert_correct_signatures(operator_instance1) |
36
|
|
|
assert_correct_delegate_behaviour(operator_instance1, operator_instance2) |
37
|
|
|
|
38
|
|
|
|
39
|
|
|
def test_retriever_implementation(test_datapoints, built_in_backends): |
40
|
|
|
built_in_pd_backend = built_in_backends.implementations['pd'] |
41
|
|
|
first_row = built_in_pd_backend['retriever'].row(0, test_datapoints) |
42
|
|
|
assert list(first_row) == list(test_datapoints.observations.iloc[[0]]) |
43
|
|
|
assert len(list(first_row)) == len(test_datapoints.attributes) |
44
|
|
|
assert len(list(first_row)) == test_datapoints.nb_columns |
45
|
|
|
|
46
|
|
|
|
47
|
|
|
# through out the test suite we use the @pytest.mark.xfail decorator to indicate this is expected to fail (since it is a discovered bug). |
48
|
|
|
# when the bug is solved, simply remove the decorator and now you will have a regression test in place! |
49
|
|
|
|
50
|
|
|
@pytest.mark.xfail(reason="There is a bug in the built in pandas retriever.get_numerical_attributes method") |
51
|
|
|
def test_retriever_get_numerical_attributes(test_datapoints, built_in_backends): |
52
|
|
|
built_in_pd_backend = built_in_backends.implementations['pd'] |
53
|
|
|
numerical_attributes = built_in_pd_backend['retriever'].get_numerical_attributes(test_datapoints) |
54
|
|
|
assert set(numerical_attributes) != {} |
55
|
|
|
|
56
|
|
|
|
57
|
|
|
def test_iterator_implementation(test_datapoints, built_in_backends): |
58
|
|
|
built_in_pd_backend = built_in_backends.implementations['pd'] |
59
|
|
|
columns_iterator = built_in_pd_backend['iterator'].itercolumns(test_datapoints) |
60
|
|
|
import types |
61
|
|
|
assert type(columns_iterator) == types.GeneratorType |
62
|
|
|
assert isinstance(columns_iterator, types.GeneratorType) |
63
|
|
|
|
64
|
|
|
|
65
|
|
|
# assert list(built_in_pd_backend['retriever'].row('Creative', test_datapoints)) == list(test_datapoints) |
66
|
|
|
# assert list(built_in_pd_backend['retriever'].row('Creative', test_datapoints)) == list(test_datapoints) |
67
|
|
|
# assert list(built_in_pd_backend['retriever'].row('Creative', test_datapoints)) == list(test_datapoints) |
68
|
|
|
|