aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/tests/QtCore/multiple_feature_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'sources/pyside6/tests/QtCore/multiple_feature_test.py')
-rw-r--r--sources/pyside6/tests/QtCore/multiple_feature_test.py116
1 files changed, 116 insertions, 0 deletions
diff --git a/sources/pyside6/tests/QtCore/multiple_feature_test.py b/sources/pyside6/tests/QtCore/multiple_feature_test.py
new file mode 100644
index 000000000..0f51ace6b
--- /dev/null
+++ b/sources/pyside6/tests/QtCore/multiple_feature_test.py
@@ -0,0 +1,116 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import os
+import sys
+import unittest
+
+from pathlib import Path
+sys.path.append(os.fspath(Path(__file__).resolve().parents[1]))
+from init_paths import init_test_paths
+init_test_paths(False)
+
+from PySide6.QtCore import QCborArray, QObject
+
+is_pypy = hasattr(sys, "pypy_version_info")
+if not is_pypy:
+ from PySide6.support import feature
+
+from textwrap import dedent
+
+"""
+multiple_feature_test.py
+------------------------
+
+This tests the selectable features in PySide.
+
+The first feature is `snake_case` instead of `camelCase`.
+There is much more to come.
+"""
+
+MethodDescriptorType = type(str.split)
+
+
+def xprint(*args, **kw):
+ if "-v" in sys.argv:
+ print(*args, **kw)
+
+
+@unittest.skipIf(is_pypy, "__feature__ cannot yet be used with PyPy")
+class FeaturesTest(unittest.TestCase):
+
+ def testAllFeatureCombinations(self):
+ """
+ Test for all 256 possible combinations of `__feature__` imports.
+ """
+
+ def tst_bit0(flag, self, bits):
+ if flag == 0:
+ QCborArray.isEmpty
+ QCborArray.__dict__["isEmpty"]
+ with self.assertRaises(AttributeError):
+ QCborArray.is_empty
+ with self.assertRaises(KeyError):
+ QCborArray.__dict__["is_empty"]
+ else:
+ QCborArray.is_empty
+ QCborArray.__dict__["is_empty"]
+ with self.assertRaises(AttributeError):
+ QCborArray.isEmpty
+ with self.assertRaises(KeyError):
+ QCborArray.__dict__["isEmpty"]
+
+ def tst_bit1(flag, self, bits):
+ getter_name = "object_name" if bits & 1 else "objectName"
+ setter_name = "set_object_name" if bits & 1 else "setObjectName"
+ thing = getattr(QObject, getter_name)
+ if flag:
+ self.assertEqual(type(thing), property)
+ with self.assertRaises(AttributeError):
+ getattr(QObject, setter_name)
+ else:
+ self.assertEqual(type(thing), MethodDescriptorType)
+ getattr(QObject, setter_name)
+
+ edict = {}
+ for bit in range(2, 8):
+ # We are cheating here, since the functions are in the globals.
+
+ bit_pow = 1 << bit
+ eval(compile(dedent(f"""
+
+ def tst_bit{bit}(flag, self, bits):
+ if flag == 0:
+ with self.assertRaises(AttributeError):
+ QCborArray.fake_feature_{bit_pow:02x}
+ with self.assertRaises(KeyError):
+ QCborArray.__dict__["fake_feature_{bit_pow:02x}"]
+ else:
+ QCborArray.fake_feature_{bit_pow:02x}
+ QCborArray.__dict__["fake_feature_{bit_pow:02x}"]
+
+ """), "<string>", "exec"), globals(), edict)
+ globals().update(edict)
+ feature_list = feature._really_all_feature_names
+ func_list = [tst_bit0, tst_bit1, tst_bit2, tst_bit3,
+ tst_bit4, tst_bit5, tst_bit6, tst_bit7]
+
+ for idx in range(0x100):
+ feature.reset()
+ config = f"feature_{idx:02x}"
+ xprint()
+ xprint(f"--- Feature Test Config `{config}` ---")
+ xprint("Imports:")
+ for bit in range(8):
+ if idx & 1 << bit:
+ cur_feature = feature_list[bit]
+ text = f"from __feature__ import {cur_feature}"
+ xprint(text)
+ eval(compile(text, "<string>", "exec"), globals(), edict)
+ for bit in range(8):
+ value = idx & 1 << bit
+ func_list[bit](value, self=self, bits=idx)
+
+
+if __name__ == '__main__':
+ unittest.main()