Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
cbca658
gh-111495: Add tests for PyNumber C API
skirpichev Nov 5, 2023
0d95d57
Remove inaccessible code (PyLong_AsSsize_t raises OverflowError)
skirpichev Nov 10, 2023
7b8adb4
Drop checks for broken float subclasses (like for PyNumber_Long in 31…
skirpichev Nov 11, 2023
4665f25
+ tests with sets for intersection/union/etc
skirpichev Nov 13, 2023
9e14905
Use macroses
skirpichev Nov 13, 2023
c0f4051
Merge branch 'main' into capi-number-tests
skirpichev Nov 13, 2023
3a7a4c4
Merge branch 'main' into capi-number-tests
skirpichev Nov 14, 2023
788e9c2
Ternary ops (currently only pow/ipow) don't use __r*__ dunders
skirpichev Nov 15, 2023
8cf4429
More tests
skirpichev Nov 15, 2023
91c68a7
Merge branch 'main' into capi-number-tests
skirpichev Nov 15, 2023
9f6fd15
More tests
skirpichev Nov 15, 2023
9f5b7a1
Use BINARY_FUNC macro for some remaining ops
skirpichev Nov 15, 2023
2675738
Add UNARY_FUNC macro to define unary PyNumber_* functions
skirpichev Nov 15, 2023
2bc6bc7
Fix typo
skirpichev Nov 15, 2023
49d673b
Make last argument optional for PyNumber_Power/InPlacePower
skirpichev Nov 15, 2023
b2dda89
More tests
skirpichev Nov 15, 2023
b86d2eb
Remove number_check() from _testcapi/abstract.c, move tests
skirpichev Nov 15, 2023
0fbbba9
address review:
skirpichev Nov 16, 2023
bcf0c20
Merge branch 'main' into capi-number-tests
skirpichev Nov 16, 2023
9aae51b
some cleanup for support classes
skirpichev Nov 17, 2023
d052280
+ cleanup
skirpichev Nov 17, 2023
c04679c
use instead generic tests for unary functions
skirpichev Nov 18, 2023
efe4aab
+1
skirpichev Nov 18, 2023
4d96d35
use instead generic tests for binary functions + misc tests
skirpichev Nov 18, 2023
b00365e
Merge branch 'main' into capi-number-tests
skirpichev Dec 2, 2023
74abc5d
+1
skirpichev Dec 3, 2023
d62b802
Merge branch 'main' into capi-number-tests
skirpichev Feb 21, 2024
7ba5bb0
Merge branch 'master' into capi-number-tests
skirpichev Mar 22, 2024
76aac6f
Merge branch 'master' into capi-number-tests
skirpichev Mar 23, 2024
de8f7f3
Include only basic tests for unary/binary ops (with builtin types)
skirpichev Mar 26, 2024
bd3435b
Merge branch 'master' into capi-number-tests
skirpichev Aug 9, 2024
ab08430
address review: sort imports
skirpichev Aug 9, 2024
0bccf1c
address review: split test_misc()
skirpichev Aug 9, 2024
abde55b
Update Lib/test/test_capi/test_number.py
skirpichev Aug 9, 2024
f4be9c5
address review: use import_helper for _testbuffer
skirpichev Aug 9, 2024
86df16c
fix typo
skirpichev Aug 9, 2024
c620c72
drop support classes with __trunc__ dunder
skirpichev Aug 9, 2024
556b23b
address review: skip two test if no ndarray
skirpichev Aug 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
use instead generic tests for unary functions
  • Loading branch information
skirpichev committed Nov 18, 2023
commit c04679c3b68c9957a0b1c2440c52838ac62a72c9
77 changes: 36 additions & 41 deletions Lib/test/test_capi/test_number.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@

NULL = None

class BadDescr:
def __get__(self, obj, objtype=None):
raise RuntimeError

class WithDunder:
@classmethod
Expand All @@ -28,6 +31,13 @@ def meth(*args):
setattr(cls, cls.methname, meth)
return obj

@classmethod
def with_badattr(cls):
obj = super().__new__(cls)
setattr(cls, cls.methname, BadDescr())
return obj


class IndexLike(WithDunder):
methname = '__index__'

Expand All @@ -40,9 +50,6 @@ class FloatLike(WithDunder):
class HasTrunc(WithDunder):
methname = '__trunc__'

class BadDescr:
def __get__(self, obj, objtype=None):
raise ValueError

class HasBadTrunc:
__trunc__ = BadDescr()
Expand Down Expand Up @@ -210,50 +217,38 @@ def test_power(self):
# CRASHES power(NULL, 42)
# CRASHES power(42, NULL)

def test_negative(self):
# Test PyNumber_Negative()
negative = _testcapi.number_negative

self.assertEqual(negative(42), -42)
self.assertEqual(negative(1.25), -1.25)

self.assertRaises(TypeError, negative, "123")
self.assertRaises(TypeError, negative, object())
self.assertRaises(SystemError, negative, NULL)

def test_positive(self):
# Test PyNumber_Positive()
positive = _testcapi.number_positive

self.assertEqual(positive(-1), +(-1))
self.assertEqual(positive(1.25), 1.25)
def test_unary_ops(self):
# Common tests for unary functions (PyNumber_Negative(),
# PyNumber_Positive(), PyNumber_Absolute() and PyNumber_Invert()
methmap = {'__neg__': _testcapi.number_negative,
'__pos__': _testcapi.number_positive,
'__abs__': _testcapi.number_absolute,
'__invert__': _testcapi.number_invert}

self.assertRaises(TypeError, positive, "123")
self.assertRaises(TypeError, positive, object())
self.assertRaises(SystemError, positive, NULL)
for name, func in methmap.items():
# Generic object: no tp_as_number structure
self.assertRaises(TypeError, func, object())

def test_absolute(self):
# Test PyNumber_Absolute()
absolute = _testcapi.number_absolute
# Has tp_as_number, but not unary
class HasAdd(WithDunder):
methname = '__add__'
self.assertRaises(TypeError, func, HasAdd.with_val("don't care"))

self.assertEqual(absolute(-1), abs(-1))
self.assertEqual(absolute(-1.25), 1.25)
self.assertEqual(absolute(1j), 1.0)
class HasMeth(WithDunder):
methname = name

self.assertRaises(TypeError, absolute, "123")
self.assertRaises(TypeError, absolute, object())
self.assertRaises(SystemError, absolute, NULL)
# Has dunder method, but it's a bad descriptor
self.assertRaises(RuntimeError, func, HasMeth.with_badattr())

def test_invert(self):
# Test PyNumber_Invert()
invert = _testcapi.number_invert
# Dunder method trigger an error
self.assertRaises(ValueError, func, HasMeth.with_exc(ValueError))

self.assertEqual(invert(123), ~123)
# Finally, it returns something
self.assertEqual(func(HasMeth.with_val(42)), 42)
self.assertEqual(func(HasMeth.with_val(NotImplemented)), NotImplemented)

self.assertRaises(TypeError, invert, 1.25)
self.assertRaises(TypeError, invert, "123")
self.assertRaises(TypeError, invert, object())
self.assertRaises(SystemError, invert, NULL)
# And accept NULL
self.assertRaises(SystemError, func, NULL)

def test_lshift(self):
# Test PyNumber_Lshift()
Expand Down Expand Up @@ -516,7 +511,7 @@ def test_long(self):
with self.assertWarns(DeprecationWarning):
self.assertRaises(TypeError, long, HasTrunc.with_val(1.25))
self.assertRaises(RuntimeError, long, HasTrunc.with_exc(RuntimeError))
self.assertRaises(ValueError, long, HasBadTrunc())
self.assertRaises(RuntimeError, long, HasBadTrunc())

self.assertRaises(TypeError, long, 1j)
self.assertRaises(TypeError, long, object())
Expand Down