Passed
Pull Request — dev (#32)
by Konstantinos
03:15 queued 01:42
created

test_decorating.test_objects()   A

Complexity

Conditions 4

Size

Total Lines 18
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

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