1# Copyright (c) 2019 Ultimaker B.V.
2# Uranium is released under the terms of the LGPLv3 or higher.
3
4import pytest
5
6from UM.Decorators import interface
7
8def test_interface():
9    def declare_interface():
10        @interface
11        class TestInterface:
12            def test(self):
13                pass
14
15            def test2(self):
16                pass
17
18        return TestInterface
19
20    cls = declare_interface()
21    assert cls is not None
22
23    def declare_subclass(cls):
24        class TestSubclass(cls):
25            def __init__(self):
26                super().__init__()
27
28            def test(self):
29                print("test")
30
31            def test2(self):
32                print("test2")
33
34        return TestSubclass
35
36    cls = declare_subclass(cls)
37    assert cls is not None
38
39    sub = cls()
40    assert sub is not None
41
42    def declare_bad_subclass():
43        @interface
44        class TestInterface:
45            def test(self):
46                pass
47
48        class TestSubclass(TestInterface):
49            pass
50
51        return TestSubclass()
52
53    with pytest.raises(NotImplementedError):
54        declare_bad_subclass()
55
56    def declare_good_signature():
57        @interface
58        class TestInterface:
59            def test(self, one, two, three = None):
60                pass
61
62        class TestSubclass(TestInterface):
63            def test(self, one, two, three = None):
64                pass
65
66        return TestSubclass()
67
68    sub = declare_good_signature()
69    assert sub is not None
70
71    def declare_bad_signature():
72        @interface
73        class TestInterface:
74            def test(self, one, two, three = None):
75                pass
76
77        class TestSubclass(TestInterface):
78            def test(self, one):
79                pass
80
81        return TestSubclass()
82
83    with pytest.raises(NotImplementedError):
84        declare_bad_signature()
85
86    #
87    # private functions should be ignored
88    #
89    def should_ignore_private_functions():
90        @interface
91        class TestInterface:
92            def __should_be_ignored(self):
93                pass
94
95        class TestSubClass(TestInterface):
96            pass
97
98        return TestSubClass()
99
100    sub = should_ignore_private_functions()
101    assert sub is not None
102