Coverage for tests/test_000_accretive/test_300_namespaces.py: 100%
79 statements
« prev ^ index » next coverage.py v7.6.4, created at 2024-11-10 23:02 +0000
« prev ^ index » next coverage.py v7.6.4, created at 2024-11-10 23:02 +0000
1# vim: set filetype=python fileencoding=utf-8:
2# -*- coding: utf-8 -*-
4#============================================================================#
5# #
6# Licensed under the Apache License, Version 2.0 (the "License"); #
7# you may not use this file except in compliance with the License. #
8# You may obtain a copy of the License at #
9# #
10# http://www.apache.org/licenses/LICENSE-2.0 #
11# #
12# Unless required by applicable law or agreed to in writing, software #
13# distributed under the License is distributed on an "AS IS" BASIS, #
14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
15# See the License for the specific language governing permissions and #
16# limitations under the License. #
17# #
18#============================================================================#
21''' Assert correct function of namespaces. '''
23# mypy: ignore-errors
24# pylint: disable=attribute-defined-outside-init
25# pylint: disable=invalid-name,magic-value-comparison,protected-access
28import pytest
30from itertools import product
32from . import (
33 MODULES_QNAMES,
34 PACKAGE_NAME,
35 cache_import_module,
36)
39THESE_MODULE_QNAMES = tuple(
40 name for name in MODULES_QNAMES if name.endswith( '.namespaces' ) )
41THESE_CLASSES_NAMES = ( 'Namespace', )
43base = cache_import_module( f"{PACKAGE_NAME}.__" )
44exceptions = cache_import_module( f"{PACKAGE_NAME}.exceptions" )
47@pytest.mark.parametrize(
48 'module_qname, class_name',
49 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES )
50)
51def test_100_instantiation( module_qname, class_name ):
52 ''' Class instantiates. '''
53 module = cache_import_module( module_qname )
54 Namespace = getattr( module, class_name )
55 ns1 = Namespace( )
56 assert isinstance( ns1, Namespace )
57 ns2 = Namespace(
58 ( ( 'foo', 1 ), ( 'bar', 2 ) ), { 'unicorn': True }, orb = False )
59 assert isinstance( ns2, Namespace )
60 assert 1 == ns2.foo
61 assert 2 == ns2.bar
62 assert ns2.unicorn
63 assert not ns2.orb
64 assert ( 'foo', 'bar', 'unicorn', 'orb' ) == tuple( ns2.__dict__.keys( ) )
65 assert ( 1, 2, True, False ) == tuple( ns2.__dict__.values( ) )
68@pytest.mark.parametrize(
69 'module_qname, class_name',
70 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES )
71)
72def test_101_accretion( module_qname, class_name ):
73 ''' Namespace accretes attributes. '''
74 module = cache_import_module( module_qname )
75 Object = getattr( module, class_name )
76 obj = Object( )
77 obj.attr = 42
78 with pytest.raises( exceptions.IndelibleAttributeError ):
79 obj.attr = -1
80 assert 42 == obj.attr
81 with pytest.raises( exceptions.IndelibleAttributeError ):
82 del obj.attr
83 assert 42 == obj.attr
86@pytest.mark.parametrize(
87 'module_qname, class_name',
88 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES )
89)
90def test_102_string_representation( module_qname, class_name ):
91 ''' Namespace has expected string representations. '''
92 module = cache_import_module( module_qname )
93 factory = getattr( module, class_name )
94 obj = factory( )
95 assert base.calculate_fqname( obj ) in repr( obj )
96 obj.a = 1
97 obj.b = 2
98 assert 'a = 1, b = 2' in repr( obj )
101@pytest.mark.parametrize(
102 'module_qname, class_name',
103 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES )
104)
105def test_105_dictionary_equality( module_qname, class_name ):
106 ''' Dictionary is equivalent to another dictionary with same values. '''
107 from types import SimpleNamespace
108 module = cache_import_module( module_qname )
109 factory = getattr( module, class_name )
110 ns1 = factory( foo = 1, bar = 2 )
111 ns2 = factory( ns1.__dict__ )
112 ns3 = SimpleNamespace( **ns1.__dict__ )
113 assert ns1 == ns2
114 assert ns2 == ns1
115 assert ns1 == ns3
116 assert ns3 == ns1
117 assert not ( ns1 == -1 ) # pylint: disable=superfluous-parens
118 assert ns1 != -1
119 assert ns1 != ( )
120 ns2.baz = 43
121 assert ns1 != ns2
122 assert ns2 != ns1
125@pytest.mark.parametrize(
126 'module_qname, class_name',
127 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES )
128)
129def test_900_docstring_sanity( module_qname, class_name ):
130 ''' Class has valid docstring. '''
131 module = cache_import_module( module_qname )
132 Object = getattr( module, class_name )
133 assert hasattr( Object, '__doc__' )
134 assert isinstance( Object.__doc__, str )
135 assert Object.__doc__
138@pytest.mark.parametrize(
139 'module_qname, class_name',
140 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES )
141)
142def test_901_docstring_describes_namespace( module_qname, class_name ):
143 ''' Class docstring describes namespace. '''
144 module = cache_import_module( module_qname )
145 Object = getattr( module, class_name )
146 fragment = base.generate_docstring( 'description of namespace' )
147 assert fragment in Object.__doc__
150@pytest.mark.parametrize(
151 'module_qname, class_name',
152 product( THESE_MODULE_QNAMES, THESE_CLASSES_NAMES )
153)
154def test_902_docstring_mentions_accretion( module_qname, class_name ):
155 ''' Class docstring mentions accretion. '''
156 module = cache_import_module( module_qname )
157 Object = getattr( module, class_name )
158 fragment = base.generate_docstring( 'instance attributes accretion' )
159 assert fragment in Object.__doc__