Passed
Push — mpeta ( 3dde83...6d5856 )
by Konstantinos
01:31
created

test_decorating   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 66
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 50
dl 0
loc 66
rs 10
c 0
b 0
f 0
wmc 4

4 Functions

Rating   Name   Duplication   Size   Complexity  
A test_decorating() 0 31 1
A test_infra() 0 4 1
A classes() 0 15 1
A test_decorator() 0 6 1
1
import pytest
2
3
4
@pytest.fixture
5
def test_infra():
6
    from so_magic.data.backend.backend import MyDecorator, CommandRegistrator
7
    return type('TestInfra', (object,), dict(MyDecorator=MyDecorator, CommandRegistrator=CommandRegistrator))
8
9
10
def test_decorating(test_infra):
11
    assert not hasattr(test_infra.CommandRegistrator, 'registry')
12
    assert not hasattr(test_infra.CommandRegistrator, 'state')
13
    assert not hasattr(test_infra.MyDecorator, '_commands_hash')
14
15
    class A(test_infra.MyDecorator): pass
16
    class Ab(test_infra.MyDecorator): pass
17
    class B(metaclass=test_infra.MyDecorator): pass
18
19
    assert type(test_infra.MyDecorator) == type
20
    assert type(A) == type
21
    assert type(B) == test_infra.MyDecorator
22
23
    DynamicClass = test_infra.MyDecorator('DynamicClass', (object,), {})
24
    assert type(DynamicClass) == test_infra.MyDecorator
25
    o1 = DynamicClass()
26
    assert type(o1) == DynamicClass
27
28
    class ParentClass: pass
29
    class DefinedClass(ParentClass, metaclass=test_infra.MyDecorator): pass
30
    dc = DefinedClass()
31
    assert type(dc) == DefinedClass
32
33
    b = B()
34
    assert type(b) == B
35
36
    objects = (test_infra.MyDecorator, A, Ab, B, type(DynamicClass), type(type(o1)), DefinedClass)
37
    assert all([hasattr(x, 'magic_decorator') for x in objects])
38
39
    assert id(A.magic_decorator) != id(Ab.magic_decorator)
40
    assert len(set([id(o.magic_decorator) for o in objects])) == 1
41
42
43
@pytest.fixture
44
def classes(test_infra):
45
    class ADecoratorClass(metaclass=test_infra.CommandRegistrator): pass
46
    class BDecoratorClass(metaclass=test_infra.CommandRegistrator): pass
47
48
    @ADecoratorClass.func_decorator()
49
    def aa(x):
50
        return str(x) + 'aa'
51
52
    @BDecoratorClass.func_decorator()
53
    def bb(x):
54
        return str(x) + 'bb'
55
    value = 1
56
    return [{'c': c, 'test_data': (value, f'{value}{decorated_func_name}')}
57
            for c, decorated_func_name in zip([ADecoratorClass, BDecoratorClass], ['aa', 'bb'])]
58
59
60
def test_decorator(classes):
61
    func_names = ('aa', 'bb')
62
    assert all(func_name in test_data['c'].registry for func_name, test_data in zip(func_names, classes))
63
    assert all(func_name not in test_data['c'].registry for func_name, test_data in zip(func_names, reversed(classes)))
64
    assert all(test_data['c'].registry[func_name](test_data['test_data'][0]) == test_data['test_data'][1]
65
               for func_name, test_data in zip(func_names, classes))
66