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

test_decorating.classes()   A

Complexity

Conditions 1

Size

Total Lines 15
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 13
nop 1
dl 0
loc 15
rs 9.75
c 0
b 0
f 0
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