From 687906efdaa29ecf4a296f331855819dae31447a Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 12 Sep 2020 04:13:11 -0400 Subject: [PATCH 1/2] Add some tests for cbook._define_aliases. --- lib/matplotlib/tests/test_cbook.py | 33 ++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/lib/matplotlib/tests/test_cbook.py b/lib/matplotlib/tests/test_cbook.py index de99701d7757..f06b8965f91f 100644 --- a/lib/matplotlib/tests/test_cbook.py +++ b/lib/matplotlib/tests/test_cbook.py @@ -298,6 +298,39 @@ def test_sanitize_sequence(): assert k == cbook.sanitize_sequence(k) +def test_define_aliases(): + @cbook._define_aliases({'prop': ['alias1', 'alias2']}) + class NoGetter: + def set_prop(self): + pass + + @cbook._define_aliases({'prop': ['alias1', 'alias2']}) + class NoSetter: + def get_prop(self): + pass + + assert getattr(NoGetter, 'get_alias1', None) is None + assert getattr(NoGetter, 'set_alias1', None) is not None + assert getattr(NoGetter, 'get_alias2', None) is None + assert getattr(NoGetter, 'set_alias2', None) is not None + assert NoGetter._alias_map == {'prop': ['alias1', 'alias2']} + + assert getattr(NoSetter, 'get_alias1', None) is not None + assert getattr(NoSetter, 'set_alias1', None) is None + assert getattr(NoSetter, 'get_alias2', None) is not None + assert getattr(NoSetter, 'set_alias2', None) is None + assert NoSetter._alias_map == {'prop': ['alias1', 'alias2']} + + +def test_define_aliases_invalid(): + class Invalid: + pass + + with pytest.raises(ValueError, + match="Neither getter nor setter exists for 'prop'"): + cbook._define_aliases({'prop': ['alias1', 'alias2']})(Invalid) + + fail_mapping = ( ({'a': 1}, {'forbidden': ('a')}), ({'a': 1}, {'required': ('b')}), From 43a4cf11dc1e40ba0a1f22a1a682d89d74b8fabe Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 12 Sep 2020 04:26:33 -0400 Subject: [PATCH 2/2] Add test of subclassing with cbook._define_aliases. --- lib/matplotlib/tests/test_cbook.py | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/lib/matplotlib/tests/test_cbook.py b/lib/matplotlib/tests/test_cbook.py index f06b8965f91f..0ecc3f25ef28 100644 --- a/lib/matplotlib/tests/test_cbook.py +++ b/lib/matplotlib/tests/test_cbook.py @@ -331,6 +331,48 @@ class Invalid: cbook._define_aliases({'prop': ['alias1', 'alias2']})(Invalid) +def test_define_aliases_subclass(): + @cbook._define_aliases({'prop': ['alias']}) + class Base: + def __init__(self): + self.call_count = {'Base:set_prop': 0} + + def set_prop(self): + self.call_count['Base:set_prop'] += 1 + + class Derived(Base): + def __init__(self): + super().__init__() + self.call_count['Derived:set_prop'] = 0 + + def set_prop(self): + self.call_count['Derived:set_prop'] += 1 + + # Calling original or alias should run the same method. + b = Base() + b.set_prop() + assert b.call_count['Base:set_prop'] == 1 + b.set_alias() + assert b.call_count['Base:set_prop'] == 2 + + d = Derived() + # Calling original or alias should run the same derived method. + d.set_prop() + assert d.call_count['Base:set_prop'] == 0 + assert d.call_count['Derived:set_prop'] == 1 + d.set_alias() + assert d.call_count['Base:set_prop'] == 0 + assert d.call_count['Derived:set_prop'] == 2 + + # Calling original or alias should run the same base method. + Base.set_prop(d) + assert d.call_count['Base:set_prop'] == 1 + assert d.call_count['Derived:set_prop'] == 2 + Base.set_alias(d) + assert d.call_count['Base:set_prop'] == 2 + assert d.call_count['Derived:set_prop'] == 2 + + fail_mapping = ( ({'a': 1}, {'forbidden': ('a')}), ({'a': 1}, {'required': ('b')}),