test_iterator_implementation()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nop 2
dl 0
loc 6
rs 10
c 0
b 0
f 0
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