Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

gh-141360: Refactor test decimal#141361

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Draft
efimov-mikhail wants to merge18 commits intopython:main
base:main
Choose a base branch
Loading
fromefimov-mikhail:refactor_test_decimal
Draft
Show file tree
Hide file tree
Changes from1 commit
Commits
Show all changes
18 commits
Select commitHold shift + click to select a range
c5ebc42
Remove redundant line
efimov-mikhailNov 9, 2025
9aee907
Create test_decimal package, move decimaltestdata
efimov-mikhailNov 9, 2025
c6c2eb1
Some fix to previous commit
efimov-mikhailNov 9, 2025
5b7c58f
Big file divided
efimov-mikhailNov 9, 2025
b9328c9
New files: test_arithmetic.py and test_doc.py
efimov-mikhailNov 10, 2025
f1f1c7a
Introduce load_tests_for_base_classes
efimov-mikhailNov 10, 2025
939cb5b
Add test_format
efimov-mikhailNov 10, 2025
e47c83d
Add test_operators
efimov-mikhailNov 10, 2025
876d9a7
Add test_threading
efimov-mikhailNov 10, 2025
b674b77
Add test_usability
efimov-mikhailNov 10, 2025
f81966d
Add test_api
efimov-mikhailNov 10, 2025
7244822
Add test_contexts
efimov-mikhailNov 10, 2025
67e6a08
Add test_coverage
efimov-mikhailNov 10, 2025
5585777
Add test_py_specific
efimov-mikhailNov 10, 2025
70716f0
Add test_c_specific
efimov-mikhailNov 10, 2025
223faa1
Little improvements
efimov-mikhailNov 10, 2025
067b9de
NEWS entry
efimov-mikhailNov 10, 2025
27d2014
Update Misc/NEWS.d/next/Tests/2025-11-10-18-31-48.gh-issue-141360.VQL…
efimov-mikhailNov 10, 2025
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
PrevPrevious commit
NextNext commit
Add test_py_specific
  • Loading branch information
@efimov-mikhail
efimov-mikhail committedNov 10, 2025
commit558577778634a2471acb00ebef599b1e45356957
180 changes: 0 additions & 180 deletionsLib/test/test_decimal/test_other.py
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -45,186 +45,6 @@ def test_decimal_attributes(self):
self.assertEqual(set(x) - set(y), set())


class PyFunctionality(unittest.TestCase):
"""Extra functionality in decimal.py"""

def test_py_alternate_formatting(self):
# triples giving a format, a Decimal, and the expected result
Decimal = P.Decimal
localcontext = P.localcontext

test_values = [
# Issue 7094: Alternate formatting (specified by #)
('.0e', '1.0', '1e+0'),
('#.0e', '1.0', '1.e+0'),
('.0f', '1.0', '1'),
('#.0f', '1.0', '1.'),
('g', '1.1', '1.1'),
('#g', '1.1', '1.1'),
('.0g', '1', '1'),
('#.0g', '1', '1.'),
('.0%', '1.0', '100%'),
('#.0%', '1.0', '100.%'),
]
for fmt, d, result in test_values:
self.assertEqual(format(Decimal(d), fmt), result)

class PyWhitebox(unittest.TestCase):
"""White box testing for decimal.py"""

def test_py_exact_power(self):
# Rarely exercised lines in _power_exact.
Decimal = P.Decimal
localcontext = P.localcontext

with localcontext() as c:
c.prec = 8
x = Decimal(2**16) ** Decimal("-0.5")
self.assertEqual(x, Decimal('0.00390625'))

x = Decimal(2**16) ** Decimal("-0.6")
self.assertEqual(x, Decimal('0.0012885819'))

x = Decimal("256e7") ** Decimal("-0.5")

x = Decimal(152587890625) ** Decimal('-0.0625')
self.assertEqual(x, Decimal("0.2"))

x = Decimal("152587890625e7") ** Decimal('-0.0625')

x = Decimal(5**2659) ** Decimal('-0.0625')

c.prec = 1
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('3e-6'))
c.prec = 2
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('2.6e-6'))
c.prec = 3
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('2.56e-6'))
c.prec = 28
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('2.56e-6'))

c.prec = 201
x = Decimal(2**578) ** Decimal("-0.5")

# See https://github.com/python/cpython/issues/118027
# Testing for an exact power could appear to hang, in the Python
# version, as it attempted to compute 10**(MAX_EMAX + 1).
# Fixed via https://github.com/python/cpython/pull/118503.
c.prec = P.MAX_PREC
c.Emax = P.MAX_EMAX
c.Emin = P.MIN_EMIN
c.traps[P.Inexact] = 1
D2 = Decimal(2)
# If the bug is still present, the next statement won't complete.
res = D2 ** 117
self.assertEqual(res, 1 << 117)

def test_py_immutability_operations(self):
# Do operations and check that it didn't change internal objects.
Decimal = P.Decimal
DefaultContext = P.DefaultContext
setcontext = P.setcontext

c = DefaultContext.copy()
c.traps = dict((s, 0) for s in OrderedSignals[P])
setcontext(c)

d1 = Decimal('-25e55')
b1 = Decimal('-25e55')
d2 = Decimal('33e+33')
b2 = Decimal('33e+33')

def checkSameDec(operation, useOther=False):
if useOther:
eval("d1." + operation + "(d2)")
self.assertEqual(d1._sign, b1._sign)
self.assertEqual(d1._int, b1._int)
self.assertEqual(d1._exp, b1._exp)
self.assertEqual(d2._sign, b2._sign)
self.assertEqual(d2._int, b2._int)
self.assertEqual(d2._exp, b2._exp)
else:
eval("d1." + operation + "()")
self.assertEqual(d1._sign, b1._sign)
self.assertEqual(d1._int, b1._int)
self.assertEqual(d1._exp, b1._exp)

Decimal(d1)
self.assertEqual(d1._sign, b1._sign)
self.assertEqual(d1._int, b1._int)
self.assertEqual(d1._exp, b1._exp)

checkSameDec("__abs__")
checkSameDec("__add__", True)
checkSameDec("__divmod__", True)
checkSameDec("__eq__", True)
checkSameDec("__ne__", True)
checkSameDec("__le__", True)
checkSameDec("__lt__", True)
checkSameDec("__ge__", True)
checkSameDec("__gt__", True)
checkSameDec("__float__")
checkSameDec("__floordiv__", True)
checkSameDec("__hash__")
checkSameDec("__int__")
checkSameDec("__trunc__")
checkSameDec("__mod__", True)
checkSameDec("__mul__", True)
checkSameDec("__neg__")
checkSameDec("__bool__")
checkSameDec("__pos__")
checkSameDec("__pow__", True)
checkSameDec("__radd__", True)
checkSameDec("__rdivmod__", True)
checkSameDec("__repr__")
checkSameDec("__rfloordiv__", True)
checkSameDec("__rmod__", True)
checkSameDec("__rmul__", True)
checkSameDec("__rpow__", True)
checkSameDec("__rsub__", True)
checkSameDec("__str__")
checkSameDec("__sub__", True)
checkSameDec("__truediv__", True)
checkSameDec("adjusted")
checkSameDec("as_tuple")
checkSameDec("compare", True)
checkSameDec("max", True)
checkSameDec("min", True)
checkSameDec("normalize")
checkSameDec("quantize", True)
checkSameDec("remainder_near", True)
checkSameDec("same_quantum", True)
checkSameDec("sqrt")
checkSameDec("to_eng_string")
checkSameDec("to_integral")

def test_py_decimal_id(self):
Decimal = P.Decimal

d = Decimal(45)
e = Decimal(d)
self.assertEqual(str(e), '45')
self.assertNotEqual(id(d), id(e))

def test_py_rescale(self):
# Coverage
Decimal = P.Decimal
localcontext = P.localcontext

with localcontext() as c:
x = Decimal("NaN")._rescale(3, P.ROUND_UP)
self.assertTrue(x.is_nan())

def test_py__round(self):
# Coverage
Decimal = P.Decimal

self.assertRaises(ValueError, Decimal("3.1234")._round, 0, P.ROUND_UP)

class CFunctionality(unittest.TestCase):
"""Extra functionality in _decimal"""

Expand Down
187 changes: 187 additions & 0 deletionsLib/test/test_decimal/test_py_specific.py
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
import unittest
from . import P, OrderedSignals


class PyFunctionality(unittest.TestCase):
"""Extra functionality in decimal.py"""

def test_py_alternate_formatting(self):
# triples giving a format, a Decimal, and the expected result
Decimal = P.Decimal
localcontext = P.localcontext

test_values = [
# Issue 7094: Alternate formatting (specified by #)
('.0e', '1.0', '1e+0'),
('#.0e', '1.0', '1.e+0'),
('.0f', '1.0', '1'),
('#.0f', '1.0', '1.'),
('g', '1.1', '1.1'),
('#g', '1.1', '1.1'),
('.0g', '1', '1'),
('#.0g', '1', '1.'),
('.0%', '1.0', '100%'),
('#.0%', '1.0', '100.%'),
]
for fmt, d, result in test_values:
self.assertEqual(format(Decimal(d), fmt), result)

class PyWhitebox(unittest.TestCase):
"""White box testing for decimal.py"""

def test_py_exact_power(self):
# Rarely exercised lines in _power_exact.
Decimal = P.Decimal
localcontext = P.localcontext

with localcontext() as c:
c.prec = 8
x = Decimal(2**16) ** Decimal("-0.5")
self.assertEqual(x, Decimal('0.00390625'))

x = Decimal(2**16) ** Decimal("-0.6")
self.assertEqual(x, Decimal('0.0012885819'))

x = Decimal("256e7") ** Decimal("-0.5")

x = Decimal(152587890625) ** Decimal('-0.0625')
self.assertEqual(x, Decimal("0.2"))

x = Decimal("152587890625e7") ** Decimal('-0.0625')

x = Decimal(5**2659) ** Decimal('-0.0625')

c.prec = 1
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('3e-6'))
c.prec = 2
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('2.6e-6'))
c.prec = 3
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('2.56e-6'))
c.prec = 28
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('2.56e-6'))

c.prec = 201
x = Decimal(2**578) ** Decimal("-0.5")

# See https://github.com/python/cpython/issues/118027
# Testing for an exact power could appear to hang, in the Python
# version, as it attempted to compute 10**(MAX_EMAX + 1).
# Fixed via https://github.com/python/cpython/pull/118503.
c.prec = P.MAX_PREC
c.Emax = P.MAX_EMAX
c.Emin = P.MIN_EMIN
c.traps[P.Inexact] = 1
D2 = Decimal(2)
# If the bug is still present, the next statement won't complete.
res = D2 ** 117
self.assertEqual(res, 1 << 117)

def test_py_immutability_operations(self):
# Do operations and check that it didn't change internal objects.
Decimal = P.Decimal
DefaultContext = P.DefaultContext
setcontext = P.setcontext

c = DefaultContext.copy()
c.traps = dict((s, 0) for s in OrderedSignals[P])
setcontext(c)

d1 = Decimal('-25e55')
b1 = Decimal('-25e55')
d2 = Decimal('33e+33')
b2 = Decimal('33e+33')

def checkSameDec(operation, useOther=False):
if useOther:
eval("d1." + operation + "(d2)")
self.assertEqual(d1._sign, b1._sign)
self.assertEqual(d1._int, b1._int)
self.assertEqual(d1._exp, b1._exp)
self.assertEqual(d2._sign, b2._sign)
self.assertEqual(d2._int, b2._int)
self.assertEqual(d2._exp, b2._exp)
else:
eval("d1." + operation + "()")
self.assertEqual(d1._sign, b1._sign)
self.assertEqual(d1._int, b1._int)
self.assertEqual(d1._exp, b1._exp)

Decimal(d1)
self.assertEqual(d1._sign, b1._sign)
self.assertEqual(d1._int, b1._int)
self.assertEqual(d1._exp, b1._exp)

checkSameDec("__abs__")
checkSameDec("__add__", True)
checkSameDec("__divmod__", True)
checkSameDec("__eq__", True)
checkSameDec("__ne__", True)
checkSameDec("__le__", True)
checkSameDec("__lt__", True)
checkSameDec("__ge__", True)
checkSameDec("__gt__", True)
checkSameDec("__float__")
checkSameDec("__floordiv__", True)
checkSameDec("__hash__")
checkSameDec("__int__")
checkSameDec("__trunc__")
checkSameDec("__mod__", True)
checkSameDec("__mul__", True)
checkSameDec("__neg__")
checkSameDec("__bool__")
checkSameDec("__pos__")
checkSameDec("__pow__", True)
checkSameDec("__radd__", True)
checkSameDec("__rdivmod__", True)
checkSameDec("__repr__")
checkSameDec("__rfloordiv__", True)
checkSameDec("__rmod__", True)
checkSameDec("__rmul__", True)
checkSameDec("__rpow__", True)
checkSameDec("__rsub__", True)
checkSameDec("__str__")
checkSameDec("__sub__", True)
checkSameDec("__truediv__", True)
checkSameDec("adjusted")
checkSameDec("as_tuple")
checkSameDec("compare", True)
checkSameDec("max", True)
checkSameDec("min", True)
checkSameDec("normalize")
checkSameDec("quantize", True)
checkSameDec("remainder_near", True)
checkSameDec("same_quantum", True)
checkSameDec("sqrt")
checkSameDec("to_eng_string")
checkSameDec("to_integral")

def test_py_decimal_id(self):
Decimal = P.Decimal

d = Decimal(45)
e = Decimal(d)
self.assertEqual(str(e), '45')
self.assertNotEqual(id(d), id(e))

def test_py_rescale(self):
# Coverage
Decimal = P.Decimal
localcontext = P.localcontext

with localcontext() as c:
x = Decimal("NaN")._rescale(3, P.ROUND_UP)
self.assertTrue(x.is_nan())

def test_py__round(self):
# Coverage
Decimal = P.Decimal

self.assertRaises(ValueError, Decimal("3.1234")._round, 0, P.ROUND_UP)


if __name__ == '__main__':
unittest.main()

[8]ページ先頭

©2009-2025 Movatter.jp