Passed
Push — master ( 96da92...a1b572 )
by Konstantinos
37s queued 14s
created

test_decorating.test_objects()   A

Complexity

Conditions 2

Size

Total Lines 16
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 16
nop 1
dl 0
loc 16
rs 9.6
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_type_class_properties(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
16
@pytest.fixture
17
def test_objects(test_infra):
18
    class A(test_infra.MyDecorator): pass
19
    class Ab(test_infra.MyDecorator): pass
20
    class B(metaclass=test_infra.MyDecorator): pass
21
    DynamicClass = test_infra.MyDecorator('DynamicClass', (object,), {})
22
    class ParentClass: pass
23
    class DefinedClass(ParentClass, metaclass=test_infra.MyDecorator): pass
24
    inst1 = DynamicClass()
25
    return type('TestObjects', (object,), {
26
        'type_classes': type('TypeClasses', (object,), {'A': A, 'Ab': Ab, '__iter__': lambda self: iter([A, Ab])})(),
27
        'normal_classes': type('NormalClasses', (object,),
28
                               {'B': B, 'DynamicClass': DynamicClass, 'DefinedClass': DefinedClass})(),
29
        'instances': type('Instances', (object,), {'DynamicClass': inst1, 'DefinedClass': DefinedClass(), 'B': B()}),
30
        'MyDecorator': test_infra.MyDecorator,
31
        'test': [type(type(inst1)), type(DynamicClass), test_infra.MyDecorator, A, Ab, B, DynamicClass, DefinedClass]
32
    })
33
34
35
def test_decorating(test_objects):
36
    assert all(type(x) == type for x in (test_objects.MyDecorator, test_objects.type_classes.A))
37
    assert all(type(x) == test_objects.MyDecorator
38
               for x in (test_objects.normal_classes.B, test_objects.normal_classes.DynamicClass))
39
    assert all(type(getattr(test_objects.instances, x)) == getattr(test_objects.normal_classes, x)
40
               for x in ('DynamicClass', 'DefinedClass', 'B'))
41
    assert not hasattr(test_objects.instances.B, 'magic_decorator')
42
    assert not hasattr(test_objects.instances.DefinedClass, 'magic_decorator')
43
    assert all([hasattr(x, 'magic_decorator') for x in test_objects.test])
44
    assert id(test_objects.type_classes.A.magic_decorator) != id(test_objects.type_classes.Ab.magic_decorator)
45
    assert len(set([id(o.magic_decorator) for o in test_objects.test])) == 1
46
47
48
@pytest.fixture
49
def classes(test_infra):
50
    class ADecoratorClass(metaclass=test_infra.CommandRegistrator): pass
51
    class BDecoratorClass(metaclass=test_infra.CommandRegistrator): pass
52
53
    @ADecoratorClass.func_decorator()
54
    def aa(x):
55
        return str(x) + 'aa'
56
57
    @BDecoratorClass.func_decorator()
58
    def bb(x):
59
        return str(x) + 'bb'
60
    value = 1
61
    return [{'c': c, 'test_data': (value, f'{value}{decorated_func_name}')}
62
            for c, decorated_func_name in zip([ADecoratorClass, BDecoratorClass], ['aa', 'bb'])]
63
64
65
def test_decorator(classes):
66
    func_names = ('aa', 'bb')
67
    assert all(func_name in test_data['c'].registry for func_name, test_data in zip(func_names, classes))
68
    assert all(func_name not in test_data['c'].registry for func_name, test_data in zip(func_names, reversed(classes)))
69
    assert all(test_data['c'].registry[func_name](test_data['test_data'][0]) == test_data['test_data'][1]
70
               for func_name, test_data in zip(func_names, classes))
71