summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2024-03-26 15:18:17 (GMT)
committerGitHub <noreply@github.com>2024-03-26 15:18:17 (GMT)
commit79be75735c9d77972112cecc8d7e1af28c176ed0 (patch)
tree243cf7ff18185b4aeb4f213c4571bc7e26793116 /Lib/test
parent70969d53a77a8a190c40a30419e772bc874a4f62 (diff)
downloadcpython-79be75735c9d77972112cecc8d7e1af28c176ed0.zip
cpython-79be75735c9d77972112cecc8d7e1af28c176ed0.tar.gz
cpython-79be75735c9d77972112cecc8d7e1af28c176ed0.tar.bz2
gh-115775: Compiler adds __static_attributes__ field to classes (#115913)
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_compile.py58
-rw-r--r--Lib/test/test_descr.py8
-rw-r--r--Lib/test/test_io.py2
-rw-r--r--Lib/test/test_metaclass.py8
4 files changed, 69 insertions, 7 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index d3e69bf..9d5f721 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -1960,6 +1960,64 @@ class TestSourcePositions(unittest.TestCase):
)
+class TestExpectedAttributes(unittest.TestCase):
+
+ def test_basic(self):
+ class C:
+ def f(self):
+ self.a = self.b = 42
+
+ self.assertIsInstance(C.__static_attributes__, tuple)
+ self.assertEqual(sorted(C.__static_attributes__), ['a', 'b'])
+
+ def test_nested_function(self):
+ class C:
+ def f(self):
+ self.x = 1
+ self.y = 2
+ self.x = 3 # check deduplication
+
+ def g(self, obj):
+ self.y = 4
+ self.z = 5
+
+ def h(self, a):
+ self.u = 6
+ self.v = 7
+
+ obj.self = 8
+
+ self.assertEqual(sorted(C.__static_attributes__), ['u', 'v', 'x', 'y', 'z'])
+
+ def test_nested_class(self):
+ class C:
+ def f(self):
+ self.x = 42
+ self.y = 42
+
+ class D:
+ def g(self):
+ self.y = 42
+ self.z = 42
+
+ self.assertEqual(sorted(C.__static_attributes__), ['x', 'y'])
+ self.assertEqual(sorted(C.D.__static_attributes__), ['y', 'z'])
+
+ def test_subclass(self):
+ class C:
+ def f(self):
+ self.x = 42
+ self.y = 42
+
+ class D(C):
+ def g(self):
+ self.y = 42
+ self.z = 42
+
+ self.assertEqual(sorted(C.__static_attributes__), ['x', 'y'])
+ self.assertEqual(sorted(D.__static_attributes__), ['y', 'z'])
+
+
class TestExpressionStackSize(unittest.TestCase):
# These tests check that the computed stack size for a code object
# stays within reasonable bounds (see issue #21523 for an example
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 5404d8d..097ca38 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -5080,7 +5080,8 @@ class DictProxyTests(unittest.TestCase):
keys = list(it)
keys.sort()
self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
- '__weakref__', 'meth'])
+ '__static_attributes__', '__weakref__',
+ 'meth'])
@unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
'trace function introduces __local__')
@@ -5089,7 +5090,7 @@ class DictProxyTests(unittest.TestCase):
it = self.C.__dict__.values()
self.assertNotIsInstance(it, list)
values = list(it)
- self.assertEqual(len(values), 5)
+ self.assertEqual(len(values), 6)
@unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
'trace function introduces __local__')
@@ -5100,7 +5101,8 @@ class DictProxyTests(unittest.TestCase):
keys = [item[0] for item in it]
keys.sort()
self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
- '__weakref__', 'meth'])
+ '__static_attributes__', '__weakref__',
+ 'meth'])
def test_dict_type_with_metaclass(self):
# Testing type of __dict__ when metaclass set...
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 5491c05..4ea1ef1 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -1160,7 +1160,7 @@ class APIMismatchTest(unittest.TestCase):
def test_RawIOBase_io_in_pyio_match(self):
"""Test that pyio RawIOBase class has all c RawIOBase methods"""
mismatch = support.detect_api_mismatch(pyio.RawIOBase, io.RawIOBase,
- ignore=('__weakref__',))
+ ignore=('__weakref__', '__static_attributes__'))
self.assertEqual(mismatch, set(), msg='Python RawIOBase does not have all C RawIOBase methods')
def test_RawIOBase_pyio_in_io_match(self):
diff --git a/Lib/test/test_metaclass.py b/Lib/test/test_metaclass.py
index 36e8ab4..70f9c5d 100644
--- a/Lib/test/test_metaclass.py
+++ b/Lib/test/test_metaclass.py
@@ -167,6 +167,7 @@ Use a __prepare__ method that returns an instrumented dict.
d['foo'] = 4
d['foo'] = 42
d['bar'] = 123
+ d['__static_attributes__'] = ()
>>>
Use a metaclass that doesn't derive from type.
@@ -182,12 +183,12 @@ Use a metaclass that doesn't derive from type.
... b = 24
...
meta: C ()
- ns: [('__module__', 'test.test_metaclass'), ('__qualname__', 'C'), ('a', 42), ('b', 24)]
+ ns: [('__module__', 'test.test_metaclass'), ('__qualname__', 'C'), ('__static_attributes__', ()), ('a', 42), ('b', 24)]
kw: []
>>> type(C) is dict
True
>>> print(sorted(C.items()))
- [('__module__', 'test.test_metaclass'), ('__qualname__', 'C'), ('a', 42), ('b', 24)]
+ [('__module__', 'test.test_metaclass'), ('__qualname__', 'C'), ('__static_attributes__', ()), ('a', 42), ('b', 24)]
>>>
And again, with a __prepare__ attribute.
@@ -208,8 +209,9 @@ And again, with a __prepare__ attribute.
d['a'] = 1
d['a'] = 2
d['b'] = 3
+ d['__static_attributes__'] = ()
meta: C ()
- ns: [('__module__', 'test.test_metaclass'), ('__qualname__', 'C'), ('a', 2), ('b', 3)]
+ ns: [('__module__', 'test.test_metaclass'), ('__qualname__', 'C'), ('__static_attributes__', ()), ('a', 2), ('b', 3)]
kw: [('other', 'booh')]
>>>