Issue #15783: Support None default values in the Context() constructor.
This commit is contained in:
parent
92f8b0016e
commit
9a4ff437d1
@ -2718,6 +2718,27 @@ class PyPythonAPItests(PythonAPItests):
|
|||||||
|
|
||||||
class ContextAPItests(unittest.TestCase):
|
class ContextAPItests(unittest.TestCase):
|
||||||
|
|
||||||
|
def test_none_args(self):
|
||||||
|
Context = self.decimal.Context
|
||||||
|
InvalidOperation = self.decimal.InvalidOperation
|
||||||
|
DivisionByZero = self.decimal.DivisionByZero
|
||||||
|
Overflow = self.decimal.Overflow
|
||||||
|
ROUND_HALF_EVEN = self.decimal.ROUND_HALF_EVEN
|
||||||
|
|
||||||
|
c1 = Context()
|
||||||
|
c2 = Context(prec=None, rounding=None, Emax=None, Emin=None,
|
||||||
|
capitals=None, clamp=None, flags=None, traps=None)
|
||||||
|
for c in [c1, c2]:
|
||||||
|
self.assertEqual(c.prec, 28)
|
||||||
|
self.assertEqual(c.rounding, ROUND_HALF_EVEN)
|
||||||
|
self.assertEqual(c.Emax, 999999)
|
||||||
|
self.assertEqual(c.Emin, -999999)
|
||||||
|
self.assertEqual(c.capitals, 1)
|
||||||
|
self.assertEqual(c.clamp, 0)
|
||||||
|
assert_signals(self, c, 'flags', [])
|
||||||
|
assert_signals(self, c, 'traps', [InvalidOperation, DivisionByZero,
|
||||||
|
Overflow])
|
||||||
|
|
||||||
def test_pickle(self):
|
def test_pickle(self):
|
||||||
|
|
||||||
Context = self.decimal.Context
|
Context = self.decimal.Context
|
||||||
|
@ -1241,50 +1241,53 @@ context_init(PyObject *self, PyObject *args, PyObject *kwds)
|
|||||||
"prec", "rounding", "Emin", "Emax", "capitals", "clamp",
|
"prec", "rounding", "Emin", "Emax", "capitals", "clamp",
|
||||||
"flags", "traps", NULL
|
"flags", "traps", NULL
|
||||||
};
|
};
|
||||||
PyObject *rounding = NULL;
|
PyObject *prec = Py_None;
|
||||||
PyObject *traps = NULL;
|
PyObject *rounding = Py_None;
|
||||||
PyObject *status = NULL;
|
PyObject *emin = Py_None;
|
||||||
mpd_context_t *ctx, t;
|
PyObject *emax = Py_None;
|
||||||
int capitals = 1;
|
PyObject *capitals = Py_None;
|
||||||
|
PyObject *clamp = Py_None;
|
||||||
|
PyObject *status = Py_None;
|
||||||
|
PyObject *traps = Py_None;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
assert(PyTuple_Check(args));
|
assert(PyTuple_Check(args));
|
||||||
ctx = CTX(self);
|
|
||||||
|
|
||||||
t = *ctx;
|
|
||||||
if (!PyArg_ParseTupleAndKeywords(
|
if (!PyArg_ParseTupleAndKeywords(
|
||||||
args, kwds,
|
args, kwds,
|
||||||
"|nOnniiOO", kwlist,
|
"|OOOOOOOO", kwlist,
|
||||||
&t.prec, &rounding, &t.emin, &t.emax, &capitals, &t.clamp,
|
&prec, &rounding, &emin, &emax, &capitals, &clamp, &status, &traps
|
||||||
&status, &traps
|
|
||||||
)) {
|
)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rounding != NULL) {
|
|
||||||
t.round = getround(rounding);
|
if (prec != Py_None && context_setprec(self, prec, NULL) < 0) {
|
||||||
if (t.round < 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (emin != Py_None && context_setemin(self, emin, NULL) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (emax != Py_None && context_setemax(self, emax, NULL) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (capitals != Py_None && context_setcapitals(self, capitals, NULL) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (clamp != Py_None && context_setclamp(self, clamp, NULL) < 0) {
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mpd_qsetprec(ctx, t.prec) ||
|
if (rounding != Py_None) {
|
||||||
!mpd_qsetemin(ctx, t.emin) ||
|
int x = getround(rounding);
|
||||||
!mpd_qsetemax(ctx, t.emax) ||
|
if (x < 0) {
|
||||||
!mpd_qsetclamp(ctx, t.clamp)) {
|
return -1;
|
||||||
return value_error_int("invalid context");
|
}
|
||||||
|
if (!mpd_qsetround(CTX(self), x)) {
|
||||||
|
return type_error_int(invalid_rounding_err);
|
||||||
}
|
}
|
||||||
if (!mpd_qsetround(ctx, t.round) ||
|
|
||||||
!mpd_qsettraps(ctx, t.traps) ||
|
|
||||||
!mpd_qsetstatus(ctx, t.status)) {
|
|
||||||
return type_error_int("invalid context");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (capitals != 0 && capitals != 1) {
|
if (traps != Py_None) {
|
||||||
return value_error_int("invalid context");
|
|
||||||
}
|
|
||||||
CtxCaps(self) = capitals;
|
|
||||||
|
|
||||||
if (traps != NULL) {
|
|
||||||
if (PyList_Check(traps)) {
|
if (PyList_Check(traps)) {
|
||||||
ret = context_settraps_list(self, traps);
|
ret = context_settraps_list(self, traps);
|
||||||
}
|
}
|
||||||
@ -1300,7 +1303,7 @@ context_init(PyObject *self, PyObject *args, PyObject *kwds)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (status != NULL) {
|
if (status != Py_None) {
|
||||||
if (PyList_Check(status)) {
|
if (PyList_Check(status)) {
|
||||||
ret = context_setstatus_list(self, status);
|
ret = context_setstatus_list(self, status);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user