Commit 91b5eca5 authored by Stefan Krah's avatar Stefan Krah

Issue #15783: Support None default values in the Context() constructor.

parent 66494d6e
...@@ -2718,6 +2718,27 @@ class PyPythonAPItests(PythonAPItests): ...@@ -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) ...@@ -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 (t.round < 0) {
return -1;
}
}
if (!mpd_qsetprec(ctx, t.prec) || if (prec != Py_None && context_setprec(self, prec, NULL) < 0) {
!mpd_qsetemin(ctx, t.emin) || return -1;
!mpd_qsetemax(ctx, t.emax) || }
!mpd_qsetclamp(ctx, t.clamp)) { if (emin != Py_None && context_setemin(self, emin, NULL) < 0) {
return value_error_int("invalid context"); return -1;
} }
if (!mpd_qsetround(ctx, t.round) || if (emax != Py_None && context_setemax(self, emax, NULL) < 0) {
!mpd_qsettraps(ctx, t.traps) || return -1;
!mpd_qsetstatus(ctx, t.status)) { }
return type_error_int("invalid context"); 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 (capitals != 0 && capitals != 1) { if (rounding != Py_None) {
return value_error_int("invalid context"); int x = getround(rounding);
if (x < 0) {
return -1;
}
if (!mpd_qsetround(CTX(self), x)) {
return type_error_int(invalid_rounding_err);
}
} }
CtxCaps(self) = capitals;
if (traps != NULL) { if (traps != Py_None) {
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) ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment