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